// Layout tour. Route: /layout // // One page built out of the layout set, rather than showing each piece alone: // // PublicPageShell the outer shell, holding the page background // Section each band down the page, with its own spacing and tint // SectionHeader the eyebrow, heading and description of each band // Container the reading width // Grid the card deck, including an auto-fit track // Columns the coarse two-way split // LayoutSplitter a resizable pane, by drag or by arrow key // CustomScrollbar a themed scrolling region // Divider the rules between bands // Typography the prose column // Image, Link, Kbd the smaller pieces inside it // // CustomScrollbar sits beside the splitter rather than inside a pane of it: a // component tag nested in another component slot is dropped, and only its // children survive. // // The splitter does not report into a status line here. It emits a sizeChange // output and the component does fire it, but a parent binding on the tag is // not invoked, so wiring one up would show something that never updates. page LayoutTour { layout = "public" seo { title = "Layout tour" description = "Every layout component working together on one page." } view {

Fixed columns

Three tracks on a wide screen, two on a tablet, one on a phone.

Themed

Every surface here is a theme token, so light and dark both work.

No Tailwind

These components carry their own styles and no longer need it.

One

Two

Three

Four

Five

Prose

Typography caps the measure so a line never runs too long to follow. Inside it you get the smaller pieces: a to somewhere else, and for a shortcut.

Placeholder artwork

Drag the divider, or focus it and use the arrow keys. Home and End go to the bounds. The live value is on the handle itself, as aria-valuenow, which is what a screen reader announces.

Start pane

Drag the divider, or focus it and use the arrow keys. Home and End go to the bounds.

End pane

The size is resolved in the runtime and written onto the container, so the panes are plain grid tracks.

This region scrolls, and its scrollbar follows the theme.

Scrollbar appearance is CSS rather than script.

scrollbar-width and scrollbar-color are the standard properties.

The webkit rules cover the engines that still need them.

Enough lines here that the region actually overflows.

Otherwise there would be no scrollbar to look at.

Which is the mistake the showcase demo made first time.

} style { .tour-card { padding: 1rem; border: 1px solid var(--wire-color-border); border-radius: var(--wire-radius-md); background: var(--wire-color-surface); } .tour-card h4, .tour-pane h4 { margin: 0 0 0.35rem; font-size: 0.95rem; font-weight: 700; } .tour-card p, .tour-pane p, .tour-scroll p { margin: 0; color: var(--wire-color-text-muted); font-size: 0.86rem; line-height: 1.6; } .tour-card--compact { text-align: center; } .tour-status { margin: 0 0 0.75rem; padding: 0.5rem 0.75rem; border: 1px solid var(--wire-color-border); border-radius: var(--wire-radius-sm); background: var(--wire-color-surface-soft); color: var(--wire-color-text-muted); font-size: 0.82rem; } .tour-pane { padding: 1rem; } .tour-scroll { display: grid; gap: 0.6rem; padding: 0.75rem; } /* The splitter panes need a floor or they collapse to their text. */ .tour-pane, .tour-scroll { min-height: 8rem; } } }