A web component that creates layouts by treating your HTML elements as rectangles and packing them using a best-fit 2D strip-packing algorithm.
Web browsers naturally manage elements as rectangles. rectpackr-layout
leverages this by applying a best-fit strip-packing algorithm — the same approach used in industrial optimization problems — to web layout creation.
The algorithm intelligently works with whatever dimensional information is available:
- Automatically measures element dimensions through browser APIs
- Uses width as the primary constraint for predictable flow
- Adapts to any height — whether fixed, aspect-ratio based, or content-determined
- Handles mixed content seamlessly without manual configuration
- Set explicit widths for pixel-perfect control
- Use percentage-based or responsive widths
- Let elements determine their own natural sizes
- Mix and match approaches within the same layout
- Truly flexible layouts that work with your existing CSS approach
- Zero-configuration setups for rapid prototyping
- Production-ready precision when you need exact control
- Best of both worlds — automation when you want it, control when you need it
npm install rectpackr-layout
yarn add rectpackr-layout
pnpm install rectpackr-layout
Then import it in your JavaScript:
// In your main.js or component file
import 'rectpackr-layout';
Or directly in your HTML:
<script type="module">
import 'rectpackr-layout';
</script>
Include it directly in your HTML via CDN:
<script type="module" src="https://unpkg.com/rectpackr-layout"></script>
<script
type="module"
src="https://cdn.jsdelivr.net/npm/rectpackr-layout"
></script>
<script type="module" src="https://esm.sh/rectpackr-layout"></script>
<rectpackr-layout>
<div>Your content here</div>
</rectpackr-layout>
positioning
Defines the CSS method used to position items.
transform
(Default): Usestransform: translate(x, y)
offset
: Uses CSSinset
property for precise positioning
💡 Performance Note: The default
transform
value typically offers better performance through hardware acceleration. Useoffset
only when child elements already usetransform
for other purposes (animation etc.).
x-direction
Controls the horizontal packing direction.
ltr
(Default): Left-to-right packingrtl
: Right-to-left packing
y-direction
Controls the vertical packing direction.
ttb
(Default): Top-to-bottom packingbtt
: Bottom-to-top packing
The x-direction
and y-direction
attributes control visual placement, which may create a difference between the visual arrangement and the underlying DOM order.
- DOM Order is Preserved: The underlying HTML structure remains unchanged
- Visual Order is Algorithm-Determined: Item placement follows the packing logic and your direction settings
<rectpackr-layout>
<div>Card 1</div>
<div>Card 2</div>
<div>Card 3</div>
</rectpackr-layout>
<style>
rectpackr-layout {
container-type: inline-size;
display: block;
}
rectpackr-layout > * {
/* Fluid width based on container queries */
width: 100%;
}
@container (min-width: 400px) {
rectpackr-layout > * {
width: 50%;
}
}
@container (min-width: 800px) {
rectpackr-layout > * {
width: 33.33%;
}
}
</style>
<rectpackr-layout id="dynamic-layout">
<!-- Content can be added/removed dynamically -->
</rectpackr-layout>
<script>
// The layout automatically adjusts to content changes
document.getElementById('dynamic-layout').appendChild(newElement);
</script>
See predictable masonry-style layouts with equal-width elements
Explore optimal packing of variably-sized elements and aspect ratios
Experiment with real-time controls and dynamic content manipulation
Modern browsers with Web Components support.
If you encounter any issues or have questions, please open an issue.
This project is licensed under the MIT License.