@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.
@@ -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: [isDefined(status) && jsx(Status, {
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--81227","slideDown":"bp_accordion_module_slideDown--81227","slideUp":"bp_accordion_module_slideUp--81227","accordionContentWrapper":"bp_accordion_module_accordionContentWrapper--81227","accordionInlineErrorWrapper":"bp_accordion_module_accordionInlineErrorWrapper--81227","accordionItem":"bp_accordion_module_accordionItem--81227","accordionFixedContent":"bp_accordion_module_accordionFixedContent--81227","accordionHeader":"bp_accordion_module_accordionHeader--81227","accordionHeaderTrigger":"bp_accordion_module_accordionHeaderTrigger--81227","accordionStatus":"bp_accordion_module_accordionStatus--81227","accordionTrigger":"bp_accordion_module_accordionTrigger--81227","accordionTriggerIcon":"bp_accordion_module_accordionTriggerIcon--81227"};
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((props, forwardedRef) => jsx(Button, {
10
- ...props,
9
+ const PrimaryAction = /*#__PURE__*/forwardRef(({
10
+ autoFocus = true,
11
+ className,
12
+ ...rest
13
+ }, forwardedRef) => jsx(Button, {
14
+ ...rest,
11
15
  ref: forwardedRef,
12
- autoFocus: true,
13
- className: clsx(styles.primaryAction, props.className)
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". */
@@ -522,19 +522,19 @@
522
522
  background-color:#92e0c0;
523
523
  }
524
524
 
525
- .bp_accordion_module_accordionContent--81227[data-state=open]{
526
- animation:bp_accordion_module_slideDown--81227 .15s ease-out;
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--81227[data-state=closed]{
530
- animation:bp_accordion_module_slideUp--81227 .15s ease-out;
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--81227{
533
+ .bp_accordion_module_accordionContent--a6dfe{
534
534
  overflow:hidden;
535
535
  }
536
536
 
537
- @keyframes bp_accordion_module_slideDown--81227{
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--81227{
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--81227{
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--81227{
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--81227{
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--81227,.bp_accordion_module_accordionItem--81227 > [data-state=open]{
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--81227{
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--81227{
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--81227{
600
+ .bp_accordion_module_accordionHeaderTrigger--a6dfe{
601
601
  align-items:center;
602
602
  display:flex;
603
603
  }
604
604
 
605
- .bp_accordion_module_accordionStatus--81227{
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--81227{
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--81227:active{
623
+ .bp_accordion_module_accordionTrigger--a6dfe:active{
621
624
  background-color:var(--surface-surface);
622
625
  }
623
- .bp_accordion_module_accordionTrigger--81227:hover{
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--81227:focus-visible{
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--81227:disabled{
635
+ .bp_accordion_module_accordionTrigger--a6dfe:disabled{
633
636
  cursor:default;
634
637
  opacity:.3;
635
638
  }
636
- .bp_accordion_module_accordionTrigger--81227:disabled:hover{
639
+ .bp_accordion_module_accordionTrigger--a6dfe:disabled:hover{
637
640
  background-color:var(--gray-white);
638
641
  }
639
- .bp_accordion_module_accordionTrigger--81227 .bp_accordion_module_accordionTriggerIcon--81227{
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--81227[data-state=open] .bp_accordion_module_accordionTriggerIcon--81227{
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--cf0e6{
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--cf0e6[data-menu-fullscreen=true]{
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--cf0e6[data-menu-fullscreen=true] .bp_dropdown_menu_module_fullScreenContent--cf0e6{
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--cf0e6 .bp_dropdown_menu_module_subheader--cf0e6{
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--cf0e6 .bp_dropdown_menu_module_subheader--cf0e6.bp_dropdown_menu_module_uppercased--cf0e6{
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--cf0e6{
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--cf0e6{
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--cf0e6,.bp_dropdown_menu_module_subMenuTrigger--cf0e6{
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--cf0e6[data-disabled],.bp_dropdown_menu_module_subMenuTrigger--cf0e6[data-disabled]{
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--cf0e6[data-highlighted],.bp_dropdown_menu_module_subMenuTrigger--cf0e6[data-highlighted]{
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--cf0e6:active,.bp_dropdown_menu_module_subMenuTrigger--cf0e6:active{
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--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]{
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--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{
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--cf0e6{
2865
+ .bp_dropdown_menu_module_dropdownMenuItemSeparator--87356{
2834
2866
  margin-block:var(--space-2);
2835
2867
  }
2836
2868
 
2837
- .bp_dropdown_menu_module_menuHeader--cf0e6{
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--cf0e6{
2879
+ .bp_dropdown_menu_module_headerTextContent--87356{
2848
2880
  display:grid;
2849
2881
  }
2850
2882
 
2851
- .bp_dropdown_menu_module_submenuCloseButton--cf0e6{
2883
+ .bp_dropdown_menu_module_submenuCloseButton--87356{
2852
2884
  grid-area:submenu-close;
2853
2885
  }
2854
2886
 
2855
- .bp_dropdown_menu_module_menuCloseButton--cf0e6{
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: "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.4",
3
+ "version": "11.10.0",
4
4
  "type": "module",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {