Two panes split by a draggable gutter, side by side or stacked. Drag the gutter or move it with the arrow keys; ratio sets the first pane's share, minRatio keeps both panes open and collapsible lets either snap shut. Reach for it when a list and a detail view share one screen and the reader decides the split.
ratio is the first pane width as a fraction of the whole, and both panes scroll their own content. The gutter is named "Resize panes" unless the host carries its own aria-label, which wins.
1000Operating Checking$88,412.08
1200Accounts Receivable$90,740.00
2000Accounts Payable($31,204.55)
4000Service Revenue$412,880.00
1000 Operating Checking
First Harrison Bank Last reconciled Aug 31, 2026 3 unreconciled deposits
flush takes the 14 by 16 px off both panes, so a list sits against the pane edge and the divider the way an inbox does. The divider is a hairline at rest; the grab handle appears on hover, focus and drag, and the pointer has a 7 px zone either side of the line to catch.
1000 Operating Checking
First Harrison Bank Last reconciled Aug 31, 2026 3 unreconciled deposits
// setup(root): properties and events
setup(root) {
root.querySelector('#sp-flush-list').items = [
{ id: 'a', title: 'Reconcile Operating Checking', description: 'Three deposits are unmatched', meta: '9:14 AM', unread: true },
{ id: 'b', title: 'INV-1043 was viewed', description: 'Silver Hills Church opened the invoice', meta: 'Yesterday' },
{ id: 'c', title: 'Payroll posted', description: '$21,004.90 to 14 employees', meta: 'Aug 29' },
{ id: 'd', title: 'Quarterly close', description: 'Statements go out on the 5th', meta: 'Aug 28' },
];
}
Vertical
orientation="vertical" stacks the panes and ratio becomes the top pane's share of the height. The slots start and end name the panes in either orientation.
1000Operating Checking$88,412.08
1200Accounts Receivable$90,740.00
2000Accounts Payable($31,204.55)
4000Service Revenue$412,880.00
1000 Operating Checking
First Harrison Bank Last reconciled Aug 31, 2026 3 unreconciled deposits
collapsible lets either pane snap shut: drag past half of min-ratio, or press an arrow key at the minimum, and the pane closes; the opposite key or a drag reopens it. ratio reads 0 or 1 while a pane is shut.
// setup(root): properties and events
setup(root) {
const log = root.querySelector('#sp-collapse-log');
root.querySelector('#sp-collapse').addEventListener('suiResizeEnd', (e) => {
const r = e.detail;
log.textContent = r === 0 ? 'List shut. Press the arrow key that points into the editor on the gutter to reopen it.' : r === 1 ? 'Editor shut. Press the arrow key that points into the list on the gutter to reopen it.' : `Both panes open at ${Math.round(r * 100)} percent.`;
});
}
Starting ratio and minimum
min-ratio clamps both sides, so neither pane can be dragged shut. A min-ratio above 0.5 is clamped to 0.5.
Starts at 25 percent, floors at 20.
1000 Operating Checking
First Harrison Bank Last reconciled Aug 31, 2026 3 unreconciled deposits
Starts even, moves only between 40 and 60 percent.
Use a tight range when both panes hold a form.
<div style="display:flex;flex-direction:column;gap:12px">
<sui-splitter ratio="0.25" min-ratio="0.2" height="120" aria-label="Narrow list and detail">
<div slot="start" style="font-size:13px;color:var(--ink-muted)">Starts at 25 percent, floors at 20.</div>
<div slot="end">
<div style="font-weight:620;font-size:13px;margin-bottom:6px">1000 Operating Checking</div>
<div style="font-size:13px;color:var(--ink-muted);line-height:1.7">First Harrison Bank<br>Last reconciled Aug 31, 2026<br>3 unreconciled deposits</div>
</div>
</sui-splitter>
<sui-splitter ratio="0.5" min-ratio="0.4" height="120" aria-label="Even split with a tight range">
<div slot="start" style="font-size:13px;color:var(--ink-muted)">Starts even, moves only between 40 and 60 percent.</div>
<div slot="end" style="font-size:13px;color:var(--ink-muted)">Use a tight range when both panes hold a form.</div>
</sui-splitter>
</div>
Drag and key events
suiResize fires on every drag step and key press; suiResizeEnd fires on release, or at once on a key press, so do the costly relayout there. Neither bubbles, so a nested splitter never reports as the outer one. The gutter is a focusable separator with aria-orientation and aria-valuenow in percent.
1000Operating Checking$88,412.08
1200Accounts Receivable$90,740.00
2000Accounts Payable($31,204.55)
4000Service Revenue$412,880.00
1000 Operating Checking
First Harrison Bank Last reconciled Aug 31, 2026 3 unreconciled deposits
Drag the gutter, or focus it and press the arrow keys.
A splitter in a pane gives a third column, and a vertical one inside a horizontal one gives an editor with a console. Name each one, because two unnamed gutters read alike.
1000Operating Checking$88,412.08
1200Accounts Receivable$90,740.00
2000Accounts Payable($31,204.55)
4000Service Revenue$412,880.00
1000 Operating Checking
First Harrison Bank Last reconciled Aug 31, 2026 3 unreconciled deposits
Moves focus to the gutter. A pane whose content outgrows it is a tab stop too, so the arrow keys and Page keys can scroll it; a pane that fits adds no stop. A shut pane leaves the gutter where it was.
ArrowLeftArrowRight
Move a side-by-side gutter 2 percent toward the first or the second pane and commit at once. Under dir="rtl" the first pane is on the right, so the keys swap with it. Ignored when vertical.
ArrowUpArrowDown
Move a vertical gutter 2 percent and commit at once. Ignored when side by side.
Home
Moves the gutter to the smallest first pane min-ratio allows, or shuts the first pane when collapsible.
End
Moves the gutter to the largest first pane min-ratio allows, or shuts the second pane when collapsible.
Arrow toward a shut pane
Reopens it to the share it had. With collapsible, an arrow pressed at min-ratio shuts the pane.
API
<sui-splitter>
Properties
Property
Attribute
Type
Default
Description
collapsible
collapsible
boolean
false
Lets either pane snap shut. A drag past half of minRatio closes the pane, a key press at minRatio closes it, and the opposite key reopens it to the share it had. ratio reads 0 or 1 while a pane is shut. Reflected.
flush
flush
boolean
false
Takes the panes' padding off (it is 14px by 16px), for a list or a table that should sit against the pane edge and the divider, as an inbox does. Reflected.
height
height
number
220
Height of the splitter in px.
minRatio
min-ratio
number
0.2
Smallest share either pane may shrink to. Values above 0.5 clamp to 0.5. With collapsible, a pane pushed past half of this snaps shut instead.
orientation
orientation
"horizontal" | "vertical"
'horizontal'
horizontal puts the panes side by side with a gutter that moves left and right; vertical stacks them with a gutter that moves up and down.
ratio
ratio
number
0.5
Share of the whole the first pane takes (0 to 1): its width side by side, its height when vertical. Seeds the split (the reference defaultRatio) and tracks it afterwards.
Events
Event
Detail
React
Vue
Description
suiResize
number
onSuiResize
@sui-resize
Fires while the gutter moves (every drag step and every key press); detail is the new ratio. Does not bubble, so a splitter inside a pane never reports as the outer one.
suiResizeEnd
number
onSuiResizeEnd
@sui-resize-end
Fires when a resize commits: on pointer release, or straight away on a key press. Detail is the new ratio. Do the expensive work, such as re-laying out a chart or a virtualized table, here. Does not bubble.
Methods
Method
Signature
Description
setFocus()
setFocus() => Promise<void>
Moves keyboard focus to the gutter, the splitter's own tab stop, from which the arrow keys move the split.
Slots
Slot
Description
end
Second pane: at the inline-end, or bottom when vertical.
start
First pane: at the inline-start (the left, or the right under dir="rtl"), or top when vertical.
Theming
Every design token this element can render with, read from its own stylesheets and the ones it imports. Set a token on :root or on any ancestor and every use below follows it. The values shown are the ones in the theme you are viewing. The list is read per stylesheet, so an element that imports a shared drawing module lists that module's tokens too, whether or not it paints with all of them.