A design substrate, not another builder.
Tokens, surfaces, containers, behaviours — all readable by humans and agents alike. Composition is the entire product.
Asymmetric layout as a named map. Each cell claims a slot in grid-template-areas, declares its tier, and trusts the grid for shape. Cells stagger in on view; below 700px the map folds gracefully to a stack.
data-cells="6"Tokens, surfaces, containers, behaviours — all readable by humans and agents alike. Composition is the entire product.
Pick a constellation. Wire a behaviour. Export an .lsd. Hand it to your stack.
data-cells="9"Set data-tier="elevated" for a quiet lift, "high" for a directional accent wash. The colour thinking is done by the substrate.
Resizes lock to the next size step — never a rogue pixel.
A cell asks the parent its width, not the viewport.
Fan-out actions with origin modes — first, center, edges, random.
A visual JS designer for the parts that resist tokens.
Components stay layout-only; colour flows from context.
Layers, ruler, draggable keyframes — Flash DNA for the modern web.
data-cells="12"Galaxies set palette, nebulas tune contrast, constellations decide hierarchy. Cells inherit the conversation.
// surface-aware .card { background: var(--bg-elev); color: var(--ink); border: 1px solid var(--line); } // reads tier from parent @container style(--tier: high) { .card { background: var(--bg-accent); } }
Shipped surfaces vs last cycle.
A live view of every token in flight.
six contributors this cycle.
API surfaceA bento grid is a host (data-cells) with .lsd-bento__cell children declaring data-area. The grid's grid-template-areas map decides placement; cells never carry layout coordinates of their own. Container queries collapse the map at 700px and again at 440px.
| Hook | Values | Effect |
|---|---|---|
data-cells | 6 · 9 · 12 | Picks a layout DNA. Add your own by extending the CSS map. |
data-area | area-name | Slots the cell into the named region. |
data-tier | elevated · high | Surface-tier styling — quiet lift or directional accent. |
--i | integer | Stagger index. Author it inline; the keyframe multiplies by 60ms. |
--bento-radius | length | Per-host corner rounding. |
--bento-pad | length | Per-cell internal padding. |
.is-revealed on host | — | IO toggles this; CSS plays the staggered entrance. |
prefers-reduced-motion | — | Stagger and hover-lift drop. Layout, content, tier all remain. |
<div class="lsd-bento" data-cells="6"> <article class="lsd-bento__cell" data-area="hero" data-tier="high" style="--i: 0;"> … </article> <article class="lsd-bento__cell" data-area="stat" data-tier="elevated" style="--i: 1;"> … </article> <article class="lsd-bento__cell" data-area="chart" data-tier="elevated" style="--i: 2;"> … </article> <article class="lsd-bento__cell" data-area="media" style="--i: 3;"> … </article> <article class="lsd-bento__cell" data-area="cta" data-tier="elevated" style="--i: 4;"> … </article> </div>