Components · Layout

Split View

The canonical master–detail layout: a selectable list on the left, its detail on the right, split by a draggable hairline divider. Drag the divider or focus it and nudge with ←/→ (Home/End jump to the min/max); double-click or press Enter to collapse a pane to zero and reflow the other. Sizes persist to localStorage, and below the md breakpoint the split folds into a stack.

Live split · Roster → Rescuer  ·  divider pinned to its drag state

Roster128
Rescuer#4127

Priya Raman

Foster coordinator · Harbor Foster Network

Active
Harbor Foster Network Oakland, CA 14 active fosters
Phone(510) 555-0148
JoinedMar 2, 2024 · 2y 4m
Last activeToday, 8:12 AM
CoverageEast Bay · weekends + evenings
AgreementSigned v2 · Jun 30, 2026
Intake note. Runs the Harbor foster onboarding cohort; can take medical-hold beagles and short-notice weekend transport to the Sacramento vet partner. Prefers WhatsApp for same-day dispatch.
Drag the divider, or focus it and press · Enter collapses this pane.
Selected list row
The active option gets the accent-soft fill + a 3px accent rail and aria-selected="true" — exactly one is selected, and it drives the detail pane. Hover fills --surface-2; focus shows the ring.
Divider & grip
A 1px hairline over a wider hit area; on hover / focus / drag it turns accent and floats a --surface-2 grip chip. role="separator", tabindex=0, aria-valuenow = leading pane %.
Resize
Pointer drag (with capture) or the keyboard: ←/→ nudge by step %, Home/End snap to this pane's minSize / max. Sizes are flex weights, so the panes reflow proportionally.
Collapse to zero
A collapsible pane folds to weight 0 on double-click (or Enter on the bordering separator) and the sibling fills the gap; press again to restore. The collapse animates unless prefers-reduced-motion.
Persisted layout
With a persistKey the sizes + which panes are collapsed are written to localStorage — resize, reload, and the split comes back where you left it.
Mobile stack
Below md (useIsMobile) the row split is abandoned: the primary pane leads in flow and any collapsible ("auxiliary") pane becomes a closed disclosure drawer.

Source · SplitView.tsx — the hand-rolled N-pane engine (pointer-drag + arrow-key role="separator" handles, collapse-to-zero, localStorage persistence, mobile stack), and PaneLayout.tsx — the start/primary/end preset over it. Both compose the Surface primitive (the clipped radius-lg frame) and add no split-pane dependency. Panes layer --surface (list) under --surface-2 (detail); the selected-row treatment mirrors PortalSidebar's active rail.