@kushagradhawan/kookie-ui 0.1.124 → 0.1.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components.css +93 -0
- package/dist/cjs/components/_internal/base-menu.props.d.ts +52 -1
- package/dist/cjs/components/_internal/base-menu.props.d.ts.map +1 -1
- package/dist/cjs/components/_internal/base-menu.props.js +1 -1
- package/dist/cjs/components/_internal/base-menu.props.js.map +3 -3
- package/dist/cjs/components/_internal/dropdown-menu-drill-down.d.ts +60 -0
- package/dist/cjs/components/_internal/dropdown-menu-drill-down.d.ts.map +1 -0
- package/dist/cjs/components/_internal/dropdown-menu-drill-down.js +2 -0
- package/dist/cjs/components/_internal/dropdown-menu-drill-down.js.map +7 -0
- package/dist/cjs/components/combobox.d.ts.map +1 -1
- package/dist/cjs/components/combobox.js +1 -1
- package/dist/cjs/components/combobox.js.map +3 -3
- package/dist/cjs/components/dropdown-menu.d.ts +28 -7
- package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
- package/dist/cjs/components/dropdown-menu.js +1 -1
- package/dist/cjs/components/dropdown-menu.js.map +3 -3
- package/dist/cjs/components/dropdown-menu.props.d.ts +1 -1
- package/dist/cjs/components/dropdown-menu.props.d.ts.map +1 -1
- package/dist/cjs/components/dropdown-menu.props.js +1 -1
- package/dist/cjs/components/dropdown-menu.props.js.map +2 -2
- package/dist/cjs/components/icons.d.ts +2 -1
- package/dist/cjs/components/icons.d.ts.map +1 -1
- package/dist/cjs/components/icons.js +1 -1
- package/dist/cjs/components/icons.js.map +3 -3
- package/dist/cjs/components/schemas/shell.schema.d.ts +2 -2
- package/dist/esm/components/_internal/base-menu.props.d.ts +52 -1
- package/dist/esm/components/_internal/base-menu.props.d.ts.map +1 -1
- package/dist/esm/components/_internal/base-menu.props.js +1 -1
- package/dist/esm/components/_internal/base-menu.props.js.map +3 -3
- package/dist/esm/components/_internal/dropdown-menu-drill-down.d.ts +60 -0
- package/dist/esm/components/_internal/dropdown-menu-drill-down.d.ts.map +1 -0
- package/dist/esm/components/_internal/dropdown-menu-drill-down.js +2 -0
- package/dist/esm/components/_internal/dropdown-menu-drill-down.js.map +7 -0
- package/dist/esm/components/combobox.d.ts.map +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/combobox.js.map +3 -3
- package/dist/esm/components/dropdown-menu.d.ts +28 -7
- package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
- package/dist/esm/components/dropdown-menu.js +1 -1
- package/dist/esm/components/dropdown-menu.js.map +3 -3
- package/dist/esm/components/dropdown-menu.props.d.ts +1 -1
- package/dist/esm/components/dropdown-menu.props.d.ts.map +1 -1
- package/dist/esm/components/dropdown-menu.props.js +1 -1
- package/dist/esm/components/dropdown-menu.props.js.map +3 -3
- package/dist/esm/components/icons.d.ts +2 -1
- package/dist/esm/components/icons.d.ts.map +1 -1
- package/dist/esm/components/icons.js +1 -1
- package/dist/esm/components/icons.js.map +3 -3
- package/dist/esm/components/schemas/shell.schema.d.ts +2 -2
- package/package.json +1 -1
- package/schemas/base-button.json +1 -1
- package/schemas/button.json +1 -1
- package/schemas/icon-button.json +1 -1
- package/schemas/index.json +6 -6
- package/schemas/toggle-button.json +1 -1
- package/schemas/toggle-icon-button.json +1 -1
- package/src/components/_internal/base-menu.props.ts +31 -1
- package/src/components/_internal/dropdown-menu-drill-down.tsx +242 -0
- package/src/components/combobox.tsx +176 -80
- package/src/components/dropdown-menu.css +119 -0
- package/src/components/dropdown-menu.props.tsx +2 -0
- package/src/components/dropdown-menu.tsx +217 -27
- package/src/components/icons.tsx +14 -1
- package/styles.css +93 -0
|
@@ -7,19 +7,28 @@ import { DropdownMenu as DropdownMenuPrimitive, Slot } from 'radix-ui';
|
|
|
7
7
|
import { ScrollArea } from './scroll-area.js';
|
|
8
8
|
import {
|
|
9
9
|
dropdownMenuContentPropDefs,
|
|
10
|
+
dropdownMenuSubContentPropDefs,
|
|
10
11
|
dropdownMenuItemPropDefs,
|
|
11
12
|
dropdownMenuCheckboxItemPropDefs,
|
|
12
13
|
dropdownMenuRadioItemPropDefs,
|
|
13
14
|
} from './dropdown-menu.props.js';
|
|
14
15
|
import { Theme, useThemeContext } from './theme.js';
|
|
15
|
-
import { ChevronDownIcon, ThickCheckIcon, ThickChevronRightIcon, ThickDotIcon } from './icons.js';
|
|
16
|
+
import { ChevronDownIcon, ThickCheckIcon, ThickChevronLeftIcon, ThickChevronRightIcon, ThickDotIcon } from './icons.js';
|
|
16
17
|
import { extractProps } from '../helpers/extract-props.js';
|
|
18
|
+
import {
|
|
19
|
+
DrillDownProvider,
|
|
20
|
+
SubContext,
|
|
21
|
+
useDrillDown,
|
|
22
|
+
useDrillDownOptional,
|
|
23
|
+
useSubContext,
|
|
24
|
+
} from './_internal/dropdown-menu-drill-down.js';
|
|
25
|
+
import type { SubmenuBehavior } from './_internal/dropdown-menu-drill-down.js';
|
|
17
26
|
import { requireReactElement } from '../helpers/require-react-element.js';
|
|
18
27
|
import { Kbd } from './kbd.js';
|
|
19
28
|
|
|
20
29
|
import type { IconProps } from './icons.js';
|
|
21
30
|
import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
|
|
22
|
-
import type { GetPropDefTypes } from '../props/prop-def.js';
|
|
31
|
+
import type { GetPropDefTypes, Responsive } from '../props/prop-def.js';
|
|
23
32
|
|
|
24
33
|
interface DropdownMenuRootProps
|
|
25
34
|
extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Root> {}
|
|
@@ -40,14 +49,52 @@ const DropdownMenuTrigger = React.forwardRef<DropdownMenuTriggerElement, Dropdow
|
|
|
40
49
|
);
|
|
41
50
|
DropdownMenuTrigger.displayName = 'DropdownMenu.Trigger';
|
|
42
51
|
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Internal component that wraps root menu items and handles visibility in drill-down mode.
|
|
54
|
+
* In drill-down mode, this hides when a submenu is active.
|
|
55
|
+
*/
|
|
56
|
+
function DrillDownRoot({ children }: { children: React.ReactNode }) {
|
|
57
|
+
const drillDown = useDrillDownOptional();
|
|
58
|
+
|
|
59
|
+
// In cascade mode or when no drill-down context, always show
|
|
60
|
+
if (!drillDown || drillDown.behavior === 'cascade') {
|
|
61
|
+
return <>{children}</>;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// In drill-down mode, hide root when a submenu is active
|
|
65
|
+
return (
|
|
66
|
+
<div
|
|
67
|
+
className="rt-DropdownMenuDrillDownRoot"
|
|
68
|
+
data-drill-down-active={drillDown.isRoot ? undefined : true}
|
|
69
|
+
>
|
|
70
|
+
{children}
|
|
71
|
+
</div>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
type DropdownMenuContentOwnProps = GetPropDefTypes<typeof dropdownMenuContentPropDefs> & {
|
|
76
|
+
/**
|
|
77
|
+
* Controls how submenus behave.
|
|
78
|
+
* - `cascade`: Default cascading behavior where submenus open to the side (portal-based)
|
|
79
|
+
* - `drill-down`: Mobile-friendly behavior where submenus replace the content inline
|
|
80
|
+
* Supports responsive values: `{ initial: 'drill-down', md: 'cascade' }`
|
|
81
|
+
*/
|
|
82
|
+
submenuBehavior?: Responsive<SubmenuBehavior>;
|
|
83
|
+
};
|
|
84
|
+
type DropdownMenuContentContextValue = Omit<DropdownMenuContentOwnProps, 'submenuBehavior'>;
|
|
45
85
|
const DropdownMenuContentContext = React.createContext<DropdownMenuContentContextValue>({});
|
|
46
86
|
type DropdownMenuContentElement = React.ElementRef<typeof DropdownMenuPrimitive.Content>;
|
|
47
87
|
interface DropdownMenuContentProps
|
|
48
88
|
extends ComponentPropsWithout<typeof DropdownMenuPrimitive.Content, RemovedProps>,
|
|
49
89
|
DropdownMenuContentContextValue {
|
|
50
90
|
container?: React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Portal>['container'];
|
|
91
|
+
/**
|
|
92
|
+
* Controls how submenus behave.
|
|
93
|
+
* - `cascade`: Default cascading behavior where submenus open to the side (portal-based)
|
|
94
|
+
* - `drill-down`: Mobile-friendly behavior where submenus replace the content inline
|
|
95
|
+
* Supports responsive values: `{ initial: 'drill-down', md: 'cascade' }`
|
|
96
|
+
*/
|
|
97
|
+
submenuBehavior?: Responsive<SubmenuBehavior>;
|
|
51
98
|
}
|
|
52
99
|
const DropdownMenuContent = React.forwardRef<DropdownMenuContentElement, DropdownMenuContentProps>(
|
|
53
100
|
(props, forwardedRef) => {
|
|
@@ -80,6 +127,7 @@ const DropdownMenuContent = React.forwardRef<DropdownMenuContentElement, Dropdow
|
|
|
80
127
|
variant = dropdownMenuContentPropDefs.variant.default,
|
|
81
128
|
highContrast = dropdownMenuContentPropDefs.highContrast.default,
|
|
82
129
|
material = memoizedThemeContext.material,
|
|
130
|
+
submenuBehavior,
|
|
83
131
|
} = props;
|
|
84
132
|
const {
|
|
85
133
|
className,
|
|
@@ -89,6 +137,7 @@ const DropdownMenuContent = React.forwardRef<DropdownMenuContentElement, Dropdow
|
|
|
89
137
|
forceMount,
|
|
90
138
|
material: _,
|
|
91
139
|
panelBackground: __,
|
|
140
|
+
submenuBehavior: ___,
|
|
92
141
|
...contentProps
|
|
93
142
|
} = extractProps(props, dropdownMenuContentPropDefs);
|
|
94
143
|
|
|
@@ -125,7 +174,9 @@ const DropdownMenuContent = React.forwardRef<DropdownMenuContentElement, Dropdow
|
|
|
125
174
|
[size, variant, resolvedColor, highContrast, material],
|
|
126
175
|
)}
|
|
127
176
|
>
|
|
128
|
-
{
|
|
177
|
+
<DrillDownProvider submenuBehavior={submenuBehavior}>
|
|
178
|
+
<DrillDownRoot>{children}</DrillDownRoot>
|
|
179
|
+
</DrillDownProvider>
|
|
129
180
|
</DropdownMenuContentContext.Provider>
|
|
130
181
|
</div>
|
|
131
182
|
</ScrollArea>
|
|
@@ -298,11 +349,46 @@ const DropdownMenuCheckboxItem = React.forwardRef<
|
|
|
298
349
|
});
|
|
299
350
|
DropdownMenuCheckboxItem.displayName = 'DropdownMenu.CheckboxItem';
|
|
300
351
|
|
|
352
|
+
// Generate unique submenu IDs using React 18's useId for SSR safety
|
|
353
|
+
function useSubId() {
|
|
354
|
+
return React.useId();
|
|
355
|
+
}
|
|
356
|
+
|
|
301
357
|
interface DropdownMenuSubProps
|
|
302
|
-
extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Sub> {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
358
|
+
extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Sub> {
|
|
359
|
+
/**
|
|
360
|
+
* Label displayed in the back button when using drill-down mode.
|
|
361
|
+
* If not provided, defaults to "Back".
|
|
362
|
+
*/
|
|
363
|
+
label?: React.ReactNode;
|
|
364
|
+
}
|
|
365
|
+
const DropdownMenuSub: React.FC<DropdownMenuSubProps> = ({ label = 'Back', ...props }) => {
|
|
366
|
+
const drillDown = useDrillDownOptional();
|
|
367
|
+
const subId = useSubId();
|
|
368
|
+
|
|
369
|
+
// Create context value for SubContent and SubTrigger
|
|
370
|
+
const subContextValue = React.useMemo(
|
|
371
|
+
() => ({ id: subId, label }),
|
|
372
|
+
[subId, label]
|
|
373
|
+
);
|
|
374
|
+
|
|
375
|
+
// In drill-down mode, we don't use Radix's Sub component
|
|
376
|
+
// We just provide the SubContext and render children
|
|
377
|
+
if (drillDown?.behavior === 'drill-down') {
|
|
378
|
+
return (
|
|
379
|
+
<SubContext.Provider value={subContextValue}>
|
|
380
|
+
{props.children}
|
|
381
|
+
</SubContext.Provider>
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// In cascade mode, use Radix's Sub component normally
|
|
386
|
+
return (
|
|
387
|
+
<SubContext.Provider value={subContextValue}>
|
|
388
|
+
<DropdownMenuPrimitive.Sub {...props} />
|
|
389
|
+
</SubContext.Provider>
|
|
390
|
+
);
|
|
391
|
+
};
|
|
306
392
|
DropdownMenuSub.displayName = 'DropdownMenu.Sub';
|
|
307
393
|
|
|
308
394
|
type DropdownMenuSubTriggerElement = React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>;
|
|
@@ -312,10 +398,53 @@ const DropdownMenuSubTrigger = React.forwardRef<
|
|
|
312
398
|
DropdownMenuSubTriggerElement,
|
|
313
399
|
DropdownMenuSubTriggerProps
|
|
314
400
|
>((props, forwardedRef) => {
|
|
315
|
-
const { className, children, ...subTriggerProps } = props;
|
|
401
|
+
const { className, children, onClick, ...subTriggerProps } = props;
|
|
402
|
+
const drillDown = useDrillDownOptional();
|
|
403
|
+
const subContext = useSubContext();
|
|
404
|
+
|
|
405
|
+
// In drill-down mode, render a button that navigates to the submenu
|
|
406
|
+
if (drillDown?.behavior === 'drill-down' && subContext) {
|
|
407
|
+
const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
408
|
+
e.preventDefault();
|
|
409
|
+
drillDown.push(subContext.id);
|
|
410
|
+
(onClick as React.MouseEventHandler<HTMLDivElement> | undefined)?.(e);
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
return (
|
|
414
|
+
<div
|
|
415
|
+
role="menuitem"
|
|
416
|
+
tabIndex={0}
|
|
417
|
+
ref={forwardedRef as React.Ref<HTMLDivElement>}
|
|
418
|
+
onClick={handleClick}
|
|
419
|
+
onKeyDown={(e) => {
|
|
420
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
421
|
+
e.preventDefault();
|
|
422
|
+
drillDown.push(subContext.id);
|
|
423
|
+
}
|
|
424
|
+
}}
|
|
425
|
+
className={classNames(
|
|
426
|
+
'rt-reset',
|
|
427
|
+
'rt-BaseMenuItem',
|
|
428
|
+
'rt-BaseMenuSubTrigger',
|
|
429
|
+
'rt-DropdownMenuItem',
|
|
430
|
+
'rt-DropdownMenuSubTrigger',
|
|
431
|
+
'rt-DropdownMenuDrillDownSubTrigger',
|
|
432
|
+
className,
|
|
433
|
+
)}
|
|
434
|
+
>
|
|
435
|
+
{children}
|
|
436
|
+
<div className="rt-BaseMenuShortcut rt-DropdownMenuShortcut">
|
|
437
|
+
<ThickChevronRightIcon className="rt-BaseMenuSubTriggerIcon rt-DropdownMenuSubtriggerIcon" />
|
|
438
|
+
</div>
|
|
439
|
+
</div>
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// In cascade mode, use Radix's SubTrigger
|
|
316
444
|
return (
|
|
317
445
|
<DropdownMenuPrimitive.SubTrigger
|
|
318
446
|
{...subTriggerProps}
|
|
447
|
+
onClick={onClick as React.MouseEventHandler<HTMLDivElement> | undefined}
|
|
319
448
|
asChild={false}
|
|
320
449
|
ref={forwardedRef}
|
|
321
450
|
className={classNames(
|
|
@@ -335,6 +464,56 @@ const DropdownMenuSubTrigger = React.forwardRef<
|
|
|
335
464
|
});
|
|
336
465
|
DropdownMenuSubTrigger.displayName = 'DropdownMenu.SubTrigger';
|
|
337
466
|
|
|
467
|
+
// Separator is defined here (before SubContent) because it's used in drill-down mode
|
|
468
|
+
type DropdownMenuSeparatorElement = React.ElementRef<typeof DropdownMenuPrimitive.Separator>;
|
|
469
|
+
interface DropdownMenuSeparatorProps
|
|
470
|
+
extends ComponentPropsWithout<typeof DropdownMenuPrimitive.Separator, RemovedProps> {}
|
|
471
|
+
const DropdownMenuSeparator = React.forwardRef<
|
|
472
|
+
DropdownMenuSeparatorElement,
|
|
473
|
+
DropdownMenuSeparatorProps
|
|
474
|
+
>(({ className, ...props }, forwardedRef) => (
|
|
475
|
+
<DropdownMenuPrimitive.Separator
|
|
476
|
+
{...props}
|
|
477
|
+
asChild={false}
|
|
478
|
+
ref={forwardedRef}
|
|
479
|
+
className={classNames('rt-BaseMenuSeparator', 'rt-DropdownMenuSeparator', className)}
|
|
480
|
+
/>
|
|
481
|
+
));
|
|
482
|
+
DropdownMenuSeparator.displayName = 'DropdownMenu.Separator';
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Internal component for the drill-down back button.
|
|
486
|
+
*/
|
|
487
|
+
function DrillDownBackItem({ label }: { label: React.ReactNode }) {
|
|
488
|
+
const drillDown = useDrillDown();
|
|
489
|
+
|
|
490
|
+
return (
|
|
491
|
+
<div
|
|
492
|
+
role="menuitem"
|
|
493
|
+
tabIndex={0}
|
|
494
|
+
onClick={(e) => {
|
|
495
|
+
e.preventDefault();
|
|
496
|
+
drillDown.pop();
|
|
497
|
+
}}
|
|
498
|
+
onKeyDown={(e) => {
|
|
499
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
500
|
+
e.preventDefault();
|
|
501
|
+
drillDown.pop();
|
|
502
|
+
}
|
|
503
|
+
}}
|
|
504
|
+
className={classNames(
|
|
505
|
+
'rt-reset',
|
|
506
|
+
'rt-BaseMenuItem',
|
|
507
|
+
'rt-DropdownMenuItem',
|
|
508
|
+
'rt-DropdownMenuDrillDownBackItem',
|
|
509
|
+
)}
|
|
510
|
+
>
|
|
511
|
+
<ThickChevronLeftIcon className="rt-DropdownMenuDrillDownBackIcon" />
|
|
512
|
+
<span className="rt-DropdownMenuDrillDownBackLabel">{label}</span>
|
|
513
|
+
</div>
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
|
|
338
517
|
type DropdownMenuSubContentElement = React.ElementRef<typeof DropdownMenuPrimitive.SubContent>;
|
|
339
518
|
interface DropdownMenuSubContentProps
|
|
340
519
|
extends ComponentPropsWithout<typeof DropdownMenuPrimitive.SubContent, RemovedProps>,
|
|
@@ -351,6 +530,8 @@ const DropdownMenuSubContent = React.forwardRef<
|
|
|
351
530
|
() => contextValue,
|
|
352
531
|
[contextValue],
|
|
353
532
|
);
|
|
533
|
+
const drillDown = useDrillDownOptional();
|
|
534
|
+
const subContext = useSubContext();
|
|
354
535
|
|
|
355
536
|
const {
|
|
356
537
|
className,
|
|
@@ -362,8 +543,32 @@ const DropdownMenuSubContent = React.forwardRef<
|
|
|
362
543
|
...subContentProps
|
|
363
544
|
} = extractProps(
|
|
364
545
|
{ size, variant, color, highContrast, material, ...props },
|
|
365
|
-
|
|
546
|
+
dropdownMenuSubContentPropDefs,
|
|
366
547
|
);
|
|
548
|
+
|
|
549
|
+
// In drill-down mode, render inline instead of in a portal
|
|
550
|
+
if (drillDown?.behavior === 'drill-down' && subContext) {
|
|
551
|
+
const isActive = drillDown.isActive(subContext.id);
|
|
552
|
+
|
|
553
|
+
return (
|
|
554
|
+
<div
|
|
555
|
+
ref={forwardedRef as React.Ref<HTMLDivElement>}
|
|
556
|
+
role="menu"
|
|
557
|
+
aria-label={typeof subContext.label === 'string' ? subContext.label : undefined}
|
|
558
|
+
data-drill-down-active={isActive ? true : undefined}
|
|
559
|
+
className={classNames(
|
|
560
|
+
'rt-DropdownMenuDrillDownPanel',
|
|
561
|
+
className,
|
|
562
|
+
)}
|
|
563
|
+
>
|
|
564
|
+
<DrillDownBackItem label={subContext.label} />
|
|
565
|
+
<DropdownMenuSeparator />
|
|
566
|
+
{children}
|
|
567
|
+
</div>
|
|
568
|
+
);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// In cascade mode, use Portal and Radix's SubContent
|
|
367
572
|
return (
|
|
368
573
|
<DropdownMenuPrimitive.Portal container={container} forceMount={forceMount}>
|
|
369
574
|
<Theme asChild>
|
|
@@ -399,22 +604,6 @@ const DropdownMenuSubContent = React.forwardRef<
|
|
|
399
604
|
});
|
|
400
605
|
DropdownMenuSubContent.displayName = 'DropdownMenu.SubContent';
|
|
401
606
|
|
|
402
|
-
type DropdownMenuSeparatorElement = React.ElementRef<typeof DropdownMenuPrimitive.Separator>;
|
|
403
|
-
interface DropdownMenuSeparatorProps
|
|
404
|
-
extends ComponentPropsWithout<typeof DropdownMenuPrimitive.Separator, RemovedProps> {}
|
|
405
|
-
const DropdownMenuSeparator = React.forwardRef<
|
|
406
|
-
DropdownMenuSeparatorElement,
|
|
407
|
-
DropdownMenuSeparatorProps
|
|
408
|
-
>(({ className, ...props }, forwardedRef) => (
|
|
409
|
-
<DropdownMenuPrimitive.Separator
|
|
410
|
-
{...props}
|
|
411
|
-
asChild={false}
|
|
412
|
-
ref={forwardedRef}
|
|
413
|
-
className={classNames('rt-BaseMenuSeparator', 'rt-DropdownMenuSeparator', className)}
|
|
414
|
-
/>
|
|
415
|
-
));
|
|
416
|
-
DropdownMenuSeparator.displayName = 'DropdownMenu.Separator';
|
|
417
|
-
|
|
418
607
|
type DropdownMenuTriggerIconElement = React.ElementRef<'svg'>;
|
|
419
608
|
interface DropdownMenuTriggerIconProps extends IconProps {}
|
|
420
609
|
const DropdownMenuTriggerIcon = React.forwardRef<
|
|
@@ -457,4 +646,5 @@ export type {
|
|
|
457
646
|
DropdownMenuSubTriggerProps as SubTriggerProps,
|
|
458
647
|
DropdownMenuSubContentProps as SubContentProps,
|
|
459
648
|
DropdownMenuSeparatorProps as SeparatorProps,
|
|
649
|
+
SubmenuBehavior,
|
|
460
650
|
};
|
package/src/components/icons.tsx
CHANGED
|
@@ -54,6 +54,19 @@ const ThickChevronRightIcon = React.forwardRef<IconElement, IconProps>((props, f
|
|
|
54
54
|
});
|
|
55
55
|
ThickChevronRightIcon.displayName = 'ThickChevronRightIcon';
|
|
56
56
|
|
|
57
|
+
const ThickChevronLeftIcon = React.forwardRef<IconElement, IconProps>((props, forwardedRef) => {
|
|
58
|
+
return (
|
|
59
|
+
<svg width="9" height="9" viewBox="0 0 9 9" fill="currentcolor" xmlns="http://www.w3.org/2000/svg" {...props} ref={forwardedRef}>
|
|
60
|
+
<path
|
|
61
|
+
fillRule="evenodd"
|
|
62
|
+
clipRule="evenodd"
|
|
63
|
+
d="M5.76174 0.201711C5.45892 -0.0809141 4.98433 -0.0645489 4.70171 0.238264L1.20171 3.98826C0.932757 4.27642 0.932757 4.72359 1.20171 5.01174L4.70171 8.76174C4.98433 9.06455 5.45892 9.08092 5.76174 8.79829C6.06455 8.51567 6.08091 8.04108 5.79829 7.73826L2.77591 4.5L5.79829 1.26174C6.08091 0.958928 6.06455 0.484337 5.76174 0.201711Z"
|
|
64
|
+
/>
|
|
65
|
+
</svg>
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
ThickChevronLeftIcon.displayName = 'ThickChevronLeftIcon';
|
|
69
|
+
|
|
57
70
|
const ThickDotIcon = React.forwardRef<IconElement, IconProps>((props, forwardedRef) => {
|
|
58
71
|
return (
|
|
59
72
|
<svg width="9" height="9" viewBox="0 0 9 9" fill="currentcolor" xmlns="http://www.w3.org/2000/svg" {...props} ref={forwardedRef}>
|
|
@@ -63,7 +76,7 @@ const ThickDotIcon = React.forwardRef<IconElement, IconProps>((props, forwardedR
|
|
|
63
76
|
});
|
|
64
77
|
ThickDotIcon.displayName = 'ThickDotIcon';
|
|
65
78
|
|
|
66
|
-
export { ChevronDownIcon, ThickCheckIcon, ThickChevronRightIcon, ThickDividerHorizontalIcon, ThickDotIcon };
|
|
79
|
+
export { ChevronDownIcon, ThickCheckIcon, ThickChevronLeftIcon, ThickChevronRightIcon, ThickDividerHorizontalIcon, ThickDotIcon };
|
|
67
80
|
export type { IconProps };
|
|
68
81
|
|
|
69
82
|
// Additional minimal icons
|
package/styles.css
CHANGED
|
@@ -13680,6 +13680,99 @@
|
|
|
13680
13680
|
height: var(--trigger-icon-size-4);
|
|
13681
13681
|
}
|
|
13682
13682
|
}
|
|
13683
|
+
.rt-DropdownMenuDrillDownRoot{
|
|
13684
|
+
display: contents;
|
|
13685
|
+
}
|
|
13686
|
+
.rt-DropdownMenuDrillDownRoot:where([data-drill-down-active]) > *{
|
|
13687
|
+
display: none !important;
|
|
13688
|
+
}
|
|
13689
|
+
.rt-DropdownMenuDrillDownRoot:where([data-drill-down-active]) > :where(.rt-DropdownMenuDrillDownPanel){
|
|
13690
|
+
display: contents !important;
|
|
13691
|
+
}
|
|
13692
|
+
.rt-DropdownMenuDrillDownPanel{
|
|
13693
|
+
display: contents;
|
|
13694
|
+
}
|
|
13695
|
+
.rt-DropdownMenuDrillDownPanel:where(:not([data-drill-down-active])) > *{
|
|
13696
|
+
display: none !important;
|
|
13697
|
+
}
|
|
13698
|
+
.rt-DropdownMenuDrillDownPanel:where(:not([data-drill-down-active])) > :where(.rt-DropdownMenuDrillDownPanel){
|
|
13699
|
+
display: contents !important;
|
|
13700
|
+
}
|
|
13701
|
+
.rt-DropdownMenuDrillDownBackItem{
|
|
13702
|
+
display: flex;
|
|
13703
|
+
align-items: center;
|
|
13704
|
+
gap: var(--space-2);
|
|
13705
|
+
min-height: var(--base-menu-item-height);
|
|
13706
|
+
padding-top: var(--base-menu-item-padding-y);
|
|
13707
|
+
padding-bottom: var(--base-menu-item-padding-y);
|
|
13708
|
+
padding-inline-start: var(--base-menu-item-padding-left);
|
|
13709
|
+
padding-inline-end: var(--base-menu-item-padding-right);
|
|
13710
|
+
box-sizing: border-box;
|
|
13711
|
+
outline: none;
|
|
13712
|
+
cursor: var(--cursor-menu-item);
|
|
13713
|
+
-webkit-user-select: none;
|
|
13714
|
+
-moz-user-select: none;
|
|
13715
|
+
user-select: none;
|
|
13716
|
+
transition: var(--transition-menu);
|
|
13717
|
+
font-weight: 500;
|
|
13718
|
+
}
|
|
13719
|
+
.rt-DropdownMenuDrillDownBackItem:where(:focus-visible){
|
|
13720
|
+
outline: 2px solid var(--focus-8);
|
|
13721
|
+
outline-offset: -2px;
|
|
13722
|
+
}
|
|
13723
|
+
@media (prefers-reduced-motion: reduce) {
|
|
13724
|
+
.rt-DropdownMenuDrillDownBackItem{
|
|
13725
|
+
transition: none;
|
|
13726
|
+
}
|
|
13727
|
+
}
|
|
13728
|
+
.rt-DropdownMenuDrillDownBackIcon{
|
|
13729
|
+
width: var(--indicator-icon-size-2);
|
|
13730
|
+
height: var(--indicator-icon-size-2);
|
|
13731
|
+
flex-shrink: 0;
|
|
13732
|
+
color: var(--gray-12);
|
|
13733
|
+
}
|
|
13734
|
+
.rt-DropdownMenuDrillDownBackLabel{
|
|
13735
|
+
color: var(--gray-12);
|
|
13736
|
+
}
|
|
13737
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownBackItem:hover),
|
|
13738
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownBackItem:focus-visible),
|
|
13739
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownSubTrigger:hover),
|
|
13740
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownSubTrigger:focus-visible){
|
|
13741
|
+
background-color: var(--accent-9);
|
|
13742
|
+
color: var(--accent-contrast);
|
|
13743
|
+
}
|
|
13744
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownBackItem:hover) :where(.rt-DropdownMenuDrillDownBackIcon),
|
|
13745
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownBackItem:focus-visible) :where(.rt-DropdownMenuDrillDownBackIcon),
|
|
13746
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownSubTrigger:hover) :where(.rt-DropdownMenuDrillDownBackIcon),
|
|
13747
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownSubTrigger:focus-visible) :where(.rt-DropdownMenuDrillDownBackIcon),
|
|
13748
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownBackItem:hover) :where(.rt-DropdownMenuDrillDownBackLabel),
|
|
13749
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownBackItem:focus-visible) :where(.rt-DropdownMenuDrillDownBackLabel),
|
|
13750
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownSubTrigger:hover) :where(.rt-DropdownMenuDrillDownBackLabel),
|
|
13751
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownSubTrigger:focus-visible) :where(.rt-DropdownMenuDrillDownBackLabel),
|
|
13752
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownBackItem:hover) :where(.rt-BaseMenuSubTriggerIcon),
|
|
13753
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownBackItem:focus-visible) :where(.rt-BaseMenuSubTriggerIcon),
|
|
13754
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownSubTrigger:hover) :where(.rt-BaseMenuSubTriggerIcon),
|
|
13755
|
+
.rt-BaseMenuContent:where(.rt-variant-solid) :where(.rt-DropdownMenuDrillDownSubTrigger:focus-visible) :where(.rt-BaseMenuSubTriggerIcon){
|
|
13756
|
+
color: var(--accent-contrast);
|
|
13757
|
+
}
|
|
13758
|
+
.rt-BaseMenuContent:where(.rt-variant-soft) :where(.rt-DropdownMenuDrillDownBackItem:hover),
|
|
13759
|
+
.rt-BaseMenuContent:where(.rt-variant-soft) :where(.rt-DropdownMenuDrillDownBackItem:focus-visible),
|
|
13760
|
+
.rt-BaseMenuContent:where(.rt-variant-soft) :where(.rt-DropdownMenuDrillDownSubTrigger:hover),
|
|
13761
|
+
.rt-BaseMenuContent:where(.rt-variant-soft) :where(.rt-DropdownMenuDrillDownSubTrigger:focus-visible){
|
|
13762
|
+
background-color: var(--accent-4);
|
|
13763
|
+
}
|
|
13764
|
+
:where([data-panel-background='translucent']) .rt-BaseMenuContent:where(.rt-variant-soft) :where(.rt-DropdownMenuDrillDownBackItem:hover),
|
|
13765
|
+
:where([data-panel-background='translucent']) .rt-BaseMenuContent:where(.rt-variant-soft) :where(.rt-DropdownMenuDrillDownBackItem:focus-visible),
|
|
13766
|
+
:where([data-panel-background='translucent']) .rt-BaseMenuContent:where(.rt-variant-soft) :where(.rt-DropdownMenuDrillDownSubTrigger:hover),
|
|
13767
|
+
:where([data-panel-background='translucent']) .rt-BaseMenuContent:where(.rt-variant-soft) :where(.rt-DropdownMenuDrillDownSubTrigger:focus-visible){
|
|
13768
|
+
background-color: var(--accent-a4);
|
|
13769
|
+
}
|
|
13770
|
+
@media (forced-colors: active) {
|
|
13771
|
+
.rt-DropdownMenuDrillDownBackItem:where(:focus-visible){
|
|
13772
|
+
outline: 2px solid Highlight;
|
|
13773
|
+
outline-offset: 2px;
|
|
13774
|
+
}
|
|
13775
|
+
}
|
|
13683
13776
|
:where([data-panel-background='translucent'], [data-material='translucent']) .rt-TextFieldRoot{
|
|
13684
13777
|
-webkit-backdrop-filter: var(--backdrop-filter-components);
|
|
13685
13778
|
backdrop-filter: var(--backdrop-filter-components);
|