Skip to content

Resizable

<loomi-resizable-panel-group> lays out resizable panels separated by draggable handles — similar to shadcn/ui Resizable.

Terminal window
npm install @loomidev/resizable lit
import "@loomidev/resizable";
One
Two
<loomi-resizable-panel-group style="height:200px;max-width:24rem;border:1px solid var(--loomi-surface-border);border-radius:0.5rem">
<loomi-resizable-panel default-size="50%">
<div style="display:flex;height:100%;align-items:center;justify-content:center">One</div>
</loomi-resizable-panel>
<loomi-resizable-handle with-handle></loomi-resizable-handle>
<loomi-resizable-panel default-size="50%">
<div style="display:flex;height:100%;align-items:center;justify-content:center">Two</div>
</loomi-resizable-panel>
</loomi-resizable-panel-group>
Header Content
<loomi-resizable-panel-group orientation="vertical" style="height:200px;max-width:24rem">
<loomi-resizable-panel default-size="25%">Header</loomi-resizable-panel>
<loomi-resizable-handle></loomi-resizable-handle>
<loomi-resizable-panel default-size="75%">Content</loomi-resizable-panel>
</loomi-resizable-panel-group>
One Two Three
<loomi-resizable-panel-group style="height:200px">
<loomi-resizable-panel default-size="50%">One</loomi-resizable-panel>
<loomi-resizable-handle with-handle></loomi-resizable-handle>
<loomi-resizable-panel default-size="50%">
<loomi-resizable-panel-group orientation="vertical" style="height:100%">
<loomi-resizable-panel default-size="25%">Two</loomi-resizable-panel>
<loomi-resizable-handle with-handle></loomi-resizable-handle>
<loomi-resizable-panel default-size="75%">Three</loomi-resizable-panel>
</loomi-resizable-panel-group>
</loomi-resizable-panel>
</loomi-resizable-panel-group>

Set auto-save-id on a group to store panel sizes in localStorage. Provide panel-id on each panel you want persisted.

Sidebar Main
<loomi-resizable-panel-group auto-save-id="sidebar-layout" style="height:100vh">
<loomi-resizable-panel panel-id="sidebar" default-size="20" min-size="15" max-size="40">
Sidebar
</loomi-resizable-panel>
<loomi-resizable-handle with-handle></loomi-resizable-handle>
<loomi-resizable-panel panel-id="main">Main</loomi-resizable-panel>
</loomi-resizable-panel-group>

For the library-wide baseline, see Foundations — Accessibility.

For the shared container and viewport rules, see Foundations — Responsive behavior.

For theme activation, token overrides, and contrast guidance, see Foundations — Dark mode.

AttributeDefaultDescription
orientationhorizontalhorizontal or vertical.
auto-save-id(blank)Persist layout in localStorage.
AttributeDefaultDescription
default-size(even split)Initial size (50 or 50%).
min-size0Minimum size percentage.
max-size100Maximum size percentage.
collapsiblefalseDouble-click adjacent handle to collapse.
collapsed-size0Size when collapsed.
collapsedfalseCollapse state.
panel-id(blank)Id for layout events and persistence.
AttributeDefaultDescription
with-handlefalseShow a visible grip icon.
disabledfalseDisable dragging.

Keyboard: focus a handle and use arrow keys (hold Shift for larger steps).

SlotDescription
(default)Content placed inside the component.

Listen for loomi-layout-change on the group:

group.addEventListener("loomi-layout-change", (event) => {
console.log(event.detail.sizes, event.detail.layout);
});
  • @loomidev/core