@sproutsocial/seeds-react-menu 1.0.0 → 1.1.1

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