@sproutsocial/seeds-react-menu 0.6.0 → 1.0.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.
- package/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +63 -0
- package/dist/esm/index.js +74 -31
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +34 -7
- package/dist/index.d.ts +34 -7
- package/dist/index.js +70 -27
- package/dist/index.js.map +1 -1
- package/package.json +14 -14
- package/src/ActionMenu/ActionMenu.stories.tsx +20 -24
- package/src/Autocomplete/MultiAutocomplete.tsx +0 -1
- package/src/Autocomplete/__tests__/Autocomplete.test.tsx +36 -0
- package/src/Menu.tsx +50 -0
- package/src/MenuContent/MenuContent.tsx +2 -0
- package/src/MenuContext.tsx +2 -1
- package/src/MenuFooter/styles.tsx +1 -1
- package/src/MenuGroup/MenuGroup.tsx +5 -1
- package/src/MenuGroup/styles.tsx +1 -1
- package/src/MenuHeader/MenuHeader.tsx +10 -7
- package/src/MenuHeader/styles.tsx +4 -0
- package/src/MenuItem/MenuItem.tsx +5 -1
- package/src/MenuItem/styles.tsx +4 -2
- package/src/MenuItem/useOptionProps.tsx +2 -2
- package/src/MenuRoot/MenuRoot.tsx +17 -3
- package/src/MenuSearchInput/MenuSearchInput.tsx +30 -8
- package/src/MenuSearchTokenInput/MenuSearchTokenInput.tsx +13 -3
- package/src/MultiSelectMenu/MultiSelectMenu.stories.tsx +51 -43
- package/src/NestedMenu/NestedMenuContent.tsx +6 -2
- package/src/NestedMenu/NestedMenuItem.tsx +5 -1
- package/src/SingleSelectMenu/SingleSelectMenu.stories.tsx +34 -28
- package/src/SubmenuItem/SubmenuItem.tsx +5 -1
- package/src/hooks/useDownshiftDefaults.tsx +11 -1
- package/src/hooks/useItemFiltering.tsx +2 -0
- package/src/hooks/useMenuChildren.tsx +11 -6
package/dist/index.d.mts
CHANGED
|
@@ -52,7 +52,10 @@ type TypeMenuGroupProps<I extends TypeMenuItemProps = TypeMenuItemProps> = TypeM
|
|
|
52
52
|
*
|
|
53
53
|
* @see {@link https://seeds.sproutsocial.com/components/menu-item/ | MenuItem}
|
|
54
54
|
*/
|
|
55
|
-
declare const MenuGroup:
|
|
55
|
+
declare const MenuGroup: {
|
|
56
|
+
<I extends TypeMenuItemProps = TypeMenuItemProps>({ titleAs, children: childrenProp, title, color, isSingleSelect, id, menuItems, MenuItemComponent, ...rest }: TypeMenuGroupProps<I>): react_jsx_runtime.JSX.Element | null;
|
|
57
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
58
|
+
};
|
|
56
59
|
|
|
57
60
|
declare const StyledMenuGroup: styled_components.StyledComponent<"li", styled_components.DefaultTheme, TypeMenuGroupBaseProps, never>;
|
|
58
61
|
declare const StyledTitle: styled_components.StyledComponent<React$1.FC<_sproutsocial_seeds_react_text.TypeTextProps>, styled_components.DefaultTheme, {}, never>;
|
|
@@ -81,6 +84,7 @@ interface TypeMenuContextBaseProps {
|
|
|
81
84
|
};
|
|
82
85
|
isListbox?: boolean;
|
|
83
86
|
hiddenItemsMap?: Record<string, boolean>;
|
|
87
|
+
hiddenItemsCount?: number;
|
|
84
88
|
setHiddenItemsMap?: React__default.Dispatch<React__default.SetStateAction<Record<string, boolean>>>;
|
|
85
89
|
subMenuId?: string;
|
|
86
90
|
setSubMenuId?: (id: string) => void;
|
|
@@ -227,7 +231,10 @@ interface TypeMenuItemProps extends TypeMenuItemStyledProps, Omit<GetItemPropsOp
|
|
|
227
231
|
inputLabelId?: string;
|
|
228
232
|
}
|
|
229
233
|
|
|
230
|
-
declare const MenuItem:
|
|
234
|
+
declare const MenuItem: {
|
|
235
|
+
({ id, children, onClick, onKeyDown, disabled, active, innerRef, href, color, ...props }: TypeMenuItemProps): react_jsx_runtime.JSX.Element;
|
|
236
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
237
|
+
};
|
|
231
238
|
|
|
232
239
|
declare const MenuItemContainer: styled_components.StyledComponent<"li", styled_components.DefaultTheme, {}, never>;
|
|
233
240
|
declare const StyledMenuItem: styled_components.StyledComponent<"button", styled_components.DefaultTheme, {
|
|
@@ -281,7 +288,10 @@ type TypeMenuContentProps<I extends TypeMenuItemProps = TypeMenuItemProps> = Omi
|
|
|
281
288
|
* @see {@link https://seeds.sproutsocial.com/components/menu-item/ | MenuItem}
|
|
282
289
|
* @see {@link https://seeds.sproutsocial.com/components/menu-group/ | MenuGroup}
|
|
283
290
|
*/
|
|
284
|
-
declare const MenuContent:
|
|
291
|
+
declare const MenuContent: {
|
|
292
|
+
<I extends TypeMenuItemProps = TypeMenuItemProps>({ id, children: childrenProp, menuItems, MenuItemComponent, onKeyDown, innerRef, ...rest }: TypeMenuContentProps<I>): react_jsx_runtime.JSX.Element | null;
|
|
293
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
294
|
+
};
|
|
285
295
|
|
|
286
296
|
/**
|
|
287
297
|
* @link https://seeds.sproutsocial.com/components/menu-footer/
|
|
@@ -304,12 +314,20 @@ type TypeGetIsItemVisibleFn = (item: TypeMenuContext["items"][number], inputValu
|
|
|
304
314
|
interface TypeMenuSearchInputProps extends TypeInputProps {
|
|
305
315
|
getIsItemVisible?: TypeGetIsItemVisibleFn;
|
|
306
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* <input
|
|
319
|
+
* aria-activedescendant=""
|
|
320
|
+
* aria-autocomplete="list"
|
|
321
|
+
* aria-controls="downshift-:r1:-menu"
|
|
322
|
+
* aria-expanded="true"
|
|
323
|
+
* />
|
|
324
|
+
*/
|
|
307
325
|
/**
|
|
308
326
|
* @link https://seeds.sproutsocial.com/components/menu-header/
|
|
309
327
|
*
|
|
310
328
|
* @description MenuSearchInput is search input that can be added to the MenuHeader to filter the items.
|
|
311
329
|
*/
|
|
312
|
-
declare const MenuSearchInput: ({ getIsItemVisible,
|
|
330
|
+
declare const MenuSearchInput: ({ getIsItemVisible, inputProps, ...restInputProps }: TypeMenuSearchInputProps) => react_jsx_runtime.JSX.Element;
|
|
313
331
|
|
|
314
332
|
interface TypeMenuTokenInputProps extends TypeTokenInputProps {
|
|
315
333
|
getTokenProps?: (itemId: TypeInternalItemProps["id"]) => Partial<TypeTokenSpec>;
|
|
@@ -378,7 +396,10 @@ interface TypeSubmenuItemProps<I extends TypeMenuItemProps, P extends TypeSubmen
|
|
|
378
396
|
menuProps: Omit<P, "menuToggleElement">;
|
|
379
397
|
}
|
|
380
398
|
|
|
381
|
-
declare const SubmenuItem:
|
|
399
|
+
declare const SubmenuItem: {
|
|
400
|
+
<I extends TypeMenuItemProps, P extends TypeSubmenuValidMenuComponentProps<I>>({ MenuComponent, menuProps: { children: menuChildren, menuItems, MenuItemComponent, popoutProps: { popperProps, ...popoutProps }, onStateChange, ...menuProps }, id, children, ...rest }: TypeSubmenuItemProps<I, P>): react_jsx_runtime.JSX.Element;
|
|
401
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
402
|
+
};
|
|
382
403
|
|
|
383
404
|
type TypeSingleAutocompleteProps<I extends TypeMenuItemProps = TypeMenuItemProps> = TypeMenuRootOwnProps & TypeChildrenOrItems<I> & TypeDownshiftComboboxProps & {
|
|
384
405
|
getIsItemVisible?: TypeGetIsItemVisibleFn;
|
|
@@ -435,11 +456,17 @@ interface TypeNestedMenuProps<I extends TypeMenuItemProps = TypeNestedMenuItemPr
|
|
|
435
456
|
|
|
436
457
|
declare const NestedMenu: <I extends TypeMenuItemProps = TypeNestedMenuItemProps>({ initialMenuId, menus, onBackButtonClick, backArrowLabel, menuToggleElement, }: TypeNestedMenuProps<I>) => react_jsx_runtime.JSX.Element;
|
|
437
458
|
|
|
438
|
-
declare const NestedMenuItem:
|
|
459
|
+
declare const NestedMenuItem: {
|
|
460
|
+
({ children, childMenuId, onClick: onClickProp, ...rest }: TypeNestedMenuItemProps): react_jsx_runtime.JSX.Element;
|
|
461
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
462
|
+
};
|
|
439
463
|
|
|
440
464
|
declare const NestedMenuHeader: ({ backArrowLabel, ...props }: TypeNestedMenuHeaderProps) => react_jsx_runtime.JSX.Element;
|
|
441
465
|
|
|
442
|
-
declare const NestedMenuContent:
|
|
466
|
+
declare const NestedMenuContent: {
|
|
467
|
+
<I extends TypeMenuItemProps = TypeNestedMenuItemProps>({ innerRef: innerRefProp, onKeyDown: onKeyDownProp, children, menuItems, MenuItemComponent, ...props }: TypeMenuContentProps<I>): react_jsx_runtime.JSX.Element;
|
|
468
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
469
|
+
};
|
|
443
470
|
|
|
444
471
|
interface TypeNestedMenuContext {
|
|
445
472
|
selectedMenuPath: string[];
|
package/dist/index.d.ts
CHANGED
|
@@ -52,7 +52,10 @@ type TypeMenuGroupProps<I extends TypeMenuItemProps = TypeMenuItemProps> = TypeM
|
|
|
52
52
|
*
|
|
53
53
|
* @see {@link https://seeds.sproutsocial.com/components/menu-item/ | MenuItem}
|
|
54
54
|
*/
|
|
55
|
-
declare const MenuGroup:
|
|
55
|
+
declare const MenuGroup: {
|
|
56
|
+
<I extends TypeMenuItemProps = TypeMenuItemProps>({ titleAs, children: childrenProp, title, color, isSingleSelect, id, menuItems, MenuItemComponent, ...rest }: TypeMenuGroupProps<I>): react_jsx_runtime.JSX.Element | null;
|
|
57
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
58
|
+
};
|
|
56
59
|
|
|
57
60
|
declare const StyledMenuGroup: styled_components.StyledComponent<"li", styled_components.DefaultTheme, TypeMenuGroupBaseProps, never>;
|
|
58
61
|
declare const StyledTitle: styled_components.StyledComponent<React$1.FC<_sproutsocial_seeds_react_text.TypeTextProps>, styled_components.DefaultTheme, {}, never>;
|
|
@@ -81,6 +84,7 @@ interface TypeMenuContextBaseProps {
|
|
|
81
84
|
};
|
|
82
85
|
isListbox?: boolean;
|
|
83
86
|
hiddenItemsMap?: Record<string, boolean>;
|
|
87
|
+
hiddenItemsCount?: number;
|
|
84
88
|
setHiddenItemsMap?: React__default.Dispatch<React__default.SetStateAction<Record<string, boolean>>>;
|
|
85
89
|
subMenuId?: string;
|
|
86
90
|
setSubMenuId?: (id: string) => void;
|
|
@@ -227,7 +231,10 @@ interface TypeMenuItemProps extends TypeMenuItemStyledProps, Omit<GetItemPropsOp
|
|
|
227
231
|
inputLabelId?: string;
|
|
228
232
|
}
|
|
229
233
|
|
|
230
|
-
declare const MenuItem:
|
|
234
|
+
declare const MenuItem: {
|
|
235
|
+
({ id, children, onClick, onKeyDown, disabled, active, innerRef, href, color, ...props }: TypeMenuItemProps): react_jsx_runtime.JSX.Element;
|
|
236
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
237
|
+
};
|
|
231
238
|
|
|
232
239
|
declare const MenuItemContainer: styled_components.StyledComponent<"li", styled_components.DefaultTheme, {}, never>;
|
|
233
240
|
declare const StyledMenuItem: styled_components.StyledComponent<"button", styled_components.DefaultTheme, {
|
|
@@ -281,7 +288,10 @@ type TypeMenuContentProps<I extends TypeMenuItemProps = TypeMenuItemProps> = Omi
|
|
|
281
288
|
* @see {@link https://seeds.sproutsocial.com/components/menu-item/ | MenuItem}
|
|
282
289
|
* @see {@link https://seeds.sproutsocial.com/components/menu-group/ | MenuGroup}
|
|
283
290
|
*/
|
|
284
|
-
declare const MenuContent:
|
|
291
|
+
declare const MenuContent: {
|
|
292
|
+
<I extends TypeMenuItemProps = TypeMenuItemProps>({ id, children: childrenProp, menuItems, MenuItemComponent, onKeyDown, innerRef, ...rest }: TypeMenuContentProps<I>): react_jsx_runtime.JSX.Element | null;
|
|
293
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
294
|
+
};
|
|
285
295
|
|
|
286
296
|
/**
|
|
287
297
|
* @link https://seeds.sproutsocial.com/components/menu-footer/
|
|
@@ -304,12 +314,20 @@ type TypeGetIsItemVisibleFn = (item: TypeMenuContext["items"][number], inputValu
|
|
|
304
314
|
interface TypeMenuSearchInputProps extends TypeInputProps {
|
|
305
315
|
getIsItemVisible?: TypeGetIsItemVisibleFn;
|
|
306
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* <input
|
|
319
|
+
* aria-activedescendant=""
|
|
320
|
+
* aria-autocomplete="list"
|
|
321
|
+
* aria-controls="downshift-:r1:-menu"
|
|
322
|
+
* aria-expanded="true"
|
|
323
|
+
* />
|
|
324
|
+
*/
|
|
307
325
|
/**
|
|
308
326
|
* @link https://seeds.sproutsocial.com/components/menu-header/
|
|
309
327
|
*
|
|
310
328
|
* @description MenuSearchInput is search input that can be added to the MenuHeader to filter the items.
|
|
311
329
|
*/
|
|
312
|
-
declare const MenuSearchInput: ({ getIsItemVisible,
|
|
330
|
+
declare const MenuSearchInput: ({ getIsItemVisible, inputProps, ...restInputProps }: TypeMenuSearchInputProps) => react_jsx_runtime.JSX.Element;
|
|
313
331
|
|
|
314
332
|
interface TypeMenuTokenInputProps extends TypeTokenInputProps {
|
|
315
333
|
getTokenProps?: (itemId: TypeInternalItemProps["id"]) => Partial<TypeTokenSpec>;
|
|
@@ -378,7 +396,10 @@ interface TypeSubmenuItemProps<I extends TypeMenuItemProps, P extends TypeSubmen
|
|
|
378
396
|
menuProps: Omit<P, "menuToggleElement">;
|
|
379
397
|
}
|
|
380
398
|
|
|
381
|
-
declare const SubmenuItem:
|
|
399
|
+
declare const SubmenuItem: {
|
|
400
|
+
<I extends TypeMenuItemProps, P extends TypeSubmenuValidMenuComponentProps<I>>({ MenuComponent, menuProps: { children: menuChildren, menuItems, MenuItemComponent, popoutProps: { popperProps, ...popoutProps }, onStateChange, ...menuProps }, id, children, ...rest }: TypeSubmenuItemProps<I, P>): react_jsx_runtime.JSX.Element;
|
|
401
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
402
|
+
};
|
|
382
403
|
|
|
383
404
|
type TypeSingleAutocompleteProps<I extends TypeMenuItemProps = TypeMenuItemProps> = TypeMenuRootOwnProps & TypeChildrenOrItems<I> & TypeDownshiftComboboxProps & {
|
|
384
405
|
getIsItemVisible?: TypeGetIsItemVisibleFn;
|
|
@@ -435,11 +456,17 @@ interface TypeNestedMenuProps<I extends TypeMenuItemProps = TypeNestedMenuItemPr
|
|
|
435
456
|
|
|
436
457
|
declare const NestedMenu: <I extends TypeMenuItemProps = TypeNestedMenuItemProps>({ initialMenuId, menus, onBackButtonClick, backArrowLabel, menuToggleElement, }: TypeNestedMenuProps<I>) => react_jsx_runtime.JSX.Element;
|
|
437
458
|
|
|
438
|
-
declare const NestedMenuItem:
|
|
459
|
+
declare const NestedMenuItem: {
|
|
460
|
+
({ children, childMenuId, onClick: onClickProp, ...rest }: TypeNestedMenuItemProps): react_jsx_runtime.JSX.Element;
|
|
461
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
462
|
+
};
|
|
439
463
|
|
|
440
464
|
declare const NestedMenuHeader: ({ backArrowLabel, ...props }: TypeNestedMenuHeaderProps) => react_jsx_runtime.JSX.Element;
|
|
441
465
|
|
|
442
|
-
declare const NestedMenuContent:
|
|
466
|
+
declare const NestedMenuContent: {
|
|
467
|
+
<I extends TypeMenuItemProps = TypeNestedMenuItemProps>({ innerRef: innerRefProp, onKeyDown: onKeyDownProp, children, menuItems, MenuItemComponent, ...props }: TypeMenuContentProps<I>): react_jsx_runtime.JSX.Element;
|
|
468
|
+
__MENU_PRIMITIVE_TYPE: string;
|
|
469
|
+
};
|
|
443
470
|
|
|
444
471
|
interface TypeNestedMenuContext {
|
|
445
472
|
selectedMenuPath: string[];
|
package/dist/index.js
CHANGED
|
@@ -203,7 +203,7 @@ var useMenu = ({
|
|
|
203
203
|
);
|
|
204
204
|
const isItemSelected = import_react.default.useCallback(
|
|
205
205
|
(id) => checkIfItemSelected({ id, selectedItem, selectedItemIds }),
|
|
206
|
-
[selectedItem, selectedItemIds]
|
|
206
|
+
[selectedItem?.id, selectedItemIds]
|
|
207
207
|
);
|
|
208
208
|
const getInputComponentProps = import_react.default.useCallback(
|
|
209
209
|
({ inputProps, ...props }) => {
|
|
@@ -1824,8 +1824,10 @@ var highlightedStyles = import_styled_components2.css`
|
|
|
1824
1824
|
text-decoration: none;
|
|
1825
1825
|
`;
|
|
1826
1826
|
var activeStyles = import_styled_components2.css`
|
|
1827
|
-
|
|
1828
|
-
color: ${({ theme: theme2 }) => theme2.colors.
|
|
1827
|
+
border: 1px solid ${({ theme: theme2 }) => theme2.colors.listItem.border.base};
|
|
1828
|
+
background-color: ${({ theme: theme2 }) => theme2.colors.menuItem.background.active};
|
|
1829
|
+
color: ${({ theme: theme2 }) => theme2.colors.text.body};
|
|
1830
|
+
text-decoration: none;
|
|
1829
1831
|
`;
|
|
1830
1832
|
var MenuItemContainer = import_styled_components2.default.li`
|
|
1831
1833
|
box-sizing: border-box;
|
|
@@ -1994,10 +1996,10 @@ var useOptionProps = ({
|
|
|
1994
1996
|
inputLabelId,
|
|
1995
1997
|
...props
|
|
1996
1998
|
}) => {
|
|
1997
|
-
const { selectedItem,
|
|
1999
|
+
const { selectedItem, selectedItemIds, isListbox, isItemSelected } = useMenuContentContext();
|
|
1998
2000
|
const selected = (0, import_react2.useMemo)(
|
|
1999
2001
|
() => isItemSelected(id),
|
|
2000
|
-
[selectedItem,
|
|
2002
|
+
[selectedItem?.id, selectedItemIds]
|
|
2001
2003
|
);
|
|
2002
2004
|
const label = inputLabelId || `menu-item-child-${id}`;
|
|
2003
2005
|
return isListbox ? {
|
|
@@ -2072,6 +2074,7 @@ var MenuItem = ({
|
|
|
2072
2074
|
}
|
|
2073
2075
|
) });
|
|
2074
2076
|
};
|
|
2077
|
+
MenuItem.__MENU_PRIMITIVE_TYPE = "MenuItem";
|
|
2075
2078
|
|
|
2076
2079
|
// src/MenuItem/MenuItemTypes.ts
|
|
2077
2080
|
var INPUT_TYPES = {
|
|
@@ -2120,6 +2123,10 @@ var MenuTitleText = import_styled_components4.default.h3`
|
|
|
2120
2123
|
var MenuChildrenContainer = import_styled_components4.default.div`
|
|
2121
2124
|
grid-column: 1 / -1;
|
|
2122
2125
|
margin-top: ${({ theme: theme2 }) => theme2.space[300]};
|
|
2126
|
+
|
|
2127
|
+
&:first-child {
|
|
2128
|
+
margin-top: 0;
|
|
2129
|
+
}
|
|
2123
2130
|
`;
|
|
2124
2131
|
var MenuHeaderFeatures = import_styled_components4.default.div`
|
|
2125
2132
|
display: flex;
|
|
@@ -2153,8 +2160,9 @@ var MenuHeader = ({
|
|
|
2153
2160
|
rightAction,
|
|
2154
2161
|
...rest
|
|
2155
2162
|
}) => {
|
|
2163
|
+
const showTopRow = title || leftAction || rightAction;
|
|
2156
2164
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(MenuHeaderContainer, { $leftAction: !!leftAction, ...rest, children: [
|
|
2157
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(MenuHeaderFeatures, { $leftAction: !!leftAction, children: [
|
|
2165
|
+
showTopRow && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(MenuHeaderFeatures, { $leftAction: !!leftAction, children: [
|
|
2158
2166
|
leftAction && leftAction,
|
|
2159
2167
|
title && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MenuTitleText, { $leftAction: !!leftAction, children: title }),
|
|
2160
2168
|
rightAction && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "right-action", children: rightAction })
|
|
@@ -2190,8 +2198,8 @@ var walkAllChildren = (children, callback) => {
|
|
|
2190
2198
|
});
|
|
2191
2199
|
};
|
|
2192
2200
|
var getComponentName = (element) => {
|
|
2193
|
-
if (element && typeof element === "object" && "type" in element && typeof element.type
|
|
2194
|
-
return element.type.
|
|
2201
|
+
if (element && typeof element === "object" && "type" in element && (typeof element.type === "function" || typeof element.type === "object") && "__MENU_PRIMITIVE_TYPE" in element.type && typeof element.type.__MENU_PRIMITIVE_TYPE === "string") {
|
|
2202
|
+
return element.type.__MENU_PRIMITIVE_TYPE;
|
|
2195
2203
|
}
|
|
2196
2204
|
};
|
|
2197
2205
|
var addMenuItem = ({
|
|
@@ -2272,8 +2280,6 @@ var setMenuItemsFromChildren = ({
|
|
|
2272
2280
|
walkAllChildren(children, (element) => {
|
|
2273
2281
|
switch (getComponentName(element)) {
|
|
2274
2282
|
case "MenuItem":
|
|
2275
|
-
case "SubmenuItem":
|
|
2276
|
-
case "NestedMenuItem":
|
|
2277
2283
|
const menuItem = element;
|
|
2278
2284
|
if (menuItemsMap[`${menuItem.props.id}`]) return;
|
|
2279
2285
|
addMenuItem({
|
|
@@ -2295,7 +2301,6 @@ var setMenuItemsFromChildren = ({
|
|
|
2295
2301
|
});
|
|
2296
2302
|
break;
|
|
2297
2303
|
case "MenuContent":
|
|
2298
|
-
case "NestedMenuContent":
|
|
2299
2304
|
addItemsFromContent({
|
|
2300
2305
|
// Cast element to the TypeMenuContentElement since we know it's a content and is needed for addItemsFromContent.
|
|
2301
2306
|
contentElement: element,
|
|
@@ -2390,6 +2395,7 @@ var MenuContent = ({
|
|
|
2390
2395
|
}
|
|
2391
2396
|
);
|
|
2392
2397
|
};
|
|
2398
|
+
MenuContent.__MENU_PRIMITIVE_TYPE = "MenuContent";
|
|
2393
2399
|
|
|
2394
2400
|
// src/MenuFooter/MenuFooter.tsx
|
|
2395
2401
|
var import_react7 = require("react");
|
|
@@ -2398,7 +2404,7 @@ var import_react7 = require("react");
|
|
|
2398
2404
|
var import_styled_components6 = __toESM(require("styled-components"));
|
|
2399
2405
|
var import_seeds_react_box2 = require("@sproutsocial/seeds-react-box");
|
|
2400
2406
|
var StyledMenuFooterBox = (0, import_styled_components6.default)(import_seeds_react_box2.Box)`
|
|
2401
|
-
padding: ${(
|
|
2407
|
+
padding: ${({ theme: theme2 }) => theme2.space[350]} ${({ theme: theme2 }) => theme2.space[400]};
|
|
2402
2408
|
border-top: 1px solid ${(p) => p.theme.colors.container.border.base};
|
|
2403
2409
|
`;
|
|
2404
2410
|
|
|
@@ -2540,7 +2546,7 @@ var StyledMenuGroup = import_styled_components9.default.li`
|
|
|
2540
2546
|
${space}
|
|
2541
2547
|
`;
|
|
2542
2548
|
var StyledTitle = (0, import_styled_components9.default)(index_default.SmallSubHeadline)`
|
|
2543
|
-
font-size: ${({ theme: theme2 }) => theme2.typography[
|
|
2549
|
+
font-size: ${({ theme: theme2 }) => theme2.typography[100].fontSize};
|
|
2544
2550
|
margin: ${({ theme: theme2 }) => theme2.space[400]} ${({ theme: theme2 }) => theme2.space[400]}
|
|
2545
2551
|
0px ${({ theme: theme2 }) => theme2.space[400]};
|
|
2546
2552
|
`;
|
|
@@ -2583,6 +2589,7 @@ var MenuGroup = ({
|
|
|
2583
2589
|
}
|
|
2584
2590
|
);
|
|
2585
2591
|
};
|
|
2592
|
+
MenuGroup.__MENU_PRIMITIVE_TYPE = "MenuGroup";
|
|
2586
2593
|
|
|
2587
2594
|
// src/MenuRoot/MenuRoot.tsx
|
|
2588
2595
|
var import_react11 = require("react");
|
|
@@ -2601,13 +2608,26 @@ var MenuRoot = ({
|
|
|
2601
2608
|
width: width2 = "300px",
|
|
2602
2609
|
...contextProps
|
|
2603
2610
|
}) => {
|
|
2604
|
-
const {
|
|
2611
|
+
const {
|
|
2612
|
+
isOpen,
|
|
2613
|
+
openMenu,
|
|
2614
|
+
closeMenu,
|
|
2615
|
+
inputValue,
|
|
2616
|
+
hiddenItemsCount = 0,
|
|
2617
|
+
items
|
|
2618
|
+
} = contextProps;
|
|
2605
2619
|
const setIsOpen = (0, import_react11.useCallback)(
|
|
2606
2620
|
(newIsOpen) => {
|
|
2607
2621
|
newIsOpen ? openMenu?.() : closeMenu?.();
|
|
2608
2622
|
},
|
|
2609
2623
|
[openMenu, closeMenu]
|
|
2610
2624
|
);
|
|
2625
|
+
(0, import_react11.useEffect)(() => {
|
|
2626
|
+
if (!inputValue) return;
|
|
2627
|
+
if (items && hiddenItemsCount >= items.length && isOpen) {
|
|
2628
|
+
closeMenu?.();
|
|
2629
|
+
}
|
|
2630
|
+
}, [hiddenItemsCount, items?.length, isOpen, inputValue]);
|
|
2611
2631
|
const menuContext = useMenu(contextProps);
|
|
2612
2632
|
return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
2613
2633
|
import_seeds_react_popout.Popout,
|
|
@@ -2712,7 +2732,8 @@ var useItemFiltering = ({
|
|
|
2712
2732
|
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
2713
2733
|
var MenuSearchInput = ({
|
|
2714
2734
|
getIsItemVisible,
|
|
2715
|
-
|
|
2735
|
+
inputProps,
|
|
2736
|
+
...restInputProps
|
|
2716
2737
|
}) => {
|
|
2717
2738
|
const {
|
|
2718
2739
|
items,
|
|
@@ -2728,14 +2749,15 @@ var MenuSearchInput = ({
|
|
|
2728
2749
|
setHiddenItemsMap
|
|
2729
2750
|
});
|
|
2730
2751
|
import_react15.default.useEffect(() => {
|
|
2731
|
-
updateFilteredItems({ inputValue:
|
|
2732
|
-
}, [isOpen,
|
|
2752
|
+
updateFilteredItems({ inputValue: restInputProps.value || "" });
|
|
2753
|
+
}, [isOpen, restInputProps.value]);
|
|
2754
|
+
const toggleButtonProps = getToggleButtonProps?.() || {};
|
|
2733
2755
|
const handleKeyDown = import_react15.default.useCallback(
|
|
2734
2756
|
(e) => {
|
|
2735
2757
|
if (e.key === " ") return;
|
|
2736
|
-
|
|
2758
|
+
toggleButtonProps.onKeyDown?.(e);
|
|
2737
2759
|
},
|
|
2738
|
-
[
|
|
2760
|
+
[toggleButtonProps.onKeyDown]
|
|
2739
2761
|
);
|
|
2740
2762
|
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2741
2763
|
import_seeds_react_input.Input,
|
|
@@ -2745,7 +2767,13 @@ var MenuSearchInput = ({
|
|
|
2745
2767
|
},
|
|
2746
2768
|
onKeyDown: handleKeyDown,
|
|
2747
2769
|
autoComplete: false,
|
|
2748
|
-
|
|
2770
|
+
"aria-autocomplete": "list",
|
|
2771
|
+
inputProps: {
|
|
2772
|
+
["aria-activedescendant"]: toggleButtonProps["aria-activedescendant"],
|
|
2773
|
+
["aria-controls"]: toggleButtonProps["aria-controls"],
|
|
2774
|
+
...inputProps
|
|
2775
|
+
},
|
|
2776
|
+
...restInputProps
|
|
2749
2777
|
}
|
|
2750
2778
|
);
|
|
2751
2779
|
};
|
|
@@ -2879,12 +2907,13 @@ var MenuSearchTokenInput = ({
|
|
|
2879
2907
|
import_react17.default.useEffect(() => {
|
|
2880
2908
|
updateFilteredState(controlledValue);
|
|
2881
2909
|
}, [isOpen]);
|
|
2910
|
+
const toggleButtonProps = getToggleButtonProps?.() || {};
|
|
2882
2911
|
const handleKeyDown = import_react17.default.useCallback(
|
|
2883
2912
|
(e) => {
|
|
2884
2913
|
if (e.key === " ") return;
|
|
2885
|
-
|
|
2914
|
+
toggleButtonProps.onKeyDown?.(e);
|
|
2886
2915
|
},
|
|
2887
|
-
[
|
|
2916
|
+
[toggleButtonProps.onKeyDown]
|
|
2888
2917
|
);
|
|
2889
2918
|
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
2890
2919
|
MenuTokenInput,
|
|
@@ -2896,6 +2925,8 @@ var MenuSearchTokenInput = ({
|
|
|
2896
2925
|
onKeyDown: handleKeyDown,
|
|
2897
2926
|
inputProps: {
|
|
2898
2927
|
value: internalValue,
|
|
2928
|
+
["aria-activedescendant"]: toggleButtonProps["aria-activedescendant"],
|
|
2929
|
+
["aria-controls"]: toggleButtonProps["aria-controls"],
|
|
2899
2930
|
...inputProps
|
|
2900
2931
|
},
|
|
2901
2932
|
MenuContext: MenuContentContext,
|
|
@@ -3093,6 +3124,7 @@ var SubmenuItem = ({
|
|
|
3093
3124
|
}
|
|
3094
3125
|
);
|
|
3095
3126
|
};
|
|
3127
|
+
SubmenuItem.__MENU_PRIMITIVE_TYPE = "MenuItem";
|
|
3096
3128
|
|
|
3097
3129
|
// src/ActionMenu/ActionMenu.tsx
|
|
3098
3130
|
var import_react20 = __toESM(require("react"));
|
|
@@ -3217,31 +3249,40 @@ var defaultUseSelectPropsForMulti = {
|
|
|
3217
3249
|
var defaultUseComboboxPropsForMulti = {
|
|
3218
3250
|
stateReducer: useComboboxStateReducerForMulti
|
|
3219
3251
|
};
|
|
3252
|
+
var itemToKey2 = (item) => item?.id;
|
|
3220
3253
|
var useDownshiftDefaults = ({
|
|
3221
3254
|
isCombobox = false,
|
|
3222
3255
|
isMulti = false,
|
|
3223
3256
|
multiSelectProps = {}
|
|
3224
3257
|
} = {}) => {
|
|
3225
3258
|
const [hiddenItemsMap, setHiddenItemsMap] = import_react19.default.useState({});
|
|
3259
|
+
const hiddenItemsCount = import_react19.default.useMemo(
|
|
3260
|
+
() => Object.keys(hiddenItemsMap).filter(Boolean).length,
|
|
3261
|
+
[hiddenItemsMap]
|
|
3262
|
+
);
|
|
3226
3263
|
const isItemDisabled = import_react19.default.useCallback(
|
|
3227
3264
|
(item) => Boolean(item.disabled || hiddenItemsMap[item.id]),
|
|
3228
3265
|
[hiddenItemsMap]
|
|
3229
3266
|
);
|
|
3230
3267
|
return {
|
|
3231
3268
|
hiddenItemsMap,
|
|
3269
|
+
hiddenItemsCount,
|
|
3232
3270
|
setHiddenItemsMap,
|
|
3233
3271
|
defaultDownshiftProps: {
|
|
3234
3272
|
select: !isCombobox ? {
|
|
3273
|
+
itemToKey: itemToKey2,
|
|
3235
3274
|
// disabling while item.hidden so that hidden items are ignored by downshift
|
|
3236
3275
|
isItemDisabled,
|
|
3237
3276
|
...isMulti ? defaultUseSelectPropsForMulti : defaultUseSelectProps
|
|
3238
3277
|
} : {},
|
|
3239
3278
|
combobox: isCombobox ? {
|
|
3279
|
+
itemToKey: itemToKey2,
|
|
3240
3280
|
// disabling while item.hidden so that hidden items are ignored by downshift
|
|
3241
3281
|
isItemDisabled,
|
|
3242
3282
|
...isMulti ? defaultUseComboboxPropsForMulti : defaultUseComboboxProps
|
|
3243
3283
|
} : {},
|
|
3244
3284
|
multi: isMulti ? {
|
|
3285
|
+
itemToKey: itemToKey2,
|
|
3245
3286
|
// handles the prop name mapping for multi select
|
|
3246
3287
|
...getMultiSelectOverrides(multiSelectProps)
|
|
3247
3288
|
} : {}
|
|
@@ -3549,7 +3590,7 @@ var MultiAutocomplete = ({
|
|
|
3549
3590
|
menuItems,
|
|
3550
3591
|
MenuItemComponent,
|
|
3551
3592
|
itemToString: itemToString2 = itemToString,
|
|
3552
|
-
itemToKey:
|
|
3593
|
+
itemToKey: itemToKey3 = itemToKey,
|
|
3553
3594
|
getIsItemVisible = getDefaultGetIsItemVisible(itemToString2),
|
|
3554
3595
|
showSelectedItemsInDropdown = false,
|
|
3555
3596
|
initialSelectedItems = [],
|
|
@@ -3602,7 +3643,7 @@ var MultiAutocomplete = ({
|
|
|
3602
3643
|
}, [selectedItemIds]);
|
|
3603
3644
|
const useMultipleSelectionReturnProps = (0, import_downshift7.useMultipleSelection)({
|
|
3604
3645
|
...defaultDownshiftProps.multi,
|
|
3605
|
-
itemToKey:
|
|
3646
|
+
itemToKey: itemToKey3,
|
|
3606
3647
|
selectedItems,
|
|
3607
3648
|
onSelectedItemsChange: ({ selectedItems: selectedItems2, ...changes }) => {
|
|
3608
3649
|
setSelectedItems(selectedItems2);
|
|
@@ -3614,7 +3655,7 @@ var MultiAutocomplete = ({
|
|
|
3614
3655
|
...defaultDownshiftProps.combobox,
|
|
3615
3656
|
items: allMenuItems,
|
|
3616
3657
|
itemToString: itemToString2,
|
|
3617
|
-
itemToKey:
|
|
3658
|
+
itemToKey: itemToKey3,
|
|
3618
3659
|
stateReducer: reduceReducers(
|
|
3619
3660
|
defaultDownshiftProps.combobox.stateReducer,
|
|
3620
3661
|
externalStateReducer
|
|
@@ -3803,7 +3844,7 @@ var nestedMenuStateReducer = (_state, actionAndChanges) => {
|
|
|
3803
3844
|
|
|
3804
3845
|
// src/NestedMenu/NestedMenuContent.tsx
|
|
3805
3846
|
var import_react28 = require("react");
|
|
3806
|
-
var
|
|
3847
|
+
var import_seeds_react_utilities2 = require("@sproutsocial/seeds-react-utilities");
|
|
3807
3848
|
|
|
3808
3849
|
// src/NestedMenu/NestedMenuItem.tsx
|
|
3809
3850
|
var import_seeds_react_icon4 = require("@sproutsocial/seeds-react-icon");
|
|
@@ -3827,6 +3868,7 @@ var NestedMenuItem = ({
|
|
|
3827
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" }) })
|
|
3828
3869
|
] }) });
|
|
3829
3870
|
};
|
|
3871
|
+
NestedMenuItem.__MENU_PRIMITIVE_TYPE = "MenuItem";
|
|
3830
3872
|
|
|
3831
3873
|
// src/NestedMenu/NestedMenuContent.tsx
|
|
3832
3874
|
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
@@ -3841,7 +3883,7 @@ var NestedMenuContent = ({
|
|
|
3841
3883
|
const { highlightedIndex, items } = useMenuContentContext();
|
|
3842
3884
|
const { setSelectedMenuId, selectedMenuPath, goBack } = useNestedMenuContext();
|
|
3843
3885
|
const internalRef = (0, import_react28.useRef)(null);
|
|
3844
|
-
const innerRef = (0,
|
|
3886
|
+
const innerRef = (0, import_seeds_react_utilities2.mergeRefs)(internalRef, innerRefProp);
|
|
3845
3887
|
const contentProps = children ? { children } : { menuItems, MenuItemComponent };
|
|
3846
3888
|
(0, import_react28.useEffect)(() => {
|
|
3847
3889
|
internalRef?.current?.focus();
|
|
@@ -3876,6 +3918,7 @@ var NestedMenuContent = ({
|
|
|
3876
3918
|
}
|
|
3877
3919
|
);
|
|
3878
3920
|
};
|
|
3921
|
+
NestedMenuContent.__MENU_PRIMITIVE_TYPE = "MenuContent";
|
|
3879
3922
|
|
|
3880
3923
|
// src/NestedMenu/NestedMenu.tsx
|
|
3881
3924
|
var import_jsx_runtime28 = require("react/jsx-runtime");
|