@box/blueprint-web 11.8.4 → 11.10.0
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/dist/lib-esm/accordion/accordion.js +12 -1
- package/dist/lib-esm/accordion/accordion.module.js +1 -1
- package/dist/lib-esm/accordion/types.d.ts +19 -5
- package/dist/lib-esm/guided-tooltip/guided-tooltip-footer.js +8 -4
- package/dist/lib-esm/guided-tooltip/guided-tooltip.js +11 -0
- package/dist/lib-esm/guided-tooltip/types.d.ts +4 -0
- package/dist/lib-esm/index.css +73 -41
- package/dist/lib-esm/primitives/chips/filter-chip/filter-combo-chip.d.ts +1 -0
- package/dist/lib-esm/primitives/chips/filter-chip/index.d.ts +1 -0
- package/dist/lib-esm/primitives/dropdown-menu/dropdown-menu-checkbox-item.js +11 -3
- package/dist/lib-esm/primitives/dropdown-menu/dropdown-menu-item.d.ts +31 -2
- package/dist/lib-esm/primitives/dropdown-menu/dropdown-menu-item.js +97 -7
- package/dist/lib-esm/primitives/dropdown-menu/dropdown-menu-radio-select-item.js +11 -3
- package/dist/lib-esm/primitives/dropdown-menu/dropdown-menu-root.d.ts +2 -0
- package/dist/lib-esm/primitives/dropdown-menu/dropdown-menu-root.js +14 -9
- package/dist/lib-esm/primitives/dropdown-menu/dropdown-menu.module.js +1 -1
- package/dist/lib-esm/primitives/dropdown-menu/index.d.ts +6 -2
- package/dist/lib-esm/primitives/dropdown-menu/menu-item-variant-context.d.ts +13 -0
- package/dist/lib-esm/primitives/dropdown-menu/menu-item-variant-context.js +27 -0
- package/package.json +1 -1
|
@@ -67,12 +67,16 @@ const Item = props => {
|
|
|
67
67
|
// TODO: [DSYS-549] Refactor - spread props in a single place
|
|
68
68
|
const {
|
|
69
69
|
status,
|
|
70
|
+
statusIcon,
|
|
71
|
+
statusIconAriaLabel,
|
|
70
72
|
title,
|
|
71
73
|
disabled,
|
|
72
74
|
error,
|
|
73
75
|
errorIconAriaLabel,
|
|
74
76
|
...itemRest
|
|
75
77
|
} = props;
|
|
78
|
+
const hasStatusLabel = isDefined(status) && !isDefined(statusIcon);
|
|
79
|
+
const hasStatusIcon = !isDefined(status) && isDefined(statusIcon);
|
|
76
80
|
return jsxs(RadixAccordion.Item, {
|
|
77
81
|
...itemRest,
|
|
78
82
|
className: accordionItemClasses,
|
|
@@ -87,10 +91,17 @@ const Item = props => {
|
|
|
87
91
|
children: title
|
|
88
92
|
}), jsxs("div", {
|
|
89
93
|
className: styles.accordionHeaderTrigger,
|
|
90
|
-
children: [
|
|
94
|
+
children: [hasStatusLabel && jsx(Status, {
|
|
91
95
|
className: styles.accordionStatus,
|
|
92
96
|
color: error ? statusColors.error : statusColors.default,
|
|
93
97
|
text: `${status}`
|
|
98
|
+
}), hasStatusIcon && jsx(Status, {
|
|
99
|
+
"aria-label": statusIconAriaLabel,
|
|
100
|
+
className: styles.accordionIconStatus,
|
|
101
|
+
color: error ? statusColors.error : statusColors.default,
|
|
102
|
+
hideText: true,
|
|
103
|
+
icon: statusIcon,
|
|
104
|
+
text: statusIconAriaLabel ?? ''
|
|
94
105
|
}), jsx(PointerChevron, {
|
|
95
106
|
"aria-hidden": "true",
|
|
96
107
|
className: styles.accordionTriggerIcon
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import '../index.css';
|
|
2
|
-
var styles = {"accordionContent":"bp_accordion_module_accordionContent--
|
|
2
|
+
var styles = {"accordionContent":"bp_accordion_module_accordionContent--a6dfe","slideDown":"bp_accordion_module_slideDown--a6dfe","slideUp":"bp_accordion_module_slideUp--a6dfe","accordionContentWrapper":"bp_accordion_module_accordionContentWrapper--a6dfe","accordionInlineErrorWrapper":"bp_accordion_module_accordionInlineErrorWrapper--a6dfe","accordionItem":"bp_accordion_module_accordionItem--a6dfe","accordionFixedContent":"bp_accordion_module_accordionFixedContent--a6dfe","accordionHeader":"bp_accordion_module_accordionHeader--a6dfe","accordionHeaderTrigger":"bp_accordion_module_accordionHeaderTrigger--a6dfe","accordionStatus":"bp_accordion_module_accordionStatus--a6dfe","accordionIconStatus":"bp_accordion_module_accordionIconStatus--a6dfe","accordionTrigger":"bp_accordion_module_accordionTrigger--a6dfe","accordionTriggerIcon":"bp_accordion_module_accordionTriggerIcon--a6dfe"};
|
|
3
3
|
|
|
4
4
|
export { styles as default };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type AccordionMultipleProps, type AccordionSingleProps, type AccordionItemProps as RadixAccordionItemProps } from '@radix-ui/react-accordion';
|
|
2
|
+
import { type FunctionComponent, type PropsWithChildren, type SVGProps } from 'react';
|
|
2
3
|
import { type RequireAllOrNone } from 'type-fest';
|
|
3
4
|
interface Loading {
|
|
4
5
|
/** Loading state of the section. Loading sections are displaying a placeholder. When this is true `loadingAriaLabel` must also be provided. */
|
|
@@ -16,6 +17,23 @@ interface Errorable {
|
|
|
16
17
|
*/
|
|
17
18
|
errorIconAriaLabel?: string;
|
|
18
19
|
}
|
|
20
|
+
interface StatusIconProps {
|
|
21
|
+
/**
|
|
22
|
+
* Icon displayed in a status pill next to the title
|
|
23
|
+
* */
|
|
24
|
+
statusIcon: FunctionComponent<PropsWithChildren<SVGProps<SVGSVGElement>>>;
|
|
25
|
+
/**
|
|
26
|
+
* Description of icon displayed in a status pill next to the title
|
|
27
|
+
* */
|
|
28
|
+
statusIconAriaLabel: string;
|
|
29
|
+
}
|
|
30
|
+
type StatusProps = {
|
|
31
|
+
status: number;
|
|
32
|
+
statusIcon?: never;
|
|
33
|
+
statusIconAriaLabel?: never;
|
|
34
|
+
} | ({
|
|
35
|
+
status?: never;
|
|
36
|
+
} & RequireAllOrNone<StatusIconProps, keyof StatusIconProps>);
|
|
19
37
|
export type AccordionBaseItem = {
|
|
20
38
|
/**
|
|
21
39
|
* Content of the accordion item that is displayed when the section is expanded
|
|
@@ -33,15 +51,11 @@ export type AccordionSectionItem = AccordionBaseItem & Omit<RadixAccordionItemPr
|
|
|
33
51
|
* Header text displayed
|
|
34
52
|
*/
|
|
35
53
|
title: string;
|
|
36
|
-
/**
|
|
37
|
-
* Number displayed in a status pill next to the title
|
|
38
|
-
* */
|
|
39
|
-
status?: number;
|
|
40
54
|
/**
|
|
41
55
|
* Disabled state of the section.
|
|
42
56
|
*/
|
|
43
57
|
disabled?: boolean;
|
|
44
|
-
};
|
|
58
|
+
} & StatusProps;
|
|
45
59
|
export type AccordionItem = AccordionSectionItem | AccordionFixedItem;
|
|
46
60
|
export type AccordionItemProps = AccordionItem & React.ComponentPropsWithRef<'div'>;
|
|
47
61
|
export type AccordionProps = (AccordionSingleProps | AccordionMultipleProps) & React.ComponentPropsWithRef<'div'>;
|
|
@@ -6,11 +6,15 @@ import { getUniqueId } from '../utils/useUniqueId.js';
|
|
|
6
6
|
import styles from './guided-tooltip.module.js';
|
|
7
7
|
import { useGuidedTooltipContext } from './utils/guided-tooltip-context.js';
|
|
8
8
|
|
|
9
|
-
const PrimaryAction = /*#__PURE__*/forwardRef((
|
|
10
|
-
|
|
9
|
+
const PrimaryAction = /*#__PURE__*/forwardRef(({
|
|
10
|
+
autoFocus = true,
|
|
11
|
+
className,
|
|
12
|
+
...rest
|
|
13
|
+
}, forwardedRef) => jsx(Button, {
|
|
14
|
+
...rest,
|
|
11
15
|
ref: forwardedRef,
|
|
12
|
-
autoFocus:
|
|
13
|
-
className: clsx(styles.primaryAction,
|
|
16
|
+
autoFocus: autoFocus,
|
|
17
|
+
className: clsx(styles.primaryAction, className)
|
|
14
18
|
}));
|
|
15
19
|
const SecondaryAction = /*#__PURE__*/forwardRef((props, forwardedRef) => jsx(Button, {
|
|
16
20
|
...props,
|
|
@@ -5,6 +5,7 @@ import * as RadixPopover from '@radix-ui/react-popover';
|
|
|
5
5
|
import clsx from 'clsx';
|
|
6
6
|
import { forwardRef, useCallback, useState, useMemo } from 'react';
|
|
7
7
|
import { IconButton } from '../primitives/icon-button/icon-button.js';
|
|
8
|
+
import { focusRadioGroupFirstIfExists } from '../primitives/popover/popover-focus-utils.js';
|
|
8
9
|
import { GuidedTooltipBody, GuidedTooltipText } from './guided-tooltip-body.js';
|
|
9
10
|
import { GuidedTooltipFooter } from './guided-tooltip-footer.js';
|
|
10
11
|
import { GuidedTooltipIcon } from './guided-tooltip-icon.js';
|
|
@@ -21,6 +22,7 @@ const GuidedTooltipContent = /*#__PURE__*/forwardRef(({
|
|
|
21
22
|
closeLabel,
|
|
22
23
|
content,
|
|
23
24
|
closeDataResinTarget = 'dismiss',
|
|
25
|
+
onOpenAutoFocus,
|
|
24
26
|
side = 'bottom',
|
|
25
27
|
sideOffset = OFFSET_FROM_ANCHOR_IN_PX,
|
|
26
28
|
...rest
|
|
@@ -46,6 +48,14 @@ const GuidedTooltipContent = /*#__PURE__*/forwardRef(({
|
|
|
46
48
|
* It also needs to consist of an id of the "steps indicator" element if it's present
|
|
47
49
|
*/
|
|
48
50
|
const ariaLabelledbyAttr = clsx(titleId || bodyId, stepsIndicatorId);
|
|
51
|
+
// Workaround for: https://github.com/radix-ui/primitives/issues/1910
|
|
52
|
+
const handleOpenAutoFocus = useCallback(e => {
|
|
53
|
+
onOpenAutoFocus?.(e);
|
|
54
|
+
if (e.defaultPrevented) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
focusRadioGroupFirstIfExists(e);
|
|
58
|
+
}, [onOpenAutoFocus]);
|
|
49
59
|
return jsx(GuidedTooltipContext.Provider, {
|
|
50
60
|
value: contextProviderValue,
|
|
51
61
|
children: jsxs(RadixPopover.Content, {
|
|
@@ -56,6 +66,7 @@ const GuidedTooltipContent = /*#__PURE__*/forwardRef(({
|
|
|
56
66
|
arrowPadding: ARROW_PADDING_IN_PX,
|
|
57
67
|
className: clsx(styles.content, className),
|
|
58
68
|
onInteractOutside: onInteractOutside,
|
|
69
|
+
onOpenAutoFocus: handleOpenAutoFocus,
|
|
59
70
|
side: side,
|
|
60
71
|
sideOffset: sideOffset,
|
|
61
72
|
children: [content, jsx(RadixPopover.Close, {
|
|
@@ -15,6 +15,10 @@ export interface GuidedTooltipContentProps extends Omit<React.HTMLAttributes<HTM
|
|
|
15
15
|
* "data-resin-target" to be passed to Close button.
|
|
16
16
|
*/
|
|
17
17
|
closeDataResinTarget?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Optional callback triggered when the GuidedTooltip is about to receive focus after opening
|
|
20
|
+
*/
|
|
21
|
+
onOpenAutoFocus?: RadixPopover.PopoverContentProps['onOpenAutoFocus'];
|
|
18
22
|
/** The preferred side of the anchor to render against. Will be reversed when collisions occur.
|
|
19
23
|
* "top" | "right" | "bottom" | "left"
|
|
20
24
|
* Default value: "bottom". */
|
package/dist/lib-esm/index.css
CHANGED
|
@@ -522,19 +522,19 @@
|
|
|
522
522
|
background-color:#92e0c0;
|
|
523
523
|
}
|
|
524
524
|
|
|
525
|
-
.bp_accordion_module_accordionContent--
|
|
526
|
-
animation:bp_accordion_module_slideDown--
|
|
525
|
+
.bp_accordion_module_accordionContent--a6dfe[data-state=open]{
|
|
526
|
+
animation:bp_accordion_module_slideDown--a6dfe .15s ease-out;
|
|
527
527
|
}
|
|
528
528
|
|
|
529
|
-
.bp_accordion_module_accordionContent--
|
|
530
|
-
animation:bp_accordion_module_slideUp--
|
|
529
|
+
.bp_accordion_module_accordionContent--a6dfe[data-state=closed]{
|
|
530
|
+
animation:bp_accordion_module_slideUp--a6dfe .15s ease-out;
|
|
531
531
|
}
|
|
532
532
|
|
|
533
|
-
.bp_accordion_module_accordionContent--
|
|
533
|
+
.bp_accordion_module_accordionContent--a6dfe{
|
|
534
534
|
overflow:hidden;
|
|
535
535
|
}
|
|
536
536
|
|
|
537
|
-
@keyframes bp_accordion_module_slideDown--
|
|
537
|
+
@keyframes bp_accordion_module_slideDown--a6dfe{
|
|
538
538
|
from{
|
|
539
539
|
height:0;
|
|
540
540
|
}
|
|
@@ -542,7 +542,7 @@
|
|
|
542
542
|
height:var(--radix-accordion-content-height);
|
|
543
543
|
}
|
|
544
544
|
}
|
|
545
|
-
@keyframes bp_accordion_module_slideUp--
|
|
545
|
+
@keyframes bp_accordion_module_slideUp--a6dfe{
|
|
546
546
|
from{
|
|
547
547
|
height:var(--radix-accordion-content-height);
|
|
548
548
|
}
|
|
@@ -550,7 +550,7 @@
|
|
|
550
550
|
height:0;
|
|
551
551
|
}
|
|
552
552
|
}
|
|
553
|
-
.bp_accordion_module_accordionContentWrapper--
|
|
553
|
+
.bp_accordion_module_accordionContentWrapper--a6dfe{
|
|
554
554
|
display:flex;
|
|
555
555
|
flex-direction:column;
|
|
556
556
|
gap:var(--space-4);
|
|
@@ -559,20 +559,20 @@
|
|
|
559
559
|
padding-inline:var(--space-4);
|
|
560
560
|
}
|
|
561
561
|
|
|
562
|
-
.bp_accordion_module_accordionInlineErrorWrapper--
|
|
562
|
+
.bp_accordion_module_accordionInlineErrorWrapper--a6dfe{
|
|
563
563
|
padding-block-start:var(--space-4);
|
|
564
564
|
padding-inline:var(--space-4);
|
|
565
565
|
}
|
|
566
566
|
|
|
567
|
-
.bp_accordion_module_accordionItem--
|
|
567
|
+
.bp_accordion_module_accordionItem--a6dfe{
|
|
568
568
|
border-bottom:var(--border-1) solid var(--border-divider-border);
|
|
569
569
|
min-width:320px;
|
|
570
570
|
}
|
|
571
|
-
.bp_accordion_module_accordionItem--
|
|
571
|
+
.bp_accordion_module_accordionItem--a6dfe,.bp_accordion_module_accordionItem--a6dfe > [data-state=open]{
|
|
572
572
|
background-color:var(--surface-accordion-surface);
|
|
573
573
|
}
|
|
574
574
|
|
|
575
|
-
.bp_accordion_module_accordionFixedContent--
|
|
575
|
+
.bp_accordion_module_accordionFixedContent--a6dfe{
|
|
576
576
|
background-color:var(--surface-surface);
|
|
577
577
|
display:flex;
|
|
578
578
|
flex-direction:column;
|
|
@@ -581,7 +581,7 @@
|
|
|
581
581
|
padding-inline:var(--space-4);
|
|
582
582
|
}
|
|
583
583
|
|
|
584
|
-
.bp_accordion_module_accordionHeader--
|
|
584
|
+
.bp_accordion_module_accordionHeader--a6dfe{
|
|
585
585
|
color:var(--text-text-on-light);
|
|
586
586
|
display:flex;
|
|
587
587
|
font-family:Lato, -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
|
|
@@ -597,16 +597,19 @@
|
|
|
597
597
|
width:100%;
|
|
598
598
|
}
|
|
599
599
|
|
|
600
|
-
.bp_accordion_module_accordionHeaderTrigger--
|
|
600
|
+
.bp_accordion_module_accordionHeaderTrigger--a6dfe{
|
|
601
601
|
align-items:center;
|
|
602
602
|
display:flex;
|
|
603
603
|
}
|
|
604
604
|
|
|
605
|
-
.bp_accordion_module_accordionStatus--
|
|
605
|
+
.bp_accordion_module_accordionIconStatus--a6dfe,.bp_accordion_module_accordionStatus--a6dfe{
|
|
606
606
|
margin-inline-start:var(--space-2);
|
|
607
607
|
}
|
|
608
|
+
.bp_accordion_module_accordionIconStatus--a6dfe > span{
|
|
609
|
+
padding:0 var(--space-1);
|
|
610
|
+
}
|
|
608
611
|
|
|
609
|
-
.bp_accordion_module_accordionTrigger--
|
|
612
|
+
.bp_accordion_module_accordionTrigger--a6dfe{
|
|
610
613
|
align-items:center;
|
|
611
614
|
background-color:var(--surface-surface);
|
|
612
615
|
border:none;
|
|
@@ -617,31 +620,31 @@
|
|
|
617
620
|
text-transform:capitalize;
|
|
618
621
|
width:100%;
|
|
619
622
|
}
|
|
620
|
-
.bp_accordion_module_accordionTrigger--
|
|
623
|
+
.bp_accordion_module_accordionTrigger--a6dfe:active{
|
|
621
624
|
background-color:var(--surface-surface);
|
|
622
625
|
}
|
|
623
|
-
.bp_accordion_module_accordionTrigger--
|
|
626
|
+
.bp_accordion_module_accordionTrigger--a6dfe:hover{
|
|
624
627
|
background-color:var(--surface-accordion-surface-hover);
|
|
625
628
|
cursor:pointer;
|
|
626
629
|
}
|
|
627
|
-
.bp_accordion_module_accordionTrigger--
|
|
630
|
+
.bp_accordion_module_accordionTrigger--a6dfe:focus-visible{
|
|
628
631
|
background-color:var(--surface-surface-hover);
|
|
629
632
|
box-shadow:inset 0 0 0 var(--border-2) var(--outline-focus-on-light);
|
|
630
633
|
outline:none;
|
|
631
634
|
}
|
|
632
|
-
.bp_accordion_module_accordionTrigger--
|
|
635
|
+
.bp_accordion_module_accordionTrigger--a6dfe:disabled{
|
|
633
636
|
cursor:default;
|
|
634
637
|
opacity:.3;
|
|
635
638
|
}
|
|
636
|
-
.bp_accordion_module_accordionTrigger--
|
|
639
|
+
.bp_accordion_module_accordionTrigger--a6dfe:disabled:hover{
|
|
637
640
|
background-color:var(--gray-white);
|
|
638
641
|
}
|
|
639
|
-
.bp_accordion_module_accordionTrigger--
|
|
642
|
+
.bp_accordion_module_accordionTrigger--a6dfe .bp_accordion_module_accordionTriggerIcon--a6dfe{
|
|
640
643
|
color:var(--gray-50);
|
|
641
644
|
flex-shrink:0;
|
|
642
645
|
margin-inline-start:var(--space-3);
|
|
643
646
|
}
|
|
644
|
-
.bp_accordion_module_accordionTrigger--
|
|
647
|
+
.bp_accordion_module_accordionTrigger--a6dfe[data-state=open] .bp_accordion_module_accordionTriggerIcon--a6dfe{
|
|
645
648
|
transform:rotate(180deg);
|
|
646
649
|
}
|
|
647
650
|
|
|
@@ -2740,7 +2743,7 @@
|
|
|
2740
2743
|
transform:translateZ(0);
|
|
2741
2744
|
}
|
|
2742
2745
|
|
|
2743
|
-
.bp_dropdown_menu_module_content--
|
|
2746
|
+
.bp_dropdown_menu_module_content--87356{
|
|
2744
2747
|
background-color:var(--surface-menu-surface);
|
|
2745
2748
|
border:var(--border-1) solid var(--border-card-border);
|
|
2746
2749
|
border-radius:var(--radius-3);
|
|
@@ -2761,7 +2764,7 @@
|
|
|
2761
2764
|
text-transform:none;
|
|
2762
2765
|
z-index:2147483647;
|
|
2763
2766
|
}
|
|
2764
|
-
.bp_dropdown_menu_module_content--
|
|
2767
|
+
.bp_dropdown_menu_module_content--87356[data-menu-fullscreen=true]{
|
|
2765
2768
|
border:unset;
|
|
2766
2769
|
border-radius:unset;
|
|
2767
2770
|
display:flex;
|
|
@@ -2774,24 +2777,24 @@
|
|
|
2774
2777
|
position:relative;
|
|
2775
2778
|
width:100vw;
|
|
2776
2779
|
}
|
|
2777
|
-
.bp_dropdown_menu_module_content--
|
|
2780
|
+
.bp_dropdown_menu_module_content--87356[data-menu-fullscreen=true] .bp_dropdown_menu_module_fullScreenContent--87356{
|
|
2778
2781
|
overflow-y:auto;
|
|
2779
2782
|
padding:var(--space-3);
|
|
2780
2783
|
}
|
|
2781
|
-
.bp_dropdown_menu_module_content--
|
|
2784
|
+
.bp_dropdown_menu_module_content--87356 .bp_dropdown_menu_module_subheader--87356{
|
|
2782
2785
|
padding:var(--space-2);
|
|
2783
2786
|
}
|
|
2784
|
-
.bp_dropdown_menu_module_content--
|
|
2787
|
+
.bp_dropdown_menu_module_content--87356 .bp_dropdown_menu_module_subheader--87356.bp_dropdown_menu_module_uppercased--87356{
|
|
2785
2788
|
text-transform:uppercase;
|
|
2786
2789
|
}
|
|
2787
2790
|
|
|
2788
|
-
.bp_dropdown_menu_module_ellipsis--
|
|
2791
|
+
.bp_dropdown_menu_module_ellipsis--87356{
|
|
2789
2792
|
overflow:hidden;
|
|
2790
2793
|
text-overflow:ellipsis;
|
|
2791
2794
|
white-space:nowrap;
|
|
2792
2795
|
}
|
|
2793
2796
|
|
|
2794
|
-
.bp_dropdown_menu_module_checkmark--
|
|
2797
|
+
.bp_dropdown_menu_module_checkmark--87356{
|
|
2795
2798
|
align-items:center;
|
|
2796
2799
|
display:inline-flex;
|
|
2797
2800
|
justify-content:center;
|
|
@@ -2799,7 +2802,7 @@
|
|
|
2799
2802
|
position:absolute;
|
|
2800
2803
|
}
|
|
2801
2804
|
|
|
2802
|
-
.bp_dropdown_menu_module_item--
|
|
2805
|
+
.bp_dropdown_menu_module_item--87356,.bp_dropdown_menu_module_subMenuTrigger--87356{
|
|
2803
2806
|
align-items:center;
|
|
2804
2807
|
border:var(--border-2) solid #0000;
|
|
2805
2808
|
border-radius:var(--radius-3);
|
|
@@ -2811,30 +2814,59 @@
|
|
|
2811
2814
|
-webkit-user-select:none;
|
|
2812
2815
|
user-select:none;
|
|
2813
2816
|
}
|
|
2814
|
-
.bp_dropdown_menu_module_item--
|
|
2817
|
+
.bp_dropdown_menu_module_item--87356[data-disabled],.bp_dropdown_menu_module_subMenuTrigger--87356[data-disabled]{
|
|
2815
2818
|
opacity:60%;
|
|
2816
2819
|
pointer-events:none;
|
|
2817
2820
|
}
|
|
2818
|
-
.bp_dropdown_menu_module_item--
|
|
2821
|
+
.bp_dropdown_menu_module_item--87356[data-highlighted],.bp_dropdown_menu_module_subMenuTrigger--87356[data-highlighted]{
|
|
2819
2822
|
background-color:var(--surface-menu-surface-hover);
|
|
2820
2823
|
border:var(--border-2) solid var(--outline-focus-on-light);
|
|
2821
2824
|
}
|
|
2822
|
-
.bp_dropdown_menu_module_item--
|
|
2825
|
+
.bp_dropdown_menu_module_item--87356:active,.bp_dropdown_menu_module_subMenuTrigger--87356:active{
|
|
2823
2826
|
background-color:var(--surface-menu-surface-hover);
|
|
2824
2827
|
border:var(--border-2) solid #0000;
|
|
2825
2828
|
}
|
|
2826
|
-
.bp_dropdown_menu_module_item--
|
|
2829
|
+
.bp_dropdown_menu_module_item--87356:hover,.bp_dropdown_menu_module_item--87356[data-state=open],.bp_dropdown_menu_module_subMenuTrigger--87356:hover,.bp_dropdown_menu_module_subMenuTrigger--87356[data-state=open]{
|
|
2827
2830
|
background-color:var(--surface-menu-surface-hover);
|
|
2828
2831
|
}
|
|
2829
|
-
.bp_dropdown_menu_module_item--
|
|
2832
|
+
.bp_dropdown_menu_module_item--87356.bp_dropdown_menu_module_radioItem--87356,.bp_dropdown_menu_module_subMenuTrigger--87356.bp_dropdown_menu_module_radioItem--87356{
|
|
2833
|
+
padding:.4375rem .5rem .4375rem calc(var(--space-2) + var(--space-4) + var(--space-4));
|
|
2834
|
+
}
|
|
2835
|
+
.bp_dropdown_menu_module_item--87356.bp_dropdown_menu_module_radioItem--87356 .bp_dropdown_menu_module_radioItemMediumSpacing--87356,.bp_dropdown_menu_module_subMenuTrigger--87356.bp_dropdown_menu_module_radioItem--87356 .bp_dropdown_menu_module_radioItemMediumSpacing--87356{
|
|
2836
|
+
padding-inline-start:var(--space-2);
|
|
2837
|
+
}
|
|
2838
|
+
.bp_dropdown_menu_module_item--87356.bp_dropdown_menu_module_checkboxItem--87356,.bp_dropdown_menu_module_subMenuTrigger--87356.bp_dropdown_menu_module_checkboxItem--87356{
|
|
2830
2839
|
padding:.4375rem .5rem .4375rem calc(var(--space-2) + var(--space-4) + var(--space-4));
|
|
2831
2840
|
}
|
|
2841
|
+
.bp_dropdown_menu_module_item--87356.bp_dropdown_menu_module_checkboxItem--87356 .bp_dropdown_menu_module_checkboxItemMediumSpacing--87356,.bp_dropdown_menu_module_subMenuTrigger--87356.bp_dropdown_menu_module_checkboxItem--87356 .bp_dropdown_menu_module_checkboxItemMediumSpacing--87356{
|
|
2842
|
+
padding-inline-start:var(--space-2);
|
|
2843
|
+
}
|
|
2844
|
+
.bp_dropdown_menu_module_item--87356 .bp_dropdown_menu_module_mediumItemLayout--87356,.bp_dropdown_menu_module_subMenuTrigger--87356 .bp_dropdown_menu_module_mediumItemLayout--87356{
|
|
2845
|
+
align-items:center;
|
|
2846
|
+
display:flex;
|
|
2847
|
+
gap:var(--space-2);
|
|
2848
|
+
justify-content:space-between;
|
|
2849
|
+
overflow:hidden;
|
|
2850
|
+
width:100%;
|
|
2851
|
+
}
|
|
2852
|
+
.bp_dropdown_menu_module_item--87356 .bp_dropdown_menu_module_startElement--87356,.bp_dropdown_menu_module_subMenuTrigger--87356 .bp_dropdown_menu_module_startElement--87356{
|
|
2853
|
+
align-items:center;
|
|
2854
|
+
display:flex;
|
|
2855
|
+
}
|
|
2856
|
+
.bp_dropdown_menu_module_item--87356 .bp_dropdown_menu_module_menuItemMainContent--87356,.bp_dropdown_menu_module_subMenuTrigger--87356 .bp_dropdown_menu_module_menuItemMainContent--87356{
|
|
2857
|
+
flex-grow:1;
|
|
2858
|
+
}
|
|
2859
|
+
.bp_dropdown_menu_module_item--87356 .bp_dropdown_menu_module_endElement--87356,.bp_dropdown_menu_module_subMenuTrigger--87356 .bp_dropdown_menu_module_endElement--87356{
|
|
2860
|
+
align-items:center;
|
|
2861
|
+
color:var(--text-text-on-light-secondary);
|
|
2862
|
+
display:flex;
|
|
2863
|
+
}
|
|
2832
2864
|
|
|
2833
|
-
.bp_dropdown_menu_module_dropdownMenuItemSeparator--
|
|
2865
|
+
.bp_dropdown_menu_module_dropdownMenuItemSeparator--87356{
|
|
2834
2866
|
margin-block:var(--space-2);
|
|
2835
2867
|
}
|
|
2836
2868
|
|
|
2837
|
-
.bp_dropdown_menu_module_menuHeader--
|
|
2869
|
+
.bp_dropdown_menu_module_menuHeader--87356{
|
|
2838
2870
|
align-items:center;
|
|
2839
2871
|
box-shadow:var(--dropshadow-1);
|
|
2840
2872
|
display:grid;
|
|
@@ -2844,15 +2876,15 @@
|
|
|
2844
2876
|
padding:var(--space-3);
|
|
2845
2877
|
}
|
|
2846
2878
|
|
|
2847
|
-
.bp_dropdown_menu_module_headerTextContent--
|
|
2879
|
+
.bp_dropdown_menu_module_headerTextContent--87356{
|
|
2848
2880
|
display:grid;
|
|
2849
2881
|
}
|
|
2850
2882
|
|
|
2851
|
-
.bp_dropdown_menu_module_submenuCloseButton--
|
|
2883
|
+
.bp_dropdown_menu_module_submenuCloseButton--87356{
|
|
2852
2884
|
grid-area:submenu-close;
|
|
2853
2885
|
}
|
|
2854
2886
|
|
|
2855
|
-
.bp_dropdown_menu_module_menuCloseButton--
|
|
2887
|
+
.bp_dropdown_menu_module_menuCloseButton--87356{
|
|
2856
2888
|
grid-area:close;
|
|
2857
2889
|
}
|
|
2858
2890
|
|
|
@@ -21,6 +21,7 @@ export type FilterComboChipProps = DropdownMenuRootProps & {
|
|
|
21
21
|
};
|
|
22
22
|
export declare const FilterComboChip: React.ForwardRefExoticComponent<import("@radix-ui/react-dropdown-menu").DropdownMenuProps & {
|
|
23
23
|
isFullScreenEnabled?: boolean;
|
|
24
|
+
menuItemsSize?: import("../../dropdown-menu/menu-item-variant-context").Size;
|
|
24
25
|
} & {
|
|
25
26
|
/** FilterChip.Chip component used as Dropdown menu trigger. Trigger chip value is ignored from selection */
|
|
26
27
|
chip: React.ReactElement;
|
|
@@ -8,6 +8,7 @@ export declare const FilterChip: {
|
|
|
8
8
|
DropdownIndicator: import("react").ForwardRefExoticComponent<import("react").RefAttributes<SVGSVGElement>>;
|
|
9
9
|
ComboChip: import("react").ForwardRefExoticComponent<import("@radix-ui/react-dropdown-menu").DropdownMenuProps & {
|
|
10
10
|
isFullScreenEnabled?: boolean;
|
|
11
|
+
menuItemsSize?: import("../../dropdown-menu/menu-item-variant-context").Size;
|
|
11
12
|
} & {
|
|
12
13
|
chip: React.ReactElement;
|
|
13
14
|
children: React.ReactNode;
|
|
@@ -6,6 +6,7 @@ import clsx from 'clsx';
|
|
|
6
6
|
import { forwardRef, useCallback } from 'react';
|
|
7
7
|
import { composeEventHandlers } from '../../utils/composeEventHandlers.js';
|
|
8
8
|
import styles from './dropdown-menu.module.js';
|
|
9
|
+
import { useMenuItemVariant } from './menu-item-variant-context.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Based on Radix-UI CheckboxItem
|
|
@@ -17,6 +18,11 @@ const DropdownMenuCheckboxItem = /*#__PURE__*/forwardRef((props, forwardedRef) =
|
|
|
17
18
|
className,
|
|
18
19
|
...rest
|
|
19
20
|
} = props;
|
|
21
|
+
const {
|
|
22
|
+
internalSize
|
|
23
|
+
} = useMenuItemVariant();
|
|
24
|
+
const isSizeSmall = internalSize === 'small';
|
|
25
|
+
const checkmarkSize = isSizeSmall ? '1rem' : '2rem';
|
|
20
26
|
const preventDefault = useCallback(event => event.preventDefault(), []);
|
|
21
27
|
return jsxs(DropdownMenuPrimitive.CheckboxItem, {
|
|
22
28
|
...rest,
|
|
@@ -28,12 +34,14 @@ const DropdownMenuCheckboxItem = /*#__PURE__*/forwardRef((props, forwardedRef) =
|
|
|
28
34
|
className: styles.checkmark,
|
|
29
35
|
children: jsx(Checkmark, {
|
|
30
36
|
color: Gray100,
|
|
31
|
-
height:
|
|
37
|
+
height: checkmarkSize,
|
|
32
38
|
role: "presentation",
|
|
33
|
-
width:
|
|
39
|
+
width: checkmarkSize
|
|
34
40
|
})
|
|
35
41
|
}), jsx("span", {
|
|
36
|
-
className: styles.ellipsis,
|
|
42
|
+
className: clsx(styles.ellipsis, {
|
|
43
|
+
[styles.checkboxItemMediumSpacing]: !isSizeSmall
|
|
44
|
+
}),
|
|
37
45
|
children: children
|
|
38
46
|
})]
|
|
39
47
|
});
|
|
@@ -1,6 +1,35 @@
|
|
|
1
1
|
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
2
|
+
import { type ForwardRefExoticComponent, type RefAttributes, type SVGProps } from 'react';
|
|
3
|
+
import { type RequireExactlyOne } from 'type-fest';
|
|
2
4
|
export type DropdownMenuItemProps = DropdownMenuPrimitive.DropdownMenuItemProps;
|
|
5
|
+
export interface MenuItemMainContentBaseProps extends React.ComponentProps<'div'> {
|
|
6
|
+
/** The label for the checkbox button.
|
|
7
|
+
* It will be overwritten by the `children` prop if provided.
|
|
8
|
+
*/
|
|
9
|
+
label: string;
|
|
10
|
+
/** Additional text to aid in use. */
|
|
11
|
+
caption?: string;
|
|
12
|
+
}
|
|
13
|
+
export type MenuItemMainContentProps = RequireExactlyOne<MenuItemMainContentBaseProps, 'label' | 'children'>;
|
|
3
14
|
/**
|
|
4
|
-
*
|
|
15
|
+
* Contents of an Item.
|
|
5
16
|
*/
|
|
6
|
-
export declare const
|
|
17
|
+
export declare const MenuItemMainContent: ForwardRefExoticComponent<(Omit<Required<Pick<MenuItemMainContentBaseProps, "label">> & Partial<Record<"children", never>> & Omit<MenuItemMainContentBaseProps, "label" | "children">, "ref"> | Omit<Required<Pick<MenuItemMainContentBaseProps, "children">> & Partial<Record<"label", never>> & Omit<MenuItemMainContentBaseProps, "label" | "children">, "ref">) & RefAttributes<HTMLDivElement>>;
|
|
18
|
+
export interface MenuItemStartElementProps extends React.ComponentProps<'div'> {
|
|
19
|
+
icon?: ForwardRefExoticComponent<Omit<SVGProps<SVGSVGElement>, 'ref'> & RefAttributes<SVGSVGElement>>;
|
|
20
|
+
children?: React.ReactNode;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Start element of an Item, dedicated for icons.
|
|
24
|
+
*/
|
|
25
|
+
export declare const MenuItemStartElement: ForwardRefExoticComponent<Omit<MenuItemStartElementProps, "ref"> & RefAttributes<HTMLDivElement>>;
|
|
26
|
+
export type MenuItemEndElementProps = React.ComponentProps<'div'>;
|
|
27
|
+
/**
|
|
28
|
+
* End element of an Item, dedicated for additional text and icons.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MenuItemEndElement: ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & RefAttributes<HTMLDivElement>>;
|
|
31
|
+
export declare const DropdownMenuItem: ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuItemProps & RefAttributes<HTMLDivElement>> & {
|
|
32
|
+
StartElement: ForwardRefExoticComponent<Omit<MenuItemStartElementProps, "ref"> & RefAttributes<HTMLDivElement>>;
|
|
33
|
+
MainContent: ForwardRefExoticComponent<(Omit<Required<Pick<MenuItemMainContentBaseProps, "label">> & Partial<Record<"children", never>> & Omit<MenuItemMainContentBaseProps, "label" | "children">, "ref"> | Omit<Required<Pick<MenuItemMainContentBaseProps, "children">> & Partial<Record<"label", never>> & Omit<MenuItemMainContentBaseProps, "label" | "children">, "ref">) & RefAttributes<HTMLDivElement>>;
|
|
34
|
+
EndElement: ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & RefAttributes<HTMLDivElement>>;
|
|
35
|
+
};
|
|
@@ -1,34 +1,124 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { Size8, Size4 } from '@box/blueprint-web-assets/tokens/tokens';
|
|
2
3
|
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
3
|
-
import
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import { forwardRef, useCallback, createElement } from 'react';
|
|
6
|
+
import { Text } from '../../text/text.js';
|
|
4
7
|
import { composeEventHandlers } from '../../utils/composeEventHandlers.js';
|
|
5
8
|
import styles from './dropdown-menu.module.js';
|
|
9
|
+
import { useMenuItemVariant } from './menu-item-variant-context.js';
|
|
6
10
|
|
|
7
11
|
/**
|
|
8
12
|
* Based on Radix-UI [DropdownMenu Item](https://www.radix-ui.com/docs/primitives/components/dropdown-menu#item)
|
|
9
13
|
*/
|
|
10
|
-
const
|
|
14
|
+
const DropdownMenuItemBase = /*#__PURE__*/forwardRef((props, forwardedRef) => {
|
|
11
15
|
const {
|
|
12
16
|
children,
|
|
17
|
+
className,
|
|
13
18
|
...rest
|
|
14
19
|
} = props;
|
|
20
|
+
const {
|
|
21
|
+
internalSize
|
|
22
|
+
} = useMenuItemVariant();
|
|
23
|
+
const sizeStyles = internalSize === 'small' ? styles.ellipsis : styles.mediumItemLayout;
|
|
15
24
|
const preventDefault = useCallback(event => event.preventDefault(), []);
|
|
16
25
|
return jsx(DropdownMenuPrimitive.Item, {
|
|
17
26
|
...rest,
|
|
18
27
|
ref: forwardedRef,
|
|
19
|
-
className: styles.item,
|
|
28
|
+
className: clsx(styles.item, className),
|
|
20
29
|
onPointerLeave: composeEventHandlers(props.onPointerLeave, preventDefault),
|
|
21
30
|
onPointerMove: composeEventHandlers(props.onPointerMove, preventDefault),
|
|
22
31
|
// If click starts at trigger button, and ends on the item, it should not trigger the item.
|
|
23
32
|
// Note: this also has a side effect of not allowing to start click and end on a different time.
|
|
24
33
|
// TODO: see if possible to make https://github.com/radix-ui/primitives/blob/b32a93318cdfce383c2eec095710d35ffbd33a1c/packages/react/menu/src/Menu.tsx#L646
|
|
25
34
|
onPointerUp: composeEventHandlers(props.onPointerUp, preventDefault),
|
|
26
|
-
children: jsx("
|
|
27
|
-
className:
|
|
35
|
+
children: jsx("div", {
|
|
36
|
+
className: sizeStyles,
|
|
28
37
|
children: children
|
|
29
38
|
})
|
|
30
39
|
});
|
|
31
40
|
});
|
|
41
|
+
/**
|
|
42
|
+
* Contents of an Item.
|
|
43
|
+
*/
|
|
44
|
+
const MenuItemMainContent = /*#__PURE__*/forwardRef(({
|
|
45
|
+
className,
|
|
46
|
+
label,
|
|
47
|
+
children,
|
|
48
|
+
caption,
|
|
49
|
+
...rest
|
|
50
|
+
}, ref) => {
|
|
51
|
+
const {
|
|
52
|
+
internalSize
|
|
53
|
+
} = useMenuItemVariant();
|
|
54
|
+
const labelVariant = internalSize === 'medium' ? 'bodyDefaultBold' : 'bodyDefault';
|
|
55
|
+
return jsx("div", {
|
|
56
|
+
...rest,
|
|
57
|
+
ref: ref,
|
|
58
|
+
className: clsx(styles.menuItemMainContent, styles.ellipsis, className),
|
|
59
|
+
children: children || jsxs(Fragment, {
|
|
60
|
+
children: [jsx(Text, {
|
|
61
|
+
as: "span",
|
|
62
|
+
className: styles.ellipsis,
|
|
63
|
+
variant: labelVariant,
|
|
64
|
+
children: label
|
|
65
|
+
}), caption ? jsx("div", {
|
|
66
|
+
className: styles.ellipsis,
|
|
67
|
+
children: jsx(Text, {
|
|
68
|
+
as: "span",
|
|
69
|
+
color: "textOnLightSecondary",
|
|
70
|
+
variant: "caption",
|
|
71
|
+
children: caption
|
|
72
|
+
})
|
|
73
|
+
}) : null]
|
|
74
|
+
})
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
/**
|
|
78
|
+
* Start element of an Item, dedicated for icons.
|
|
79
|
+
*/
|
|
80
|
+
const MenuItemStartElement = /*#__PURE__*/forwardRef(({
|
|
81
|
+
children,
|
|
82
|
+
className,
|
|
83
|
+
icon,
|
|
84
|
+
...rest
|
|
85
|
+
}, ref) => {
|
|
86
|
+
const {
|
|
87
|
+
internalSize
|
|
88
|
+
} = useMenuItemVariant();
|
|
89
|
+
const iconSize = internalSize === 'medium' ? Size8 : Size4;
|
|
90
|
+
return jsxs("div", {
|
|
91
|
+
...rest,
|
|
92
|
+
ref: ref,
|
|
93
|
+
className: clsx(styles.startElement, className),
|
|
94
|
+
children: [icon && /*#__PURE__*/createElement(icon, {
|
|
95
|
+
className: styles.icon,
|
|
96
|
+
height: iconSize,
|
|
97
|
+
width: iconSize,
|
|
98
|
+
role: 'presentation'
|
|
99
|
+
}), children]
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* End element of an Item, dedicated for additional text and icons.
|
|
104
|
+
*/
|
|
105
|
+
const MenuItemEndElement = /*#__PURE__*/forwardRef(({
|
|
106
|
+
children,
|
|
107
|
+
className,
|
|
108
|
+
...rest
|
|
109
|
+
}, ref) => {
|
|
110
|
+
return jsx("div", {
|
|
111
|
+
...rest,
|
|
112
|
+
ref: ref,
|
|
113
|
+
className: styles.endElement,
|
|
114
|
+
children: children
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
const DropdownMenuItem = Object.assign(DropdownMenuItemBase, {
|
|
118
|
+
StartElement: MenuItemStartElement,
|
|
119
|
+
MainContent: MenuItemMainContent,
|
|
120
|
+
EndElement: MenuItemEndElement
|
|
121
|
+
});
|
|
32
122
|
DropdownMenuItem.displayName = 'DropdownMenuItem';
|
|
33
123
|
|
|
34
|
-
export { DropdownMenuItem };
|
|
124
|
+
export { DropdownMenuItem, MenuItemEndElement, MenuItemMainContent, MenuItemStartElement };
|
|
@@ -6,6 +6,7 @@ import clsx from 'clsx';
|
|
|
6
6
|
import { forwardRef, useCallback } from 'react';
|
|
7
7
|
import { composeEventHandlers } from '../../utils/composeEventHandlers.js';
|
|
8
8
|
import styles from './dropdown-menu.module.js';
|
|
9
|
+
import { useMenuItemVariant } from './menu-item-variant-context.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Based on Radix-UI RadioItem
|
|
@@ -17,6 +18,11 @@ const DropdownMenuRadioSelectItem = /*#__PURE__*/forwardRef((props, forwardedRef
|
|
|
17
18
|
children,
|
|
18
19
|
...rest
|
|
19
20
|
} = props;
|
|
21
|
+
const {
|
|
22
|
+
internalSize
|
|
23
|
+
} = useMenuItemVariant();
|
|
24
|
+
const isSizeSmall = internalSize === 'small';
|
|
25
|
+
const checkmarkSize = isSizeSmall ? '1rem' : '2rem';
|
|
20
26
|
const preventDefault = useCallback(event => event.preventDefault(), []);
|
|
21
27
|
return jsxs(DropdownMenuPrimitive.RadioItem, {
|
|
22
28
|
...rest,
|
|
@@ -29,12 +35,14 @@ const DropdownMenuRadioSelectItem = /*#__PURE__*/forwardRef((props, forwardedRef
|
|
|
29
35
|
className: styles.checkmark,
|
|
30
36
|
children: jsx(Checkmark, {
|
|
31
37
|
color: Gray100,
|
|
32
|
-
height:
|
|
38
|
+
height: checkmarkSize,
|
|
33
39
|
role: "presentation",
|
|
34
|
-
width:
|
|
40
|
+
width: checkmarkSize
|
|
35
41
|
})
|
|
36
42
|
}), jsx("span", {
|
|
37
|
-
className: styles.ellipsis,
|
|
43
|
+
className: clsx(styles.ellipsis, {
|
|
44
|
+
[styles.radioItemMediumSpacing]: !isSizeSmall
|
|
45
|
+
}),
|
|
38
46
|
children: children ?? value
|
|
39
47
|
})]
|
|
40
48
|
});
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
2
|
+
import { type Size } from './menu-item-variant-context';
|
|
2
3
|
export type DropdownMenuRootProps = DropdownMenuPrimitive.DropdownMenuProps & {
|
|
3
4
|
isFullScreenEnabled?: boolean;
|
|
5
|
+
menuItemsSize?: Size;
|
|
4
6
|
};
|
|
5
7
|
/**
|
|
6
8
|
* The Dropdown-menu component displays a menu to the user, such as a set of actions or functions—triggered by a button.
|
|
@@ -2,6 +2,7 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
3
3
|
import { useControllableState } from '../../utils/useControllableState.js';
|
|
4
4
|
import { FullScreenMenuProvider } from '../menu-utils/responsiveness/FullScreenDropdownMenuContext.js';
|
|
5
|
+
import { MenuItemVariantProvider } from './menu-item-variant-context.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* The Dropdown-menu component displays a menu to the user, such as a set of actions or functions—triggered by a button.
|
|
@@ -13,6 +14,7 @@ const DropdownMenuRoot = props => {
|
|
|
13
14
|
open,
|
|
14
15
|
onOpenChange,
|
|
15
16
|
defaultOpen,
|
|
17
|
+
menuItemsSize,
|
|
16
18
|
...rest
|
|
17
19
|
} = props;
|
|
18
20
|
const [isMenuOpen = false, setIsMenuOpen] = useControllableState({
|
|
@@ -20,15 +22,18 @@ const DropdownMenuRoot = props => {
|
|
|
20
22
|
onChange: onOpenChange,
|
|
21
23
|
defaultProp: defaultOpen
|
|
22
24
|
});
|
|
23
|
-
return jsx(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
return jsx(MenuItemVariantProvider, {
|
|
26
|
+
size: menuItemsSize,
|
|
27
|
+
children: jsx(FullScreenMenuProvider, {
|
|
28
|
+
isFullScreenEnabled: isFullScreenEnabled,
|
|
29
|
+
isMenuOpen: isMenuOpen,
|
|
30
|
+
setIsMenuOpen: setIsMenuOpen,
|
|
31
|
+
children: jsx(DropdownMenuPrimitive.Root, {
|
|
32
|
+
...rest,
|
|
33
|
+
onOpenChange: setIsMenuOpen,
|
|
34
|
+
open: isMenuOpen,
|
|
35
|
+
children: children
|
|
36
|
+
})
|
|
32
37
|
})
|
|
33
38
|
});
|
|
34
39
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import '../../index.css';
|
|
2
|
-
var styles = {"content":"bp_dropdown_menu_module_content--
|
|
2
|
+
var styles = {"content":"bp_dropdown_menu_module_content--87356","fullScreenContent":"bp_dropdown_menu_module_fullScreenContent--87356","subheader":"bp_dropdown_menu_module_subheader--87356","uppercased":"bp_dropdown_menu_module_uppercased--87356","ellipsis":"bp_dropdown_menu_module_ellipsis--87356","checkmark":"bp_dropdown_menu_module_checkmark--87356","item":"bp_dropdown_menu_module_item--87356","subMenuTrigger":"bp_dropdown_menu_module_subMenuTrigger--87356","radioItem":"bp_dropdown_menu_module_radioItem--87356","radioItemMediumSpacing":"bp_dropdown_menu_module_radioItemMediumSpacing--87356","checkboxItem":"bp_dropdown_menu_module_checkboxItem--87356","checkboxItemMediumSpacing":"bp_dropdown_menu_module_checkboxItemMediumSpacing--87356","mediumItemLayout":"bp_dropdown_menu_module_mediumItemLayout--87356","startElement":"bp_dropdown_menu_module_startElement--87356","menuItemMainContent":"bp_dropdown_menu_module_menuItemMainContent--87356","endElement":"bp_dropdown_menu_module_endElement--87356","dropdownMenuItemSeparator":"bp_dropdown_menu_module_dropdownMenuItemSeparator--87356","menuHeader":"bp_dropdown_menu_module_menuHeader--87356","headerTextContent":"bp_dropdown_menu_module_headerTextContent--87356","submenuCloseButton":"bp_dropdown_menu_module_submenuCloseButton--87356","menuCloseButton":"bp_dropdown_menu_module_menuCloseButton--87356"};
|
|
3
3
|
|
|
4
4
|
export { styles as default };
|
|
@@ -9,7 +9,11 @@ export declare const DropdownMenu: {
|
|
|
9
9
|
RadioSelectItem: import("react").ForwardRefExoticComponent<import("@radix-ui/react-dropdown-menu").DropdownMenuRadioItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
10
10
|
CheckboxItem: import("react").ForwardRefExoticComponent<import("@radix-ui/react-dropdown-menu").DropdownMenuCheckboxItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
11
11
|
Content: import("react").ForwardRefExoticComponent<import("./dropdown-menu-content").DropdownMenuContentProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
12
|
-
Item: import("react").ForwardRefExoticComponent<import("@radix-ui/react-dropdown-menu").DropdownMenuItemProps & import("react").RefAttributes<HTMLDivElement
|
|
12
|
+
Item: import("react").ForwardRefExoticComponent<import("@radix-ui/react-dropdown-menu").DropdownMenuItemProps & import("react").RefAttributes<HTMLDivElement>> & {
|
|
13
|
+
StartElement: import("react").ForwardRefExoticComponent<Omit<import("./dropdown-menu-item").MenuItemStartElementProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
14
|
+
MainContent: import("react").ForwardRefExoticComponent<(Omit<Required<Pick<import("./dropdown-menu-item").MenuItemMainContentBaseProps, "label">> & Partial<Record<"children", never>> & Omit<import("./dropdown-menu-item").MenuItemMainContentBaseProps, "label" | "children">, "ref"> | Omit<Required<Pick<import("./dropdown-menu-item").MenuItemMainContentBaseProps, "children">> & Partial<Record<"label", never>> & Omit<import("./dropdown-menu-item").MenuItemMainContentBaseProps, "label" | "children">, "ref">) & import("react").RefAttributes<HTMLDivElement>>;
|
|
15
|
+
EndElement: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
16
|
+
};
|
|
13
17
|
Separator: import("react").ForwardRefExoticComponent<import("react").RefAttributes<HTMLHRElement>>;
|
|
14
18
|
SubMenuRoot: {
|
|
15
19
|
(props: import("./dropdown-menu-sub-menu-root").DropdownMenuSubMenuRootProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -31,7 +35,7 @@ export declare const DropdownMenu: {
|
|
|
31
35
|
SubHeader: import("react").ForwardRefExoticComponent<import("@radix-ui/react-dropdown-menu").DropdownMenuLabelProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
32
36
|
};
|
|
33
37
|
export { type DropdownMenuContentProps } from './dropdown-menu-content';
|
|
34
|
-
export { type DropdownMenuItemProps } from './dropdown-menu-item';
|
|
38
|
+
export { type DropdownMenuItemProps, type MenuItemEndElementProps, type MenuItemMainContentProps, type MenuItemStartElementProps, } from './dropdown-menu-item';
|
|
35
39
|
export { type DropdownMenuRadioGroupProps } from './dropdown-menu-radio-group';
|
|
36
40
|
export { type DropdownMenuRadioSelectItemProps } from './dropdown-menu-radio-select-item';
|
|
37
41
|
export { type DropdownMenuRootProps } from './dropdown-menu-root';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React, { type ReactNode } from 'react';
|
|
2
|
+
export type Size = 'small' | 'medium';
|
|
3
|
+
interface MenuItemVariantContextProps {
|
|
4
|
+
internalSize: Size;
|
|
5
|
+
setInternalSize: React.Dispatch<React.SetStateAction<Size>>;
|
|
6
|
+
}
|
|
7
|
+
interface MenuItemVariantProviderProps {
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
size?: Size;
|
|
10
|
+
}
|
|
11
|
+
export declare const MenuItemVariantProvider: ({ children, size }: MenuItemVariantProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare const useMenuItemVariant: () => MenuItemVariantContextProps;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useContext, createContext, useState, useMemo } from 'react';
|
|
3
|
+
|
|
4
|
+
const MenuItemVariantContext = /*#__PURE__*/createContext(null);
|
|
5
|
+
const MenuItemVariantProvider = ({
|
|
6
|
+
children,
|
|
7
|
+
size = 'small'
|
|
8
|
+
}) => {
|
|
9
|
+
const [internalSize, setInternalSize] = useState(size);
|
|
10
|
+
const value = useMemo(() => ({
|
|
11
|
+
internalSize,
|
|
12
|
+
setInternalSize
|
|
13
|
+
}), [internalSize, setInternalSize]);
|
|
14
|
+
return jsx(MenuItemVariantContext.Provider, {
|
|
15
|
+
value: value,
|
|
16
|
+
children: children
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
const useMenuItemVariant = () => {
|
|
20
|
+
const context = useContext(MenuItemVariantContext);
|
|
21
|
+
if (context === null) {
|
|
22
|
+
throw new Error('useMenuItemVariant must be used within a MenuItemVariantProvider');
|
|
23
|
+
}
|
|
24
|
+
return context;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { MenuItemVariantProvider, useMenuItemVariant };
|