@box/blueprint-web 11.8.3 → 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.
@@ -2740,7 +2740,7 @@
2740
2740
  transform:translateZ(0);
2741
2741
  }
2742
2742
 
2743
- .bp_dropdown_menu_module_content--cf0e6{
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--cf0e6[data-menu-fullscreen=true]{
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--cf0e6[data-menu-fullscreen=true] .bp_dropdown_menu_module_fullScreenContent--cf0e6{
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--cf0e6 .bp_dropdown_menu_module_subheader--cf0e6{
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--cf0e6 .bp_dropdown_menu_module_subheader--cf0e6.bp_dropdown_menu_module_uppercased--cf0e6{
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--cf0e6{
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--cf0e6{
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--cf0e6,.bp_dropdown_menu_module_subMenuTrigger--cf0e6{
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--cf0e6[data-disabled],.bp_dropdown_menu_module_subMenuTrigger--cf0e6[data-disabled]{
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--cf0e6[data-highlighted],.bp_dropdown_menu_module_subMenuTrigger--cf0e6[data-highlighted]{
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--cf0e6:active,.bp_dropdown_menu_module_subMenuTrigger--cf0e6:active{
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--cf0e6:hover,.bp_dropdown_menu_module_item--cf0e6[data-state=open],.bp_dropdown_menu_module_subMenuTrigger--cf0e6:hover,.bp_dropdown_menu_module_subMenuTrigger--cf0e6[data-state=open]{
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--cf0e6.bp_dropdown_menu_module_checkboxItem--cf0e6,.bp_dropdown_menu_module_item--cf0e6.bp_dropdown_menu_module_radioItem--cf0e6,.bp_dropdown_menu_module_subMenuTrigger--cf0e6.bp_dropdown_menu_module_checkboxItem--cf0e6,.bp_dropdown_menu_module_subMenuTrigger--cf0e6.bp_dropdown_menu_module_radioItem--cf0e6{
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--cf0e6{
2862
+ .bp_dropdown_menu_module_dropdownMenuItemSeparator--87356{
2834
2863
  margin-block:var(--space-2);
2835
2864
  }
2836
2865
 
2837
- .bp_dropdown_menu_module_menuHeader--cf0e6{
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--cf0e6{
2876
+ .bp_dropdown_menu_module_headerTextContent--87356{
2848
2877
  display:grid;
2849
2878
  }
2850
2879
 
2851
- .bp_dropdown_menu_module_submenuCloseButton--cf0e6{
2880
+ .bp_dropdown_menu_module_submenuCloseButton--87356{
2852
2881
  grid-area:submenu-close;
2853
2882
  }
2854
2883
 
2855
- .bp_dropdown_menu_module_menuCloseButton--cf0e6{
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: "1rem",
37
+ height: checkmarkSize,
32
38
  role: "presentation",
33
- width: "1rem"
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
- * Based on Radix-UI [DropdownMenu Item](https://www.radix-ui.com/docs/primitives/components/dropdown-menu#item)
15
+ * Contents of an Item.
5
16
  */
6
- export declare const DropdownMenuItem: import("react").ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuItemProps & import("react").RefAttributes<HTMLDivElement>>;
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 { forwardRef, useCallback } from 'react';
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 DropdownMenuItem = /*#__PURE__*/forwardRef((props, forwardedRef) => {
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("span", {
27
- className: styles.ellipsis,
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: "1rem",
38
+ height: checkmarkSize,
33
39
  role: "presentation",
34
- width: "1rem"
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(FullScreenMenuProvider, {
24
- isFullScreenEnabled: isFullScreenEnabled,
25
- isMenuOpen: isMenuOpen,
26
- setIsMenuOpen: setIsMenuOpen,
27
- children: jsx(DropdownMenuPrimitive.Root, {
28
- ...rest,
29
- onOpenChange: setIsMenuOpen,
30
- open: isMenuOpen,
31
- children: children
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--cf0e6","fullScreenContent":"bp_dropdown_menu_module_fullScreenContent--cf0e6","subheader":"bp_dropdown_menu_module_subheader--cf0e6","uppercased":"bp_dropdown_menu_module_uppercased--cf0e6","ellipsis":"bp_dropdown_menu_module_ellipsis--cf0e6","checkmark":"bp_dropdown_menu_module_checkmark--cf0e6","item":"bp_dropdown_menu_module_item--cf0e6","subMenuTrigger":"bp_dropdown_menu_module_subMenuTrigger--cf0e6","radioItem":"bp_dropdown_menu_module_radioItem--cf0e6","checkboxItem":"bp_dropdown_menu_module_checkboxItem--cf0e6","dropdownMenuItemSeparator":"bp_dropdown_menu_module_dropdownMenuItemSeparator--cf0e6","menuHeader":"bp_dropdown_menu_module_menuHeader--cf0e6","headerTextContent":"bp_dropdown_menu_module_headerTextContent--cf0e6","submenuCloseButton":"bp_dropdown_menu_module_submenuCloseButton--cf0e6","menuCloseButton":"bp_dropdown_menu_module_menuCloseButton--cf0e6"};
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@box/blueprint-web",
3
- "version": "11.8.3",
3
+ "version": "11.9.0",
4
4
  "type": "module",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {
@@ -66,13 +66,13 @@
66
66
  "@radix-ui/react-toggle-group": "1.0.4",
67
67
  "@radix-ui/react-toolbar": "1.0.4",
68
68
  "@radix-ui/react-tooltip": "1.0.7",
69
- "@react-aria/i18n": "^3.12.7",
70
- "@react-aria/utils": "^3.28.1",
69
+ "@react-aria/i18n": "3.12.7",
70
+ "@react-aria/utils": "3.28.1",
71
71
  "clsx": "^1.2.1",
72
72
  "color": "2.0.1",
73
73
  "lodash": "^4.17.15",
74
- "react-aria": "^3.38.1",
75
- "react-aria-components": "^1.7.1",
74
+ "react-aria": "3.38.1",
75
+ "react-aria-components": "1.7.1",
76
76
  "tabbable": "^4.0.0",
77
77
  "type-fest": "^3.2.0"
78
78
  },