@sproutsocial/seeds-react-menu 1.0.1 → 1.2.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.
Files changed (44) hide show
  1. package/.turbo/turbo-build.log +86 -10
  2. package/CHANGELOG.md +44 -0
  3. package/dist/esm/index.js +537 -126
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/index.d.mts +47 -16
  6. package/dist/index.d.ts +47 -16
  7. package/dist/index.js +602 -184
  8. package/dist/index.js.map +1 -1
  9. package/package.json +5 -5
  10. package/src/ActionMenu/ActionMenu.tsx +4 -3
  11. package/src/ActionMenu/ActionMenuTypes.ts +5 -4
  12. package/src/ActionMenu/__tests__/ActionMenu.test.tsx +1 -1
  13. package/src/Autocomplete/Autocomplete.stories.tsx +124 -32
  14. package/src/Autocomplete/AutocompleteSelect.tsx +24 -0
  15. package/src/Autocomplete/AutocompleteTypes.ts +5 -2
  16. package/src/Autocomplete/MultiAutocomplete.tsx +3 -2
  17. package/src/Autocomplete/SingleAutocomplete.tsx +4 -4
  18. package/src/Autocomplete/index.ts +2 -0
  19. package/src/ListboxToggleButton.tsx +65 -0
  20. package/src/MenuContent/MenuContentTypes.ts +1 -2
  21. package/src/MenuContent/styles.tsx +6 -9
  22. package/src/MenuGroup/__tests__/MenuGroup.test.tsx +1 -1
  23. package/src/MenuItem/__tests__/MenuItem.test.tsx +1 -3
  24. package/src/MenuRoot/MenuRoot.tsx +95 -15
  25. package/src/MultiSelectMenu/MultiSelectMenu.stories.tsx +0 -1
  26. package/src/MultiSelectMenu/MultiSelectMenu.tsx +3 -2
  27. package/src/MultiSelectMenu/MultiSelectMenuTypes.ts +5 -3
  28. package/src/NestedMenu/NestedMenu.feature +1 -1
  29. package/src/NestedMenu/NestedMenu.stories.tsx +25 -7
  30. package/src/NestedMenu/NestedMenu.tsx +217 -43
  31. package/src/NestedMenu/NestedMenuContext.tsx +16 -0
  32. package/src/NestedMenu/NestedMenuHeader.tsx +19 -6
  33. package/src/NestedMenu/NestedMenuItem.tsx +11 -8
  34. package/src/NestedMenu/NestedMenuPopout.tsx +55 -0
  35. package/src/NestedMenu/NestedMenuRoot.tsx +27 -0
  36. package/src/NestedMenu/NestedMenuTypes.ts +3 -2
  37. package/src/NestedMenu/__tests__/NestedMenu.test.tsx +210 -19
  38. package/src/SingleSelectMenu/SingleSelectMenu.stories.tsx +0 -1
  39. package/src/SingleSelectMenu/SingleSelectMenu.tsx +3 -2
  40. package/src/SingleSelectMenu/SingleSelectMenuTypes.ts +5 -3
  41. package/src/__tests__/Menu.test.tsx +1 -1
  42. package/src/index.ts +1 -0
  43. package/src/storybookUtilities/menu-storybook-components.tsx +11 -31
  44. package/src/types.ts +5 -1
package/dist/index.js CHANGED
@@ -106,7 +106,11 @@ __export(index_exports, {
106
106
  ActionMenu: () => ActionMenu,
107
107
  Autocomplete: () => Autocomplete,
108
108
  AutocompleteInput: () => AutocompleteInput,
109
+ AutocompleteSelect: () => AutocompleteSelect,
110
+ AutocompleteTokenInput: () => AutocompleteTokenInput,
111
+ CustomPopoutContent: () => CustomPopoutContent,
109
112
  INPUT_TYPES: () => INPUT_TYPES,
113
+ ListboxToggleButton: () => ListboxToggleButton,
110
114
  MenuContent: () => MenuContent,
111
115
  MenuContentContext: () => MenuContentContext,
112
116
  MenuContentProvider: () => MenuContentProvider,
@@ -121,7 +125,9 @@ __export(index_exports, {
121
125
  MenuItemRow: () => MenuItemRow,
122
126
  MenuItemText: () => MenuItemText,
123
127
  MenuLabel: () => MenuLabel,
128
+ MenuPopout: () => MenuPopout,
124
129
  MenuRoot: () => MenuRoot,
130
+ MenuRootNoPopout: () => MenuRootNoPopout,
125
131
  MenuSearchInput: () => MenuSearchInput,
126
132
  MenuSearchTokenInput: () => MenuSearchTokenInput,
127
133
  MenuToggleButton: () => MenuToggleButton,
@@ -136,6 +142,7 @@ __export(index_exports, {
136
142
  NestedMenuItem: () => NestedMenuItem,
137
143
  NestedMenuProvider: () => NestedMenuProvider,
138
144
  SingleSelectMenu: () => SingleSelectMenu,
145
+ StyledListboxToggleButton: () => StyledListboxToggleButton,
139
146
  StyledMenuGroup: () => StyledMenuGroup,
140
147
  StyledMenuGroupUl: () => StyledMenuGroupUl,
141
148
  StyledMenuItem: () => StyledMenuItem,
@@ -2173,14 +2180,18 @@ var MenuHeader = ({
2173
2180
 
2174
2181
  // src/MenuContent/styles.tsx
2175
2182
  var import_styled_components5 = __toESM(require("styled-components"));
2176
- var import_react4 = require("motion/react");
2177
- var StyledMenuContent = (0, import_styled_components5.default)(import_react4.motion.ul)`
2183
+ var StyledMenuContent = import_styled_components5.default.ul`
2178
2184
  margin: 0;
2179
2185
  padding: 0;
2186
+
2187
+ &:focus {
2188
+ outline: none;
2189
+ box-shadow: none;
2190
+ }
2180
2191
  `;
2181
2192
 
2182
2193
  // src/hooks/useMenuChildren.tsx
2183
- var import_react5 = __toESM(require("react"));
2194
+ var import_react4 = __toESM(require("react"));
2184
2195
  var import_jsx_runtime5 = require("react/jsx-runtime");
2185
2196
  var walkAllChildren = (children, callback) => {
2186
2197
  const walk = (element, parents2) => {
@@ -2188,12 +2199,12 @@ var walkAllChildren = (children, callback) => {
2188
2199
  callback(element, parents2);
2189
2200
  const newParents = [...parents2, element];
2190
2201
  const children2 = element.props?.children;
2191
- import_react5.default.Children.toArray(children2).forEach((child) => {
2202
+ import_react4.default.Children.toArray(children2).forEach((child) => {
2192
2203
  walk(child, newParents);
2193
2204
  });
2194
2205
  };
2195
2206
  const parents = [];
2196
- import_react5.default.Children.toArray(children).forEach((child) => {
2207
+ import_react4.default.Children.toArray(children).forEach((child) => {
2197
2208
  walk(child, parents);
2198
2209
  });
2199
2210
  };
@@ -2328,7 +2339,7 @@ var useMenuChildren = ({
2328
2339
  menuItems,
2329
2340
  MenuItemComponent
2330
2341
  }) => {
2331
- const { allMenuItems, menuItemsMap, children } = (0, import_react5.useMemo)(() => {
2342
+ const { allMenuItems, menuItemsMap, children } = (0, import_react4.useMemo)(() => {
2332
2343
  let children2 = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_jsx_runtime5.Fragment, {});
2333
2344
  const menuItemsMap2 = {};
2334
2345
  const allMenuItems2 = [];
@@ -2351,7 +2362,7 @@ var useMenuChildren = ({
2351
2362
  };
2352
2363
 
2353
2364
  // src/MenuContent/MenuContent.tsx
2354
- var import_react6 = require("react");
2365
+ var import_react5 = require("react");
2355
2366
  var import_jsx_runtime6 = require("react/jsx-runtime");
2356
2367
  var MenuContent = ({
2357
2368
  id = "menu_content",
@@ -2368,7 +2379,7 @@ var MenuContent = ({
2368
2379
  if (!children) {
2369
2380
  return null;
2370
2381
  }
2371
- const handleKeyDown = (0, import_react6.useCallback)(
2382
+ const handleKeyDown = (0, import_react5.useCallback)(
2372
2383
  (e) => {
2373
2384
  toggleButtonProps?.["onKeyDown"]?.(e);
2374
2385
  onKeyDown?.(e);
@@ -2398,7 +2409,7 @@ var MenuContent = ({
2398
2409
  MenuContent.__MENU_PRIMITIVE_TYPE = "MenuContent";
2399
2410
 
2400
2411
  // src/MenuFooter/MenuFooter.tsx
2401
- var import_react7 = require("react");
2412
+ var import_react6 = require("react");
2402
2413
 
2403
2414
  // src/MenuFooter/styles.tsx
2404
2415
  var import_styled_components6 = __toESM(require("styled-components"));
@@ -2415,18 +2426,18 @@ var MenuFooter = ({ children, ...rest }) => {
2415
2426
  };
2416
2427
 
2417
2428
  // src/MenuGroup/MenuGroup.tsx
2418
- var import_react10 = require("react");
2429
+ var import_react9 = require("react");
2419
2430
 
2420
2431
  // src/MenuGroup/styles.tsx
2421
2432
  var import_styled_components9 = __toESM(require("styled-components"));
2422
2433
 
2423
2434
  // ../seeds-react-text/dist/esm/index.js
2424
- var import_react8 = require("react");
2435
+ var import_react7 = require("react");
2425
2436
  var import_styled_components7 = __toESM(require("styled-components"));
2426
2437
  var import_styled_components8 = __toESM(require("styled-components"));
2427
2438
  var import_seeds_react_system_props = require("@sproutsocial/seeds-react-system-props");
2428
2439
  var import_jsx_runtime8 = require("react/jsx-runtime");
2429
- var import_react9 = require("react");
2440
+ var import_react8 = require("react");
2430
2441
  var Container = import_styled_components8.default.span`
2431
2442
  margin: 0;
2432
2443
  padding-left: 0;
@@ -2592,15 +2603,81 @@ var MenuGroup = ({
2592
2603
  MenuGroup.__MENU_PRIMITIVE_TYPE = "MenuGroup";
2593
2604
 
2594
2605
  // src/MenuRoot/MenuRoot.tsx
2595
- var import_react11 = require("react");
2606
+ var import_react10 = require("react");
2596
2607
  var import_styled_components10 = __toESM(require("styled-components"));
2597
2608
  var import_seeds_react_popout = require("@sproutsocial/seeds-react-popout");
2609
+
2610
+ // ../../seeds-design-tokens/seeds-motion/dist/seeds-motion-unitless.esm.js
2611
+ var MOTION_DURATION_FAST = 0.15;
2612
+
2613
+ // src/MenuRoot/MenuRoot.tsx
2598
2614
  var import_jsx_runtime10 = require("react/jsx-runtime");
2599
2615
  var CustomPopoutContent = (0, import_styled_components10.default)(import_seeds_react_popout.Popout.Content)`
2600
2616
  padding: 0;
2601
2617
  margin-left: 0;
2602
2618
  margin-right: 0;
2603
2619
  `;
2620
+ var menuAnimationConfig = {
2621
+ initial: {
2622
+ scale: 0,
2623
+ opacity: 0,
2624
+ originX: 0,
2625
+ originY: 0
2626
+ },
2627
+ animate: {
2628
+ opacity: 1,
2629
+ scale: 1,
2630
+ originX: 0,
2631
+ originY: 0,
2632
+ transition: {
2633
+ type: "tween",
2634
+ duration: MOTION_DURATION_FAST,
2635
+ ease: "circOut"
2636
+ }
2637
+ },
2638
+ exit: {
2639
+ opacity: 0,
2640
+ scale: 1,
2641
+ transition: {
2642
+ type: "tween",
2643
+ duration: MOTION_DURATION_FAST,
2644
+ ease: "circIn"
2645
+ }
2646
+ }
2647
+ };
2648
+ var MenuPopout = ({
2649
+ content,
2650
+ width: width2 = "300px",
2651
+ isOpen,
2652
+ openMenu,
2653
+ closeMenu,
2654
+ focusLockProps,
2655
+ ...popoutProps
2656
+ }) => {
2657
+ const setIsOpen = (0, import_react10.useCallback)(
2658
+ (newIsOpen) => {
2659
+ newIsOpen ? openMenu?.() : closeMenu?.();
2660
+ },
2661
+ [openMenu, closeMenu]
2662
+ );
2663
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2664
+ import_seeds_react_popout.Popout,
2665
+ {
2666
+ isOpen: !!isOpen,
2667
+ setIsOpen,
2668
+ content: (props) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CustomPopoutContent, { width: popoutProps.fullWidth ? "initial" : width2, children: typeof content === "function" ? content(props) : content }),
2669
+ focusLockProps: {
2670
+ // correct jerking motion when scrolling while the Popout is open
2671
+ // returnFocus: false,
2672
+ crossFrame: false,
2673
+ ...focusLockProps
2674
+ },
2675
+ disableWrapperAria: true,
2676
+ animationConfig: menuAnimationConfig,
2677
+ ...popoutProps
2678
+ }
2679
+ );
2680
+ };
2604
2681
  var MenuRoot = ({
2605
2682
  children,
2606
2683
  menuToggleElement,
@@ -2616,13 +2693,13 @@ var MenuRoot = ({
2616
2693
  hiddenItemsCount = 0,
2617
2694
  items
2618
2695
  } = contextProps;
2619
- const setIsOpen = (0, import_react11.useCallback)(
2696
+ const setIsOpen = (0, import_react10.useCallback)(
2620
2697
  (newIsOpen) => {
2621
2698
  newIsOpen ? openMenu?.() : closeMenu?.();
2622
2699
  },
2623
2700
  [openMenu, closeMenu]
2624
2701
  );
2625
- (0, import_react11.useEffect)(() => {
2702
+ (0, import_react10.useEffect)(() => {
2626
2703
  if (!inputValue) return;
2627
2704
  if (items && hiddenItemsCount >= items.length && isOpen) {
2628
2705
  closeMenu?.();
@@ -2630,28 +2707,29 @@ var MenuRoot = ({
2630
2707
  }, [hiddenItemsCount, items?.length, isOpen, inputValue]);
2631
2708
  const menuContext = useMenu(contextProps);
2632
2709
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2633
- import_seeds_react_popout.Popout,
2710
+ MenuPopout,
2634
2711
  {
2635
- menuPopout: true,
2636
2712
  placement,
2637
2713
  isOpen: !!isOpen,
2638
- setIsOpen,
2639
- content: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(MenuContentProvider, { menuContext, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CustomPopoutContent, { width: width2, children }) }),
2640
- focusLockProps: {
2641
- // correct jerking motion when scrolling while the Popout is open
2642
- // returnFocus: false,
2643
- crossFrame: false,
2644
- ...focusLockProps
2645
- },
2646
- disableWrapperAria: true,
2714
+ openMenu,
2715
+ closeMenu,
2716
+ content: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(MenuContentProvider, { menuContext, children }),
2647
2717
  ...popoutProps,
2648
2718
  children: (toggleProps) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(MenuToggleProvider, { menuContext: { ...menuContext, ...toggleProps }, children: menuToggleElement })
2649
2719
  }
2650
2720
  );
2651
2721
  };
2722
+ var MenuRootNoPopout = ({
2723
+ children,
2724
+ menuToggleElement,
2725
+ ...contextProps
2726
+ }) => {
2727
+ const menuContext = useMenu(contextProps);
2728
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(MenuContentProvider, { menuContext, children });
2729
+ };
2652
2730
 
2653
2731
  // src/MenuLabel.tsx
2654
- var import_react12 = require("react");
2732
+ var import_react11 = require("react");
2655
2733
  var import_seeds_react_label = require("@sproutsocial/seeds-react-label");
2656
2734
  var import_jsx_runtime11 = require("react/jsx-runtime");
2657
2735
  var MenuLabel = ({ children, ...rest }) => {
@@ -2660,7 +2738,7 @@ var MenuLabel = ({ children, ...rest }) => {
2660
2738
  };
2661
2739
 
2662
2740
  // src/MenuToggleButton/MenuToggleButton.tsx
2663
- var import_react13 = require("react");
2741
+ var import_react12 = require("react");
2664
2742
  var import_seeds_react_button = require("@sproutsocial/seeds-react-button");
2665
2743
  var import_jsx_runtime12 = require("react/jsx-runtime");
2666
2744
  var MenuToggleButton = ({
@@ -2686,11 +2764,11 @@ var MenuToggleButton = ({
2686
2764
  };
2687
2765
 
2688
2766
  // src/MenuSearchInput/MenuSearchInput.tsx
2689
- var import_react15 = __toESM(require("react"));
2767
+ var import_react14 = __toESM(require("react"));
2690
2768
  var import_seeds_react_input = require("@sproutsocial/seeds-react-input");
2691
2769
 
2692
2770
  // src/hooks/useItemFiltering.tsx
2693
- var import_react14 = __toESM(require("react"));
2771
+ var import_react13 = __toESM(require("react"));
2694
2772
 
2695
2773
  // src/utils/downshiftDefaults.ts
2696
2774
  var itemToString = (item) => {
@@ -2710,8 +2788,8 @@ var useItemFiltering = ({
2710
2788
  getShouldFilter = defaultGetShouldFilter,
2711
2789
  setHiddenItemsMap: setHiddenItemsMapProp
2712
2790
  }) => {
2713
- const [hiddenItemsMap, setHiddenItemsMap] = import_react14.default.useState({});
2714
- const updateFilteredItems = import_react14.default.useCallback(
2791
+ const [hiddenItemsMap, setHiddenItemsMap] = import_react13.default.useState({});
2792
+ const updateFilteredItems = import_react13.default.useCallback(
2715
2793
  ({ inputValue }) => {
2716
2794
  const newHiddenItems = getShouldFilter({ inputValue }) ? allMenuItems.reduce((map, item) => {
2717
2795
  const isItemVisible = getIsItemVisible(item, inputValue);
@@ -2748,11 +2826,11 @@ var MenuSearchInput = ({
2748
2826
  getIsItemVisible,
2749
2827
  setHiddenItemsMap
2750
2828
  });
2751
- import_react15.default.useEffect(() => {
2829
+ import_react14.default.useEffect(() => {
2752
2830
  updateFilteredItems({ inputValue: restInputProps.value || "" });
2753
2831
  }, [isOpen, restInputProps.value]);
2754
2832
  const toggleButtonProps = getToggleButtonProps?.() || {};
2755
- const handleKeyDown = import_react15.default.useCallback(
2833
+ const handleKeyDown = import_react14.default.useCallback(
2756
2834
  (e) => {
2757
2835
  if (e.key === " ") return;
2758
2836
  toggleButtonProps.onKeyDown?.(e);
@@ -2779,7 +2857,7 @@ var MenuSearchInput = ({
2779
2857
  };
2780
2858
 
2781
2859
  // src/MenuTokenInput.tsx
2782
- var import_react16 = __toESM(require("react"));
2860
+ var import_react15 = __toESM(require("react"));
2783
2861
  var import_styled_components11 = __toESM(require("styled-components"));
2784
2862
  var import_seeds_react_token_input = require("@sproutsocial/seeds-react-token-input");
2785
2863
  var import_jsx_runtime14 = require("react/jsx-runtime");
@@ -2812,7 +2890,7 @@ var MenuTokenInput = ({
2812
2890
  removeSelectedItem,
2813
2891
  setActiveIndex,
2814
2892
  selectedItems = []
2815
- } = import_react16.default.useContext(MenuContext);
2893
+ } = import_react15.default.useContext(MenuContext);
2816
2894
  const removeToken = (tokenId) => {
2817
2895
  const tokenToRemove = selectedItems?.find((item) => item.id === tokenId);
2818
2896
  tokenToRemove && removeSelectedItem?.(tokenToRemove);
@@ -2866,7 +2944,7 @@ var MenuTokenInput = ({
2866
2944
  };
2867
2945
 
2868
2946
  // src/MenuSearchTokenInput/MenuSearchTokenInput.tsx
2869
- var import_react17 = __toESM(require("react"));
2947
+ var import_react16 = __toESM(require("react"));
2870
2948
  var import_jsx_runtime15 = require("react/jsx-runtime");
2871
2949
  var MenuSearchTokenInput = ({
2872
2950
  getIsItemVisible,
@@ -2890,10 +2968,10 @@ var MenuSearchTokenInput = ({
2890
2968
  setHiddenItemsMap
2891
2969
  });
2892
2970
  const controlledValue = value || inputPropsValue !== void 0 ? `${inputPropsValue}` : void 0;
2893
- const [internalValue, setInternalValue] = import_react17.default.useState(
2971
+ const [internalValue, setInternalValue] = import_react16.default.useState(
2894
2972
  controlledValue || ""
2895
2973
  );
2896
- const updateFilteredState = import_react17.default.useCallback(
2974
+ const updateFilteredState = import_react16.default.useCallback(
2897
2975
  // defaults to an empty string if no value is passed
2898
2976
  (value2 = "") => {
2899
2977
  setInternalValue(value2);
@@ -2901,14 +2979,14 @@ var MenuSearchTokenInput = ({
2901
2979
  },
2902
2980
  [updateFilteredItems]
2903
2981
  );
2904
- import_react17.default.useEffect(() => {
2982
+ import_react16.default.useEffect(() => {
2905
2983
  updateFilteredState(controlledValue);
2906
2984
  }, [controlledValue]);
2907
- import_react17.default.useEffect(() => {
2985
+ import_react16.default.useEffect(() => {
2908
2986
  updateFilteredState(controlledValue);
2909
2987
  }, [isOpen]);
2910
2988
  const toggleButtonProps = getToggleButtonProps?.() || {};
2911
- const handleKeyDown = import_react17.default.useCallback(
2989
+ const handleKeyDown = import_react16.default.useCallback(
2912
2990
  (e) => {
2913
2991
  if (e.key === " ") return;
2914
2992
  toggleButtonProps.onKeyDown?.(e);
@@ -2936,7 +3014,7 @@ var MenuSearchTokenInput = ({
2936
3014
  };
2937
3015
 
2938
3016
  // src/SubmenuItem/SubmenuItem.tsx
2939
- var import_react18 = __toESM(require("react"));
3017
+ var import_react17 = __toESM(require("react"));
2940
3018
  var import_seeds_react_icon2 = require("@sproutsocial/seeds-react-icon");
2941
3019
  var import_seeds_react_box3 = require("@sproutsocial/seeds-react-box");
2942
3020
  var import_seeds_react_utilities = require("@sproutsocial/seeds-react-utilities");
@@ -2998,17 +3076,17 @@ var SubmenuItem = ({
2998
3076
  itemsMap,
2999
3077
  isOpen: parentIsOpen
3000
3078
  } = useMenuContentContext();
3001
- const [submenuIsFocused, setSubmenuIsFocused] = import_react18.default.useState(false);
3002
- const [submenuIsOpen, setSubmenuIsOpen] = import_react18.default.useState(false);
3003
- const [submenuIsActive, setSubmenuIsActive] = import_react18.default.useState(false);
3004
- const submenuItemRef = import_react18.default.useRef(null);
3005
- const submenuRef = import_react18.default.useRef(null);
3079
+ const [submenuIsFocused, setSubmenuIsFocused] = import_react17.default.useState(false);
3080
+ const [submenuIsOpen, setSubmenuIsOpen] = import_react17.default.useState(false);
3081
+ const [submenuIsActive, setSubmenuIsActive] = import_react17.default.useState(false);
3082
+ const submenuItemRef = import_react17.default.useRef(null);
3083
+ const submenuRef = import_react17.default.useRef(null);
3006
3084
  const menuContent = menuItems ? getChildrenFromMenuItems({ menuItems, MenuItemComponent }) : menuChildren;
3007
3085
  const item = itemsMap[id] || {
3008
3086
  index: 0,
3009
3087
  id
3010
3088
  };
3011
- import_react18.default.useEffect(() => {
3089
+ import_react17.default.useEffect(() => {
3012
3090
  if (highlightedIndex === item.index) {
3013
3091
  !submenuIsOpen && setSubmenuIsOpen(true);
3014
3092
  } else if (submenuIsOpen && highlightedIndex !== -1) {
@@ -3016,7 +3094,7 @@ var SubmenuItem = ({
3016
3094
  setSubmenuIsActive(false);
3017
3095
  }
3018
3096
  }, [highlightedIndex, item.index, submenuIsOpen, setSubmenuIsOpen]);
3019
- const onSubmenuStateChange = import_react18.default.useCallback(
3097
+ const onSubmenuStateChange = import_react17.default.useCallback(
3020
3098
  (state) => {
3021
3099
  if (state.isOpen !== void 0) {
3022
3100
  setSubmenuIsOpen(state.isOpen);
@@ -3060,7 +3138,7 @@ var SubmenuItem = ({
3060
3138
  onMenuItemClick();
3061
3139
  }
3062
3140
  };
3063
- import_react18.default.useEffect(() => {
3141
+ import_react17.default.useEffect(() => {
3064
3142
  if (document && document.body) {
3065
3143
  document.body.addEventListener("click", onBodyClick, {
3066
3144
  capture: true
@@ -3126,12 +3204,49 @@ var SubmenuItem = ({
3126
3204
  };
3127
3205
  SubmenuItem.__MENU_PRIMITIVE_TYPE = "MenuItem";
3128
3206
 
3207
+ // src/ListboxToggleButton.tsx
3208
+ var import_styled_components12 = __toESM(require("styled-components"));
3209
+ var import_seeds_react_icon3 = require("@sproutsocial/seeds-react-icon");
3210
+ var import_jsx_runtime17 = require("react/jsx-runtime");
3211
+ var StyledListboxToggleButton = (0, import_styled_components12.default)(
3212
+ MenuToggleButton
3213
+ )`
3214
+ ${(props) => props.invalid && import_styled_components12.css`
3215
+ border-color: ${(props2) => props2.theme.colors.form.border.error};
3216
+ `}
3217
+ `;
3218
+ var StyledChevron = import_styled_components12.default.div`
3219
+ margin-left: ${({ theme: theme2 }) => theme2.space[300]};
3220
+ ${({ $isOpen }) => $isOpen && `
3221
+ transform: rotate(-180deg);
3222
+ `}
3223
+ transition: transform 0.15s;
3224
+
3225
+ ${({ invalid }) => invalid && import_styled_components12.css`
3226
+ color: ${(props) => props.theme.colors.icon.error};
3227
+ `}
3228
+ `;
3229
+ var StyledInnerButton = import_styled_components12.default.div`
3230
+ display: flex;
3231
+ justify-content: space-between;
3232
+ `;
3233
+ var ListboxToggleButton = ({
3234
+ children,
3235
+ ...buttonProps
3236
+ }) => {
3237
+ const { isOpen } = useMenuToggleContext();
3238
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(StyledListboxToggleButton, { appearance: "secondary", ...buttonProps, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(StyledInnerButton, { children: [
3239
+ children,
3240
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(StyledChevron, { $isOpen: isOpen, invalid: buttonProps.invalid, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_seeds_react_icon3.Icon, { name: "chevron-down-outline", fixedWidth: true, "aria-hidden": true }) })
3241
+ ] }) });
3242
+ };
3243
+
3129
3244
  // src/ActionMenu/ActionMenu.tsx
3130
- var import_react20 = __toESM(require("react"));
3245
+ var import_react19 = __toESM(require("react"));
3131
3246
  var import_downshift3 = require("downshift");
3132
3247
 
3133
3248
  // src/hooks/useDownshiftDefaults.tsx
3134
- var import_react19 = __toESM(require("react"));
3249
+ var import_react18 = __toESM(require("react"));
3135
3250
 
3136
3251
  // src/reducers/useComboboxStateReducer.tsx
3137
3252
  var import_downshift = require("downshift");
@@ -3255,12 +3370,12 @@ var useDownshiftDefaults = ({
3255
3370
  isMulti = false,
3256
3371
  multiSelectProps = {}
3257
3372
  } = {}) => {
3258
- const [hiddenItemsMap, setHiddenItemsMap] = import_react19.default.useState({});
3259
- const hiddenItemsCount = import_react19.default.useMemo(
3373
+ const [hiddenItemsMap, setHiddenItemsMap] = import_react18.default.useState({});
3374
+ const hiddenItemsCount = import_react18.default.useMemo(
3260
3375
  () => Object.keys(hiddenItemsMap).filter(Boolean).length,
3261
3376
  [hiddenItemsMap]
3262
3377
  );
3263
- const isItemDisabled = import_react19.default.useCallback(
3378
+ const isItemDisabled = import_react18.default.useCallback(
3264
3379
  (item) => Boolean(item.disabled || hiddenItemsMap[item.id]),
3265
3380
  [hiddenItemsMap]
3266
3381
  );
@@ -3291,7 +3406,7 @@ var useDownshiftDefaults = ({
3291
3406
  };
3292
3407
 
3293
3408
  // src/ActionMenu/ActionMenu.tsx
3294
- var import_jsx_runtime17 = require("react/jsx-runtime");
3409
+ var import_jsx_runtime18 = require("react/jsx-runtime");
3295
3410
  var handleStateChange = (changes, currentSelectedItem) => {
3296
3411
  if (!(changes.type === import_downshift3.useSelect.stateChangeTypes.ToggleButtonKeyDownEnter || changes.type === import_downshift3.useSelect.stateChangeTypes.ToggleButtonKeyDownSpaceButton)) {
3297
3412
  return;
@@ -3328,6 +3443,7 @@ var ActionMenu = ({
3328
3443
  menuItems,
3329
3444
  MenuItemComponent,
3330
3445
  stateReducer: externalStateReducer,
3446
+ MenuRootComponent = MenuRoot,
3331
3447
  ...useSelectProps
3332
3448
  }) => {
3333
3449
  const { allMenuItems, menuItemsMap, children } = useMenuChildren({
@@ -3338,7 +3454,7 @@ var ActionMenu = ({
3338
3454
  const { defaultDownshiftProps, ...restDefaults } = useDownshiftDefaults({
3339
3455
  isCombobox: false
3340
3456
  });
3341
- const [currentSelectedItem, setCurrentSelectedItem] = import_react20.default.useState(null);
3457
+ const [currentSelectedItem, setCurrentSelectedItem] = import_react19.default.useState(null);
3342
3458
  const { isOpen, ...useSelectReturnProps } = (0, import_downshift3.useSelect)({
3343
3459
  ...defaultDownshiftProps.select,
3344
3460
  items: allMenuItems,
@@ -3350,11 +3466,11 @@ var ActionMenu = ({
3350
3466
  ),
3351
3467
  ...useSelectProps
3352
3468
  });
3353
- (0, import_react20.useEffect)(() => {
3469
+ (0, import_react19.useEffect)(() => {
3354
3470
  setCurrentSelectedItem(useSelectReturnProps.selectedItem);
3355
3471
  }, [useSelectReturnProps.selectedItem]);
3356
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3357
- MenuRoot,
3472
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3473
+ MenuRootComponent,
3358
3474
  {
3359
3475
  ...{
3360
3476
  isListbox: false,
@@ -3372,14 +3488,15 @@ var ActionMenu = ({
3372
3488
  };
3373
3489
 
3374
3490
  // src/SingleSelectMenu/SingleSelectMenu.tsx
3375
- var import_react21 = require("react");
3491
+ var import_react20 = require("react");
3376
3492
  var import_downshift4 = require("downshift");
3377
- var import_jsx_runtime18 = require("react/jsx-runtime");
3493
+ var import_jsx_runtime19 = require("react/jsx-runtime");
3378
3494
  var SingleSelectMenu = ({
3379
3495
  children: childrenProp,
3380
3496
  stateReducer: externalStateReducer,
3381
3497
  menuItems,
3382
3498
  MenuItemComponent,
3499
+ MenuRootComponent = MenuRoot,
3383
3500
  ...useSelectProps
3384
3501
  }) => {
3385
3502
  const { allMenuItems, menuItemsMap, children } = useMenuChildren({
@@ -3400,8 +3517,8 @@ var SingleSelectMenu = ({
3400
3517
  ),
3401
3518
  ...useSelectProps
3402
3519
  });
3403
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3404
- MenuRoot,
3520
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
3521
+ MenuRootComponent,
3405
3522
  {
3406
3523
  ...{
3407
3524
  isListbox: true,
@@ -3419,15 +3536,16 @@ var SingleSelectMenu = ({
3419
3536
  };
3420
3537
 
3421
3538
  // src/MultiSelectMenu/MultiSelectMenu.tsx
3422
- var import_react22 = require("react");
3539
+ var import_react21 = require("react");
3423
3540
  var import_downshift5 = require("downshift");
3424
- var import_jsx_runtime19 = require("react/jsx-runtime");
3541
+ var import_jsx_runtime20 = require("react/jsx-runtime");
3425
3542
  var MultiSelectMenu = ({
3426
3543
  children: childrenProp,
3427
3544
  menuItems,
3428
3545
  MenuItemComponent,
3429
3546
  onSelectedItemChange: externalOnSelectedItemChange,
3430
3547
  stateReducer: externalStateReducer,
3548
+ MenuRootComponent = MenuRoot,
3431
3549
  getA11yMultiStatusMessage,
3432
3550
  onMultiSelectStateChange,
3433
3551
  multiSelectStateReducer,
@@ -3493,8 +3611,8 @@ var MultiSelectMenu = ({
3493
3611
  },
3494
3612
  ...useSelectProps
3495
3613
  });
3496
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
3497
- MenuRoot,
3614
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
3615
+ MenuRootComponent,
3498
3616
  {
3499
3617
  ...{
3500
3618
  isListbox: true,
@@ -3521,16 +3639,17 @@ var MultiSelectMenu = ({
3521
3639
  };
3522
3640
 
3523
3641
  // src/Autocomplete/Autocomplete.tsx
3524
- var import_react25 = require("react");
3642
+ var import_react24 = require("react");
3525
3643
 
3526
3644
  // src/Autocomplete/SingleAutocomplete.tsx
3527
- var import_react23 = require("react");
3645
+ var import_react22 = require("react");
3528
3646
  var import_downshift6 = require("downshift");
3529
- var import_jsx_runtime20 = require("react/jsx-runtime");
3647
+ var import_jsx_runtime21 = require("react/jsx-runtime");
3530
3648
  var SingleAutocomplete = ({
3531
3649
  children: childrenProp,
3532
3650
  stateReducer: externalStateReducer,
3533
3651
  menuItems,
3652
+ MenuRootComponent = MenuRoot,
3534
3653
  MenuItemComponent,
3535
3654
  itemToString: itemToString2 = itemToString,
3536
3655
  getIsItemVisible,
@@ -3559,8 +3678,8 @@ var SingleAutocomplete = ({
3559
3678
  ),
3560
3679
  ...useComboboxProps
3561
3680
  });
3562
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
3563
- MenuRoot,
3681
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
3682
+ MenuRootComponent,
3564
3683
  {
3565
3684
  ...{
3566
3685
  isListbox: true,
@@ -3581,14 +3700,15 @@ var SingleAutocomplete = ({
3581
3700
  };
3582
3701
 
3583
3702
  // src/Autocomplete/MultiAutocomplete.tsx
3584
- var import_react24 = __toESM(require("react"));
3703
+ var import_react23 = __toESM(require("react"));
3585
3704
  var import_downshift7 = require("downshift");
3586
- var import_jsx_runtime21 = require("react/jsx-runtime");
3705
+ var import_jsx_runtime22 = require("react/jsx-runtime");
3587
3706
  var MultiAutocomplete = ({
3588
3707
  children: childrenProp,
3589
3708
  stateReducer: externalStateReducer,
3590
3709
  menuItems,
3591
3710
  MenuItemComponent,
3711
+ MenuRootComponent = MenuRoot,
3592
3712
  itemToString: itemToString2 = itemToString,
3593
3713
  itemToKey: itemToKey3 = itemToKey,
3594
3714
  getIsItemVisible = getDefaultGetIsItemVisible(itemToString2),
@@ -3606,15 +3726,15 @@ var MultiAutocomplete = ({
3606
3726
  menuItems,
3607
3727
  MenuItemComponent
3608
3728
  });
3609
- const [selectedItems, setSelectedItems] = import_react24.default.useState(initialSelectedItems);
3610
- const [selectedItemIds, setSelectedItemIds] = import_react24.default.useState(getSelectedItemIds(initialSelectedItems));
3611
- const getIsItemVisibleMulti = import_react24.default.useCallback(
3729
+ const [selectedItems, setSelectedItems] = import_react23.default.useState(initialSelectedItems);
3730
+ const [selectedItemIds, setSelectedItemIds] = import_react23.default.useState(getSelectedItemIds(initialSelectedItems));
3731
+ const getIsItemVisibleMulti = import_react23.default.useCallback(
3612
3732
  (item, inputValue) => {
3613
3733
  return (showSelectedItemsInDropdown || !selectedItemIds[item.id]) && getIsItemVisible(item, inputValue);
3614
3734
  },
3615
3735
  [selectedItemIds, showSelectedItemsInDropdown, getIsItemVisible]
3616
3736
  );
3617
- const getShouldFilterMulti = import_react24.default.useCallback(
3737
+ const getShouldFilterMulti = import_react23.default.useCallback(
3618
3738
  (args) => {
3619
3739
  return !showSelectedItemsInDropdown && Object.keys(selectedItemIds).length > 0 || defaultGetShouldFilter(args);
3620
3740
  },
@@ -3638,7 +3758,7 @@ var MultiAutocomplete = ({
3638
3758
  getShouldFilter: getShouldFilterMulti,
3639
3759
  setHiddenItemsMap
3640
3760
  });
3641
- import_react24.default.useEffect(() => {
3761
+ import_react23.default.useEffect(() => {
3642
3762
  updateFilteredItems({ inputValue: "" });
3643
3763
  }, [selectedItemIds]);
3644
3764
  const useMultipleSelectionReturnProps = (0, import_downshift7.useMultipleSelection)({
@@ -3687,8 +3807,8 @@ var MultiAutocomplete = ({
3687
3807
  },
3688
3808
  ...useComboboxProps
3689
3809
  });
3690
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
3691
- MenuRoot,
3810
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
3811
+ MenuRootComponent,
3692
3812
  {
3693
3813
  ...{
3694
3814
  isListbox: true,
@@ -3716,21 +3836,21 @@ var MultiAutocomplete = ({
3716
3836
  };
3717
3837
 
3718
3838
  // src/Autocomplete/Autocomplete.tsx
3719
- var import_jsx_runtime22 = require("react/jsx-runtime");
3839
+ var import_jsx_runtime23 = require("react/jsx-runtime");
3720
3840
  var Autocomplete = ({
3721
3841
  multiSelect,
3722
3842
  ...rest
3723
3843
  }) => {
3724
3844
  if (multiSelect) {
3725
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(MultiAutocomplete, { ...rest });
3845
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(MultiAutocomplete, { ...rest });
3726
3846
  }
3727
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(SingleAutocomplete, { ...rest });
3847
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SingleAutocomplete, { ...rest });
3728
3848
  };
3729
3849
 
3730
3850
  // src/Autocomplete/AutocompleteInput.tsx
3731
- var import_react26 = require("react");
3851
+ var import_react25 = require("react");
3732
3852
  var import_seeds_react_input2 = require("@sproutsocial/seeds-react-input");
3733
- var import_jsx_runtime23 = require("react/jsx-runtime");
3853
+ var import_jsx_runtime24 = require("react/jsx-runtime");
3734
3854
  var AutocompleteInput = ({
3735
3855
  onKeyDown,
3736
3856
  onChange,
@@ -3741,7 +3861,7 @@ var AutocompleteInput = ({
3741
3861
  ...rest
3742
3862
  }) => {
3743
3863
  const { getInputComponentProps, inputValue, ref, ariaProps } = useMenuToggleContext();
3744
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
3864
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
3745
3865
  import_seeds_react_input2.Input,
3746
3866
  {
3747
3867
  id: "autocomplete_input",
@@ -3765,59 +3885,75 @@ var AutocompleteInput = ({
3765
3885
  );
3766
3886
  };
3767
3887
 
3768
- // src/NestedMenu/NestedMenu.tsx
3769
- var import_react29 = require("react");
3770
-
3771
- // src/NestedMenu/NestedMenuContext.tsx
3772
- var import_react27 = require("react");
3773
- var import_jsx_runtime24 = require("react/jsx-runtime");
3774
- var defaultNestedMenuContext = {
3775
- selectedMenuPath: [],
3776
- setSelectedMenuId: () => {
3777
- },
3778
- setSelectedMenuPath: () => {
3779
- },
3780
- goBack: () => {
3781
- }
3782
- };
3783
- var NestedMenuContext = (0, import_react27.createContext)(
3784
- defaultNestedMenuContext
3785
- );
3786
- var NestedMenuProvider = ({
3787
- children,
3788
- ...nestedMenuProps
3789
- }) => {
3790
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(NestedMenuContext.Provider, { value: nestedMenuProps, children });
3791
- };
3792
- var useNestedMenuContext = () => {
3793
- const nestedMenuContextValue = (0, import_react27.useContext)(NestedMenuContext);
3794
- if (nestedMenuContextValue === null) {
3795
- throw new Error(
3796
- "useNestedMenuContext must be used within a <NestedMenuContext.Provider />"
3797
- );
3798
- }
3799
- return nestedMenuContextValue;
3800
- };
3801
-
3802
- // src/NestedMenu/NestedMenuHeader.tsx
3803
- var import_seeds_react_button2 = require("@sproutsocial/seeds-react-button");
3804
- var import_seeds_react_icon3 = require("@sproutsocial/seeds-react-icon");
3888
+ // src/Autocomplete/AutocompleteTokenInput.tsx
3889
+ var import_react26 = require("react");
3805
3890
  var import_jsx_runtime25 = require("react/jsx-runtime");
3806
- var NestedMenuHeader = ({
3807
- backArrowLabel,
3808
- ...props
3891
+ var AutocompleteTokenInput = ({
3892
+ onKeyDown,
3893
+ onChange,
3894
+ onInput,
3895
+ onBlur,
3896
+ onClick,
3897
+ inputProps,
3898
+ getTokenProps,
3899
+ ...rest
3809
3900
  }) => {
3810
- const { goBack, selectedMenuPath } = useNestedMenuContext();
3811
- const showBackArrow = selectedMenuPath.length > 1;
3901
+ const {
3902
+ getInputComponentProps,
3903
+ getDropdownProps,
3904
+ inputValue,
3905
+ isOpen,
3906
+ ref,
3907
+ ariaProps
3908
+ } = useMenuToggleContext();
3812
3909
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
3813
- MenuHeader,
3910
+ MenuTokenInput,
3814
3911
  {
3815
- leftAction: showBackArrow ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_seeds_react_button2.Button, { onClick: goBack, ariaLabel: backArrowLabel, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_seeds_react_icon3.Icon, { name: "arrow-left" }) }) : void 0,
3912
+ id: "autocomplete_input",
3913
+ name: "autocomplete_input",
3914
+ ...getInputComponentProps({
3915
+ ...getDropdownProps?.({ ref, preventKeyAction: isOpen }) || { ref },
3916
+ onKeyDown,
3917
+ onChange,
3918
+ onInput,
3919
+ onBlur,
3920
+ onClick,
3921
+ value: inputValue,
3922
+ refKey: "innerRef",
3923
+ inputProps,
3924
+ ...ariaProps
3925
+ }),
3926
+ ...rest
3927
+ }
3928
+ );
3929
+ };
3930
+
3931
+ // src/Autocomplete/AutocompleteSelect.tsx
3932
+ var import_seeds_react_icon4 = __toESM(require("@sproutsocial/seeds-react-icon"));
3933
+ var import_react27 = require("react");
3934
+ var import_styled_components13 = __toESM(require("styled-components"));
3935
+ var import_seeds_react_input3 = require("@sproutsocial/seeds-react-input");
3936
+ var import_jsx_runtime26 = require("react/jsx-runtime");
3937
+ var StyledAutocompleteInput = (0, import_styled_components13.default)(AutocompleteInput)`
3938
+ ${import_seeds_react_input3.Accessory} {
3939
+ pointer-events: none;
3940
+ }
3941
+ `;
3942
+ var AutocompleteSelect = (props) => {
3943
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
3944
+ StyledAutocompleteInput,
3945
+ {
3946
+ elemAfter: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_seeds_react_icon4.default, { name: "chevron-down" }),
3816
3947
  ...props
3817
3948
  }
3818
3949
  );
3819
3950
  };
3820
3951
 
3952
+ // src/NestedMenu/NestedMenu.tsx
3953
+ var import_react33 = require("react");
3954
+ var import_react34 = require("motion/react");
3955
+ var import_downshift9 = require("downshift");
3956
+
3821
3957
  // src/reducers/nestedMenuStateReducer.tsx
3822
3958
  var import_downshift8 = require("downshift");
3823
3959
  var nestedMenuStateReducer = (_state, actionAndChanges) => {
@@ -3842,14 +3978,52 @@ var nestedMenuStateReducer = (_state, actionAndChanges) => {
3842
3978
  }
3843
3979
  };
3844
3980
 
3845
- // src/NestedMenu/NestedMenuContent.tsx
3981
+ // src/NestedMenu/NestedMenuContext.tsx
3846
3982
  var import_react28 = require("react");
3983
+ var import_jsx_runtime27 = require("react/jsx-runtime");
3984
+ var defaultNestedMenuContext = {
3985
+ selectedMenuPath: [],
3986
+ setSelectedMenuId: () => {
3987
+ },
3988
+ setSelectedMenuPath: () => {
3989
+ },
3990
+ resetSelectedMenuPath: () => {
3991
+ },
3992
+ goBack: () => {
3993
+ },
3994
+ rootMenuContextProps: {},
3995
+ activeMenuContext: defaultMenuContext,
3996
+ setActiveMenuContext: () => {
3997
+ },
3998
+ animationSpeed: MOTION_DURATION_FAST
3999
+ };
4000
+ var NestedMenuContext = (0, import_react28.createContext)(
4001
+ defaultNestedMenuContext
4002
+ );
4003
+ var NestedMenuProvider = ({
4004
+ children,
4005
+ ...nestedMenuProps
4006
+ }) => {
4007
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(NestedMenuContext.Provider, { value: nestedMenuProps, children });
4008
+ };
4009
+ var useNestedMenuContext = () => {
4010
+ const nestedMenuContextValue = (0, import_react28.useContext)(NestedMenuContext);
4011
+ if (nestedMenuContextValue === null) {
4012
+ throw new Error(
4013
+ "useNestedMenuContext must be used within a <NestedMenuContext.Provider />"
4014
+ );
4015
+ }
4016
+ return nestedMenuContextValue;
4017
+ };
4018
+
4019
+ // src/NestedMenu/NestedMenuContent.tsx
4020
+ var import_react29 = require("react");
3847
4021
  var import_seeds_react_utilities2 = require("@sproutsocial/seeds-react-utilities");
3848
4022
 
3849
4023
  // src/NestedMenu/NestedMenuItem.tsx
3850
- var import_seeds_react_icon4 = require("@sproutsocial/seeds-react-icon");
4024
+ var import_seeds_react_icon5 = require("@sproutsocial/seeds-react-icon");
3851
4025
  var import_seeds_react_box4 = require("@sproutsocial/seeds-react-box");
3852
- var import_jsx_runtime26 = require("react/jsx-runtime");
4026
+ var import_jsx_runtime28 = require("react/jsx-runtime");
3853
4027
  var NestedMenuItem = ({
3854
4028
  children,
3855
4029
  childMenuId,
@@ -3857,21 +4031,23 @@ var NestedMenuItem = ({
3857
4031
  ...rest
3858
4032
  }) => {
3859
4033
  const { setSelectedMenuId } = useNestedMenuContext();
3860
- const onClickProps = childMenuId ? {
4034
+ const onClickProps = childMenuId || onClickProp ? {
3861
4035
  onClick: (e) => {
3862
4036
  onClickProp?.(e);
3863
- setSelectedMenuId?.(childMenuId);
4037
+ if (childMenuId) {
4038
+ setSelectedMenuId?.(childMenuId);
4039
+ }
3864
4040
  }
3865
4041
  } : {};
3866
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(MenuItem, { ...onClickProps, ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_seeds_react_box4.Box, { display: "flex", justifyContent: "space-between", children: [
4042
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(MenuItem, { ...onClickProps, ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_seeds_react_box4.Box, { display: "flex", justifyContent: "space-between", children: [
3867
4043
  children,
3868
- childMenuId && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(MenuItemActionRight, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_seeds_react_icon4.Icon, { name: "arrow-right-outline" }) })
4044
+ childMenuId && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(MenuItemActionRight, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_seeds_react_icon5.Icon, { name: "arrow-right-outline" }) })
3869
4045
  ] }) });
3870
4046
  };
3871
4047
  NestedMenuItem.__MENU_PRIMITIVE_TYPE = "MenuItem";
3872
4048
 
3873
4049
  // src/NestedMenu/NestedMenuContent.tsx
3874
- var import_jsx_runtime27 = require("react/jsx-runtime");
4050
+ var import_jsx_runtime29 = require("react/jsx-runtime");
3875
4051
  var NestedMenuContent = ({
3876
4052
  innerRef: innerRefProp = null,
3877
4053
  onKeyDown: onKeyDownProp,
@@ -3882,10 +4058,10 @@ var NestedMenuContent = ({
3882
4058
  }) => {
3883
4059
  const { highlightedIndex, items } = useMenuContentContext();
3884
4060
  const { setSelectedMenuId, selectedMenuPath, goBack } = useNestedMenuContext();
3885
- const internalRef = (0, import_react28.useRef)(null);
4061
+ const internalRef = (0, import_react29.useRef)(null);
3886
4062
  const innerRef = (0, import_seeds_react_utilities2.mergeRefs)(internalRef, innerRefProp);
3887
4063
  const contentProps = children ? { children } : { menuItems, MenuItemComponent };
3888
- (0, import_react28.useEffect)(() => {
4064
+ (0, import_react29.useEffect)(() => {
3889
4065
  internalRef?.current?.focus();
3890
4066
  }, []);
3891
4067
  const onKeyDown = (e) => {
@@ -3908,7 +4084,7 @@ var NestedMenuContent = ({
3908
4084
  break;
3909
4085
  }
3910
4086
  };
3911
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
4087
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
3912
4088
  MenuContent,
3913
4089
  {
3914
4090
  onKeyDown,
@@ -3920,82 +4096,317 @@ var NestedMenuContent = ({
3920
4096
  };
3921
4097
  NestedMenuContent.__MENU_PRIMITIVE_TYPE = "MenuContent";
3922
4098
 
4099
+ // src/NestedMenu/NestedMenuHeader.tsx
4100
+ var import_seeds_react_button2 = require("@sproutsocial/seeds-react-button");
4101
+ var import_seeds_react_icon6 = require("@sproutsocial/seeds-react-icon");
4102
+ var import_react30 = require("motion/react");
4103
+ var import_jsx_runtime30 = require("react/jsx-runtime");
4104
+ var NestedMenuHeader = ({
4105
+ backArrowLabel,
4106
+ ...props
4107
+ }) => {
4108
+ const { goBack, selectedMenuPath, animationSpeed } = useNestedMenuContext();
4109
+ const showBackArrow = selectedMenuPath.length > 1;
4110
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
4111
+ MenuHeader,
4112
+ {
4113
+ leftAction: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_react30.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
4114
+ import_react30.motion.div,
4115
+ {
4116
+ initial: { opacity: 0 },
4117
+ animate: { opacity: 1 },
4118
+ exit: {
4119
+ opacity: 0,
4120
+ transition: { duration: animationSpeed }
4121
+ },
4122
+ children: showBackArrow ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_seeds_react_button2.Button, { onClick: goBack, ariaLabel: backArrowLabel, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_seeds_react_icon6.Icon, { name: "arrow-left" }) }) : void 0
4123
+ },
4124
+ `${selectedMenuPath}-header--button`
4125
+ ) }),
4126
+ ...props
4127
+ }
4128
+ );
4129
+ };
4130
+
4131
+ // src/NestedMenu/NestedMenuRoot.tsx
4132
+ var import_react31 = __toESM(require("react"));
4133
+ var import_jsx_runtime31 = require("react/jsx-runtime");
4134
+ var NestedMenuRoot = ({
4135
+ children,
4136
+ menuToggleElement,
4137
+ ...contextProps
4138
+ }) => {
4139
+ const menuContext = useMenu(contextProps);
4140
+ const { setActiveMenuContext, selectedMenuPath } = useNestedMenuContext();
4141
+ import_react31.default.useEffect(() => {
4142
+ setActiveMenuContext(menuContext);
4143
+ }, [
4144
+ selectedMenuPath[selectedMenuPath.length - 1],
4145
+ menuContext.selectedItem,
4146
+ menuContext.selectedItems?.length
4147
+ ]);
4148
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(MenuContentProvider, { menuContext, children });
4149
+ };
4150
+
4151
+ // src/NestedMenu/NestedMenuPopout.tsx
4152
+ var import_react32 = require("motion/react");
4153
+ var import_styled_components14 = __toESM(require("styled-components"));
4154
+ var import_jsx_runtime32 = require("react/jsx-runtime");
4155
+ var StyledDiv = (0, import_styled_components14.default)(import_react32.motion.div)`
4156
+ overflow: hidden;
4157
+ `;
4158
+ var NestedMenuPopout = ({
4159
+ content,
4160
+ menuToggleElement,
4161
+ width: width2,
4162
+ ...popoutProps
4163
+ }) => {
4164
+ const { activeMenuContext, rootMenuContextProps, resetSelectedMenuPath } = useNestedMenuContext();
4165
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
4166
+ MenuPopout,
4167
+ {
4168
+ ...popoutProps,
4169
+ onClose: () => setTimeout(() => resetSelectedMenuPath?.(), 100),
4170
+ isOpen: !!rootMenuContextProps.isOpen,
4171
+ openMenu: rootMenuContextProps.openMenu,
4172
+ closeMenu: rootMenuContextProps.closeMenu,
4173
+ width: width2,
4174
+ content: (props) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(StyledDiv, { layout: "position", children: typeof content === "function" ? content(props) : content }),
4175
+ children: (toggleProps) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
4176
+ MenuToggleProvider,
4177
+ {
4178
+ menuContext: {
4179
+ ...activeMenuContext,
4180
+ ...rootMenuContextProps,
4181
+ ...toggleProps
4182
+ },
4183
+ children: menuToggleElement
4184
+ }
4185
+ )
4186
+ }
4187
+ );
4188
+ };
4189
+
3923
4190
  // src/NestedMenu/NestedMenu.tsx
3924
- var import_jsx_runtime28 = require("react/jsx-runtime");
4191
+ var import_jsx_runtime33 = require("react/jsx-runtime");
3925
4192
  var NestedMenu = ({
3926
4193
  initialMenuId,
3927
4194
  menus,
3928
4195
  onBackButtonClick,
3929
4196
  backArrowLabel,
3930
- menuToggleElement
4197
+ menuToggleElement,
4198
+ popoutProps = {},
4199
+ width: width2 = "300px",
4200
+ stateReducer: rootExternalStateReducer,
4201
+ id: externalNestedMenuId,
4202
+ ...useSelectProps
3931
4203
  }) => {
3932
- const [selectedMenuPath, setSelectedMenuPath] = (0, import_react29.useState)([initialMenuId]);
3933
- const selectedMenuId = selectedMenuPath[selectedMenuPath.length - 1];
4204
+ const { defaultDownshiftProps, ...restDefaults } = useDownshiftDefaults({
4205
+ isCombobox: false
4206
+ });
4207
+ const uniqueId = (0, import_react33.useId)();
4208
+ const nestedMenuId = externalNestedMenuId ?? `nested-menu-${uniqueId}`;
4209
+ const [hasLoadedOnce, setHasLoadedOnce] = (0, import_react33.useState)(false);
4210
+ const useSelectReturnProps = (0, import_downshift9.useSelect)({
4211
+ ...defaultDownshiftProps.select,
4212
+ id: nestedMenuId,
4213
+ items: [],
4214
+ stateReducer: reduceReducers(
4215
+ defaultDownshiftProps.select.stateReducer,
4216
+ rootExternalStateReducer
4217
+ ),
4218
+ ...useSelectProps
4219
+ });
4220
+ const rootMenuContextProps = {
4221
+ ...useSelectProps,
4222
+ ...useSelectReturnProps,
4223
+ ...restDefaults
4224
+ };
4225
+ (0, import_react33.useEffect)(() => {
4226
+ if (!useSelectReturnProps.isOpen) {
4227
+ setHasLoadedOnce(false);
4228
+ } else {
4229
+ !hasLoadedOnce && setHasLoadedOnce(true);
4230
+ }
4231
+ }, [useSelectReturnProps.isOpen]);
4232
+ const onNestedIsOpenChange = ({
4233
+ isOpen: newIsOpen
4234
+ }) => {
4235
+ !newIsOpen && useSelectReturnProps.closeMenu?.();
4236
+ };
4237
+ const nestedMenuPropsFromRoot = {
4238
+ // The selected menu needs to receive this id so that the toggle element can be properly associated with it.
4239
+ id: nestedMenuId,
4240
+ onIsOpenChange: onNestedIsOpenChange
4241
+ };
4242
+ const [selectedMenuPath, setSelectedMenuPath] = (0, import_react33.useState)([initialMenuId]);
4243
+ const [activeMenuContext, setActiveMenuContext] = (0, import_react33.useState)(defaultMenuContext);
4244
+ const [currentMenuId, setCurrentMenuId] = (0, import_react33.useState)(initialMenuId);
4245
+ const [isAdding, setIsAdding] = (0, import_react33.useState)(false);
3934
4246
  const setSelectedMenuId = (id) => {
4247
+ setIsAdding(true);
3935
4248
  setSelectedMenuPath((currentPath) => [...currentPath, id]);
3936
4249
  };
4250
+ (0, import_react33.useEffect)(() => {
4251
+ if (selectedMenuPath.length > 0) {
4252
+ const newMenuId = selectedMenuPath[selectedMenuPath.length - 1];
4253
+ setCurrentMenuId(newMenuId);
4254
+ }
4255
+ }, [selectedMenuPath.join("-")]);
4256
+ const resetSelectedMenuPath = () => {
4257
+ setSelectedMenuPath([initialMenuId]);
4258
+ setCurrentMenuId(initialMenuId);
4259
+ };
3937
4260
  const goBack = () => {
4261
+ setIsAdding(false);
3938
4262
  setSelectedMenuPath((currentPath) => currentPath.slice(0, -1));
3939
- onBackButtonClick?.(selectedMenuId);
4263
+ onBackButtonClick?.(currentMenuId);
3940
4264
  };
3941
4265
  const {
3942
4266
  MenuComponent,
3943
4267
  menuProps,
3944
4268
  MenuHeaderComponent = NestedMenuHeader,
3945
4269
  menuHeaderProps = {}
3946
- } = menus[selectedMenuId] || {};
4270
+ } = menus[currentMenuId] || {};
3947
4271
  const {
3948
4272
  children,
3949
4273
  menuItems,
3950
4274
  MenuItemComponent,
3951
4275
  stateReducer: externalStateReducer,
3952
- onStateChange: externalOnStateChange,
3953
- ...props
4276
+ ...restMenuProps
3954
4277
  } = menuProps || {};
3955
4278
  const stateReducer = reduceReducers(
3956
4279
  nestedMenuStateReducer,
3957
4280
  externalStateReducer
3958
4281
  );
3959
- const onStateChange = (changes) => {
3960
- externalOnStateChange?.(changes);
3961
- if (changes.isOpen === false) {
3962
- setTimeout(() => {
3963
- setSelectedMenuPath([initialMenuId]);
3964
- }, 100);
3965
- }
4282
+ const animationSpeed = MOTION_DURATION_FAST;
4283
+ const contentVariants = {
4284
+ arrive: (custom = { hasLoadedOnce: false, isAdding: false }) => ({
4285
+ opacity: 0,
4286
+ // Start from left if is first render of root, else use default
4287
+ x: !custom?.hasLoadedOnce ? "200%" : custom?.isAdding ? "200%" : "-200%"
4288
+ }),
4289
+ enter: (custom = { hasLoadedOnce: false }) => ({
4290
+ opacity: 1,
4291
+ x: 0,
4292
+ transition: {
4293
+ type: "tween",
4294
+ duration: animationSpeed,
4295
+ ease: "circOut",
4296
+ delay: !custom.hasLoadedOnce ? animationSpeed : 0
4297
+ }
4298
+ }),
4299
+ leave: (custom = { hasLoadedOnce: false, isAdding: false }) => ({
4300
+ opacity: 0,
4301
+ x: custom?.isAdding ? "-200%" : "200%",
4302
+ transition: {
4303
+ type: "tween",
4304
+ duration: animationSpeed,
4305
+ ease: "circIn"
4306
+ }
4307
+ })
4308
+ };
4309
+ const menuVariants = {
4310
+ arrive: (custom = { hasLoadedOnce: false, isAdding: false }) => ({
4311
+ opacity: 0,
4312
+ // Start from left if is first render of root, else use default
4313
+ x: !custom?.hasLoadedOnce ? "200%" : custom?.isAdding ? "200%" : "-200%"
4314
+ }),
4315
+ enter: (custom = { hasLoadedOnce: false }) => ({
4316
+ opacity: 1,
4317
+ x: 0,
4318
+ transition: {
4319
+ type: "tween",
4320
+ duration: animationSpeed,
4321
+ ease: "circOut",
4322
+ delay: !custom.hasLoadedOnce ? animationSpeed : 0
4323
+ }
4324
+ }),
4325
+ leave: (custom = { hasLoadedOnce: false, isAdding: false }) => ({
4326
+ opacity: 0,
4327
+ x: custom?.isAdding ? "-200%" : "200%",
4328
+ transition: {
4329
+ type: "tween",
4330
+ duration: animationSpeed,
4331
+ ease: "circIn"
4332
+ }
4333
+ })
3966
4334
  };
3967
4335
  const nestedMenuProps = {
4336
+ ...nestedMenuPropsFromRoot,
3968
4337
  menuToggleElement,
3969
4338
  stateReducer,
3970
- onStateChange,
3971
- initialIsOpen: selectedMenuPath.length > 1,
3972
- children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
3973
- MenuHeaderComponent && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
3974
- MenuHeaderComponent,
3975
- {
3976
- backArrowLabel,
3977
- ...menuHeaderProps
3978
- }
3979
- ),
3980
- children && children,
3981
- menuItems && !children && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
3982
- NestedMenuContent,
4339
+ MenuRootComponent: NestedMenuRoot,
4340
+ // This ensures that onNestedIsOpenChange will be triggered if the selected menu attempts to close itself.
4341
+ initialIsOpen: true,
4342
+ children: (
4343
+ // Handles the smooth animating of the content
4344
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react34.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
4345
+ import_react34.motion.div,
3983
4346
  {
3984
- menuItems,
3985
- MenuItemComponent: MenuItemComponent ?? NestedMenuItem
3986
- }
3987
- )
3988
- ] }),
3989
- ...props
4347
+ variants: contentVariants,
4348
+ initial: "arrive",
4349
+ animate: "enter",
4350
+ exit: "leave",
4351
+ custom: { isAdding, hasLoadedOnce },
4352
+ children: [
4353
+ MenuHeaderComponent && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
4354
+ MenuHeaderComponent,
4355
+ {
4356
+ backArrowLabel,
4357
+ ...menuHeaderProps
4358
+ }
4359
+ ),
4360
+ children && children,
4361
+ menuItems && !children && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
4362
+ NestedMenuContent,
4363
+ {
4364
+ menuItems,
4365
+ MenuItemComponent: MenuItemComponent ?? NestedMenuItem
4366
+ }
4367
+ )
4368
+ ]
4369
+ },
4370
+ currentMenuId
4371
+ ) })
4372
+ ),
4373
+ ...restMenuProps
3990
4374
  };
3991
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
4375
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3992
4376
  NestedMenuProvider,
3993
4377
  {
3994
- selectedMenuPath,
3995
- setSelectedMenuPath,
3996
- setSelectedMenuId,
3997
- goBack,
3998
- children: MenuComponent && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(MenuComponent, { ...nestedMenuProps })
4378
+ ...{
4379
+ selectedMenuPath,
4380
+ setSelectedMenuPath,
4381
+ setSelectedMenuId,
4382
+ resetSelectedMenuPath,
4383
+ goBack,
4384
+ rootMenuContextProps,
4385
+ activeMenuContext,
4386
+ setActiveMenuContext,
4387
+ animationSpeed
4388
+ },
4389
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
4390
+ NestedMenuPopout,
4391
+ {
4392
+ content: MenuComponent && // Handles the rerender of the component
4393
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react34.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
4394
+ import_react34.motion.div,
4395
+ {
4396
+ variants: menuVariants,
4397
+ initial: "arrive",
4398
+ animate: "enter",
4399
+ exit: "leave",
4400
+ custom: { isAdding, hasLoadedOnce },
4401
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MenuComponent, { ...nestedMenuProps })
4402
+ },
4403
+ `${currentMenuId}-content`
4404
+ ) }),
4405
+ menuToggleElement,
4406
+ width: width2,
4407
+ ...popoutProps
4408
+ }
4409
+ )
3999
4410
  }
4000
4411
  );
4001
4412
  };
@@ -4004,7 +4415,11 @@ var NestedMenu = ({
4004
4415
  ActionMenu,
4005
4416
  Autocomplete,
4006
4417
  AutocompleteInput,
4418
+ AutocompleteSelect,
4419
+ AutocompleteTokenInput,
4420
+ CustomPopoutContent,
4007
4421
  INPUT_TYPES,
4422
+ ListboxToggleButton,
4008
4423
  MenuContent,
4009
4424
  MenuContentContext,
4010
4425
  MenuContentProvider,
@@ -4019,7 +4434,9 @@ var NestedMenu = ({
4019
4434
  MenuItemRow,
4020
4435
  MenuItemText,
4021
4436
  MenuLabel,
4437
+ MenuPopout,
4022
4438
  MenuRoot,
4439
+ MenuRootNoPopout,
4023
4440
  MenuSearchInput,
4024
4441
  MenuSearchTokenInput,
4025
4442
  MenuToggleButton,
@@ -4034,6 +4451,7 @@ var NestedMenu = ({
4034
4451
  NestedMenuItem,
4035
4452
  NestedMenuProvider,
4036
4453
  SingleSelectMenu,
4454
+ StyledListboxToggleButton,
4037
4455
  StyledMenuGroup,
4038
4456
  StyledMenuGroupUl,
4039
4457
  StyledMenuItem,