# Splitter
URL: https://ark-ui.com/docs/components/splitter
Source: https://raw.githubusercontent.com/chakra-ui/ark/refs/heads/main/website/src/content/pages/components/splitter.mdx
A component that divides your interface into resizable sections
---
## Anatomy
```tsx
```
## Examples
**Example: basic**
#### React
```tsx
import { Splitter } from '@ark-ui/react/splitter'
import styles from 'styles/splitter.module.css'
export const Basic = () => (
A
B
)
```
#### Solid
```tsx
import { Splitter } from '@ark-ui/solid/splitter'
import styles from 'styles/splitter.module.css'
export const Basic = () => (
A
B
)
```
#### Vue
```vue
AB
```
#### Svelte
```svelte
AB
```
### Context
The Splitter component allows you to pass a function as a child to gain direct access to its API. This provides more
control and allows you to modify the size of the panels programmatically:
**Example: context**
#### React
```tsx
import { Splitter } from '@ark-ui/react/splitter'
import button from 'styles/button.module.css'
import styles from 'styles/splitter.module.css'
export const Context = () => (
{(splitter) => (
<>
>
)}
)
```
#### Solid
```tsx
import { Splitter } from '@ark-ui/solid/splitter'
import button from 'styles/button.module.css'
import styles from 'styles/splitter.module.css'
export const Context = () => (
{(splitter) => (
<>
>
)}
)
```
#### Vue
```vue
```
#### Svelte
```svelte
{#snippet render(splitter)}
{/snippet}
```
### Vertical
By default, the Splitter component is horizontal. If you need a vertical splitter, use the `orientation` prop:
**Example: vertical**
#### React
```tsx
import { Splitter } from '@ark-ui/react/splitter'
import styles from 'styles/splitter.module.css'
export const Vertical = () => (
A
B
)
```
#### Solid
```tsx
import { Splitter } from '@ark-ui/solid/splitter'
import styles from 'styles/splitter.module.css'
export const Vertical = () => (
A
B
)
```
#### Vue
```vue
AB
```
#### Svelte
```svelte
AB
```
### Collapsible Panels
To make a panel collapsible, set the `collapsible` prop to `true` on the panel you want to make collapsible.
Additionally, you can use the `collapsedSize` prop to set the size of the panel when it's collapsed.
> This can be useful for building sidebar layouts.
**Example: collapsible**
#### React
```tsx
import { Splitter } from '@ark-ui/react/splitter'
import styles from 'styles/splitter.module.css'
export const Collapsible = () => (
A
B
)
```
#### Solid
```tsx
import { Splitter } from '@ark-ui/solid/splitter'
import styles from 'styles/splitter.module.css'
export const Collapsible = () => (
A
B
)
```
#### Vue
```vue
AB
```
#### Svelte
```svelte
AB
```
### Multiple Panels
Here's an example of how to use the `Splitter` component with multiple panels.
**Example: multiple-panels**
#### React
```tsx
import { Splitter } from '@ark-ui/react/splitter'
import styles from 'styles/splitter.module.css'
export const MultiplePanels = () => (
A
B
C
)
```
#### Solid
```tsx
import { Splitter } from '@ark-ui/solid/splitter'
import styles from 'styles/splitter.module.css'
export const MultiplePanels = () => (
A
B
C
)
```
#### Vue
```vue
ABC
```
#### Svelte
```svelte
ABC
```
### Root Provider
An alternative way to control the splitter is to use the `RootProvider` component and the `useSplitter` hook. This way
you can access the state and methods from outside the component.
**Example: root-provider**
#### React
```tsx
import { Splitter, useSplitter } from '@ark-ui/react/splitter'
import styles from 'styles/splitter.module.css'
export const RootProvider = () => {
const splitter = useSplitter({
defaultSize: [50, 50],
panels: [{ id: 'a' }, { id: 'b' }],
})
return (
```
### Resize Indicator
Use the `Splitter.ResizeTriggerIndicator` component to show a visual indicator on the resize handle.
**Example: resize-indicator**
#### React
```tsx
import { Splitter } from '@ark-ui/react/splitter'
import styles from 'styles/splitter.module.css'
export const ResizeIndicator = () => (
A
B
)
```
#### Solid
```tsx
import { Splitter } from '@ark-ui/solid/splitter'
import styles from 'styles/splitter.module.css'
export const ResizeIndicator = () => (
A
B
)
```
#### Vue
```vue
AB
```
#### Svelte
```svelte
AB
```
### Dynamic Collapsible
Use the `collapsePanel()` and `expandPanel()` methods to programmatically control panel collapse based on viewport size.
This is useful for responsive sidebar layouts that collapse on smaller screens.
**Example: dynamic-collapsible**
#### React
```tsx
/** biome-ignore-all lint/correctness/useExhaustiveDependencies: intentional */
import { Splitter, useSplitter } from '@ark-ui/react/splitter'
import { useLayoutEffect, useRef, useState } from 'react'
import styles from 'styles/splitter.module.css'
export const DynamicCollapsible = () => {
const [rootSize, setRootSize] = useState(null)
const ref = useRef(null)
useLayoutEffect(() => {
const handleResize = () => setRootSize(ref.current?.offsetWidth ?? null)
handleResize()
window.addEventListener('resize', handleResize)
return () => window.removeEventListener('resize', handleResize)
}, [])
const isBelowMd = rootSize != null && rootSize < 600
useLayoutEffect(() => {
if (isBelowMd) splitter.collapsePanel('a')
else splitter.expandPanel('a')
}, [isBelowMd])
const splitter = useSplitter({
panels: [{ id: 'a', collapsible: isBelowMd, collapsedSize: 5, minSize: 20, maxSize: 40 }, { id: 'b' }],
defaultSize: [15, 85],
})
return (
A
B
)
}
```
## API Reference
### Props
**Component API Reference**
#### React
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `panels` | `PanelData[]` | Yes | The size constraints of the panels. |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `defaultSize` | `number[]` | No | The initial size of the panels when rendered.
Use when you don't need to control the size of the panels. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
root: string
resizeTrigger: (id: string) => string
label: (id: string) => string
panel: (id: string | number) => string
}>` | No | The ids of the elements in the splitter. Useful for composition. |
| `keyboardResizeBy` | `number` | No | The number of pixels to resize the panel by when the keyboard is used. |
| `nonce` | `string` | No | The nonce for the injected splitter cursor stylesheet. |
| `onCollapse` | `(details: ExpandCollapseDetails) => void` | No | Function called when a panel is collapsed. |
| `onExpand` | `(details: ExpandCollapseDetails) => void` | No | Function called when a panel is expanded. |
| `onResize` | `(details: ResizeDetails) => void` | No | Function called when the splitter is resized. |
| `onResizeEnd` | `(details: ResizeEndDetails) => void` | No | Function called when the splitter resize ends. |
| `onResizeStart` | `() => void` | No | Function called when the splitter resize starts. |
| `orientation` | `'horizontal' | 'vertical'` | No | The orientation of the splitter. Can be `horizontal` or `vertical` |
| `size` | `number[]` | No | The controlled size data of the panels |
**Root Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | root |
| `[data-orientation]` | The orientation of the splitter |
| `[data-dragging]` | Present when in the dragging state |
**Panel Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `id` | `string` | Yes | |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Panel Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | panel |
| `[data-orientation]` | The orientation of the panel |
| `[data-dragging]` | Present when in the dragging state |
| `[data-id]` | |
| `[data-index]` | The index of the item |
**ResizeTrigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `id` | ``${string}:${string}`` | Yes | |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `disabled` | `boolean` | No | |
**ResizeTrigger Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | resize-trigger |
| `[data-id]` | |
| `[data-orientation]` | The orientation of the resizetrigger |
| `[data-focus]` | Present when focused |
| `[data-dragging]` | Present when in the dragging state |
| `[data-disabled]` | Present when disabled |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `UseSplitterReturn` | Yes | |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
#### Solid
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `panels` | `PanelData[]` | Yes | The size constraints of the panels. |
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `defaultSize` | `number[]` | No | The initial size of the panels when rendered.
Use when you don't need to control the size of the panels. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
root: string
resizeTrigger: (id: string) => string
label: (id: string) => string
panel: (id: string | number) => string
}>` | No | The ids of the elements in the splitter. Useful for composition. |
| `keyboardResizeBy` | `number` | No | The number of pixels to resize the panel by when the keyboard is used. |
| `nonce` | `string` | No | The nonce for the injected splitter cursor stylesheet. |
| `onCollapse` | `(details: ExpandCollapseDetails) => void` | No | Function called when a panel is collapsed. |
| `onExpand` | `(details: ExpandCollapseDetails) => void` | No | Function called when a panel is expanded. |
| `onResize` | `(details: ResizeDetails) => void` | No | Function called when the splitter is resized. |
| `onResizeEnd` | `(details: ResizeEndDetails) => void` | No | Function called when the splitter resize ends. |
| `onResizeStart` | `() => void` | No | Function called when the splitter resize starts. |
| `orientation` | `'horizontal' | 'vertical'` | No | The orientation of the splitter. Can be `horizontal` or `vertical` |
| `size` | `number[]` | No | The controlled size data of the panels |
**Root Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | root |
| `[data-orientation]` | The orientation of the splitter |
| `[data-dragging]` | Present when in the dragging state |
**Panel Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `id` | `string` | Yes | |
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Panel Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | panel |
| `[data-orientation]` | The orientation of the panel |
| `[data-dragging]` | Present when in the dragging state |
| `[data-id]` | |
| `[data-index]` | The index of the item |
**ResizeTrigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `id` | ``${string}:${string}`` | Yes | |
| `asChild` | `(props: ParentProps<'button'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `disabled` | `boolean` | No | |
**ResizeTrigger Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | resize-trigger |
| `[data-id]` | |
| `[data-orientation]` | The orientation of the resizetrigger |
| `[data-focus]` | Present when focused |
| `[data-dragging]` | Present when in the dragging state |
| `[data-disabled]` | Present when disabled |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `UseSplitterReturn` | Yes | |
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
#### Vue
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `panels` | `PanelData[]` | Yes | The size constraints of the panels. |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `defaultSize` | `number[]` | No | The initial size of the panels when rendered.
Use when you don't need to control the size of the panels. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
root: string
resizeTrigger(id: string): string
label(id: string): string
panel(id: string | number): string
}>` | No | The ids of the elements in the splitter. Useful for composition. |
| `keyboardResizeBy` | `number` | No | The number of pixels to resize the panel by when the keyboard is used. |
| `nonce` | `string` | No | The nonce for the injected splitter cursor stylesheet. |
| `orientation` | `'horizontal' | 'vertical'` | No | The orientation of the splitter. Can be `horizontal` or `vertical` |
| `size` | `number[]` | No | The controlled size data of the panels |
**Root Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | root |
| `[data-orientation]` | The orientation of the splitter |
| `[data-dragging]` | Present when in the dragging state |
**Panel Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `id` | `string` | Yes | |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Panel Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | panel |
| `[data-orientation]` | The orientation of the panel |
| `[data-dragging]` | Present when in the dragging state |
| `[data-id]` | |
| `[data-index]` | The index of the item |
**ResizeTrigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `id` | ``${string}:${string}`` | Yes | |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `disabled` | `boolean` | No | |
**ResizeTrigger Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | resize-trigger |
| `[data-id]` | |
| `[data-orientation]` | The orientation of the resizetrigger |
| `[data-focus]` | Present when focused |
| `[data-dragging]` | Present when in the dragging state |
| `[data-disabled]` | Present when disabled |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `SplitterApi` | Yes | |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
#### Svelte
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `panels` | `PanelData[]` | Yes | The size constraints of the panels. |
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `defaultSize` | `number[]` | No | The initial size of the panels when rendered.
Use when you don't need to control the size of the panels. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
root: string
resizeTrigger: (id: string) => string
label: (id: string) => string
panel: (id: string | number) => string
}>` | No | The ids of the elements in the splitter. Useful for composition. |
| `keyboardResizeBy` | `number` | No | The number of pixels to resize the panel by when the keyboard is used. |
| `nonce` | `string` | No | The nonce for the injected splitter cursor stylesheet. |
| `onCollapse` | `(details: ExpandCollapseDetails) => void` | No | Function called when a panel is collapsed. |
| `onExpand` | `(details: ExpandCollapseDetails) => void` | No | Function called when a panel is expanded. |
| `onResize` | `(details: ResizeDetails) => void` | No | Function called when the splitter is resized. |
| `onResizeEnd` | `(details: ResizeEndDetails) => void` | No | Function called when the splitter resize ends. |
| `onResizeStart` | `() => void` | No | Function called when the splitter resize starts. |
| `orientation` | `'horizontal' | 'vertical'` | No | The orientation of the splitter. Can be `horizontal` or `vertical` |
| `ref` | `Element` | No | |
| `size` | `number[]` | No | The controlled size data of the panels |
**Root Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | root |
| `[data-orientation]` | The orientation of the splitter |
| `[data-dragging]` | Present when in the dragging state |
**Context Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `render` | `Snippet<[UseSplitterContext]>` | Yes | |
**Panel Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `id` | `string` | Yes | |
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**Panel Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | panel |
| `[data-orientation]` | The orientation of the panel |
| `[data-dragging]` | Present when in the dragging state |
| `[data-id]` | |
| `[data-index]` | The index of the item |
**ResizeTrigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `id` | ``${string}:${string}`` | Yes | |
| `asChild` | `Snippet<[PropsFn<'button'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `disabled` | `boolean` | No | |
| `ref` | `Element` | No | |
**ResizeTrigger Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | splitter |
| `[data-part]` | resize-trigger |
| `[data-id]` | |
| `[data-orientation]` | The orientation of the resizetrigger |
| `[data-focus]` | Present when focused |
| `[data-dragging]` | Present when in the dragging state |
| `[data-disabled]` | Present when disabled |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `UseSplitterReturn` | Yes | |
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
### Context
**API:**
| Property | Type | Description |
|----------|------|-------------|
| `dragging` | `boolean` | Whether the splitter is currently being resized. |
| `orientation` | `"horizontal" | "vertical"` | The orientation of the splitter. |
| `getSizes` | `() => number[]` | Returns the current sizes of the panels. |
| `setSizes` | `(size: number[]) => void` | Sets the sizes of the panels. |
| `getItems` | `() => SplitterItem[]` | Returns the items of the splitter. |
| `getPanels` | `() => PanelData[]` | Returns the panels of the splitter. |
| `getPanelById` | `(id: string) => PanelData` | Returns the panel with the specified id. |
| `getPanelSize` | `(id: string) => number` | Returns the size of the specified panel. |
| `isPanelCollapsed` | `(id: string) => boolean` | Returns whether the specified panel is collapsed. |
| `isPanelExpanded` | `(id: string) => boolean` | Returns whether the specified panel is expanded. |
| `collapsePanel` | `(id: string) => void` | Collapses the specified panel. |
| `expandPanel` | `(id: string, minSize?: number) => void` | Expands the specified panel. |
| `resizePanel` | `(id: string, unsafePanelSize: number) => void` | Resizes the specified panel. |
| `getLayout` | `() => string` | Returns the layout of the splitter. |
| `resetSizes` | `VoidFunction` | Resets the splitter to its initial state. |
| `getResizeTriggerState` | `(props: ResizeTriggerProps) => ResizeTriggerState` | Returns the state of the resize trigger. |
## Accessibility
Complies with the [Window Splitter WAI-ARIA design pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/).