Tabs

Switch between panels that occupy the same space.

Review upcoming projects and their staffing status.
<Tabs.Root defaultValue="projects">
	<Tabs.List>
		<Tabs.Trigger value="projects">Projects</Tabs.Trigger>
		<Tabs.Trigger value="freelancers">Freelancers</Tabs.Trigger>
	</Tabs.List>
	<Tabs.Content value="projects">…</Tabs.Content>
	<Tabs.Content value="freelancers">…</Tabs.Content>
</Tabs.Root>

variant="line" on the list swaps the filled rail for an underline, which sits better directly under a page header.

Review upcoming projects and their staffing status.

API

Tabs.Root

PropTypeDefault
classNamestring | ((state: TabsRootState) => string | undefined)CSS class applied to the element, or a function that returns a class based on the component's state.
defaultValueanyThe default value. Use when the component is not controlled. When the value is null, no Tab will be active.
onValueChange((value: any, eventDetails: TabsRootChangeEventDetails) => void)Callback invoked when new value is being set. The event reason is 'none' for user-initiated changes, such as a click or keyboard navigation; 'initial' for the first automatic selection or fallback in uncontrolled roots when defaultValue is omitted or undefined, including when the implicit initial value is disabled or missing; 'disabled' for automatic fallback when the selected tab becomes disabled in uncontrolled roots; or 'missing' for automatic fallback when the selected tab is removed, or when an explicit defaultValue never matches a mounted tab in uncontrolled roots. For automatic changes, the selected value can be null when no enabled Tab is available as a fallback. Automatic changes cannot be canceled; calling eventDetails.cancel() for 'initial', 'disabled', or 'missing' has no effect.
orientationOrientationThe component orientation (layout flow direction).
renderComponentRenderFn<HTMLProps, TabsRootState> | ReactElement<unknown, string | JSXElementConstructor<any>>Allows you to replace the component's HTML element with a different tag, or compose it with another component. Accepts a ReactElement or a function that returns the element to render.
styleCSSProperties | ((state: TabsRootState) => CSSProperties | undefined)Style applied to the element, or a function that returns a style object based on the component's state.
valueanyThe value of the currently active Tab. Use when the component is controlled. When the value is null, no Tab will be active.

Plus the DOM props of the element it renders. Source: tabs/components/tabs-root.tsx.

Tabs.Content

PropTypeDefault
valueanyrequiredThe value of the TabPanel. It will be shown when the Tab with the corresponding value is active.
classNamestring | ((state: TabsPanelState) => string | undefined)CSS class applied to the element, or a function that returns a class based on the component's state.
keepMountedbooleanWhether to keep the HTML element in the DOM while the panel is hidden.
renderComponentRenderFn<HTMLProps, TabsPanelState> | ReactElement<unknown, string | JSXElementConstructor<any>>Allows you to replace the component's HTML element with a different tag, or compose it with another component. Accepts a ReactElement or a function that returns the element to render.
styleCSSProperties | ((state: TabsPanelState) => CSSProperties | undefined)Style applied to the element, or a function that returns a style object based on the component's state.

Plus the DOM props of the element it renders. Source: tabs/components/tabs-content.tsx.

Tabs.List

PropTypeDefault
variant"default" | "line""default"default sits the tabs in a filled track; line drops the track and marks the active tab with an underline.
activateOnFocusbooleanWhether to automatically change the active tab on arrow key focus. Otherwise, tabs will be activated using Enter or Space key press.
classNamestring | ((state: TabsListState) => string | undefined)CSS class applied to the element, or a function that returns a class based on the component's state.
loopFocusbooleanWhether to loop keyboard focus back to the first item when the end of the list is reached while using the arrow keys.
renderComponentRenderFn<HTMLProps, TabsListState> | ReactElement<unknown, string | JSXElementConstructor<any>>Allows you to replace the component's HTML element with a different tag, or compose it with another component. Accepts a ReactElement or a function that returns the element to render.
styleCSSProperties | ((state: TabsListState) => CSSProperties | undefined)Style applied to the element, or a function that returns a style object based on the component's state.

Plus the DOM props of the element it renders. Source: tabs/components/tabs-list.tsx.

Tabs.Trigger

PropTypeDefault
valueanyrequiredThe value of the Tab.
classNamestring | ((state: TabsTabState) => string | undefined)CSS class applied to the element, or a function that returns a class based on the component's state.
disabledbooleanWhether the Tab is disabled. If a first Tab on a <Tabs.List> is disabled, it won't initially be selected. Instead, the next enabled Tab will be selected. However, it does not work like this during server-side rendering, as it is not known during pre-rendering which Tabs are disabled. To work around it, ensure that defaultValue or value on <Tabs.Root> is set to an enabled Tab's value.
nativeButtonbooleanWhether the component renders a native <button> element when replacing it via the render prop. Set to false if the rendered element is not a button (for example, <div>).
renderComponentRenderFn<HTMLProps, TabsTabState> | ReactElement<unknown, string | JSXElementConstructor<any>>Allows you to replace the component's HTML element with a different tag, or compose it with another component. Accepts a ReactElement or a function that returns the element to render.
styleCSSProperties | ((state: TabsTabState) => CSSProperties | undefined)Style applied to the element, or a function that returns a style object based on the component's state.

Plus the DOM props of the element it renders. Source: tabs/components/tabs-trigger.tsx.