Horizontal or vertical resizable panels (nestable) separated by handles: pointer drag, arrow keys, min/max sizes in %, double-click collapse with snapping, persisted in localStorage.
Split axis (vertical: the group takes its parent’s height).
storage-key
string
Persists sizes in localStorage (key “mv-resizable:<value>”).
step
number
5
Keyboard step in % (Shift: ×2).
disabled
boolean
Locks the sizes.
data-size (panel)
number
Initial size in % (the rest is shared).
data-min / data-max (panel)
number
Bounds in %.
data-collapsible (panel)
boolean
Collapsible (double-click / Enter on the handle, or drag below half the min).
data-collapsed-size (panel)
number
0
Collapsed size in %.
data-label (panel)
string
Name used in the handle’s label (“Resize the explorer”).
grip (handle)
boolean
Shows a visible grip in the middle of the handle.
Properties
Name
Type
Description
sizes
number[]
Current sizes in % (setting it = setSizes).
panels
HTMLElement[]
Panels (read-only).
Methods
Name
Description
setSizes(sizes, { animate })
Applies sizes (normalized to 100).
collapse(index) / expand(index)
Collapses or restores a collapsible panel (animated).
Events
Name
Description
mv-resize
detail: { sizes } while resizing.
mv-resize-end
detail: { sizes } on pointer release.
Content structure
Name
Description
children
Panels (any direct child) separated by <mv-resizable-handle> or [data-handle].
CSS classes
Name
Description
mv-resizable-panel / -handle / -grip
Parts; data-collapsed on a collapsed panel, data-dragging on the group.
CSS variables
Name
Default
Description
--mv-resizable-handle-color
var(--mv-border)
Line color.
--mv-resizable-handle-active
var(--mv-accent)
Color on hover / focus / drag.
Accessibility
APG “Window Splitter” pattern: each handle is a focusable role=separator, aria-orientation perpendicular to the axis, aria-valuenow/min/max = size in % of the previous panel, aria-controls pointing to that panel, named “Resize <data-label>”. ←/→ (↑/↓ when vertical) adjust, Home/End jump to the bounds, Enter collapses/restores. Enlarged hit area (10 px) for the pointer, touch-action: none for touch.