@@ -81,22 +81,26 @@ export interface MenuProps<T> extends Omit<AriaMenuProps<T>, 'children' | 'style
81
81
/**
82
82
* The contents of the collection.
83
83
*/
84
- children ?: ReactNode | ( ( item : T ) => ReactNode )
84
+ children ?: ReactNode | ( ( item : T ) => ReactNode ) ,
85
+ /** Hides the default link out icons on menu items that open links in a new tab. */
86
+ hideLinkOutIcon ?: boolean
85
87
}
86
88
87
89
export const MenuContext = createContext < ContextValue < MenuProps < any > , DOMRefValue < HTMLDivElement > > > ( null ) ;
88
90
91
+ const menuItemGrid = {
92
+ size : {
93
+ S : [ edgeToText ( 24 ) , 'auto' , 'auto' , 'minmax(0, 1fr)' , 'auto' , 'auto' , 'auto' , edgeToText ( 24 ) ] ,
94
+ M : [ edgeToText ( 32 ) , 'auto' , 'auto' , 'minmax(0, 1fr)' , 'auto' , 'auto' , 'auto' , edgeToText ( 32 ) ] ,
95
+ L : [ edgeToText ( 40 ) , 'auto' , 'auto' , 'minmax(0, 1fr)' , 'auto' , 'auto' , 'auto' , edgeToText ( 40 ) ] ,
96
+ XL : [ edgeToText ( 48 ) , 'auto' , 'auto' , 'minmax(0, 1fr)' , 'auto' , 'auto' , 'auto' , edgeToText ( 48 ) ]
97
+ }
98
+ } as const ;
99
+
89
100
export let menu = style ( {
90
101
outlineStyle : 'none' ,
91
102
display : 'grid' ,
92
- gridTemplateColumns : {
93
- size : {
94
- S : [ edgeToText ( 24 ) , 'auto' , 'auto' , 'minmax(0, 1fr)' , 'auto' , 'auto' , 'auto' , edgeToText ( 24 ) ] ,
95
- M : [ edgeToText ( 32 ) , 'auto' , 'auto' , 'minmax(0, 1fr)' , 'auto' , 'auto' , 'auto' , edgeToText ( 32 ) ] ,
96
- L : [ edgeToText ( 40 ) , 'auto' , 'auto' , 'minmax(0, 1fr)' , 'auto' , 'auto' , 'auto' , edgeToText ( 40 ) ] ,
97
- XL : [ edgeToText ( 48 ) , 'auto' , 'auto' , 'minmax(0, 1fr)' , 'auto' , 'auto' , 'auto' , edgeToText ( 48 ) ]
98
- }
99
- } ,
103
+ gridTemplateColumns : menuItemGrid ,
100
104
boxSizing : 'border-box' ,
101
105
maxHeight : '[inherit]' ,
102
106
overflow : {
@@ -121,7 +125,7 @@ export let section = style({
121
125
'. checkmark icon label value keyboard descriptor .' ,
122
126
'. . . description . . . .'
123
127
] ,
124
- gridTemplateColumns : 'subgrid'
128
+ gridTemplateColumns : menuItemGrid
125
129
} ) ;
126
130
127
131
export let sectionHeader = style < { size ?: 'S' | 'M' | 'L' | 'XL' } > ( {
@@ -310,7 +314,12 @@ let descriptor = style({
310
314
}
311
315
} ) ;
312
316
313
- let InternalMenuContext = createContext < { size : 'S' | 'M' | 'L' | 'XL' , isSubmenu : boolean } > ( { size : 'M' , isSubmenu : false } ) ;
317
+ let InternalMenuContext = createContext < { size : 'S' | 'M' | 'L' | 'XL' , isSubmenu : boolean , hideLinkOutIcon : boolean } > ( {
318
+ size : 'M' ,
319
+ isSubmenu : false ,
320
+ hideLinkOutIcon : false
321
+ } ) ;
322
+
314
323
let InternalMenuTriggerContext = createContext < Omit < MenuTriggerProps , 'children' > | null > ( null ) ;
315
324
316
325
/**
@@ -324,7 +333,8 @@ export const Menu = /*#__PURE__*/ (forwardRef as forwardRefType)(function Menu<T
324
333
size = ctxSize ,
325
334
UNSAFE_style,
326
335
UNSAFE_className,
327
- styles
336
+ styles,
337
+ hideLinkOutIcon = false
328
338
} = props ;
329
339
let ctx = useContext ( InternalMenuTriggerContext ) ;
330
340
let { align = 'start' , direction = 'bottom' , shouldFlip} = ctx ?? { } ;
@@ -349,7 +359,7 @@ export const Menu = /*#__PURE__*/ (forwardRef as forwardRefType)(function Menu<T
349
359
}
350
360
351
361
let content = (
352
- < InternalMenuContext . Provider value = { { size, isSubmenu : true } } >
362
+ < InternalMenuContext . Provider value = { { size, isSubmenu : true , hideLinkOutIcon } } >
353
363
< Provider
354
364
values = { [
355
365
[ HeaderContext , { styles : sectionHeader ( { size} ) } ] ,
@@ -417,11 +427,12 @@ export function Divider(props: SeparatorProps) {
417
427
export interface MenuSectionProps < T extends object > extends AriaMenuSectionProps < T > { }
418
428
export function MenuSection < T extends object > ( props : MenuSectionProps < T > ) {
419
429
// remember, context doesn't work if it's around Section nor inside
430
+ let { size} = useContext ( InternalMenuContext ) ;
420
431
return (
421
432
< >
422
433
< AriaMenuSection
423
434
{ ...props }
424
- className = { section } >
435
+ className = { section ( { size } ) } >
425
436
{ props . children }
426
437
</ AriaMenuSection >
427
438
< Divider />
@@ -454,7 +465,7 @@ export function MenuItem(props: MenuItemProps) {
454
465
let ref = useRef ( null ) ;
455
466
let isLink = props . href != null ;
456
467
let isLinkOut = isLink && props . target === '_blank' ;
457
- let { size} = useContext ( InternalMenuContext ) ;
468
+ let { size, hideLinkOutIcon } = useContext ( InternalMenuContext ) ;
458
469
let textValue = props . textValue || ( typeof props . children === 'string' ? props . children : undefined ) ;
459
470
let { direction} = useLocale ( ) ;
460
471
return (
@@ -494,13 +505,25 @@ export function MenuItem(props: MenuItemProps) {
494
505
</ div >
495
506
) }
496
507
{ typeof children === 'string' ? < Text slot = "label" > { children } </ Text > : children }
497
- { isLinkOut && < LinkOutIcon size = { linkIconSize [ size ] } className = { descriptor } /> }
508
+ { isLinkOut && ! hideLinkOutIcon && (
509
+ < div slot = "descriptor" className = { descriptor } >
510
+ < LinkOutIcon
511
+ size = { linkIconSize [ size ] }
512
+ className = { style ( {
513
+ scaleX : {
514
+ direction : {
515
+ rtl : - 1
516
+ }
517
+ }
518
+ } ) ( { direction} ) } />
519
+ </ div >
520
+ ) }
498
521
{ renderProps . hasSubmenu && (
499
522
< div slot = "descriptor" className = { descriptor } >
500
523
< ChevronRightIcon
501
524
size = { size }
502
525
className = { style ( {
503
- scale : {
526
+ scaleX : {
504
527
direction : {
505
528
rtl : - 1
506
529
}
0 commit comments