Skip to content

API reference

The full Resizable surface: props, the two-way size model, the resize event, the imperative handle, and the three slots. For the per-framework consumption code see the usage page; for the live widget see the demo.

Props

The full prop surface. size is the sole model: true prop — the first panel's percent of the container along the split axis — so the Angular output emits a ControlValueAccessor (the splitter position is a form control). disabled defaults false (negative opt-out).

NameTypeDefaultTwo-way (model)RequiredDescription
sizeNumber50The first (start) panel's size as a percent of the container along the split axis (its width when direction="horizontal", its height when "vertical"). Two-way via r-model:size. As the sole model: true prop it drives the Angular ControlValueAccessor, so the splitter position is a form control ([(ngModel)] / [formControl] bind directly). Every commit (drag, keyboard, or a programmatic applySize) is clamped to [min, max] and written back.
directionString"horizontal"The split axis. 'horizontal' (default) lays the two panels out side-by-side with a vertical drag handle between them (size is the first panel's width); 'vertical' stacks them with a horizontal handle (size is the first panel's height). Also sets the handle's aria-orientation.
minNumber10The minimum size percent — the first panel can never be dragged or nudged below this. Clamps every commit.
maxNumber90The maximum size percent — the first panel can never be dragged or nudged beyond this (so the second panel keeps at least 100 - max percent). Clamps every commit.
disabledBooleanfalseDisable resizing — the handle becomes non-interactive (pointer drag and keyboard are ignored) and the panels lock at the current size. Also sets the Angular ControlValueAccessor disabled state.

Events

The single resize event fires on every committed size change — pointer drag, keyboard nudge, or a programmatic applySize / reset — so you can observe the split without two-way binding.

EventDescription
resizeFired on every committed size change (pointer drag, Arrow/Home/End keyboard nudge, or a programmatic applySize / reset). Payload { size } — the new first-panel percent, already clamped to [min, max]. Funneled through one commitSize wrapper so the React prop-destructure hoists exactly once.

Imperative handle

Declared once in the source via $expose; obtained through each framework's native ref mechanism.

MethodDescription
applySizeSet the split position programmatically to percent (the first-panel size); clamped to [min, max] and emits resize. Deliberately named applySize, not setSize — the model prop is size, so the React emitter auto-generates a setSize state setter; an $expose verb named setSize collapses onto it and trips ROZ524 (the deconfliction pass does not reach inside an $expose-verb closure). apply<X> is the listbox / data-table precedent.
resetRecentre the split to the midpoint of [min, max] (emits resize). Collision-safe — not a host-element member.

Slots

SlotParamsDescription
startThe first panel — sized to size percent along the split axis (its width when horizontal, height when vertical).
endThe second panel — takes the remaining space.
handleOptional. Replaces the default grip (a short centered bar) while keeping the drag and keyboard behavior on the wrapping role="separator" element.

On React / Solid the slots are render* props (renderStart / renderEnd / renderHandle) — the documented cross-framework slot divergence. None of the slot names equals a prop key (ROZ127 — a slot/prop name collision is a hard error because Svelte 5 collapses snippets and props into one $props() bag).

Pre-v1.0 — internal monorepo.