Splitter
Splitter creates resizable panels for workspace-style layouts.
@duskmoon-dev/components/splitter Usage
When to use
- Use it to build predictable page, toolbar, panel, or grid structure.
- Keep layout primitives responsible for geometry and let child components own behavior.
Implementation notes
Features
Documents spacing, responsive behavior, and nested regions used to build larger screens.
Examples keep predictable dimensions so the surrounding UI does not jump while content changes.
Splitter is most often configured through `layout`, `sizes`, `defaultSizes`, `onResize`.
Renders horizontal panels with default sizes
Feature Demos
Feature demos are authored for the component page, then supplemented with behavior scenarios from the component test coverage.
Basic usage
Import the component stylesheet and Splitter from its package subpath, then render it with the core props.
import "@duskmoon-dev/components/styles.css";
import { Splitter } from "@duskmoon-dev/components/splitter";
export function Example() {
return (<Splitter
defaultSizes={[180, "1fr"]}
style={{ width: "100%" }}
>
<Splitter.Panel>Navigation</Splitter.Panel>
<Splitter.Panel>Workspace</Splitter.Panel>
</Splitter>);
} Renders horizontal panels with default sizes
test-backedSplitter scenario from the component test coverage: renders horizontal panels with default sizes.
import "@duskmoon-dev/components/styles.css";
import { Splitter } from "@duskmoon-dev/components/splitter";
export function SplitterRendersHorizontalPanelsWithDemo() {
return (<Splitter
defaultSizes={[180, "1fr"]}
style={{ width: "100%" }}
>
<Splitter.Panel>Navigation</Splitter.Panel>
<Splitter.Panel>Workspace</Splitter.Panel>
</Splitter>);
} Supports vertical layout and controlled sizes
test-backedSplitter scenario from the component test coverage: supports vertical layout and controlled sizes.
import "@duskmoon-dev/components/styles.css";
import { Splitter } from "@duskmoon-dev/components/splitter";
export function SplitterSupportsVerticalLayoutAndDemo() {
return (<Splitter
defaultSizes={[180, "1fr"]}
style={{ width: "100%" }}
>
<Splitter.Panel>Navigation</Splitter.Panel>
<Splitter.Panel>Workspace</Splitter.Panel>
</Splitter>);
} Resizes uncontrolled numeric panels
test-backedSplitter scenario from the component test coverage: resizes uncontrolled numeric panels.
import "@duskmoon-dev/components/styles.css";
import { Splitter } from "@duskmoon-dev/components/splitter";
export function SplitterResizesUncontrolledNumericPanelsDemo() {
return (<Splitter
defaultSizes={[180, "1fr"]}
style={{ width: "100%" }}
>
<Splitter.Panel>Navigation</Splitter.Panel>
<Splitter.Panel>Workspace</Splitter.Panel>
</Splitter>);
} Collapses and expands collapsible panels
test-backedSplitter scenario from the component test coverage: collapses and expands collapsible panels.
import "@duskmoon-dev/components/styles.css";
import { Splitter } from "@duskmoon-dev/components/splitter";
export function SplitterCollapsesAndExpandsCollapsibleDemo() {
return (<Splitter
defaultSizes={[180, "1fr"]}
style={{ width: "100%" }}
>
<Splitter.Panel>Navigation</Splitter.Panel>
<Splitter.Panel>Workspace</Splitter.Panel>
</Splitter>);
} Disables handle when adjacent panel is not resizable
test-backedSplitter scenario from the component test coverage: disables handle when adjacent panel is not resizable.
import "@duskmoon-dev/components/styles.css";
import { Splitter } from "@duskmoon-dev/components/splitter";
export function SplitterDisablesHandleWhenAdjacentDemo() {
return (<Splitter
defaultSizes={[180, "1fr"]}
style={{ width: "100%" }}
>
<Splitter.Panel>Navigation</Splitter.Panel>
<Splitter.Panel>Workspace</Splitter.Panel>
</Splitter>);
} Theme aware
Docs previews inherit the DuskMoon data-theme value. Use the header switch to compare light and dark rendering.
<div data-theme="sunshine">
<Splitter
defaultSizes={[180, "1fr"]}
style={{ width: "100%" }}
>
<Splitter.Panel>Navigation</Splitter.Panel>
<Splitter.Panel>Workspace</Splitter.Panel>
</Splitter>
</div>
<div data-theme="moonlight">
<Splitter
defaultSizes={[180, "1fr"]}
style={{ width: "100%" }}
>
<Splitter.Panel>Navigation</Splitter.Panel>
<Splitter.Panel>Workspace</Splitter.Panel>
</Splitter>
</div> API
The API reference below lists every parsed exported type or interface for Splitter. Start with `layout`, `sizes`, `defaultSizes`, `onResize` for common usage.
packages/components/src/components/splitter/Splitter.types.ts
Scenarios: packages/components/src/components/splitter/Splitter.test.tsx | Prop | Type | Required | Description |
|---|---|---|---|
layout | SplitterLayout | No | layout configures Splitter. |
sizes | SplitterSize[] | No | sizes configures Splitter. |
defaultSizes | SplitterSize[] | No | defaultSizes configures Splitter. |
onResize | (sizes: SplitterSize[], info: SplitterResizeInfo) => void | No | onResize configures Splitter. |
| Prop | Type | Required | Description |
|---|---|---|---|
sizes | SplitterSize[] | Yes | sizes configures Splitter. |
| Prop | Type | Required | Description |
|---|---|---|---|
children | ReactNode | No | children configures Splitter. |
defaultSize | SplitterSize | No | defaultSize configures Splitter. |
size | SplitterSize | No | size configures Splitter. |
min | SplitterSize | No | min configures Splitter. |
max | SplitterSize | No | max configures Splitter. |
collapsible | boolean | No | collapsible configures Splitter. |
collapsed | boolean | No | collapsed configures Splitter. |
defaultCollapsed | boolean | No | defaultCollapsed configures Splitter. |
resizable | boolean | No | resizable configures Splitter. |
onCollapse | (collapsed: boolean) => void | No | onCollapse configures Splitter. |
style | CSSProperties | No | style configures Splitter. |
"horizontal" | "vertical" number | string ForwardRefExoticComponent< SplitterPanelProps & RefAttributes<HTMLDivElement> > ForwardRefExoticComponent< SplitterProps & RefAttributes<HTMLDivElement> > & { Panel: SplitterPanelComponent