@sproutsocial/seeds-react-menu 1.10.8 → 1.11.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 (50) hide show
  1. package/.turbo/turbo-build.log +21 -15
  2. package/CHANGELOG.md +22 -0
  3. package/dist/esm/index.js +45 -24
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/v2/index.js +1 -1
  6. package/dist/esm/v2/index.js.map +1 -1
  7. package/dist/esm/v3/index.js +800 -0
  8. package/dist/esm/v3/index.js.map +1 -0
  9. package/dist/index.d.mts +22 -22
  10. package/dist/index.d.ts +22 -22
  11. package/dist/index.js +35 -14
  12. package/dist/index.js.map +1 -1
  13. package/dist/v2/index.js +1 -1
  14. package/dist/v2/index.js.map +1 -1
  15. package/dist/v3/index.d.mts +295 -0
  16. package/dist/v3/index.d.ts +295 -0
  17. package/dist/v3/index.js +868 -0
  18. package/dist/v3/index.js.map +1 -0
  19. package/package.json +7 -1
  20. package/src/MenuGroup/MenuGroup.tsx +16 -3
  21. package/src/MenuGroup/__tests__/MenuGroup.test.tsx +19 -0
  22. package/src/MenuItem/MenuItem.tsx +21 -10
  23. package/src/MenuItem/__tests__/MenuItem.test.tsx +19 -0
  24. package/src/v2/Common-V2/ComboboxContent.tsx +1 -1
  25. package/src/v3/Common/ComboboxItem.tsx +82 -0
  26. package/src/v3/Common/ComboboxStyles.tsx +475 -0
  27. package/src/v3/Common/SelectGroup.tsx +28 -0
  28. package/src/v3/Common/SelectIcons.tsx +26 -0
  29. package/src/v3/Common/SelectItem.tsx +108 -0
  30. package/src/v3/Common/SelectStyles.tsx +126 -0
  31. package/src/v3/Common/VirtualizedComboboxList.tsx +200 -0
  32. package/src/v3/Common/groupItems.ts +12 -0
  33. package/src/v3/Common/types.ts +3 -0
  34. package/src/v3/ModalStories.stories.tsx +181 -0
  35. package/src/v3/MultiCombobox.stories.tsx +322 -0
  36. package/src/v3/MultiCombobox.tsx +562 -0
  37. package/src/v3/MultiSearchableSelect.stories.tsx +389 -0
  38. package/src/v3/MultiSearchableSelect.tsx +545 -0
  39. package/src/v3/MultiSelect.stories.tsx +300 -0
  40. package/src/v3/MultiSelect.tsx +498 -0
  41. package/src/v3/SeedsPortal.tsx +35 -0
  42. package/src/v3/SingleCombobox.stories.tsx +169 -0
  43. package/src/v3/SingleCombobox.tsx +304 -0
  44. package/src/v3/SingleSearchableSelect.stories.tsx +239 -0
  45. package/src/v3/SingleSearchableSelect.tsx +319 -0
  46. package/src/v3/SingleSelect.stories.tsx +227 -0
  47. package/src/v3/SingleSelect.tsx +245 -0
  48. package/src/v3/index.ts +7 -0
  49. package/src/v3/storyData.tsx +117 -0
  50. package/tsup.config.ts +1 -0
package/dist/index.d.ts CHANGED
@@ -5,8 +5,8 @@ import * as styled_components from 'styled-components';
5
5
  import * as _sproutsocial_seeds_react_box from '@sproutsocial/seeds-react-box';
6
6
  import { TypeBoxProps } from '@sproutsocial/seeds-react-box';
7
7
  export { TypeBoxProps as TypeMenuFooterProps } from '@sproutsocial/seeds-react-box';
8
- import * as React$1 from 'react';
9
- import React__default from 'react';
8
+ import * as react from 'react';
9
+ import react__default from 'react';
10
10
  import { TypePopoutProps, EnumPlacements } from '@sproutsocial/seeds-react-popout';
11
11
  import { TypeTokenInputProps, TypeTokenSpec } from '@sproutsocial/seeds-react-token-input';
12
12
  import * as _sproutsocial_seeds_react_text from '@sproutsocial/seeds-react-text';
@@ -59,7 +59,7 @@ declare const MenuGroup: {
59
59
  };
60
60
 
61
61
  declare const StyledMenuGroup: styled_components.StyledComponent<"li", styled_components.DefaultTheme, TypeMenuGroupBaseProps, never>;
62
- declare const StyledTitle: styled_components.StyledComponent<React$1.FC<_sproutsocial_seeds_react_text.TypeTextProps>, styled_components.DefaultTheme, {}, never>;
62
+ declare const StyledTitle: styled_components.StyledComponent<react.FC<_sproutsocial_seeds_react_text.TypeTextProps>, styled_components.DefaultTheme, {}, never>;
63
63
  declare const StyledMenuGroupUl: styled_components.StyledComponent<"ul", styled_components.DefaultTheme, {}, never>;
64
64
 
65
65
  interface TypeDownshiftComboboxProps extends Partial<UseComboboxProps<TypeInternalItemProps>> {
@@ -89,10 +89,10 @@ interface TypeMenuContextBaseProps {
89
89
  isListbox?: boolean;
90
90
  hiddenItemsMap?: Record<string, boolean>;
91
91
  hiddenItemsCount?: number;
92
- setHiddenItemsMap?: React__default.Dispatch<React__default.SetStateAction<Record<string, boolean>>>;
92
+ setHiddenItemsMap?: react__default.Dispatch<react__default.SetStateAction<Record<string, boolean>>>;
93
93
  subMenuId?: string;
94
94
  setSubMenuId?: (id: string) => void;
95
- contentRef?: React__default.RefObject<HTMLUListElement>;
95
+ contentRef?: react__default.RefObject<HTMLUListElement>;
96
96
  }
97
97
  interface TypeAllDownshiftProps extends Omit<TypeDownshiftComboboxReturnValue, TypeDonwshiftSharedReturnValue>, Omit<TypeDownshiftComboboxProps, TypeDonwshiftSharedProps>, Omit<TypeDownshiftSelectReturnValue, TypeDonwshiftSharedReturnValue>, Omit<TypeDownshiftSelectProps, TypeDonwshiftSharedProps>, TypeDownshiftMultiSelectReturnValue, TypeDownshiftMultiSelectProps {
98
98
  onHighlightedIndexChange?: TypeDownshiftComboboxProps["onHighlightedIndexChange"] | TypeDownshiftSelectProps["onHighlightedIndexChange"];
@@ -129,7 +129,7 @@ interface TypeMenuProviderProps {
129
129
  menuContext: TypeMenuContext;
130
130
  }
131
131
  interface TypeMenuToggleContext extends TypeMenuContext {
132
- ref?: React__default.RefObject<any> | ((arg0: React__default.ElementRef<any> | HTMLElement) => void);
132
+ ref?: react__default.RefObject<any> | ((arg0: react__default.ElementRef<any> | HTMLElement) => void);
133
133
  toggle?: () => void;
134
134
  show?: () => void;
135
135
  hide?: () => void;
@@ -156,7 +156,7 @@ declare const useMenu: ({ items, isListbox, isOpen, itemsMap: itemsMapFromProps,
156
156
  * MenuToggleContext factory, sets the type and the initial object
157
157
  * @description Context for the Menu Toggle
158
158
  */
159
- declare const MenuToggleContext: React__default.Context<TypeMenuToggleContext>;
159
+ declare const MenuToggleContext: react__default.Context<TypeMenuToggleContext>;
160
160
  /**
161
161
  * MenuToggleProvider Component sets the context values into the provider
162
162
  * @description Context Provider for the Menu Toggle
@@ -170,7 +170,7 @@ declare const useMenuToggleContext: () => TypeMenuToggleContext;
170
170
  * MenuContentContext factory, sets the type and the initial object
171
171
  * @description Context for the Menu Content
172
172
  */
173
- declare const MenuContentContext: React__default.Context<TypeMenuContext>;
173
+ declare const MenuContentContext: react__default.Context<TypeMenuContext>;
174
174
  /**
175
175
  * MenuContentProvider Component sets the context values into the provider
176
176
  * @description Context Provider for the Menu Content
@@ -184,7 +184,7 @@ declare const useMenuContentContext: () => TypeMenuContext;
184
184
  interface TypeMenuRootOwnProps {
185
185
  /** The element that is or contains an element that will toggle the menu when clicked.
186
186
  * May contain labels, buttons, inputs or other content as needed. */
187
- menuToggleElement: React__default.ReactElement<any>;
187
+ menuToggleElement: react__default.ReactElement<any>;
188
188
  /** Props to pass through to the underlying Popout.
189
189
  * Any Popout prop is valid except those explicitly omitted. */
190
190
  popoutProps?: Partial<Omit<TypePopoutProps, "isOpen" | "setIsOpen" | "content" | "children">>;
@@ -320,10 +320,10 @@ declare const MenuItemActionLeft: styled_components.StyledComponent<"div", style
320
320
  declare const MenuItemActionRight: styled_components.StyledComponent<"div", styled_components.DefaultTheme, {}, never>;
321
321
  declare const MenuItemText: styled_components.StyledComponent<"div", styled_components.DefaultTheme, {}, never>;
322
322
 
323
- interface TypeMenuHeaderProps extends Omit<React$1.ComponentPropsWithoutRef<"div">, "color">, TypeStyledComponentsCommonProps, TypeBorderSystemProps, TypeColorSystemProps, TypeFlexboxSystemProps, TypeGridSystemProps, TypeLayoutSystemProps, TypeSpaceSystemProps, TypePositionSystemProps {
323
+ interface TypeMenuHeaderProps extends Omit<react.ComponentPropsWithoutRef<"div">, "color">, TypeStyledComponentsCommonProps, TypeBorderSystemProps, TypeColorSystemProps, TypeFlexboxSystemProps, TypeGridSystemProps, TypeLayoutSystemProps, TypeSpaceSystemProps, TypePositionSystemProps {
324
324
  title?: string;
325
- leftAction?: React$1.ReactNode;
326
- rightAction?: React$1.ReactNode;
325
+ leftAction?: react.ReactNode;
326
+ rightAction?: react.ReactNode;
327
327
  }
328
328
 
329
329
  /**
@@ -367,7 +367,7 @@ type TypeMenuContentProps<I extends TypeMenuItemProps = TypeMenuItemProps> = Typ
367
367
  * @see {@link https://seeds.sproutsocial.com/components/seeds-react-menu/#menugroup MenuGroup}
368
368
  */
369
369
  declare const MenuContent: {
370
- <I extends TypeMenuItemProps = TypeMenuItemProps>({ id, children: childrenProp, menuItems, MenuItemComponent, onKeyDown, innerRef, emptyStateElement, ...rest }: TypeMenuContentProps<I>): string | number | boolean | Iterable<React$1.ReactNode> | react_jsx_runtime.JSX.Element | null;
370
+ <I extends TypeMenuItemProps = TypeMenuItemProps>({ id, children: childrenProp, menuItems, MenuItemComponent, onKeyDown, innerRef, emptyStateElement, ...rest }: TypeMenuContentProps<I>): string | number | boolean | Iterable<react.ReactNode> | react_jsx_runtime.JSX.Element | null;
371
371
  __MENU_PRIMITIVE_TYPE: string;
372
372
  };
373
373
 
@@ -386,7 +386,7 @@ declare const DefaultMenuEmptyState: ({ children, ...props }: TypeDefaultMenuEmp
386
386
  declare const MenuFooter: ({ children, ...rest }: TypeBoxProps) => react_jsx_runtime.JSX.Element;
387
387
 
388
388
  interface TypeMenuLabelProps extends Omit<TypeLabelProps, "htmlFor"> {
389
- children: React__default.ReactNode;
389
+ children: react__default.ReactNode;
390
390
  /** Whether making a selection in the associated menu is required. */
391
391
  required?: boolean;
392
392
  /** ID of the associated form element. This prop is never valid to pass into MenuLabel
@@ -628,7 +628,7 @@ interface TypeNestedMenuProviderProps extends TypeNestedMenuContext {
628
628
  /**
629
629
  * NestedMenuContext factory, sets the type and the initial object
630
630
  */
631
- declare const NestedMenuContext: React__default.Context<TypeNestedMenuContext>;
631
+ declare const NestedMenuContext: react__default.Context<TypeNestedMenuContext>;
632
632
  /**
633
633
  * Provider Component sets the context values in the provider
634
634
  */
@@ -640,11 +640,11 @@ declare const useNestedMenuContext: () => TypeNestedMenuContext;
640
640
 
641
641
  interface TypeMapMenuItemsProps<I extends TypeMenuItemProps = TypeMenuItemProps> {
642
642
  menuItems: I[];
643
- MenuItemComponent?: React__default.ComponentType<I>;
643
+ MenuItemComponent?: react__default.ComponentType<I>;
644
644
  }
645
- type TypeItemElement<I extends TypeMenuItemProps = TypeMenuItemProps> = React__default.ReactElement<TypeMenuItemProps | TypeSubmenuItemProps<I, TypeSubmenuValidMenuComponentProps<I>>>;
646
- type TypeMenuGroupElement<I extends TypeMenuItemProps = TypeMenuItemProps> = React__default.ReactElement<TypeMenuGroupProps<I>>;
647
- type TypeMenuContentElement<I extends TypeMenuItemProps = TypeMenuItemProps> = React__default.ReactElement<TypeMenuContentProps<I>>;
645
+ type TypeItemElement<I extends TypeMenuItemProps = TypeMenuItemProps> = react__default.ReactElement<TypeMenuItemProps | TypeSubmenuItemProps<I, TypeSubmenuValidMenuComponentProps<I>>>;
646
+ type TypeMenuGroupElement<I extends TypeMenuItemProps = TypeMenuItemProps> = react__default.ReactElement<TypeMenuGroupProps<I>>;
647
+ type TypeMenuContentElement<I extends TypeMenuItemProps = TypeMenuItemProps> = react__default.ReactElement<TypeMenuContentProps<I>>;
648
648
  interface TypeMenuChildren {
649
649
  type: "item" | "group" | "content";
650
650
  element: TypeItemElement | TypeMenuGroupElement | TypeMenuContentElement;
@@ -653,18 +653,18 @@ declare const mapMenuItems: <I extends TypeMenuItemProps = TypeMenuItemProps>({
653
653
  type TypeUseMenuChildrenProps<I extends TypeMenuItemProps = TypeMenuItemProps> = {
654
654
  children?: TypeMenuRootProps["children"];
655
655
  menuItems?: I[];
656
- MenuItemComponent?: React__default.ComponentType<I>;
656
+ MenuItemComponent?: react__default.ComponentType<I>;
657
657
  };
658
658
  declare const getChildrenFromMenuItems: <I extends TypeMenuItemProps = TypeMenuItemProps>({ menuItems, MenuItemComponent, }: {
659
659
  menuItems: I[];
660
- MenuItemComponent?: React__default.ComponentType<I>;
660
+ MenuItemComponent?: react__default.ComponentType<I>;
661
661
  }) => react_jsx_runtime.JSX.Element;
662
662
  declare const useMenuChildren: <I extends TypeMenuItemProps = TypeMenuItemProps>({ children: childrenProp, menuItems, MenuItemComponent, }: TypeUseMenuChildrenProps<I>) => {
663
663
  allMenuItems: TypeInternalItemProps<TypeMenuItemProps>[];
664
664
  menuItemsMap: {
665
665
  [key: string]: TypeInternalItemProps<TypeMenuItemProps>;
666
666
  };
667
- children: string | number | true | React__default.ReactElement<any, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | React__default.ReactPortal;
667
+ children: string | number | true | react__default.ReactElement<any, string | react__default.JSXElementConstructor<any>> | Iterable<react__default.ReactNode> | react__default.ReactPortal;
668
668
  };
669
669
 
670
670
  declare const useSelectStateReducer: Required<UseSelectProps<TypeInternalItemProps>>["stateReducer"];
package/dist/index.js CHANGED
@@ -475,22 +475,26 @@ var MenuItem = ({
475
475
  });
476
476
  const item = itemsMap[id] || { index: 0, id };
477
477
  const highlighted = highlightedIndex === item?.index;
478
+ const downshiftItemProps = getItemProps?.({
479
+ ...isListbox ? {} : { role: "menuitem" },
480
+ item,
481
+ index: item.index,
482
+ // The disabled prop no longer supported in downshift. Use isItemDisabled instead.
483
+ // disabled,
484
+ onClick,
485
+ onKeyDown,
486
+ ref: innerRef
487
+ }) ?? {};
488
+ if (!isListbox && "aria-selected" in downshiftItemProps) {
489
+ delete downshiftItemProps["aria-selected"];
490
+ }
478
491
  return hiddenItemsMap[item.id] ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, {}) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(MenuItemContainer, { role: "none", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
479
492
  StyledMenuItem,
480
493
  {
481
494
  id,
482
495
  $highlighted: highlighted,
483
496
  $active: active,
484
- ...getItemProps?.({
485
- ...isListbox ? {} : { role: "menuitem" },
486
- item,
487
- index: item.index,
488
- // The disabled prop no longer supported in downshift. Use isItemDisabled instead.
489
- // disabled,
490
- onClick,
491
- onKeyDown,
492
- ref: innerRef
493
- }),
497
+ ...downshiftItemProps,
494
498
  as: isListbox ? void 0 : href ? "a" : "button",
495
499
  type: href ? void 0 : "button",
496
500
  href,
@@ -919,7 +923,18 @@ var StyledMenuGroupUl = import_styled_components7.default.ul`
919
923
  `;
920
924
 
921
925
  // src/MenuGroup/MenuGroup.tsx
922
- var import_jsx_runtime9 = require("react/jsx-runtime");
926
+ var import_jsx_runtime9 = (
927
+ // role="none" on the outer <li>: this wrapper is purely visual (it exists
928
+ // for the border-bottom divider between groups in the parent menu <ul>).
929
+ // The ARIA group semantics live on the inner <ul> below — axe rejects
930
+ // role="group" on <li>, and a native <ul> here would trigger the `list`
931
+ // rule because its children are <li role="none"> menuitem wrappers.
932
+ //
933
+ // TODO(DS-4273): drop the list-based DOM entirely (MenuContent/MenuGroup
934
+ // as <div>, no <ul>/<li>, no role="none" wrappers). This is the followup
935
+ // to DS-4271's minimal ARIA patch.
936
+ require("react/jsx-runtime")
937
+ );
923
938
  var MenuGroup = ({
924
939
  titleAs = "h3",
925
940
  children: childrenProp,
@@ -939,15 +954,21 @@ var MenuGroup = ({
939
954
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
940
955
  StyledMenuGroup,
941
956
  {
942
- role: "group",
957
+ role: "none",
943
958
  id,
944
959
  isSingleSelect,
945
- "aria-labelledby": title ? titleId : void 0,
946
960
  color: color5,
947
961
  ...rest,
948
962
  children: [
949
963
  title && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(StyledTitle, { role: "heading", as: titleAs, id: titleId, children: title }),
950
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(StyledMenuGroupUl, { children })
964
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
965
+ StyledMenuGroupUl,
966
+ {
967
+ role: "group",
968
+ "aria-labelledby": title ? titleId : void 0,
969
+ children
970
+ }
971
+ )
951
972
  ]
952
973
  }
953
974
  );