Skip to content

Commit 00b700a

Browse files
committed
fix(Menu): updates Menu for radix v1
This updates all radix libraries to v1.0.0 but only updates the API for Menu, others to be done later. BREAKING CHANGE: Menu: Sub menus should now use MenuSub, MenuSubTrigger and MenuSubContent - removes MenuTriggerItem see #286
1 parent d8f0732 commit 00b700a

File tree

4 files changed

+85
-38
lines changed

4 files changed

+85
-38
lines changed

src/components/ContextMenu/ContextMenu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929
labelStyles,
3030
separatorStyles,
3131
StyledCheckIndicator,
32-
StyledTriggerItemIndicator,
32+
StyledSubTriggerIndicator,
3333
triggerItemStyles,
3434
} from '../../utils/menuStyles'
3535
import { paperStyles } from '../Paper'
@@ -119,7 +119,7 @@ export const ContextMenuSubTrigger = forwardRef<
119119
return (
120120
<StyledSubTrigger {...props} ref={forwardedRef}>
121121
{children}
122-
<StyledTriggerItemIndicator />
122+
<StyledSubTriggerIndicator />
123123
</StyledSubTrigger>
124124
)
125125
})

src/components/Menu/Menu.stories.tsx

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import {
1414
MenuRadioGroup,
1515
MenuRadioItem,
1616
MenuSeparator,
17+
MenuSub,
18+
MenuSubContent,
19+
MenuSubTrigger,
1720
MenuTrigger,
18-
MenuTriggerItem,
1921
} from '.'
2022
import { Avatar } from '../Avatar'
2123
import { Chip } from '../Chip'
@@ -36,8 +38,10 @@ export default {
3638
MenuLabel,
3739
MenuItemGroup,
3840
MenuRadioGroup,
39-
MenuTriggerItem,
4041
MenuButton,
42+
MenuSub,
43+
MenuSubContent,
44+
MenuSubTrigger,
4145
},
4246
} as Meta
4347

@@ -219,22 +223,22 @@ export const Nested: Story = () => {
219223
<MenuItem>
220224
New Window <MenuItemShortcut>⌘+N</MenuItemShortcut>
221225
</MenuItem>
222-
<Menu>
223-
<MenuTriggerItem>Developer</MenuTriggerItem>
224-
<MenuContent sideOffset={8}>
226+
<MenuSub>
227+
<MenuSubTrigger>Developer</MenuSubTrigger>
228+
<MenuSubContent>
225229
<MenuItem>Test</MenuItem>
226230
<MenuItem>Build</MenuItem>
227231
<MenuItem>Start</MenuItem>
228-
<Menu>
229-
<MenuTriggerItem>More</MenuTriggerItem>
230-
<MenuContent sideOffset={8}>
232+
<MenuSub>
233+
<MenuSubTrigger>More</MenuSubTrigger>
234+
<MenuSubContent>
231235
<MenuItem>Test</MenuItem>
232236
<MenuItem>Build</MenuItem>
233237
<MenuItem>Start</MenuItem>
234-
</MenuContent>
235-
</Menu>
236-
</MenuContent>
237-
</Menu>
238+
</MenuSubContent>
239+
</MenuSub>
240+
</MenuSubContent>
241+
</MenuSub>
238242
</MenuContent>
239243
</Menu>
240244
)

src/components/Menu/Menu.tsx

Lines changed: 66 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,20 @@ import {
55
Item,
66
ItemIndicator,
77
Label,
8+
Portal,
89
RadioGroup,
910
RadioItem,
1011
Root,
1112
Separator,
13+
Sub,
14+
SubContent,
15+
SubTrigger,
1216
Trigger,
13-
TriggerItem,
1417
} from '@radix-ui/react-dropdown-menu'
1518
import React, { ComponentProps, ElementRef, forwardRef } from 'react'
1619
import type { CSSProps } from '../../stitches.config'
1720
import { styled } from '../../stitches.config'
21+
import { ConditionalWrapper } from '../../utils'
1822
import {
1923
checkboxItemStyles,
2024
contentStyles,
@@ -25,7 +29,7 @@ import {
2529
labelStyles,
2630
separatorStyles,
2731
StyledCheckIndicator,
28-
StyledTriggerItemIndicator,
32+
StyledSubTriggerIndicator,
2933
triggerItemStyles,
3034
} from '../../utils/menuStyles'
3135
import { Button } from '../Button'
@@ -55,32 +59,27 @@ const StyledContent = styled(Content, paperStyles, contentStyles)
5559
const StyledItemIndicator = styled(ItemIndicator, itemIndicatorStyles)
5660
const StyledCheckboxItem = styled(CheckboxItem, itemStyles, checkboxItemStyles)
5761
const StyledRadioItem = styled(RadioItem, itemStyles, checkboxItemStyles)
58-
const StyledTriggerItem = styled(TriggerItem, itemStyles, triggerItemStyles)
5962

60-
type MenuTriggerItemProps = ComponentProps<typeof TriggerItem> & CSSProps
61-
62-
export const MenuTriggerItem = forwardRef<
63-
ElementRef<typeof StyledTriggerItem>,
64-
MenuTriggerItemProps
65-
>(({ children, ...props }, forwardedRef) => {
66-
return (
67-
<StyledTriggerItem {...props} ref={forwardedRef}>
68-
{children}
69-
<StyledTriggerItemIndicator />
70-
</StyledTriggerItem>
71-
)
72-
})
73-
MenuTriggerItem.toString = () => `.${StyledTriggerItem.className}`
74-
75-
type MenuContentProps = ComponentProps<typeof Content> & CSSProps
63+
type MenuContentProps = ComponentProps<typeof Content> &
64+
CSSProps & {
65+
/** By default, portals your content parts into the body, set false to add at dom location. */
66+
portalled?: boolean
67+
/** Specify a container element to portal the content into. */
68+
container?: ComponentProps<typeof Portal>['container']
69+
}
7670

7771
export const MenuContent = forwardRef<
7872
ElementRef<typeof StyledContent>,
7973
MenuContentProps
80-
>(({ children, ...props }, forwardedRef) => (
81-
<StyledContent alignOffset={8} {...props} ref={forwardedRef}>
82-
{children}
83-
</StyledContent>
74+
>(({ portalled = true, container, children, ...props }, forwardedRef) => (
75+
<ConditionalWrapper
76+
condition={portalled}
77+
wrapper={(child) => <Portal container={container}>{child}</Portal>}
78+
>
79+
<StyledContent alignOffset={8} {...props} ref={forwardedRef}>
80+
{children}
81+
</StyledContent>
82+
</ConditionalWrapper>
8483
))
8584
MenuContent.toString = () => `.${StyledContent.className}`
8685

@@ -164,3 +163,47 @@ export const MenuRadioItem = forwardRef<
164163
</StyledRadioItem>
165164
))
166165
MenuRadioItem.toString = () => `.${StyledRadioItem.className}`
166+
167+
// Sub menu
168+
169+
export const MenuSub = Sub
170+
const StyledSubTrigger = styled(SubTrigger, itemStyles, triggerItemStyles)
171+
const StyledSubContent = styled(SubContent, paperStyles, contentStyles)
172+
173+
type MenuSubTriggerProps = ComponentProps<typeof StyledSubTrigger> & CSSProps
174+
175+
export const MenuSubTrigger = forwardRef<
176+
ElementRef<typeof StyledSubTrigger>,
177+
MenuSubTriggerProps
178+
>(({ children, ...props }, forwardedRef) => {
179+
return (
180+
<StyledSubTrigger {...props} ref={forwardedRef}>
181+
{children}
182+
<StyledSubTriggerIndicator />
183+
</StyledSubTrigger>
184+
)
185+
})
186+
MenuSubTrigger.toString = () => `.${StyledSubTrigger.className}`
187+
188+
type MenuSubContentProps = ComponentProps<typeof StyledSubContent> &
189+
CSSProps & {
190+
/** By default, portals your content parts into the body, set false to add at dom location. */
191+
portalled?: boolean
192+
/** Specify a container element to portal the content into. */
193+
container?: ComponentProps<typeof Portal>['container']
194+
}
195+
196+
export const MenuSubContent = forwardRef<
197+
ElementRef<typeof StyledSubContent>,
198+
MenuSubContentProps
199+
>(({ container, portalled = true, children, ...props }, forwardedRef) => (
200+
<ConditionalWrapper
201+
condition={portalled}
202+
wrapper={(child) => <Portal container={container}>{child}</Portal>}
203+
>
204+
<StyledSubContent {...props} ref={forwardedRef}>
205+
{children}
206+
</StyledSubContent>
207+
</ConditionalWrapper>
208+
))
209+
MenuSubContent.toString = () => `.${StyledSubContent.className}`

src/utils/menuStyles.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,5 +121,5 @@ export const triggerItemStyles = css({
121121

122122
const indicatorStyles = css({ size: '$4' })
123123

124-
export const StyledTriggerItemIndicator = styled(ChevronRight, indicatorStyles)
124+
export const StyledSubTriggerIndicator = styled(ChevronRight, indicatorStyles)
125125
export const StyledCheckIndicator = styled(Check, indicatorStyles)

0 commit comments

Comments
 (0)