# What changed in react-resizable-panels

> 124 changes in react-resizable-panels 4 from its official release notes, upgrade guides and advisories: 12 breaking, 2 deprecations, 22 new APIs and options. Each one cited. Sources checked 2026-10-17. HTML: https://unstale.sh/npm/react-resizable-panels/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## react-resizable-panels 4

### Breaking changes

- `useDefaultGridLayout` now persists the requested layout instead of the constrained layout. (4.14.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.1)
- `useDefaultLayout` now persists the requested layout instead of the constrained layout. (4.14.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.1)
- Separator no longer retains focus after a drag. (4.13.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.2)
- Panel replaces the aria-disabled attribute with data-disabled. (4.7.6) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.7.6)
- Adds a new Group callback for layout changes. (4.4.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.4.0)
- Pointer-event layout changes trigger the callback only after the pointer is released, reducing callback frequency for tasks like saving layouts. (4.4.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.4.0)
- Persistent layouts no longer use PanelGroup autoSaveId directly. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)
- PanelGroup was renamed to Group to align with the version 4 API. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)
- PanelGroup was replaced by Group in version 4. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)
- PanelResizeHandle was replaced by Separator in version 4. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)
- useGroupRef replaces the imperative group ref type and creates a group reference. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)
- usePanelRef replaces the imperative panel ref type and creates a panel reference. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)

### Deprecations

- The previous callback remains supported but is marked deprecated. (4.4.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.4.0)
- The groupId parameter is deprecated in favor of id because the Group does not need a matching id. (4.0.13) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.13)

### New APIs and options

- `onLayoutChanged` metadata now includes `requestedLayout`, exposing the layout requested before constraints were applied. (4.14.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.1)
- Adds cells that can span multiple columns and rows in resizable two-dimensional layouts. (4.14.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.0)
- Adds Grid components for resizable two-dimensional layouts with row and column size constraints. (4.14.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.0)
- Adds optional gridlines that can span subsets of tracks to avoid spanning cells. (4.14.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.0)
- Adds a hook for default grid layout behavior. (4.14.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.0)
- Adds a callback ref hook for grids. (4.14.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.0)
- Adds a ref hook for grids. (4.14.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.0)
- Panels now support a configurable collapse threshold. (4.13.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.0)
- Resize preview mode is now customizable. (4.13.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.0)
- The callback now receives meta information indicating whether resizing was triggered by direct keyboard or mouse input. (4.12.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.12.0)
- The hook can now save layouts only when directly triggered by user interactions. (4.12.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.12.0)
- Adds a prop to turn off the double-click size reset behavior. (4.9.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.9.0)
- Automatically migrates legacy layouts to version 4 format, easing upgrades for existing persisted layouts. (4.8.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.8.0)
- Adds a Panel prop that lets panels retain their current pixel size when the parent Group is resized. (4.7.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.7.0)
- Panel and Separator components can now be disabled. (4.6.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.6.0)
- Group, Panel, and Separator components now expose displayName for a better debugging experience. (4.2.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.2.1)
- The onResize callback now receives prevPanelSize, simplifying collapse and expand detection. (4.2.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.2.0)
- The GroupImperativeHandle type is now exported for developers to use in application code. (4.0.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.2)
- The PanelImperativeHandle type is now exported for developers to use in application code. (4.0.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.2)
- Group accepts groupRef for imperative access. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)
- Panel accepts panelRef for imperative access. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)
- useDefaultLayout provides defaultLayout and onLayoutChange for persistent layouts. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)

### Performance

- Available group size is calculated once per hit-testing pass instead of once per hit region. (4.13.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.1)
- Panel avoids unnecessary re-renders in response to mouse-hover state. (4.5.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.4)
- 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.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.2)
- Debounces calls to storage.setItem by 150ms, reducing the frequency of storage updates. (4.0.12) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.12)

### Behavior and default changes

- The imperative Panel API now supports non-percentage sizes. (4.7.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.7.3)
- Default overflow styles changed to support shadows. (4.7.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.7.1)
- Imperative Panel and Group APIs now explicitly override disabled status when resizing, supporting conditionally disabled groups. (4.6.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.6.1)
- Pre-collapsed panels expand when dragged past the halfway point, making collapse and expansion behavior more consistent. (4.5.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.3)
- Separator and Panel edge hit target size decreases by default and becomes configurable through a new Group prop. (4.5.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.2)
- Double-clicking a Separator resets its associated Panel to its default size when one is configured. (4.5.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.0)
- The hook now uses the new layout-change callback while retaining support for the old callback. (4.4.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.4.0)
- Drag interactions call event.preventDefault only for the primary button. (4.3.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.0)
- Group now applies default width, height, and overflow styles, which can be overridden with style. (4.3.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.0)
- The storage parameter now defaults to localStorage when undefined. (4.2.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.2.2)
- The hook now supports saving and restoring multiple Panel layouts. (4.1.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.1.0)
- 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.14) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.14)
- Expanded support for fixed-size elements, allowing developers to use more fixed-size elements with the library. (4.0.10) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.10)
- Layout-change events are deferred when a Group is within a hidden DOM subtree, improving developer experience. (4.0.9) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.9)
- Size constraints now support pixels, percentages, REMs/EMs, and more. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)
- Support for server-rendering, including Server Components, has been expanded. (4.0.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.0)

### Fixes and other changes

- Group, Panel, Separator, Grid, and Cell only render an explicit id or data-testid as data-testid. (4.14.5) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.5)
- An empty string id now behaves like an undefined id and falls back to useId. (4.14.5) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.5)
- Panel now correctly treats 0 as an explicit id value. (4.14.5) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.5)
- Errors from layout or resize callbacks no longer leave drags stuck or prevent other groups from updating; errors are re-thrown afterward. (4.14.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.4)
- 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.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.4)
- Interrupted drags now end and commit the current layout instead of remaining active until the next pointer event. (4.14.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.3)
- Panels and separators are resorted before constraints are re-derived, fixing constraint calculations. (4.14.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.2)
- Constraint-induced layout changes no longer permanently alter the layout; the requested layout is restored when the constraint no longer applies. (4.14.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.14.1)
- Separator behind a modal dialog can no longer be dragged. (4.13.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.3)
- Panel ordering is fixed in environments with invalid offset values, such as JSDom. (4.13.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.2)
- The default layout is respected when an initially hidden group becomes visible. (4.13.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.1)
- Keyboard mappings are preserved for disabled separators, fixing the “Matching panels not found” error edge case. (4.13.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.1)
- Layout values now match panel IDs so reordered keys map to the correct constraints. (4.13.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.1)
- onLayoutChanged still fires when pressing elsewhere on the page or resizing another group. (4.13.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.13.1)
- Detached Separator components no longer capture the pointer. (4.12.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.12.4)
- Separator ARIA values now use proper panel indices. (4.12.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.12.4)
- Construction is guarded to avoid throwing in unsupported environments. (4.12.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.12.3)
- An edge case involving orphaned groups during pointerup was prevented. (4.12.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.12.3)
- The equality check for derived panel constraints was fixed. (4.12.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.12.3)
- Prevents context menu events from occurring while pointer-resize is active. (4.12.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.12.1)
- Improved server rendering support for the defaultSize prop. (4.7.5) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.7.5)
- Fixed an edge-case bug with pointer event capture. (4.7.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.7.4)
- Separators no longer scroll when receiving focus. (4.7.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.7.2)
- Checks for undefined adoptedStyleSheets to better support environments like jsdom. (4.6.5) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.6.5)
- Updates the in-memory layout cache when a group is resized by double-clicking on a separator. (4.6.5) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.6.5)
- Fixed resize actions sometimes jumping on touch devices. (4.6.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.6.4)
- Group now guards against layouts with mis-ordered Panel id keys. (4.6.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.6.2)
- Separator now sets a not-allowed cursor when its parent Group has cursors disabled. (4.6.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.6.1)
- Click events are no longer swallowed in certain cases. (4.5.9) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.9)
- A collapsible panel bugfix was re-enabled after another reported issue was fixed. (4.5.9) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.9)
- Imperative Group.setLayout now persists the layout to the in-memory cache. (4.5.9) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.9)
- The change to collapsible panel behavior from pull request 635 was disabled due to another reported regression. (4.5.8) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.8)
- Re-enables collapsible panels that were disabled in 4.5.6. (4.5.7) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.7)
- Resets separator hover state when the document receives a pointerout event. (4.5.7) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.7)
- Disabled the earlier change to collapsible panel behavior, restoring the previous behavior. (4.5.6) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.6)
- Removed the invalid aria-orientation role from the root Group element to comply with the ARIA specification. (4.5.5) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.5)
- Fixed a regression affecting collapsible Panel behavior that was introduced in 4.5.3. (4.5.5) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.5)
- Panels set max-width and max-height to 100% to fix a potential CSS overflow bug. (4.5.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.3)
- Safari now falls back to alternate CSS cursor styles for grab, col-resize, and row-resize cursors. (4.5.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.1)
- The library no longer overrides adoptedStyleSheets. (4.5.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.0)
- Panels within vertical groups are now sized correctly in Safari. (4.5.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.5.0)
- Fixes cursor style calculation when pointermove events provide low-precision or rounded clientX and clientY values. (4.4.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.4.2)
- Collapsible panels now treat defaultSize={0} as collapsed when mounted. (4.4.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.4.1)
- On pointerup, event.preventDefault() is no longer called unless a handle was actively dragged, fixing a Windows text selection bug. (4.3.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.3)
- Panel pixel size is read with offsetWidth/offsetHeight to avoid an edge-case ResizeObserver bug. (4.3.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.1)
- Pointerdown and pointerup handlers now use the capture phase for compatibility with UI libraries such as Blueprint JS. (4.3.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.1)
- Styles no longer use unset values, improving override safety for applications using the panels. (4.3.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.1)
- The useGroupRef type now includes | null for better compatibility with older React versions. (4.3.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.0)
- The usePanelRef type now includes | null for better compatibility with older React versions. (4.3.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.3.0)
- The ambiguous onResize prop type was fixed for compatibility with certain TypeScript versions. (4.2.2) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.2.2)
- Group handles newly registered Panels and Separators during mount, allowing user code to safely call imperative APIs earlier. (4.2.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.2.1)
- A race condition in the hook was fixed for more reliable group ref behavior. (4.1.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.1.0)
- A race condition in the hook was fixed for more reliable panel ref behavior. (4.1.0) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.1.0)
- Adds a guard for an unexpected defaultView value returned by some development environments. (4.0.16) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.16)
- Panel expand() now restores the size from before the panel was collapsed. (4.0.16) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.16)
- defaultLayout is ignored when its keys do not match Panel ids. (4.0.15) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.15)
- Fixes an edge case where panel constraints were not properly invalidated after resizing. (4.0.11) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.11)
- Group no longer remounts when defaultLayout or disableCursor props change. (4.0.9) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.9)
- Panel id changes are now handled gracefully. (4.0.9) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.9)
- Clicks on higher z-index elements such as modals no longer trigger separators behind them. (4.0.9) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.9)
- Invalid defaultLayout values are now handled gracefully. (4.0.8) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.8)
- Invalid layouts are no longer set when Group is hidden or has a width or height of 0. (4.0.8) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.8)
- Pointer-event styles are reset after the pointerup event, preventing stale interaction styles after pointer release. (4.0.7) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.7)
- Pointer-move delta percentages now account for Flex gap when calculating panel resizing. (4.0.6) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.6)
- Resize user experience is improved on iOS and Safari. (4.0.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.4)
- Separator receives focus on pointerdown, improving focus behavior during panel resizing. (4.0.4) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.4)
- Fixed the TypeScript type for the defaultLayout value returned from useDefaultLayout. (4.0.3) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.3)
- Accounts for pointer resize events near the edge of a window or iframe. (4.0.1) — [release notes](https://github.com/bvaughn/react-resizable-panels/releases/tag/4.0.1)
