@box/blueprint-web 11.8.4 → 11.9.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/index.css +47 -18
- 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
package/dist/lib-esm/index.css
CHANGED
|
@@ -2740,7 +2740,7 @@
|
|
|
2740
2740
|
transform:translateZ(0);
|
|
2741
2741
|
}
|
|
2742
2742
|
|
|
2743
|
-
.bp_dropdown_menu_module_content--
|
|
2743
|
+
.bp_dropdown_menu_module_content--87356{
|
|
2744
2744
|
background-color:var(--surface-menu-surface);
|
|
2745
2745
|
border:var(--border-1) solid var(--border-card-border);
|
|
2746
2746
|
border-radius:var(--radius-3);
|
|
@@ -2761,7 +2761,7 @@
|
|
|
2761
2761
|
text-transform:none;
|
|
2762
2762
|
z-index:2147483647;
|
|
2763
2763
|
}
|
|
2764
|
-
.bp_dropdown_menu_module_content--
|
|
2764
|
+
.bp_dropdown_menu_module_content--87356[data-menu-fullscreen=true]{
|
|
2765
2765
|
border:unset;
|
|
2766
2766
|
border-radius:unset;
|
|
2767
2767
|
display:flex;
|
|
@@ -2774,24 +2774,24 @@
|
|
|
2774
2774
|
position:relative;
|
|
2775
2775
|
width:100vw;
|
|
2776
2776
|
}
|
|
2777
|
-
.bp_dropdown_menu_module_content--
|
|
2777
|
+
.bp_dropdown_menu_module_content--87356[data-menu-fullscreen=true] .bp_dropdown_menu_module_fullScreenContent--87356{
|
|
2778
2778
|
overflow-y:auto;
|
|
2779
2779
|
padding:var(--space-3);
|
|
2780
2780
|
}
|
|
2781
|
-
.bp_dropdown_menu_module_content--
|
|
2781
|
+
.bp_dropdown_menu_module_content--87356 .bp_dropdown_menu_module_subheader--87356{
|
|
2782
2782
|
padding:var(--space-2);
|
|
2783
2783
|
}
|
|
2784
|
-
.bp_dropdown_menu_module_content--
|
|
2784
|
+
.bp_dropdown_menu_module_content--87356 .bp_dropdown_menu_module_subheader--87356.bp_dropdown_menu_module_uppercased--87356{
|
|
2785
2785
|
text-transform:uppercase;
|
|
2786
2786
|
}
|
|
2787
2787
|
|
|
2788
|
-
.bp_dropdown_menu_module_ellipsis--
|
|
2788
|
+
.bp_dropdown_menu_module_ellipsis--87356{
|
|
2789
2789
|
overflow:hidden;
|
|
2790
2790
|
text-overflow:ellipsis;
|
|
2791
2791
|
white-space:nowrap;
|
|
2792
2792
|
}
|
|
2793
2793
|
|
|
2794
|
-
.bp_dropdown_menu_module_checkmark--
|
|
2794
|
+
.bp_dropdown_menu_module_checkmark--87356{
|
|
2795
2795
|
align-items:center;
|
|
2796
2796
|
display:inline-flex;
|
|
2797
2797
|
justify-content:center;
|
|
@@ -2799,7 +2799,7 @@
|
|
|
2799
2799
|
position:absolute;
|
|
2800
2800
|
}
|
|
2801
2801
|
|
|
2802
|
-
.bp_dropdown_menu_module_item--
|
|
2802
|
+
.bp_dropdown_menu_module_item--87356,.bp_dropdown_menu_module_subMenuTrigger--87356{
|
|
2803
2803
|
align-items:center;
|
|
2804
2804
|
border:var(--border-2) solid #0000;
|
|
2805
2805
|
border-radius:var(--radius-3);
|
|
@@ -2811,30 +2811,59 @@
|
|
|
2811
2811
|
-webkit-user-select:none;
|
|
2812
2812
|
user-select:none;
|
|
2813
2813
|
}
|
|
2814
|
-
.bp_dropdown_menu_module_item--
|
|
2814
|
+
.bp_dropdown_menu_module_item--87356[data-disabled],.bp_dropdown_menu_module_subMenuTrigger--87356[data-disabled]{
|
|
2815
2815
|
opacity:60%;
|
|
2816
2816
|
pointer-events:none;
|
|
2817
2817
|
}
|
|
2818
|
-
.bp_dropdown_menu_module_item--
|
|
2818
|
+
.bp_dropdown_menu_module_item--87356[data-highlighted],.bp_dropdown_menu_module_subMenuTrigger--87356[data-highlighted]{
|
|
2819
2819
|
background-color:var(--surface-menu-surface-hover);
|
|
2820
2820
|
border:var(--border-2) solid var(--outline-focus-on-light);
|
|
2821
2821
|
}
|
|
2822
|
-
.bp_dropdown_menu_module_item--
|
|
2822
|
+
.bp_dropdown_menu_module_item--87356:active,.bp_dropdown_menu_module_subMenuTrigger--87356:active{
|
|
2823
2823
|
background-color:var(--surface-menu-surface-hover);
|
|
2824
2824
|
border:var(--border-2) solid #0000;
|
|
2825
2825
|
}
|
|
2826
|
-
.bp_dropdown_menu_module_item--
|
|
2826
|
+
.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
2827
|
background-color:var(--surface-menu-surface-hover);
|
|
2828
2828
|
}
|
|
2829
|
-
.bp_dropdown_menu_module_item--
|
|
2829
|
+
.bp_dropdown_menu_module_item--87356.bp_dropdown_menu_module_radioItem--87356,.bp_dropdown_menu_module_subMenuTrigger--87356.bp_dropdown_menu_module_radioItem--87356{
|
|
2830
2830
|
padding:.4375rem .5rem .4375rem calc(var(--space-2) + var(--space-4) + var(--space-4));
|
|
2831
2831
|
}
|
|
2832
|
+
.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{
|
|
2833
|
+
padding-inline-start:var(--space-2);
|
|
2834
|
+
}
|
|
2835
|
+
.bp_dropdown_menu_module_item--87356.bp_dropdown_menu_module_checkboxItem--87356,.bp_dropdown_menu_module_subMenuTrigger--87356.bp_dropdown_menu_module_checkboxItem--87356{
|
|
2836
|
+
padding:.4375rem .5rem .4375rem calc(var(--space-2) + var(--space-4) + var(--space-4));
|
|
2837
|
+
}
|
|
2838
|
+
.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{
|
|
2839
|
+
padding-inline-start:var(--space-2);
|
|
2840
|
+
}
|
|
2841
|
+
.bp_dropdown_menu_module_item--87356 .bp_dropdown_menu_module_mediumItemLayout--87356,.bp_dropdown_menu_module_subMenuTrigger--87356 .bp_dropdown_menu_module_mediumItemLayout--87356{
|
|
2842
|
+
align-items:center;
|
|
2843
|
+
display:flex;
|
|
2844
|
+
gap:var(--space-2);
|
|
2845
|
+
justify-content:space-between;
|
|
2846
|
+
overflow:hidden;
|
|
2847
|
+
width:100%;
|
|
2848
|
+
}
|
|
2849
|
+
.bp_dropdown_menu_module_item--87356 .bp_dropdown_menu_module_startElement--87356,.bp_dropdown_menu_module_subMenuTrigger--87356 .bp_dropdown_menu_module_startElement--87356{
|
|
2850
|
+
align-items:center;
|
|
2851
|
+
display:flex;
|
|
2852
|
+
}
|
|
2853
|
+
.bp_dropdown_menu_module_item--87356 .bp_dropdown_menu_module_menuItemMainContent--87356,.bp_dropdown_menu_module_subMenuTrigger--87356 .bp_dropdown_menu_module_menuItemMainContent--87356{
|
|
2854
|
+
flex-grow:1;
|
|
2855
|
+
}
|
|
2856
|
+
.bp_dropdown_menu_module_item--87356 .bp_dropdown_menu_module_endElement--87356,.bp_dropdown_menu_module_subMenuTrigger--87356 .bp_dropdown_menu_module_endElement--87356{
|
|
2857
|
+
align-items:center;
|
|
2858
|
+
color:var(--text-text-on-light-secondary);
|
|
2859
|
+
display:flex;
|
|
2860
|
+
}
|
|
2832
2861
|
|
|
2833
|
-
.bp_dropdown_menu_module_dropdownMenuItemSeparator--
|
|
2862
|
+
.bp_dropdown_menu_module_dropdownMenuItemSeparator--87356{
|
|
2834
2863
|
margin-block:var(--space-2);
|
|
2835
2864
|
}
|
|
2836
2865
|
|
|
2837
|
-
.bp_dropdown_menu_module_menuHeader--
|
|
2866
|
+
.bp_dropdown_menu_module_menuHeader--87356{
|
|
2838
2867
|
align-items:center;
|
|
2839
2868
|
box-shadow:var(--dropshadow-1);
|
|
2840
2869
|
display:grid;
|
|
@@ -2844,15 +2873,15 @@
|
|
|
2844
2873
|
padding:var(--space-3);
|
|
2845
2874
|
}
|
|
2846
2875
|
|
|
2847
|
-
.bp_dropdown_menu_module_headerTextContent--
|
|
2876
|
+
.bp_dropdown_menu_module_headerTextContent--87356{
|
|
2848
2877
|
display:grid;
|
|
2849
2878
|
}
|
|
2850
2879
|
|
|
2851
|
-
.bp_dropdown_menu_module_submenuCloseButton--
|
|
2880
|
+
.bp_dropdown_menu_module_submenuCloseButton--87356{
|
|
2852
2881
|
grid-area:submenu-close;
|
|
2853
2882
|
}
|
|
2854
2883
|
|
|
2855
|
-
.bp_dropdown_menu_module_menuCloseButton--
|
|
2884
|
+
.bp_dropdown_menu_module_menuCloseButton--87356{
|
|
2856
2885
|
grid-area:close;
|
|
2857
2886
|
}
|
|
2858
2887
|
|
|
@@ -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 };
|