unstale

npm / react-resizable-panels

react-resizable-panels

What changed in react-resizable-panels 4, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-17.

12 breaking2 deprecations22 new APIs and options4 performance16 behavior and defaults68 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.1.0 on npm

react-resizable-panels 4124 changes

Breaking changes 12

  • useDefaultGridLayout now persists the requested layout instead of the constrained layout.

    4.14.1release notes

  • useDefaultLayout now persists the requested layout instead of the constrained layout.

    4.14.1release notes

  • Separator no longer retains focus after a drag.

    4.13.2release notes

  • Panel replaces the aria-disabled attribute with data-disabled.

    4.7.6release notes

  • Adds a new Group callback for layout changes.

    4.4.0release notes

  • Pointer-event layout changes trigger the callback only after the pointer is released, reducing callback frequency for tasks like saving layouts.

    4.4.0release notes

  • Persistent layouts no longer use PanelGroup autoSaveId directly.

    4.0.0release notes

  • PanelGroup was renamed to Group to align with the version 4 API.

    4.0.0release notes

  • PanelGroup was replaced by Group in version 4.

    4.0.0release notes

  • PanelResizeHandle was replaced by Separator in version 4.

    4.0.0release notes

  • useGroupRef replaces the imperative group ref type and creates a group reference.

    4.0.0release notes

  • usePanelRef replaces the imperative panel ref type and creates a panel reference.

    4.0.0release notes

Deprecations 2

  • The previous callback remains supported but is marked deprecated.

    4.4.0release notes

  • The groupId parameter is deprecated in favor of id because the Group does not need a matching id.

    4.0.13release notes

New APIs and options 22

  • onLayoutChanged metadata now includes requestedLayout, exposing the layout requested before constraints were applied.

    4.14.1release notes

  • Adds cells that can span multiple columns and rows in resizable two-dimensional layouts.

    4.14.0release notes

  • Adds Grid components for resizable two-dimensional layouts with row and column size constraints.

    4.14.0release notes

  • Adds optional gridlines that can span subsets of tracks to avoid spanning cells.

    4.14.0release notes

  • Adds a hook for default grid layout behavior.

    4.14.0release notes

  • Adds a callback ref hook for grids.

    4.14.0release notes

  • Adds a ref hook for grids.

    4.14.0release notes

  • Panels now support a configurable collapse threshold.

    4.13.0release notes

  • Resize preview mode is now customizable.

    4.13.0release notes

  • The callback now receives meta information indicating whether resizing was triggered by direct keyboard or mouse input.

    4.12.0release notes

  • The hook can now save layouts only when directly triggered by user interactions.

    4.12.0release notes

  • Adds a prop to turn off the double-click size reset behavior.

    4.9.0release notes

  • Automatically migrates legacy layouts to version 4 format, easing upgrades for existing persisted layouts.

    4.8.0release notes

  • Adds a Panel prop that lets panels retain their current pixel size when the parent Group is resized.

    4.7.0release notes

  • Panel and Separator components can now be disabled.

    4.6.0release notes

  • Group, Panel, and Separator components now expose displayName for a better debugging experience.

    4.2.1release notes

  • The onResize callback now receives prevPanelSize, simplifying collapse and expand detection.

    4.2.0release notes

  • The GroupImperativeHandle type is now exported for developers to use in application code.

    4.0.2release notes

  • The PanelImperativeHandle type is now exported for developers to use in application code.

    4.0.2release notes

  • Group accepts groupRef for imperative access.

    4.0.0release notes

  • Panel accepts panelRef for imperative access.

    4.0.0release notes

  • useDefaultLayout provides defaultLayout and onLayoutChange for persistent layouts.

    4.0.0release notes

Performance 4

  • Available group size is calculated once per hit-testing pass instead of once per hit region.

    4.13.1release notes

  • Panel avoids unnecessary re-renders in response to mouse-hover state.

    4.5.4release notes

  • Panel now applies flex-grow inline instead of using a CSS variable on the parent Group, reducing forced reflow and improving rendering performance.

    4.3.2release notes

  • Debounces calls to storage.setItem by 150ms, reducing the frequency of storage updates.

    4.0.12release notes

Behavior and default changes 16

  • The imperative Panel API now supports non-percentage sizes.

    4.7.3release notes

  • Default overflow styles changed to support shadows.

    4.7.1release notes

  • Imperative Panel and Group APIs now explicitly override disabled status when resizing, supporting conditionally disabled groups.

    4.6.1release notes

  • Pre-collapsed panels expand when dragged past the halfway point, making collapse and expansion behavior more consistent.

    4.5.3release notes

  • Separator and Panel edge hit target size decreases by default and becomes configurable through a new Group prop.

    4.5.2release notes

  • Double-clicking a Separator resets its associated Panel to its default size when one is configured.

    4.5.0release notes

  • The hook now uses the new layout-change callback while retaining support for the old callback.

    4.4.0release notes

  • Drag interactions call event.preventDefault only for the primary button.

    4.3.0release notes

  • Group now applies default width, height, and overflow styles, which can be overridden with style.

    4.3.0release notes

  • The storage parameter now defaults to localStorage when undefined.

    4.2.2release notes

  • The hook now supports saving and restoring multiple Panel layouts.

    4.1.0release notes

  • Resizable panels can render into a different Window, such as a popup or frame, by accessing globals through the element's owner document.

    4.0.14release notes

  • Expanded support for fixed-size elements, allowing developers to use more fixed-size elements with the library.

    4.0.10release notes

  • Layout-change events are deferred when a Group is within a hidden DOM subtree, improving developer experience.

    4.0.9release notes

  • Size constraints now support pixels, percentages, REMs/EMs, and more.

    4.0.0release notes

  • Support for server-rendering, including Server Components, has been expanded.

    4.0.0release notes

Fixes and other changes 68

  • Group, Panel, Separator, Grid, and Cell only render an explicit id or data-testid as data-testid.

    4.14.5release notes

  • An empty string id now behaves like an undefined id and falls back to useId.

    4.14.5release notes

  • Panel now correctly treats 0 as an explicit id value.

    4.14.5release notes

  • Errors from layout or resize callbacks no longer leave drags stuck or prevent other groups from updating; errors are re-thrown afterward.

    4.14.4release notes

  • Pointer events across documents no longer affect groups mounted in another document, and the resize cursor is limited to the active group's document.

    4.14.4release notes

  • Interrupted drags now end and commit the current layout instead of remaining active until the next pointer event.

    4.14.3release notes

  • Panels and separators are resorted before constraints are re-derived, fixing constraint calculations.

    4.14.2release notes

  • Constraint-induced layout changes no longer permanently alter the layout; the requested layout is restored when the constraint no longer applies.

    4.14.1release notes

  • Separator behind a modal dialog can no longer be dragged.

    4.13.3release notes

  • Panel ordering is fixed in environments with invalid offset values, such as JSDom.

    4.13.2release notes

  • The default layout is respected when an initially hidden group becomes visible.

    4.13.1release notes

  • Keyboard mappings are preserved for disabled separators, fixing the “Matching panels not found” error edge case.

    4.13.1release notes

  • Layout values now match panel IDs so reordered keys map to the correct constraints.

    4.13.1release notes

  • onLayoutChanged still fires when pressing elsewhere on the page or resizing another group.

    4.13.1release notes

  • Detached Separator components no longer capture the pointer.

    4.12.4release notes

  • Separator ARIA values now use proper panel indices.

    4.12.4release notes

  • Construction is guarded to avoid throwing in unsupported environments.

    4.12.3release notes

  • An edge case involving orphaned groups during pointerup was prevented.

    4.12.3release notes

  • The equality check for derived panel constraints was fixed.

    4.12.3release notes

  • Prevents context menu events from occurring while pointer-resize is active.

    4.12.1release notes

  • Improved server rendering support for the defaultSize prop.

    4.7.5release notes

  • Fixed an edge-case bug with pointer event capture.

    4.7.4release notes

  • Separators no longer scroll when receiving focus.

    4.7.2release notes

  • Checks for undefined adoptedStyleSheets to better support environments like jsdom.

    4.6.5release notes

  • Updates the in-memory layout cache when a group is resized by double-clicking on a separator.

    4.6.5release notes

  • Fixed resize actions sometimes jumping on touch devices.

    4.6.4release notes

  • Group now guards against layouts with mis-ordered Panel id keys.

    4.6.2release notes

  • Separator now sets a not-allowed cursor when its parent Group has cursors disabled.

    4.6.1release notes

  • Click events are no longer swallowed in certain cases.

    4.5.9release notes

  • A collapsible panel bugfix was re-enabled after another reported issue was fixed.

    4.5.9release notes

  • Imperative Group.setLayout now persists the layout to the in-memory cache.

    4.5.9release notes

  • The change to collapsible panel behavior from pull request 635 was disabled due to another reported regression.

    4.5.8release notes

  • Re-enables collapsible panels that were disabled in 4.5.6.

    4.5.7release notes

  • Resets separator hover state when the document receives a pointerout event.

    4.5.7release notes

  • Disabled the earlier change to collapsible panel behavior, restoring the previous behavior.

    4.5.6release notes

  • Removed the invalid aria-orientation role from the root Group element to comply with the ARIA specification.

    4.5.5release notes

  • Fixed a regression affecting collapsible Panel behavior that was introduced in 4.5.3.

    4.5.5release notes

  • Panels set max-width and max-height to 100% to fix a potential CSS overflow bug.

    4.5.3release notes

  • Safari now falls back to alternate CSS cursor styles for grab, col-resize, and row-resize cursors.

    4.5.1release notes

  • The library no longer overrides adoptedStyleSheets.

    4.5.0release notes

  • Panels within vertical groups are now sized correctly in Safari.

    4.5.0release notes

  • Fixes cursor style calculation when pointermove events provide low-precision or rounded clientX and clientY values.

    4.4.2release notes

  • Collapsible panels now treat defaultSize={0} as collapsed when mounted.

    4.4.1release notes

  • On pointerup, event.preventDefault() is no longer called unless a handle was actively dragged, fixing a Windows text selection bug.

    4.3.3release notes

  • Panel pixel size is read with offsetWidth/offsetHeight to avoid an edge-case ResizeObserver bug.

    4.3.1release notes

  • Pointerdown and pointerup handlers now use the capture phase for compatibility with UI libraries such as Blueprint JS.

    4.3.1release notes

  • Styles no longer use unset values, improving override safety for applications using the panels.

    4.3.1release notes

  • The useGroupRef type now includes | null for better compatibility with older React versions.

    4.3.0release notes

  • The usePanelRef type now includes | null for better compatibility with older React versions.

    4.3.0release notes

  • The ambiguous onResize prop type was fixed for compatibility with certain TypeScript versions.

    4.2.2release notes

  • Group handles newly registered Panels and Separators during mount, allowing user code to safely call imperative APIs earlier.

    4.2.1release notes

  • A race condition in the hook was fixed for more reliable group ref behavior.

    4.1.0release notes

  • A race condition in the hook was fixed for more reliable panel ref behavior.

    4.1.0release notes

  • Adds a guard for an unexpected defaultView value returned by some development environments.

    4.0.16release notes

  • Panel expand() now restores the size from before the panel was collapsed.

    4.0.16release notes

  • defaultLayout is ignored when its keys do not match Panel ids.

    4.0.15release notes

  • Fixes an edge case where panel constraints were not properly invalidated after resizing.

    4.0.11release notes

  • Group no longer remounts when defaultLayout or disableCursor props change.

    4.0.9release notes

  • Panel id changes are now handled gracefully.

    4.0.9release notes

  • Clicks on higher z-index elements such as modals no longer trigger separators behind them.

    4.0.9release notes

  • Invalid defaultLayout values are now handled gracefully.

    4.0.8release notes

  • Invalid layouts are no longer set when Group is hidden or has a width or height of 0.

    4.0.8release notes

  • Pointer-event styles are reset after the pointerup event, preventing stale interaction styles after pointer release.

    4.0.7release notes

  • Pointer-move delta percentages now account for Flex gap when calculating panel resizing.

    4.0.6release notes

  • Resize user experience is improved on iOS and Safari.

    4.0.4release notes

  • Separator receives focus on pointerdown, improving focus behavior during panel resizing.

    4.0.4release notes

  • Fixed the TypeScript type for the defaultLayout value returned from useDefaultLayout.

    4.0.3release notes

  • Accounts for pointer resize events near the edge of a window or iframe.

    4.0.1release notes