--void — overlay backdrop
Main content area
This demonstrates the sidebar + main content layout pattern. The sidebar is sticky on larger screens and collapses on mobile.
A layered component library built for precision, structure, and performance. Five surface levels, eight hue tracks and a hairline for every boundary — every specimen below is live.
Hierarchy is not decoration, it is structure. Six surface levels run from the darkest void all the way up to surface-3, with an inset well layer darker than the page hung off the side — each step differs by only a little lightness, yet that is enough for the boundary to be read.
--void — overlay backdrop
--base — page · band--base
--surface-1 — panels · cards
--surface-2 — headers · controls
--surface-3 — tracks · hover
--inset — wells · code
[*] Panel mapping: thin / medium → surface-1, heavy / elevated → surface-2. A border and a shadow never appear together on a static surface — with both present, the boundary goes muddy.
var(--base)
var(--surface-1)
hue 5% + surface-1
hue 4% + base
var(--inset)
64px grid on base
--h-indigo
--h-blue
--h-cyan
--h-teal
--h-emerald
--h-amber
--h-rose
--h-purple
Components are split into four layers by responsibility: those that carry surface, structure, interaction and feedback. The layer split is what decides whether a component can be reused — the higher the layer, the fewer its members; the lower the layer, the more general it is.
Panel · Card · StatCard · GlassTable · ListGroup · Meter
Band · SectionHeading · SpecList · KeyCap · CodeBlock · Terminal
Button · Modal · Toast · Tooltip · Dropdown · Tabs · CommandPalette
Alert · Progress · Spinner · Skeleton · Empty · Badge · StatusIndicator
[*] The monospace annotation layer (.micro / .note / .fig) is the system's second voice: it carries specs, numbering and readouts, and every number that can change is aligned with tabular-nums.
The first principle for form controls is uniform height with a visible focus state. Every control is 36px tall with a 10px radius and a 1px hairline border; on focus the border switches to the accent colour plus a 3px soft ring.
[*] The track and the knob are drawn entirely in CSS (the label's ::before / ::after), so the component adds no extra DOM. The track is 34 × 20, the knob 14px travelling 14px, and only transform and background take part in the transition.
Tables, lists and cards share one hairline language: a 1px outer frame, with only the fainter line-faint left between rows — no zebra stripes, no lifted cards. The data finds its own rhythm.
| Name | Role | Status | Last Active |
|---|---|---|---|
| Alice Chen | Administrator | Online | Just now |
| Bob Martinez | Editor | Away | 12 min ago |
| Carol Wu | Viewer | Offline | 3 hours ago |
| David Kim | Developer | Online | 5 min ago |
[*] Headers use the monospace uppercase micro face; clicking a header lets StrataRuntime sort it and write aria-sort, rotating the arrow 180°. The headers themselves are Tab-focusable, and both Enter and Space trigger them.
High-performance rendering core with sub-millisecond latency.
Real-time data synchronization across distributed nodes.
Encrypted storage with zero-knowledge proof authentication.
[*] The track is 5px with a pill radius on a surface-3 base; the fill takes the hue of the band it sits in (--hue), so the same Meter recolours itself from section to section.
The native date controls keep the browser's own picker and only unify height, padding and text colour; the calendar is the one hand-built grid here, its cells aligned with 10px monospace digits.
Overlays are the only place on the page where a shadow is allowed — static surfaces lean on borders, and only a layer that genuinely floats uses shadow to spell out its volume. Everything is driven by data-strata-* attributes; the page ships not one line of JS.
[*] The menu starts at 208px wide, radius 14, on a surface-2 base with a line-strong border and --shadow-pop; clicking outside or pressing Esc dismisses it and hands focus back to the trigger.
Connect a Postgres instance and Strata will chart it automatically.
Sidebar plus main content is the most common page skeleton: the sidebar sticks on wide screens and drops back into the document flow on narrow ones, the collapse button is injected by the runtime, and the collapsed state keeps only two-digit monospace numbering.
[*] Lines are 9px tall, the title 13px and 42% wide, radius 4px, on a surface-3 base, with a line-faint gradient sweeping across. The whole skeleton is aria-hidden and paired with sr-only copy, so screen readers never announce hollow content.
A media frame is a 16:9 container over a thin gradient ground, and the play key is the only round, floating element here. The carousel dots keep active in sync with aria-current and stay keyboard reachable.
The horizontal scroll container tucks its content into a focusable region: once it has focus the arrow keys scroll it, and the scrollbar itself belongs to the hairline language.
Scroll horizontally →
More content
Keep scrolling
Keep going
Still there
Nearly done
Almost there
Last one!
Loading and status feedback run entirely on semantic colour: the four steps ok / warn / err / info appear only on the 2px rail, the icon and the text — never as a full fill.
[*] The track is a 5px pill; the determinate state writes aria-valuenow, the indeterminate state omits it and lets a 35%-wide highlight slide along the track.
The toolbar is a row of equal-height 26px icon buttons that signal their pressed state through active and aria-pressed; dividers are just a 1px hairline, never a background block grouping.
[*] Buttons are 26px tall with a 6px radius and 0 9px padding; the pressed state is written back to aria-pressed, so keyboard users and screen reader users see the same state.
The monospace face is the system's second voice: code blocks, terminals, keycaps and spec lists all share the same 12px monospace scale. Long-form text borrows the same primitives but obeys reading rhythm rather than a layout grid.
<!-- interactions are declared with data-strata-* attributes --><label class="input-label" for="email">Email</label><input class="input-field input-error" type="email" id="email" name="email" value="invalid-email" aria-invalid="true" aria-describedby="email-error" /><span class="input-error-text" id="email-error"> Please enter a valid email address</span> <button class="btn btn-primary" type="button" data-strata-open="demoModal">Open modal</button> <button class="btn btn-outline" type="button" data-strata-toast="Action completed successfully!"> Show toast</button>
/* surface ramp - structure is carried by value + hairline */html.strata-root { --base: #060b14; --surface-1: #0b111f; --surface-3: #161f33; --inset: #04070f; --line: rgba(255,255,255,.09); --line-strong: rgba(255,255,255,.17); --accent: #3b82f6;} /* hover swaps colour, never tweens it */.strata .btn { transition: transform var(--duration-fast) var(--ease); }.strata .btn-primary:hover { background: var(--accent-hi); }
import type { BandTreatment, BandHue } from '../types/strata'; /** Adjacent bands never share a background - the runtime reuses this table. */const VALID_NEIGHBOURS: Record<BandTreatment, BandTreatment[]> = { hero: ['tinted', 'base', 'well', 'raised'], grid: ['tinted', 'base', 'well', 'raised'], tinted: ['base', 'well', 'raised', 'inset'], base: ['well', 'raised', 'inset', 'tinted'], well: ['raised', 'inset', 'tinted', 'base'], raised: ['inset', 'tinted', 'base', 'well'], inset: ['tinted', 'base', 'well', 'raised'],}; export function assertOrder(order: { hue: BandHue; treatment: BandTreatment }[]) { for (let i = 1; i < order.length; i++) { const prev = order[i - 1]!; const next = order[i]!; if (prev.treatment === next.treatment) { throw new Error(next.treatment + ' touches ' + prev.treatment + ' at band ' + i); } if (!VALID_NEIGHBOURS[prev.treatment]!.includes(next.treatment)) { throw new Error(next.treatment + ' is not a valid neighbour at band ' + i); } } return true;}
[*] All three render through the code prop: automatic escaping, zero-padded line numbers, and a copy button in the top-right corner (it echoes back for 1.6s). The code block sits on --inset, the darkest surface on the page, defined by a border rather than a shadow.
"Design is not just what it looks like and feels like. Design is how it works — especially at the edge of tomorrow."
Every surface is composited from three parts: a
flat background, a hairline border, and the text layer on top.
The stacking order is what keeps text legible —
a single blurred backdrop the surface ramp plus one 1px line
does the heavy lifting.
Start from --base #060b14 and step up through
--surface-1 to --surface-3, then add
--inset for anything that should read as a well.
See Feedback for the status colours,
or press ⌘ + K to search design tokens.
A single 1px border at rgba(255,255,255,0.09) is enough to
separate a panel from the deep background. Underlines stay
reserved for inline annotations, never decoration.
Documents borrow the same primitives as UI but follow reading rhythm instead of layout grids — lists, quotes and figures slot straight into the flow:
Open items can render as checkable tasks:
"A hairline is not a decoration — it is the contract between background and foreground."
The navbar is hidden — restore it here any time