react-resizable-panels: React components for resizable layouts: panel groups, grids, and workspaces of tabsets that users can rearrange by dragging tabs.
If you like this project there are several ways to support it:
Begin by installing the library from NPM:
npm install react-resizable-panelsTypeScript definitions are included within the published dist folder
Frequently asked questions can be found here.
Documentation for this project is available at react-resizable-panels.vercel.app.
A Cell occupies one or more tracks (columns and rows) within a Grid. Cells are resized along with the tracks they occupy.
Cell elements always include the following attributes:
<div data-cell data-testid="cell-id-prop" id="cell-id-prop">ℹ️ Test id can be used to narrow selection when unit testing.
| Name | Description |
|---|---|
| column | Index of the (first) column this cell occupies. |
| row | Index of the (first) row this cell occupies. |
| Name | Description |
|---|---|
| className | CSS class name. |
| id | Uniquely identifies this cell within the parent grid.
Falls back to ℹ️ This value will also be assigned to the |
| style | CSS properties. |
| children | Cell contents. |
| columnSpan | Number of columns this cell spans; defaults to 1. |
| elementRef | Ref attached to the root |
| rowSpan | Number of rows this cell spans; defaults to 1. |
A Grid arranges resizable Cells in two dimensions. Columns can be resized horizontally and rows can be resized vertically; dragging the point where a column boundary and a row boundary intersect resizes both.
Size constraints (e.g. min/max size, collapsible) are specified per track (column or row), using the same format as Panel props.
Cells can span multiple columns and/or rows. Track boundaries cannot be resized alongside of a cell that spans across them.
Grid elements always include the following attributes:
<div data-grid data-testid="grid-id-prop" id="grid-id-prop">ℹ️ Test id can be used to narrow selection when unit testing.
| Name | Description |
|---|---|
| columns | Grid columns; either the number of columns or an array of size constraints (one per column). |
| rows | Grid rows; either the number of rows or an array of size constraints (one per row). |
| Name | Description |
|---|---|
| className | CSS class name. |
| id | Uniquely identifies this grid within an application.
Falls back to ℹ️ This value will also be assigned to the |
| style | CSS properties. |
| children | Cell and Gridline components that comprise this grid. |
| defaultLayout | Default layout for either or both of the Grid's axes. ℹ️ This value allows layouts to be remembered between page reloads. |
| disableCursor | This library sets custom mouse cursor styles to indicate drag state. Use this prop to disable that behavior for this grid. |
| disabled | Disable resize functionality. |
| elementRef | Ref attached to the root |
| gridRef | Exposes the following imperative API:
ℹ️ The |
| onLayoutChange | Called when the Grid's layout is changing.
|
| onLayoutChanged | Called after the Grid's layout has been changed. ℹ️ For layout changes caused by pointer events, this callback is not called until the pointer has been released. This callback is recommended for saving layouts to storage. |
| resizeTargetMinimumSize | Minimum size of the resizable hit target area (either a ℹ️ Refer to the |
Resizes the columns (or rows) of a Grid.
For example:
// Rendered between columns 0 and 1 and spans all rows
<Gridline type="column" column={1} />// Rendered between rows 0 and 1 and spans all columns
<Gridline type="row" row={1} />// Rendered between columns 0 and 1 alongside of row 2 only
<Gridline type="column" column={1} row={2} rowSpan={1} />A gridline should not be rendered alongside of a Cell that spans across its boundary (this includes disabled gridlines; in development builds, an error will be logged to the console); render multiple gridlines along the same boundary instead (e.g. before and after the spanning Cell).
ℹ️ Once a boundary contains a gridline, it can only be resized using gridlines; the parts of the boundary that aren't alongside of a gridline can't be dragged.
Where column and row gridlines intersect, dragging resizes both axes.
Gridlines are not required but they are recommended as they improve keyboard accessibility.
Gridline elements always include the following attributes:
<div aria-orientation="vertical" data-separator role="separator">ℹ️ Column gridlines are vertical (aria-orientation="vertical") and row gridlines are horizontal (aria-orientation="horizontal").
ℹ️ In addition to the attributes shown above, gridlines also render all required WAI-ARIA properties.
ℹ️ Gridlines rendered by another component (rather than directly within the Grid) aren't detected until they mount, so server-rendered layouts may shift slightly during hydration.
| Name | Description |
|---|---|
| type | Column gridlines are vertical; they resize the columns on either side of them. Row gridlines are horizontal; they resize the rows on either side of them. |
| Name | Description |
|---|---|
| children | Gridline contents (e.g. a drag handle icon). |
| className | CSS class name. ℹ️ Use the |
| disabled | When disabled, the gridline cannot be used to resize its neighboring tracks. ℹ️ The tracks may still be resized indirectly (e.g. by an intersecting gridline or another boundary). To prevent a track from being resized at all, it needs to also be disabled. |
| elementRef | Ref attached to the root |
| style | CSS properties. |
| column | When |
| row | When |
| rowSpan | Number of rows a column gridline spans; defaults to all rows (starting from ℹ️ Gridlines can span a subset of rows in order to avoid cells that span across the boundary they sit on; multiple gridlines can be rendered along the same boundary (e.g. above and below a spanning cell). |
| columnSpan | Number of columns a row gridline spans; defaults to all columns (starting from ℹ️ Gridlines can span a subset of columns in order to avoid cells that span across the boundary they sit on; multiple gridlines can be rendered along the same boundary (e.g. before and after a spanning cell). |
A Group wraps a set of resizable Panel components. Group content can be resized horizontally or vertically.
Group elements always include the following attributes:
<div data-group data-testid="group-id-prop" id="group-id-prop">ℹ️ Test id can be used to narrow selection when unit testing.
None
| Name | Description |
|---|---|
| className | CSS class name. |
| id | Uniquely identifies this group within an application.
Falls back to ℹ️ This value will also be assigned to the |
| style | CSS properties.
|
| children | Panel and Separator components that comprise this group. |
| defaultLayout | Default layout for the Group. ℹ️ This value allows layouts to be remembered between page reloads. |
| disableCursor | This library sets custom mouse cursor styles to indicate drag state. Use this prop to disable that behavior for Panels and Separators in this group. |
| disabled | Disable resize functionality. |
| elementRef | Ref attached to the root |
| groupRef | Exposes the following imperative API:
ℹ️ The |
| onLayoutChange | Called when the Group's layout is changing.
|
| onLayoutChanged | Called after the Group's layout has been changed. ℹ️ For layout changes caused by pointer events, this callback is not called until the pointer has been released. This callback is recommended for saving layouts to storage. ℹ️ The second argument contains meta information about the layout change.
The |
| resizePreviewMode | Controls whether pointer dragging updates Defaults to Customize previews using the |
| resizeTargetMinimumSize | Minimum size of the resizable hit target area (either
ℹ️ Apple interface guidelines suggest |
| orientation | Specifies the resizable orientation ("horizontal" or "vertical"); defaults to "horizontal" |
A Panel wraps resizable content and can be configured with min/max size constraints and collapsible behavior.
Panel size props can be in the following formats:
- Percentage of the parent Group (0..100)
- Pixels
- Relative font units (em, rem)
- Viewport relative units (vh, vw)
ℹ️ Numeric values are assumed to be pixels. Strings without explicit units are assumed to be percentages (0%..100%). Percentages may also be specified as strings ending with "%" (e.g. "33%") Pixels may also be specified as strings ending with the unit "px". Other units should be specified as strings ending with their CSS property units (e.g. 1rem, 50vh)
Panel elements always include the following attributes:
<div data-panel data-testid="panel-id-prop" id="panel-id-prop">ℹ️ Test id can be used to narrow selection when unit testing.
None
| Name | Description |
|---|---|
| className | CSS class name.
|
| id | Uniquely identifies this panel within the parent group.
Falls back to ℹ️ This prop is used to associate persisted group layouts with the original panel. ℹ️ This value will also be assigned to the |
| style | CSS properties.
|
| collapsedSize | Panel size when collapsed; defaults to 0%. |
| collapsedThreshold | Distance a collapsible panel must be resized past its For example if a panel declares ℹ️ Interpretation rules:
|
| collapsible | This panel can be collapsed. ℹ️ A collapsible panel will collapse when its size is less than the specified |
| defaultSize | Default size of Panel within its parent group; default is auto-assigned based on the total number of Panels. ℹ️ Interpretation rules:
|
| disabled | When disabled, a panel cannot be resized either directly or indirectly (by resizing another panel). |
| elementRef | Ref attached to the root |
| groupResizeBehavior | How should this Panel behave if the parent Group is resized?
Defaults to
ℹ️ Panel min/max size constraints may impact this behavior.
|
| maxSize | Maximum size of Panel within its parent group; defaults to ℹ️ Interpretation rules:
|
| minSize | Minimum size of Panel within its parent group; defaults to 0%. ℹ️ Interpretation rules:
|
| onResize | Called when panel sizes change.
|
| panelRef | Exposes the following imperative API:
ℹ️ The |
Separators are not required but they are recommended as they improve keyboard accessibility.
Separator elements always include the following attributes:
<div data-separator data-testid="separator-id-prop" id="separator-id-prop" role="separator">ℹ️ Test id can be used to narrow selection when unit testing.
ℹ️ In addition to the attributes shown above, separator also renders all required WAI-ARIA properties.
None
| Name | Description |
|---|---|
| className | CSS class name. ℹ️ Use the
|
| id | Uniquely identifies the separator within the parent group.
Falls back to ℹ️ This value will also be assigned to the |
| style | CSS properties. ℹ️ Use the
|
| disabled | When disabled, the separator cannot be used to resize its neighboring panels. ℹ️ The panels may still be resized indirectly (while other panels are being resized). To prevent a panel from being resized at all, it needs to also be disabled. |
| disableDoubleClick | When true, double-clicking this |
| elementRef | Ref attached to the root |
| preview | Overrides the |
Closes the tab it is rendered within; render it within the element returned by the Workspace's renderTab prop:
renderTab={(tab, props) => (
<div {...props}>
{tab.title}
<TabCloseButton>×</TabCloseButton>
</div>
)}The button renders nothing if closing is disabled (by the tab's disableClose flag or the Workspace's disabled prop).
Its content defaults to "×" (e.g. it can be replaced with an icon),
and its default aria-label is "Close" followed by the tab's title (or id).
Its children, className, style, and title can also be functions of its state (see TabCloseButtonState):
<TabCloseButton title={({ tabTitle }) => `Close ${tabTitle}`} />To keep the tab open (e.g. to confirm unsaved changes first), call event.preventDefault() in an onClick handler:
<TabCloseButton
onClick={(event) => {
if (hasUnsavedChanges && !confirm("Discard unsaved changes?")) {
event.preventDefault();
}
}}
/>ℹ️ This button is not focusable by default (tabIndex={-1}), since tabs shouldn't contain focusable content;
keyboard users can close the focused tab with Delete or Backspace.
None
| Name | Description |
|---|---|
| children | Content of the element, or a function that returns it (given the component's state). |
| className | Class name of the element, or a function that returns it (given the component's state). |
| style | Inline styles of the element, or a function that returns them (given the component's state). |
| title | Tooltip of the element, or a function that returns it (given the component's state). |
Collapses (or expands) the tabset it is rendered within; render it within the content returned by the Workspace's renderTabsetToolbar prop.
Its children, className, style, and title can be functions of its state (see TabsetCollapseButtonState), e.g. to show a different icon while the tabset is collapsed:
renderTabsetToolbar={() => (
<TabsetCollapseButton title={({ isCollapsed }) => (isCollapsed ? "Expand" : "Collapse")}>
{({ isCollapsed }) => (isCollapsed ? "▸" : "▾")}
</TabsetCollapseButton>
)}The button renders nothing if the tabset can't be collapsed (see ParentTabsetState.isCollapsible), or while it's maximized.
While the tabset is collapsed only because it doesn't fit (see ParentTabsetState.isCollapsedToFit), it can't be expanded, so the button has aria-disabled="true".
Its aria-expanded attribute reflects whether the tabset is expanded, and its aria-controls attribute refers to the selected tab's panel;
its default aria-label ("Collapse tabset") doesn't change, since aria-expanded describes the state.
To keep the tabset as it is, call event.preventDefault() in an onClick handler.
ℹ️ Clicking a tab of a collapsed tabset also expands it.
None
| Name | Description |
|---|---|
| children | Content of the element, or a function that returns it (given the component's state). |
| className | Class name of the element, or a function that returns it (given the component's state). |
| style | Inline styles of the element, or a function that returns them (given the component's state). |
| title | Tooltip of the element, or a function that returns it (given the component's state). |
Drags the tabset it is rendered within; render it within the content returned by the Workspace's renderTabsetToolbar prop:
renderTabsetToolbar={() => (
<TabsetDragHandle>⠿</TabsetDragHandle>
)}By default, a tabset is dragged by the empty space in its header;
once its header contains a drag handle, only the handle drags it.
Any element with a data-tabset-drag-handle attribute is a drag handle;
this component also sets touch-action: none, so that it can be dragged by touch.
The handle has a data-disabled attribute when the tabset can't be dragged (see useParentTabsetState), e.g. to hide it.
Its children, className, style, and title can also be functions of its state (see TabsetDragHandleState):
<TabsetDragHandle title={({ isDisabled }) => (isDisabled ? undefined : "Drag tabset")}>
⠿
</TabsetDragHandle>None
| Name | Description |
|---|---|
| children | Content of the element, or a function that returns it (given the component's state). |
| className | Class name of the element, or a function that returns it (given the component's state). |
| style | Inline styles of the element, or a function that returns them (given the component's state). |
| title | Tooltip of the element, or a function that returns it (given the component's state). |
Maximizes (or restores) the tabset it is rendered within; render it within the content returned by the Workspace's renderTabsetToolbar prop.
Its children, className, style, and title can be functions of its state (see TabsetMaximizeButtonState), e.g. to show a different icon while the tabset is maximized:
renderTabsetToolbar={() => (
<TabsetMaximizeButton title={({ isMaximized }) => (isMaximized ? "Restore" : "Maximize")}>
{({ isMaximized }) => (isMaximized ? "Restore" : "Maximize")}
</TabsetMaximizeButton>
)}The button renders nothing for the only tabset in a workspace (see ParentTabsetState.isRoot) and for floating tabsets, which can't be maximized.
Its aria-pressed attribute reflects whether the tabset is maximized;
its default aria-label ("Maximize tabset") doesn't change, since aria-pressed describes the state.
To keep the tabset as it is, call event.preventDefault() in an onClick handler.
None
| Name | Description |
|---|---|
| children | Content of the element, or a function that returns it (given the component's state). |
| className | Class name of the element, or a function that returns it (given the component's state). |
| style | Inline styles of the element, or a function that returns them (given the component's state). |
| title | Tooltip of the element, or a function that returns it (given the component's state). |
A Workspace arranges tabsets that users can rearrange by dragging tabs: between tabsets, within a tabset's list of tabs, or onto the edge of a tabset to split it. Tabsets can be resized and maximized.
The layout is described by a serializable model (see WorkspaceModel).
Workspaces are uncontrolled: provide an initial model with the defaultModel prop, save changes from the onModelChanged callback,
and make changes using the imperative API (see WorkspaceImperativeHandle).
ℹ️ Tab content is not remounted when a tab is moved. Its elements are moved within the document, though, which resets some browser state (e.g. iframes are reloaded).
Workspace elements always include the following attributes:
<div data-workspace data-testid="workspace-id-prop" id="workspace-id-prop">ℹ️ Test id can be used to narrow selection when unit testing.
| Name | Description |
|---|---|
| defaultModel | Initial layout of the workspace. ℹ️ Splits and tabsets may omit their ids; they're assigned ids based on their position (see ℹ️ This value is only used when the Workspace mounts; use the imperative |
| renderTabContent | Content of a tab. ℹ️ Content is only re-rendered when its tab changes or this function does;
a function created while rendering (e.g. an inline arrow function) re-renders the content of every tab whenever the Workspace's parent re-renders,
so it should be memoized (e.g. with |
| Name | Description |
|---|---|
| className | CSS class name. |
| id | Uniquely identifies this workspace within an application.
Falls back to ℹ️ This value will also be assigned to the |
| style | CSS properties. |
| acceptExternalDrop | Lets the workspace accept drags that use the browser's drag and drop from outside of any workspace
(e.g. an element of the application with the ℹ️ ℹ️ Elements within the workspace's tab content that handle the same drags themselves (by canceling the ℹ️ This object is read when drag events are handled, so it doesn't need to be memoized. |
| classNames | CSS class names for the elements the workspace renders within its root element:
ℹ️ Elements expose their state as data attributes (e.g. ℹ️ The drop indicator is the same element for the whole drag (rendered within the workspace's root element),
so it can be animated between regions and tabsets (e.g. ℹ️ Like the render props, this object is part of what tabsets re-render for; in large workspaces, define it outside of the component (or memoize it) rather than inline. |
| copyTab | Lets tabs be copied by dragging them: a tab dropped while the copy modifier key is held (Option on macOS, Ctrl elsewhere) adds the copy this function returns,
leaving the dragged tab where it was. The change is reported to Returning ℹ️ The copy needs an id that isn't used by any other node of the workspace (e.g. ℹ️ The workspace the tab is dropped into makes the copy, so a tab dragged from another workspace (see the
|
| copyTabset | Lets tabsets be copied by dragging them (by their headers), like the The copy includes its tabs, which need ids that aren't used by any other node of the workspace too; the Returning ℹ️ The copy's selected tab is the copy of the dragged tabset's selected tab (matched by position), unless the copy selects one of its own tabs. ℹ️ A copy dropped into a tab list (or onto the center of another tabset) only adds its tabs; its id and data are only used where it's added as a tabset.
|
| disabled | Locks the arrangement: tabs cannot be resized, dragged, dropped, or closed by the user. Selecting tabs and maximizing tabsets still work. ℹ️ This prop overrides the |
| disableDragBetweenApps | Keeps drags between workspaces (see Defaults to |
| disableDrop | Prevents tabs (and tabsets) from being dropped onto some (or all) targets. Functions are called when the target under the pointer changes;
returning ℹ️ While a tabset is dragged, this function is called for each of its tabs (see ℹ️ Tabs can also be dropped at the edges of the workspace (beside all of the other tabsets), within a few pixels of the edges of its layout
(except over tabset headers, where the tab lists are) or within its root element's padding.
These targets have an |
| dragGroup | Lets tabs (and tabsets) be dragged between workspaces with the same Mouse drags use the browser's drag and drop when this prop is set, since pointer events can't follow the pointer into another window. Touch drags still use pointer events, so they can't leave the window. ℹ️ Tab ids must be unique within the group; a tab can't be dropped into a workspace that already has a tab with its id (and a tabset with the
|
| elementRef | Ref attached to the root |
| hiddenTabBehavior | What happens to the content of tabs that are not selected. Can be a function to choose per tab (e.g. based on its data).
ℹ️ Moving a tab never remounts its content. |
| onModelChanged | Called after the model has changed (e.g. a tab was moved, selected, or closed, or a tabset was resized). ℹ️ For changes caused by pointer events, this callback is not called until the pointer has been released. This callback is recommended for saving models to storage. |
| onTearOff | Called when a tab (or a whole tabset) is dropped outside of the window, e.g. to open it in a popup window.
Return Tabs and tabsets can only be torn off if they could be dragged, and tabsets with the
ℹ️ This is called while the release of the pointer is being handled (which browsers treat as user input), so a popup can be opened from it.
With the
❌ This prop has been deprecated. Open popout windows from a button instead (see |
| renderDragPreview | Content of the element that follows the pointer while a tab is being dragged. Defaults to the tab's title (or id). ℹ️ The element has a |
| renderTabsetDragPreview | Content of the element that follows the pointer while a whole tabset is being dragged.
Defaults to the title (or id) of its selected tab followed by the number of other tabs being dragged (e.g. "One (+2)"), or the selected tab's ℹ️ The element has a |
| renderEmptyTabset | Content shown in the panels of a tabset that has no tabs (e.g. "Drag a tab here"):
the root tabset of an empty workspace, or a tabset with the |
| renderSeparator | Separator rendered between the children of a split.
Should return a ℹ️ Without separators, tabsets can still be resized by dragging their edges (like Panels in a Group without separators), but separators are recommended: they can be resized with the keyboard, and an edge's hit area can overlap the tabs beside it (pressing there resizes the tabset rather than dragging the tab). |
| renderTab | Renders a tab (within its tabset's tab list).
Spread Individual props can be overridden or wrapped, e.g. to confirm before the Delete key closes a tab
(call
ℹ️ Pointer and keyboard events from interactive descendants ( ℹ️ When this prop is not provided, tabs show their title (or id) followed by a |
| renderTabsetToolbar | Content shown after a tabset's tab list (e.g. buttons to add a tab or maximize the tabset). ℹ️ The |
| resizePreviewMode | Controls whether pointer dragging updates sizes immediately, or renders overlay separator previews until the pointer is released. |
| serverRenderTabContent | Render the content of selected tabs on the server. Can be a function to choose per tab (e.g. based on its data). Tab content is rendered through portals (so that moving a tab doesn't remount it), which React can't render on the server. Content opted into server rendering is rendered inline instead, then moved into a portal once hydration has finished. ℹ️ This prop has no effect for workspaces that are not server rendered. |
| styles | CSS properties for the elements the workspace renders within its root element (see |
| tabPlacement | Where tabs are placed relative to tab content. Tabs placed on the left or right are stacked ("vertical"): this determines how a dropped tab's position is found and which arrow keys move focus between tabs. ℹ️ Elements within a tabset have a ℹ️ "left" and "right" are the start and end of the tabset (its header is rendered before or after its content),
so in a right-to-left layout (e.g. within ℹ️ Tabsets can override this with the |
| tabRemovalSelectionBehavior | Which tab is selected when a tabset's selected tab is removed (closed, or dragged to another tabset):
ℹ️ In |
| tabsetMinHeight | Minimum height of each tabset's content area (not including its header). ℹ️ Tabsets can override this with the ℹ️ Interpretation rules:
|
| tabsetMinWidth | Minimum width of each tabset's content area (not including its header). ℹ️ Tabsets can override this with the ℹ️ Interpretation rules:
|
| workspaceRef | Exposes the imperative API (see ℹ️ The |
Imperative Grid API.
ℹ️ The useGridRef and useGridCallbackRef hooks are exported for convenience in TypeScript projects.
| Name | Description |
|---|---|
| getLayout | Get the Grid's current layout: maps of column and row ids to percentages (0..100) |
| getTrackById | Imperative API for the column or row with the specified id (see ℹ️ Tracks without an explicit
|
| getTrackByIndex | Imperative API for the column or row at the specified index (see ℹ️ The index is resolved to a track id when this method is called; the returned API continues to refer to that id.
Tracks without an explicit
|
| setLayout | Set a new layout for one or both of the Grid's axes.
|
Imperative API for an individual Grid track (column or row); returned by GridImperativeHandle.getTrackById and GridImperativeHandle.getTrackByIndex.
ℹ️ Sizes are relative to the space available to the track's axis (e.g. the width of the Grid, minus gaps and gridlines, for a column).
| Name | Description |
|---|---|
| collapse | Collapse the track to its
|
| expand | Expand a collapsed track to its most recent size. ℹ️ If restoring that size would require collapsing another track, the track expands to the largest size that fits instead (as long as that is at least its |
| getSize | Get the current size of the track in pixels as well as a percentage of its axis (0..100). |
| isCollapsed | The track is currently collapsed. |
| resize | Update the track's size. Size can be in the following formats:
ℹ️ Numeric values are assumed to be pixels. Strings without explicit units are assumed to be percentages (0%..100%). Percentages may also be specified as strings ending with "%" (e.g. "33%") Pixels may also be specified as strings ending with the unit "px". Other units should be specified as strings ending with their CSS property units (e.g. 1rem, 50vh)
|
Imperative Group API.
ℹ️ The useGroupRef and useGroupCallbackRef hooks are exported for convenience in TypeScript projects.
| Name | Description |
|---|---|
| getLayout | Get the Group's current layout as a map of Panel id to percentage (0..100) |
| setLayout | Set a new layout for the Group
|
Imperative Panel API
ℹ️ The usePanelRef and usePanelCallbackRef hooks are exported for convenience in TypeScript projects.
| Name | Description |
|---|---|
| collapse | Collapse the Panel to its
|
| expand | Expand a collapsed Panel to its most recent size. ℹ️ If restoring that size would require collapsing another Panel, the Panel expands to the largest size that fits instead (as long as that is at least its |
| getSize | Get the current size of the Panel in pixels as well as a percentage of the parent group (0..100). |
| isCollapsed | The Panel is currently collapsed. |
| resize | Update the Panel's size. Size can be in the following formats:
ℹ️ Numeric values are assumed to be pixels. Strings without explicit units are assumed to be percentages (0%..100%). Percentages may also be specified as strings ending with "%" (e.g. "33%") Pixels may also be specified as strings ending with the unit "px". Other units should be specified as strings ending with their CSS property units (e.g. 1rem, 50vh)
|
Imperative Workspace API.
The easiest way to interact with this API is to use the useWorkspaceRef and useWorkspaceCallbackRef hooks.
ℹ️ These methods are not restricted by disabled, disableClose, disableDrag, or disableDrop.
| Name | Description |
|---|---|
| addTab | Add a tab to a tabset. ℹ️ If a tab with the same id already exists, it is selected instead (and its data is not changed).
|
| closeTab | Close a tab. |
| closeTabset | Close a tabset, along with any tabs it contains (e.g. to remove an empty tabset with the ℹ️ Like the rest of the imperative API, this isn't restricted by tabs' |
| collapseTabset | Collapse a tabset to just its header. ℹ️ This has no effect unless the tabset has the |
| expandTabset | Expand a collapsed tabset to its previous size. ℹ️ Tabsets are shown at least at their minimum sizes (if they fit), even if the model's sizes are smaller (see ℹ️ This has no effect on a tabset that's only collapsed to fit, which is expanded once it fits (see |
| floatTab | Move a tab into a new floating tabset (see ℹ️ Parts of the position and size that aren't specified default to those of the tab's tabset, offset slightly down and to the right (and moved, if needed, to fit within the workspace). ℹ️ This has no effect on the only tab of a floating tabset (unless the tabset has the |
| floatTabset | Move a tabset out of the layout, to float above it (see ℹ️ Parts of the position and size that aren't specified default to those of the tabset, offset slightly down and to the right (and moved, if needed, to fit within the workspace). ℹ️ This has no effect on the root tabset (which fills the workspace) or a tabset that's already floating. A maximized tabset is restored first. |
| getActiveTabsetId | Id of the tabset the user most recently interacted with (by pointer or focus). |
| getModel | Get the current model. |
| getTabListFreeSpace | Space (in pixels) in a tabset's tab list that its tabs don't use, e.g. how much a toolbar beside the tabs could grow before they overflow (and how much space an overflow menu needs to free up, once it's negative). ℹ️ The space is measured along the tab list: its width, or its height if its tabs are placed on the left or right (or the tabset is collapsed to a vertical strip). If the tab list can't shrink any further (e.g. it's 0px wide, beside a toolbar that doesn't shrink), the amount the header's content overflows the header is subtracted too, so it's still how much space a toolbar needs to free up. ℹ️ The tab list's ℹ️ Within a tabset (e.g. its toolbar), the |
| getTabListOverflow | Ids of a tabset's tabs that are out of view (scrolled out of its tab list, which overflows), in the order they're shown; e.g. to list them in an overflow menu. ℹ️ The same array is returned until the tabs out of view change.
Tabs that aren't rendered at all (e.g. hidden with ℹ️ Within a tabset (e.g. its toolbar), the |
| maximizeTabset | Maximize a tabset, so that it covers the rest of the workspace. ℹ️ This has no effect on the only tabset in a workspace (the root), which already fills it, or on a floating tabset. A maximized tabset is restored if it becomes the only one (e.g. after the other tabsets are closed). |
| moveTab | Move a tab to a position within a tabset's tab list, to a region of a tabset's content area,
or to an ℹ️ The ℹ️ Floating tabsets can't be split, so a tab moved to an edge region of one is added to it instead (like the |
| moveTabset | Move a tabset beside another tabset (by dropping it onto a region at the edge of that tabset's content area),
or beside all of the other tabsets (at an ℹ️ When its tabs are moved, the emptied tabset is removed (unless it has the ℹ️ A floating tabset moved beside another tabset (or to an edge of the workspace) is docked: it's moved into the layout, and stops floating.
Floating tabsets can't be split, so a tabset moved to an edge region of one has its tabs moved into it instead (like the |
| restoreTabset | Restore the maximized tabset (if there is one). |
| selectTab | Select a tab within its tabset. ℹ️ Like a tab selected any other way, it's scrolled into view if its tab list overflows. |
| setModel | Replace the model. |
| startExternalDrag | Start dragging a tab that isn't in the workspace yet, from an element outside of it (e.g. an item in a palette of widgets);
call it from the element's ℹ️ Unlike other imperative methods, the drop is restricted by ℹ️ The element must be in the same document as the workspace.
Like tabs, it should have
|
| subscribeToTabListFreeSpace | Subscribe to changes to the free space in a tabset's tab list (see ℹ️ The listener is called synchronously when the tab list is measured (when it or its tabs change size, or tabs are added or removed),
before the browser paints; changes it makes to the DOM (e.g. with ℹ️ The listener is called with |
| subscribeToTabListOverflow | Subscribe to changes to which of a tabset's tabs are out of view (see ℹ️ The listener is called synchronously when the tab list is measured (when it's scrolled, when it or its tabs change size, or when tabs are added or removed), before the browser paints, except while the user scrolls the list (it's reported in the scroll event, and the browser may show the new position first). ℹ️ The listener is called with |
| updateTab | Update a tab; fields that are not specified are not changed. ℹ️ |
| updateTabset | Update a tabset; fields that are not specified are not changed. ℹ️ ℹ️ Setting ℹ️ The position and size ( |
