sheengemologic ui
All components

SplitLayout

Composes two labeled, persisted resizable panes that retain one content owner while stacking in a narrow container.@gemologic/sheen-patterns · patterns

Playground

Preview
<SplitLayout label="Editor" startLabel="Source" endLabel="Preview" handleLabel="Resize source and preview" defaultSizes={[0.4, 0.6]} start={<textarea aria-label="Source draft" />} end={<article>Preview</article>}  narrowLayout="stack" orientation="horizontal"/>

Variant matrix

Source and preview
Preview
orientation: horizontal
Preview
orientation: vertical
Preview
narrowLayout: stack
Preview
narrowLayout: split
Preview

Anatomy

Package
@gemologic/sheen-patterns
Source
packages/patterns/src/SplitLayout.tsx
Tokens
  • --sheen-color-bg
  • --sheen-color-bg-raised
  • --sheen-color-border
  • --sheen-color-border-control
  • --sheen-color-focus-ring
  • --sheen-color-focus-ring-offset

Accessibility

Role: named group containing two named scroll regions and an adjustable separatorKeyboard: Tab focuses each pane and the separator, Arrow keys resize the focused separator, Home and End move it to its bounds

Do

  • Provide server-known initial sizes and let the application persistence adapter save accepted changes.
  • Keep both content slots mounted while refreshing or crossing the narrow breakpoint.

Do not

  • Do not read storage on mount and replace server geometry.
  • Do not create a second mobile content tree.

Generated props

NameTypeDefaultDescription
label *stringAccessible name for the complete split workspace.
startLabel *stringAccessible name for the logical start pane's scroll region.
endLabel *stringAccessible name for the logical end pane's scroll region.
handleLabel *stringAccessible name for the adjustable separator.
start *JSX.ElementPersistent logical start-pane content.
end *JSX.ElementPersistent logical end-pane content.
orientation"horizontal" | "vertical"horizontalHorizontal side-by-side or vertical stacked split axis.
narrowLayout"stack" | "split"stackStacks a horizontal split below the component container breakpoint or retains resizing.
sizesreadonly number[]Controlled two-pane fractions summing to one.
defaultSizesreadonly number[]Deterministic initial two-pane fractions summing to one.
onSizesChange(sizes: readonly number[]) => voidReceives validated immutable fractions after pointer or keyboard resizing.
keyboardStepnumber0.05Fraction moved by each separator arrow-key action.
persistenceResizablePersistenceApp-owned server-known initial sizes, async save adapter, and explicit failure callback.
startMinSizenumber0.2Minimum logical start-pane fraction.
startMaxSizenumberMaximum logical start-pane fraction.
endMinSizenumber0.2Minimum logical end-pane fraction.
endMaxSizenumberMaximum logical end-pane fraction.
refreshingbooleanfalseMarks retained accepted content busy without hiding or replacing either pane.
Native Solid/HTML attributes remain available and are omitted from this authored-prop view.