The adaptive grid uses CSS container queries to arrange content according to the space available
to the grid itself, rather than the viewport. It uses one equal-width column by default. Add
.adaptive-grid-columns-2 to use two equal-width columns when the query container's content box
is at least 400px wide.
The wrapper, content, and item classes are required. .adaptive-grid establishes the named query
container, its direct .adaptive-grid-content child receives the grid layout, and each direct
grid child uses .adaptive-grid-item. A CSS container cannot query its own size to style itself,
so the separate inner element makes the component self-contained.
Resize the available content area to see this example switch between one and two columns.
<div class="adaptive-grid adaptive-grid-columns-2">
<div class="adaptive-grid-content">
<div class="adaptive-grid-item border border-radius padding-sm">Item 1</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 2</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 3</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 4</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 5</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 6</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 7</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 8</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 9</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 10</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 11</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 12</div>
</div>
</div>
The same modifier can produce different layouts in the same viewport because each grid queries its own wrapper. The 350px example remains one column, while the 500px example becomes two columns when the viewport is wide enough to apply that width.
<div class="adaptive-grid adaptive-grid-columns-2 width-350">
<div class="adaptive-grid-content">
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 1</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 2</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 3</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 4</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 5</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 6</div>
</div>
</div>
<div class="adaptive-grid adaptive-grid-columns-2 width-500-tablet">
<div class="adaptive-grid-content">
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 1</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 2</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 3</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 4</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 5</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 6</div>
</div>
</div>
Every track uses minmax(0, 1fr), and direct .adaptive-grid-item children have
min-inline-size: 0. This allows long code, tables, and other intrinsically wide content to
shrink within a track instead of forcing the grid wider than its container. Consumers can apply
an appropriate overflow or wrapping treatment to the content itself.
Consumers compiling Atlas Sass can configure the default gap and two-column threshold with
$adaptive-grid-gap and $adaptive-grid-columns-2-min-width.
Use the button groups to apply the column modifier and gap atomics, then use the slider to change this preview's outer inline size. The slider updates a CSS custom property on the demo parent without changing the viewport. The grid switches to two columns when its queried content box reaches 400px; the displayed outer width also includes its border and padding.
The component markup used in the preview is:
<div class="adaptive-grid adaptive-grid-columns-2">
<div class="adaptive-grid-content">
<div class="adaptive-grid-item border border-radius padding-sm">Item 1</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 2</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 3</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 4</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 5</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 6</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 7</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 8</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 9</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 10</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 11</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 12</div>
</div>
</div>