Skip to content

Commit 195d097

Browse files
author
Andy Hook
authored
Add forceMount to Content (#1414)
1 parent 39cd2de commit 195d097

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

.yarn/versions/4a91906d.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
releases:
2+
"@radix-ui/react-tabs": patch
3+
4+
declined:
5+
- primitives

packages/react/tabs/src/Tabs.stories.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,30 @@ export const Chromatic = () => (
309309
</Tabs.Content>
310310
</Tabs.Root>
311311

312+
<h1>Force mounted contents</h1>
313+
<Tabs.Root className={rootClass()}>
314+
<Tabs.List aria-label="tabs example" className={listClass()}>
315+
<Tabs.Trigger value="tab1" className={triggerClass()}>
316+
Tab 1
317+
</Tabs.Trigger>
318+
<Tabs.Trigger value="tab2" className={triggerClass()}>
319+
Tab 2
320+
</Tabs.Trigger>
321+
<Tabs.Trigger value="tab3" className={triggerClass()}>
322+
Tab 3
323+
</Tabs.Trigger>
324+
</Tabs.List>
325+
<Tabs.Content value="tab1" className={contentClass()} forceMount>
326+
Tab 1 content
327+
</Tabs.Content>
328+
<Tabs.Content value="tab2" className={contentClass()} forceMount>
329+
Tab 2 content
330+
</Tabs.Content>
331+
<Tabs.Content value="tab3" className={contentClass()} forceMount>
332+
Tab 3 content
333+
</Tabs.Content>
334+
</Tabs.Root>
335+
312336
<h1>State attributes</h1>
313337
<Tabs.Root defaultValue="tab3" className={rootAttrClass()}>
314338
<Tabs.List aria-label="tabs example" className={listAttrClass()}>

packages/react/tabs/src/Tabs.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,17 @@ const CONTENT_NAME = 'TabsContent';
217217
type TabsContentElement = React.ElementRef<typeof Primitive.div>;
218218
interface TabsContentProps extends PrimitiveDivProps {
219219
value: string;
220+
221+
/**
222+
* Used to force mounting when more control is needed. Useful when
223+
* controlling animation with React animation libraries.
224+
*/
225+
forceMount?: true;
220226
}
221227

222228
const TabsContent = React.forwardRef<TabsContentElement, TabsContentProps>(
223229
(props: ScopedProps<TabsContentProps>, forwardedRef) => {
224-
const { __scopeTabs, value, children, ...contentProps } = props;
230+
const { __scopeTabs, value, forceMount, children, ...contentProps } = props;
225231
const context = useTabsContext(CONTENT_NAME, __scopeTabs);
226232
const triggerId = makeTriggerId(context.baseId, value);
227233
const contentId = makeContentId(context.baseId, value);
@@ -234,7 +240,7 @@ const TabsContent = React.forwardRef<TabsContentElement, TabsContentProps>(
234240
}, []);
235241

236242
return (
237-
<Presence present={isSelected}>
243+
<Presence present={forceMount || isSelected}>
238244
{({ present }) => (
239245
<Primitive.div
240246
data-state={isSelected ? 'active' : 'inactive'}

0 commit comments

Comments
 (0)