@launchpad-ui/menu 0.8.10 → 0.9.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.
- package/dist/Menu.d.ts +1 -1
- package/dist/Menu.d.ts.map +1 -1
- package/dist/MenuItem.d.ts +2 -18
- package/dist/MenuItem.d.ts.map +1 -1
- package/dist/MenuSearch.d.ts +1 -0
- package/dist/MenuSearch.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +3 -27
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +3 -27
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -2
package/dist/Menu.d.ts
CHANGED
@@ -9,7 +9,7 @@ type ControlledMenuProps<T> = {
|
|
9
9
|
*/
|
10
10
|
enableVirtualization?: boolean;
|
11
11
|
/**
|
12
|
-
* Class name to be applied to all MenuItem
|
12
|
+
* Class name to be applied to all MenuItem components
|
13
13
|
* in the menu.
|
14
14
|
*/
|
15
15
|
menuItemClassName?: string;
|
package/dist/Menu.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../src/Menu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA4BpE,KAAK,mBAAmB,CAAC,CAAC,IAAI;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAEnE,QAAA,MAAM,IAAI,
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../src/Menu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA4BpE,KAAK,mBAAmB,CAAC,CAAC,IAAI;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAEnE,QAAA,MAAM,IAAI,iEAuHT,CAAC;AAEF,KAAK,oBAAoB,CAAC,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG;IACxE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,QAAA,MAAM,eAAe,4EA+MpB,CAAC;AAEF,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACjC,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC"}
|
package/dist/MenuItem.d.ts
CHANGED
@@ -2,7 +2,6 @@ import type { Icon } from '@launchpad-ui/icons';
|
|
2
2
|
import type { PopoverPlacement } from '@launchpad-ui/popover';
|
3
3
|
import type { ComponentPropsWithRef, ElementType, PropsWithRef, ReactElement } from 'react';
|
4
4
|
import { Tooltip } from '@launchpad-ui/tooltip';
|
5
|
-
import { Link } from 'react-router-dom';
|
6
5
|
import './styles/Menu.css';
|
7
6
|
type Merge<T, U> = Omit<T, keyof U> & U;
|
8
7
|
type PropsWithComponent<P, T extends ElementType> = P & {
|
@@ -28,21 +27,6 @@ type MenuItemProps<P, T extends ElementType = typeof defaultElement> = Polymorph
|
|
28
27
|
item?: undefined;
|
29
28
|
}), T>;
|
30
29
|
declare const MenuItem: <P, T extends ElementType<any> = "button">({ ...props }: MenuItemProps<P, T>) => JSX.Element;
|
31
|
-
|
32
|
-
|
33
|
-
useHistory?: boolean;
|
34
|
-
newTab?: boolean;
|
35
|
-
};
|
36
|
-
type MenuItemLinkProps<P, T extends ElementType = typeof Link> = Merge<Omit<MenuItemProps<P, T>, 'component' | 'item'>, MenuItemLinkOwnProps> & ({
|
37
|
-
item?: undefined;
|
38
|
-
} | {
|
39
|
-
item: P;
|
40
|
-
});
|
41
|
-
declare const MenuItemLink: <P, T extends ElementType<any> = import("react").ForwardRefExoticComponent<import("react-router-dom").LinkProps & import("react").RefAttributes<HTMLAnchorElement>>>({ to, disabled, useHistory, newTab, children, ...props }: Omit<Omit<MenuItemProps<P, T>, "item" | "component">, keyof MenuItemLinkOwnProps> & MenuItemLinkOwnProps & ({
|
42
|
-
item?: undefined;
|
43
|
-
} | {
|
44
|
-
item: P;
|
45
|
-
})) => JSX.Element;
|
46
|
-
export { MenuItem, MenuItemLink };
|
47
|
-
export type { MenuItemProps, MenuItemLinkProps };
|
30
|
+
export { MenuItem };
|
31
|
+
export type { MenuItemProps };
|
48
32
|
//# sourceMappingURL=MenuItem.d.ts.map
|
package/dist/MenuItem.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"MenuItem.d.ts","sourceRoot":"","sources":["../src/MenuItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE5F,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
1
|
+
{"version":3,"file":"MenuItem.d.ts","sourceRoot":"","sources":["../src/MenuItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE5F,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAKhD,OAAO,mBAAmB,CAAC;AAG3B,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAExC,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,IAAI,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAE1E,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,IAAI,KAAK,CAC5D,CAAC,SAAS,MAAM,GAAG,CAAC,iBAAiB,GACjC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GACtC,qBAAqB,CAAC,CAAC,CAAC,EAC5B,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CACzB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,IAAI,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,OAAO,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,QAAA,MAAM,cAAc,WAAW,CAAC;AAEhC,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,GAAG,OAAO,cAAc,IAAI,uBAAuB,CAC1F,CAAC,gBAAgB,GAAG;IAClB,IAAI,EAAE,CAAC,CAAC;CACT,CAAC,GACF,CAAC,gBAAgB,GAAG;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC,EACJ,CAAC,CACF,CAAC;AAEF,QAAA,MAAM,QAAQ,8FA0Eb,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/MenuSearch.d.ts
CHANGED
package/dist/MenuSearch.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"MenuSearch.d.ts","sourceRoot":"","sources":["../src/MenuSearch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAKzC,OAAO,mBAAmB,CAAC;AAE3B,KAAK,eAAe,GAAG;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,QAAA,MAAM,UAAU,
|
1
|
+
{"version":3,"file":"MenuSearch.d.ts","sourceRoot":"","sources":["../src/MenuSearch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAKzC,OAAO,mBAAmB,CAAC;AAE3B,KAAK,eAAe,GAAG;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,QAAA,MAAM,UAAU,8GAyBd,CAAC;AAIH,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/index.d.ts
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
export type { MenuBaseProps } from './MenuBase';
|
2
2
|
export type { MenuDividerProps } from './MenuDivider';
|
3
|
-
export type { MenuItemProps
|
3
|
+
export type { MenuItemProps } from './MenuItem';
|
4
4
|
export type { MenuItemListProps } from './MenuItemList';
|
5
5
|
export type { MenuSearchProps } from './MenuSearch';
|
6
6
|
export type { MenuProps } from './Menu';
|
7
7
|
export { MenuBase } from './MenuBase';
|
8
8
|
export { MenuDivider } from './MenuDivider';
|
9
|
-
export { MenuItem
|
9
|
+
export { MenuItem } from './MenuItem';
|
10
10
|
export { MenuItemList } from './MenuItemList';
|
11
11
|
export { MenuSearch } from './MenuSearch';
|
12
12
|
export { Menu } from './Menu';
|
package/dist/index.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/index.es.js
CHANGED
@@ -6,7 +6,6 @@ import { useSeparator } from "@react-aria/separator";
|
|
6
6
|
import { Tooltip } from "@launchpad-ui/tooltip";
|
7
7
|
import { Slot } from "@radix-ui/react-slot";
|
8
8
|
import { FocusRing, useFocusManager } from "@react-aria/focus";
|
9
|
-
import { Link } from "react-router-dom";
|
10
9
|
import { TextField } from "@launchpad-ui/form";
|
11
10
|
import { useVirtual } from "react-virtual";
|
12
11
|
const Menu$1 = "";
|
@@ -103,27 +102,6 @@ const MenuItem = ({
|
|
103
102
|
}
|
104
103
|
return renderedItem;
|
105
104
|
};
|
106
|
-
const MenuItemLink = ({
|
107
|
-
to,
|
108
|
-
disabled = false,
|
109
|
-
useHistory = true,
|
110
|
-
newTab = false,
|
111
|
-
children,
|
112
|
-
...props
|
113
|
-
}) => {
|
114
|
-
const finalProps = {
|
115
|
-
...props,
|
116
|
-
disabled,
|
117
|
-
component: useHistory ? Link : "a",
|
118
|
-
[useHistory ? "to" : "href"]: disabled ? "" : to,
|
119
|
-
rel: newTab ? "noopener noreferrer" : void 0,
|
120
|
-
target: newTab ? "_blank" : void 0
|
121
|
-
};
|
122
|
-
return /* @__PURE__ */ jsx(MenuItem, {
|
123
|
-
...finalProps,
|
124
|
-
children
|
125
|
-
});
|
126
|
-
};
|
127
105
|
const MenuItemList = forwardRef(({
|
128
106
|
children,
|
129
107
|
...rest
|
@@ -139,6 +117,7 @@ const MenuSearch = forwardRef((props, ref) => {
|
|
139
117
|
const {
|
140
118
|
ariaLabel,
|
141
119
|
placeholder,
|
120
|
+
id,
|
142
121
|
"data-test-id": testId = "menu-search",
|
143
122
|
...finalProps
|
144
123
|
} = props;
|
@@ -149,6 +128,7 @@ const MenuSearch = forwardRef((props, ref) => {
|
|
149
128
|
ref,
|
150
129
|
className: "Menu-search-input",
|
151
130
|
tiny: true,
|
131
|
+
id,
|
152
132
|
type: "search",
|
153
133
|
"data-test-id": testId,
|
154
134
|
autoComplete: "off",
|
@@ -208,7 +188,6 @@ const Menu = (props) => {
|
|
208
188
|
searchElem = child;
|
209
189
|
break;
|
210
190
|
case MenuItem:
|
211
|
-
case MenuItemLink:
|
212
191
|
case MenuDivider:
|
213
192
|
elements = elements.concat(child);
|
214
193
|
break;
|
@@ -236,7 +215,6 @@ const Menu = (props) => {
|
|
236
215
|
})
|
237
216
|
};
|
238
217
|
case MenuItem:
|
239
|
-
case MenuItemLink:
|
240
218
|
return {
|
241
219
|
items: items.concat(child.props.disabled ? cloneElement(child, {
|
242
220
|
onClick: () => void 0,
|
@@ -359,7 +337,6 @@ const ItemVirtualizer = (props) => {
|
|
359
337
|
const childProps = itemElem.props;
|
360
338
|
switch (itemElem.type) {
|
361
339
|
case MenuItem:
|
362
|
-
case MenuItemLink:
|
363
340
|
return {
|
364
341
|
className: cx(childProps.className, menuItemClassName),
|
365
342
|
onKeyDown: childProps.disabled ? () => void 0 : (e) => handleKeyboardFocusKeydown(e, {
|
@@ -416,7 +393,7 @@ const ItemVirtualizer = (props) => {
|
|
416
393
|
}
|
417
394
|
const elem = items[virtualRow.index];
|
418
395
|
return /* @__PURE__ */ jsx("div", {
|
419
|
-
ref: elem.type !== MenuItem
|
396
|
+
ref: elem.type !== MenuItem ? virtualRow.measureRef : void 0,
|
420
397
|
role: "presentation",
|
421
398
|
className: cx("VirtualMenu-item"),
|
422
399
|
style: {
|
@@ -445,7 +422,6 @@ export {
|
|
445
422
|
MenuBase,
|
446
423
|
MenuDivider,
|
447
424
|
MenuItem,
|
448
|
-
MenuItemLink,
|
449
425
|
MenuItemList,
|
450
426
|
MenuSearch
|
451
427
|
};
|
package/dist/index.es.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/MenuBase.tsx","../src/MenuDivider.tsx","../src/MenuItem.tsx","../src/MenuItemList.tsx","../src/MenuSearch.tsx","../src/utils.ts","../src/Menu.tsx"],"sourcesContent":["import type { MenuProps } from './Menu';\nimport type { ComponentPropsWithRef } from 'react';\n\nimport { cx } from 'classix';\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuBaseProps = ComponentPropsWithRef<'div'> & {\n isVirtual?: boolean;\n size?: MenuProps<string>['size'];\n};\n\nconst MenuBase = forwardRef<HTMLDivElement, MenuBaseProps>(\n ({ children, size, isVirtual, ...props }, ref) => {\n const classes = cx('Menu', isVirtual && 'Menu--isVirtual', size && `MenuSize--${size}`);\n\n return (\n <div {...props} role=\"menu\" className={classes} ref={ref}>\n {children}\n </div>\n );\n }\n);\n\nMenuBase.displayName = 'MenuBase';\n\nexport { MenuBase };\nexport type { MenuBaseProps };\n","import type { SeparatorProps } from '@react-aria/separator';\nimport type { RefObject } from 'react';\n\nimport { useSeparator } from '@react-aria/separator';\n\nimport './styles/Menu.css';\n\ntype MenuDividerProps = SeparatorProps & {\n innerRef?: RefObject<HTMLDivElement>;\n 'data-test-id'?: string;\n};\n\nconst MenuDivider = ({\n elementType = 'div',\n orientation,\n innerRef,\n 'data-test-id': testId = 'menu-divider',\n}: MenuDividerProps) => {\n const { separatorProps } = useSeparator({\n orientation,\n elementType,\n });\n\n return <div {...separatorProps} data-test-id={testId} ref={innerRef} className=\"Menu-divider\" />;\n};\n\nexport { MenuDivider };\nexport type { MenuDividerProps };\n","import type { Icon } from '@launchpad-ui/icons';\nimport type { PopoverPlacement } from '@launchpad-ui/popover';\nimport type { ComponentPropsWithRef, ElementType, PropsWithRef, ReactElement } from 'react';\n\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { Slot } from '@radix-ui/react-slot';\nimport { FocusRing } from '@react-aria/focus';\nimport { cx } from 'classix';\nimport { Link } from 'react-router-dom';\n\nimport './styles/Menu.css';\n\n// Merge two types and get rid of overlapping definitions\ntype Merge<T, U> = Omit<T, keyof U> & U;\n\ntype PropsWithComponent<P, T extends ElementType> = P & { component?: T };\n\ntype PolymorphicPropsWithRef<P, T extends ElementType> = Merge<\n T extends keyof JSX.IntrinsicElements\n ? PropsWithRef<JSX.IntrinsicElements[T]>\n : ComponentPropsWithRef<T>,\n PropsWithComponent<P, T>\n>;\n\ntype MenuItemOwnProps = {\n isHighlighted?: boolean;\n icon?: typeof Icon | null;\n disabled?: boolean;\n nested?: boolean;\n groupHeader?: boolean;\n tooltip?: string | ReactElement;\n tooltipOptions?: typeof Tooltip;\n tooltipPlacement?: PopoverPlacement;\n asChild?: boolean;\n 'data-test-id'?: string;\n};\n\nconst defaultElement = 'button';\n\ntype MenuItemProps<P, T extends ElementType = typeof defaultElement> = PolymorphicPropsWithRef<\n | (MenuItemOwnProps & {\n item: P; // Infer the type if it is included\n })\n | (MenuItemOwnProps & {\n item?: undefined;\n }),\n T\n>;\n\nconst MenuItem = <P, T extends ElementType = typeof defaultElement>({\n ...props\n}: MenuItemProps<P, T>) => {\n const {\n // TODO: remove component prop once we migrate over to asChild format\n component,\n children,\n isHighlighted,\n icon: Icon,\n nested,\n groupHeader,\n item,\n disabled,\n className,\n tooltip,\n role = 'menuitem',\n tooltipPlacement,\n onKeyDown,\n tooltipOptions,\n asChild,\n 'data-test-id': testId = 'menu-item',\n ...rest\n } = props;\n\n const Component: ElementType = component || (asChild ? Slot : defaultElement);\n\n const renderedItem = (\n <FocusRing focusRingClass=\"has-focus\">\n <Component\n {...rest}\n disabled={disabled}\n aria-disabled={disabled ? disabled : undefined}\n className={cx(\n 'Menu-item',\n className,\n isHighlighted && 'is-highlighted',\n nested && 'Menu-item--nested',\n groupHeader && 'Menu-item--header'\n )}\n data-test-id={testId}\n role={role}\n onKeyDown={onKeyDown}\n >\n {asChild ? (\n children\n ) : (\n <>\n {Icon && (\n <span className=\"Menu-item-icon\">\n <Icon size=\"small\" />\n </span>\n )}\n {children}\n </>\n )}\n </Component>\n </FocusRing>\n );\n\n if (tooltip) {\n return (\n <Tooltip\n content={tooltip}\n rootElementStyle={{ display: 'block' }}\n allowBoundaryElementOverflow\n placement={tooltipPlacement ? tooltipPlacement : 'bottom'}\n {...(tooltipOptions || {})}\n >\n {renderedItem}\n </Tooltip>\n );\n }\n\n return renderedItem;\n};\n\ntype MenuItemLinkOwnProps = {\n disabled?: boolean;\n useHistory?: boolean;\n newTab?: boolean;\n};\n\ntype MenuItemLinkProps<P, T extends ElementType = typeof Link> =\n | Merge<Omit<MenuItemProps<P, T>, 'component' | 'item'>, MenuItemLinkOwnProps> &\n (\n | {\n item?: undefined;\n }\n | {\n item: P;\n }\n );\n\n// By default, this is a Link component whenever useHistory is\n// explicitly not false\n// TODO: deprecate this component\nconst MenuItemLink = <P, T extends ElementType = typeof Link>({\n to,\n disabled = false,\n useHistory = true,\n newTab = false,\n children,\n ...props\n}: MenuItemLinkProps<P, T>) => {\n const finalProps = {\n ...props,\n disabled,\n component: useHistory ? Link : ('a' as const),\n [useHistory ? 'to' : 'href']: disabled ? '' : to,\n rel: newTab ? 'noopener noreferrer' : undefined,\n target: newTab ? '_blank' : undefined,\n };\n\n // Ideally if this item is disabled, it should be a button rather\n // than a link https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md\n\n return <MenuItem {...finalProps}>{children}</MenuItem>;\n};\n\nexport { MenuItem, MenuItemLink };\nexport type { MenuItemProps, MenuItemLinkProps };\n","import type { ComponentPropsWithRef } from 'react';\n\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuItemListProps = Omit<ComponentPropsWithRef<'div'>, 'className'>;\n\nconst MenuItemList = forwardRef<HTMLDivElement, MenuItemListProps>(({ children, ...rest }, ref) => (\n <div {...rest} ref={ref} data-test-id=\"menu-item-list\" className=\"Menu-item-list\">\n {children}\n </div>\n));\n\nMenuItemList.displayName = 'MenuItemList';\n\nexport { MenuItemList };\nexport type { MenuItemListProps };\n","import type { ChangeEvent } from 'react';\n\nimport { TextField } from '@launchpad-ui/form';\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuSearchProps = {\n ariaLabel?: string;\n value?: string;\n placeholder?: string;\n onChange?(event: ChangeEvent<HTMLInputElement>): void;\n 'data-test-id'?: string;\n};\n\nconst MenuSearch = forwardRef<HTMLInputElement, MenuSearchProps>((props, ref) => {\n const { ariaLabel, placeholder, 'data-test-id': testId = 'menu-search', ...finalProps } = props;\n\n return (\n <div className=\"Menu-search\">\n <TextField\n {...finalProps}\n ref={ref}\n className=\"Menu-search-input\"\n tiny\n type=\"search\"\n data-test-id={testId}\n autoComplete=\"off\"\n placeholder={placeholder}\n aria-label={ariaLabel || 'Search'}\n />\n </div>\n );\n});\n\nMenuSearch.displayName = 'MenuSearch';\n\nexport { MenuSearch };\nexport type { MenuSearchProps };\n","import type { EventHandler, KeyboardEvent, SyntheticEvent } from 'react';\n\nconst createItemId = (index: number, id: string) => `${id}-item-${index}`;\n\nconst getNodeForIndex = (index: number | null, menuId: string) =>\n index === null ? index : document.getElementById(createItemId(index, menuId));\n\nconst handleKeyboardInteractions = (\n event: KeyboardEvent,\n keyHandlers: Partial<\n Record<'handleUp' | 'handleDown' | 'handleEnter', (e: KeyboardEvent) => void>\n >\n) => {\n const ops = {\n ArrowUp: keyHandlers.handleUp,\n ArrowDown: keyHandlers.handleDown,\n Enter: keyHandlers.handleEnter,\n } as Record<string, (e: KeyboardEvent) => void | undefined>;\n\n if (ops[event.key]) {\n event.preventDefault();\n ops[event.key]?.call(globalThis, event);\n }\n};\n\nconst chainEventHandlers =\n (...handlers: Array<EventHandler<SyntheticEvent> | undefined>) =>\n (event: SyntheticEvent) => {\n handlers.forEach((h) => typeof h === 'function' && h(event));\n };\n\nexport { createItemId, getNodeForIndex, handleKeyboardInteractions, chainEventHandlers };\n","import type { MenuItemProps } from './MenuItem';\nimport type { FocusManager } from '@react-aria/focus';\nimport type { KeyboardEvent, ReactElement, ReactNode } from 'react';\n\nimport { useFocusManager } from '@react-aria/focus';\nimport { cx } from 'classix';\nimport {\n Children,\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useVirtual } from 'react-virtual';\n\nimport { MenuBase } from './MenuBase';\nimport { MenuDivider } from './MenuDivider';\nimport { MenuItem, MenuItemLink } from './MenuItem';\nimport { MenuItemList } from './MenuItemList';\nimport { MenuSearch } from './MenuSearch';\nimport {\n chainEventHandlers,\n createItemId,\n getNodeForIndex,\n handleKeyboardInteractions,\n} from './utils';\n\ntype ControlledMenuProps<T> = {\n children: ReactNode;\n onSelect?: (item: T) => void;\n /**\n * Menus items are rendered using react-virtual for\n * additional rendering performance.\n */\n enableVirtualization?: boolean;\n /**\n * Class name to be applied to all MenuItem and MenuItemLink components\n * in the menu.\n */\n menuItemClassName?: string;\n /**\n * Sets the width of the menu. This is especially useful when using virtual items\n * since the width cannot be automatically set by the widest element.\n */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /**\n * Sets the number out of elements rendered outside of the view window\n * when using virtualization\n */\n overscan?: number;\n /**\n * Sets the height for each menu item when using virtualization.\n *\n */\n itemHeight?: number;\n 'data-test-id'?: string;\n};\n\ntype MenuProps<T extends number | string> = ControlledMenuProps<T>;\n\nconst Menu = <T extends number | string>(props: MenuProps<T>) => {\n const {\n children,\n menuItemClassName,\n onSelect,\n enableVirtualization,\n itemHeight,\n size,\n overscan = 1,\n 'data-test-id': testId = 'menu',\n } = props;\n\n const focusManager = useFocusManager();\n\n const handleArrowDown = useCallback(() => {\n focusManager.focusNext({ wrap: true });\n }, [focusManager]);\n\n const handleArrowUp = useCallback(() => {\n focusManager.focusPrevious({ wrap: true });\n }, [focusManager]);\n\n const reduceItems = useMemo(() => {\n const childrenProps = Children.toArray(children);\n if (enableVirtualization) {\n // the virtualized menu has its own handlers and props\n let searchElem = null;\n let elements: ReactElement[] = [];\n (childrenProps as ReactElement[]).forEach((child: ReactElement) => {\n switch (child.type) {\n case MenuSearch:\n searchElem = child;\n break;\n case MenuItem:\n case MenuItemLink:\n case MenuDivider:\n elements = elements.concat(child);\n break;\n default:\n break;\n }\n });\n return { items: elements, searchElement: searchElem };\n }\n\n return (childrenProps as ReactElement[]).reduce(\n (\n { items, searchElement }: { items: ReactElement[]; searchElement: null | ReactElement },\n child\n ) => {\n switch (child.type) {\n case MenuSearch:\n return {\n items,\n searchElement: cloneElement(child, {\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardInteractions(e, {\n handleDown: handleArrowDown,\n handleUp: handleArrowUp,\n }),\n }),\n };\n case MenuItem:\n case MenuItemLink:\n return {\n items: items.concat(\n child.props.disabled\n ? cloneElement(child, {\n onClick: () => undefined,\n onKeyDown: () => undefined,\n tabIndex: -1,\n disabled: true,\n })\n : cloneElement(child, {\n className: cx(child.props.className, menuItemClassName),\n item: child.props.item ?? items.length,\n // set focus on the first menu item if there is no search input, and set in the tab order\n onClick: chainEventHandlers(child.props.onClick, () => {\n onSelect?.(child.props.item ?? items.length);\n }),\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardInteractions(e, {\n handleDown: handleArrowDown,\n handleUp: handleArrowUp,\n }),\n })\n ),\n searchElement,\n };\n case MenuDivider:\n return { items: items.concat(child), searchElement };\n default:\n return { items, searchElement };\n }\n },\n { items: [], searchElement: null }\n );\n }, [children, enableVirtualization, menuItemClassName, handleArrowDown, handleArrowUp, onSelect]);\n\n if (enableVirtualization) {\n return (\n <MenuBase data-test-id={testId} isVirtual size={size}>\n <ItemVirtualizer<T>\n items={Children.toArray(reduceItems.items) as ReactElement[]}\n searchElement={reduceItems.searchElement}\n overscan={overscan}\n menuItemClassName={menuItemClassName}\n onSelect={onSelect}\n itemHeight={itemHeight}\n focusManager={focusManager}\n />\n </MenuBase>\n );\n }\n\n return (\n <MenuBase data-test-id={testId} size={size}>\n {reduceItems.searchElement}\n <MenuItemList role=\"presentation\">{reduceItems.items}</MenuItemList>\n </MenuBase>\n );\n};\n\ntype ItemVirtualizerProps<T> = Omit<ControlledMenuProps<T>, 'children'> & {\n items: ReactElement[] | null;\n searchElement?: ReactElement | null;\n focusManager: FocusManager;\n};\n\nconst ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<T>) => {\n const {\n overscan,\n searchElement,\n itemHeight = 33,\n menuItemClassName,\n items: items,\n focusManager,\n onSelect,\n } = props;\n\n const menuId = useRef(`menu-ctrl-${useId()}`);\n\n const focusedItemIndex = useRef<number | null>(null);\n const parentRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement>();\n\n const [nextFocusValue, setNextFocusValue] = useState<number | null>(null);\n\n const hasSearch = !!searchElement;\n\n const lastVirtualItemIndex = items ? items.length - 1 : 0;\n\n const rowVirtualizer = useVirtual({\n size: items !== null ? items.length : 0,\n parentRef,\n estimateSize: useCallback(() => itemHeight, [itemHeight]),\n overscan,\n });\n\n const focusSearchBar = useCallback(() => {\n rowVirtualizer.scrollToIndex(0);\n searchRef.current?.focus?.();\n }, [rowVirtualizer]);\n\n /**\n * Scrolls to the menu item with the index provided and\n * then manually focuses it using a side effect in useEffect\n */\n const focusMenuItem = useCallback(\n (index: number) => {\n rowVirtualizer.scrollToIndex(index);\n setNextFocusValue(index);\n },\n [rowVirtualizer]\n );\n\n const handleKeyboardFocusInteraction = useCallback(\n (direction: 'next' | 'previous') => {\n if (focusedItemIndex.current === null || focusedItemIndex.current === undefined) {\n return;\n }\n const nextIndex =\n direction === 'next' ? focusedItemIndex.current + 1 : focusedItemIndex.current - 1;\n const shouldWrap =\n (direction === 'next' && focusedItemIndex.current === lastVirtualItemIndex) ||\n (direction === 'previous' && focusedItemIndex.current === 0);\n if (shouldWrap) {\n // we are at the end of the list so we will\n // scroll back to the beginning of the list\n if (hasSearch) {\n focusSearchBar();\n } else {\n // if at end, wrap to beginning, else focus last item\n focusMenuItem(direction === 'next' ? 0 : lastVirtualItemIndex);\n }\n return;\n }\n switch (direction) {\n case 'next':\n rowVirtualizer.scrollToIndex(nextIndex);\n focusManager.focusNext();\n break;\n case 'previous':\n rowVirtualizer.scrollToIndex(nextIndex);\n focusManager.focusPrevious();\n break;\n default:\n break;\n }\n },\n [focusManager, focusMenuItem, focusSearchBar, hasSearch, lastVirtualItemIndex, rowVirtualizer]\n );\n\n const getItemProps = useCallback(\n (itemElem: ReactElement, index: number) => {\n const childProps = itemElem.props as MenuItemProps<T>;\n switch (itemElem.type) {\n case MenuItem:\n case MenuItemLink:\n return {\n className: cx(childProps.className, menuItemClassName),\n // set focus on the first menu item if there is no search input, and set in the tab order\n onKeyDown: childProps.disabled\n ? () => undefined\n : (e: KeyboardEvent) =>\n handleKeyboardFocusKeydown(e, {\n handleFocusBackward: handleKeyboardFocusInteraction,\n handleFocusForward: handleKeyboardFocusInteraction,\n }),\n onFocus: chainEventHandlers(childProps.onFocus, () => {\n focusedItemIndex.current = index;\n }),\n id: createItemId(index, menuId.current),\n onBlur: chainEventHandlers(childProps.onBlur, () => {\n focusedItemIndex.current = null;\n }),\n onClick: childProps.disabled\n ? () => undefined\n : chainEventHandlers(childProps.onClick, () => {\n onSelect?.(childProps.item as T);\n }),\n } as MenuItemProps<T>;\n default:\n return {};\n }\n },\n [handleKeyboardFocusInteraction, menuItemClassName, onSelect]\n );\n\n useEffect(() => {\n if (nextFocusValue !== null) {\n requestAnimationFrame(() => {\n const element = getNodeForIndex(nextFocusValue, menuId.current);\n element?.focus();\n });\n setNextFocusValue(null);\n }\n }, [nextFocusValue]);\n\n /**\n * Calls handleFocusForward when the user is attempting to focus forward using\n * tab or arrow keys. Calls handleFocusBackward when the users wants to move backward.\n */\n const handleKeyboardFocusKeydown = (\n e: KeyboardEvent,\n callbacks: Record<\n 'handleFocusForward' | 'handleFocusBackward',\n (direction: 'next' | 'previous') => void\n >\n ) => {\n const keyOps = ['Tab', 'ArrowUp', 'ArrowDown'];\n if (keyOps.includes(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n if ((e.key === 'Tab' && e.shiftKey) || e.key === 'ArrowUp') {\n callbacks.handleFocusBackward?.('previous');\n } else if (e.key === 'ArrowDown' || e.key === 'Tab') {\n callbacks.handleFocusForward?.('next');\n }\n }\n };\n\n const renderSearch = useMemo(\n () =>\n searchElement\n ? cloneElement(searchElement, {\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardFocusKeydown(e, {\n handleFocusBackward: () => focusMenuItem(lastVirtualItemIndex),\n handleFocusForward: () => focusMenuItem(0),\n }),\n ref: searchRef,\n })\n : null,\n [searchElement, lastVirtualItemIndex, focusMenuItem]\n );\n\n const renderItems = useMemo(\n () =>\n rowVirtualizer.virtualItems.map((virtualRow) => {\n if (!items) {\n return null;\n }\n const elem = items[virtualRow.index];\n return (\n <div\n key={virtualRow.index}\n ref={\n elem.type !== MenuItem || elem.type !== MenuItemLink\n ? virtualRow.measureRef\n : undefined\n }\n role=\"presentation\"\n className={cx('VirtualMenu-item')}\n style={{\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {cloneElement(elem, getItemProps(elem, virtualRow.index))}\n </div>\n );\n }),\n [rowVirtualizer.virtualItems, items, getItemProps]\n );\n\n return (\n <>\n {renderSearch}\n <MenuItemList ref={parentRef} role=\"presentation\">\n <div\n role=\"presentation\"\n className=\"VirtualMenu-item-list\"\n style={{\n height: `${rowVirtualizer.totalSize}px`,\n }}\n >\n {renderItems}\n </div>\n </MenuItemList>\n </>\n );\n};\n\nexport { Menu, ItemVirtualizer };\nexport type { MenuProps, ItemVirtualizerProps };\n"],"names":["MenuBase","forwardRef","children","size","isVirtual","props","ref","classes","cx","role","className","displayName","MenuDivider","elementType","orientation","innerRef","testId","separatorProps","useSeparator","defaultElement","MenuItem","component","isHighlighted","icon","Icon","nested","groupHeader","item","disabled","tooltip","tooltipPlacement","onKeyDown","tooltipOptions","asChild","rest","Component","Slot","renderedItem","FocusRing","focusRingClass","undefined","_jsxs","_Fragment","_jsx","Tooltip","content","rootElementStyle","display","allowBoundaryElementOverflow","placement","MenuItemLink","to","useHistory","newTab","finalProps","Link","rel","target","MenuItemList","MenuSearch","ariaLabel","placeholder","TextField","tiny","type","autoComplete","Menu","menuItemClassName","onSelect","enableVirtualization","itemHeight","overscan","focusManager","useFocusManager","handleArrowDown","useCallback","focusNext","wrap","handleArrowUp","focusPrevious","reduceItems","useMemo","childrenProps","Children","toArray","searchElem","elements","forEach","child","concat","items","searchElement","reduce","cloneElement","e","handleKeyboardInteractions","handleDown","handleUp","onClick","tabIndex","length","chainEventHandlers","ItemVirtualizer","menuId","useRef","useId","focusedItemIndex","parentRef","searchRef","nextFocusValue","setNextFocusValue","useState","hasSearch","lastVirtualItemIndex","rowVirtualizer","useVirtual","estimateSize","focusSearchBar","scrollToIndex","current","focus","focusMenuItem","index","handleKeyboardFocusInteraction","direction","nextIndex","shouldWrap","getItemProps","itemElem","childProps","handleKeyboardFocusKeydown","handleFocusBackward","handleFocusForward","onFocus","id","createItemId","onBlur","useEffect","requestAnimationFrame","element","getNodeForIndex","callbacks","keyOps","includes","key","preventDefault","stopPropagation","shiftKey","renderSearch","renderItems","virtualItems","map","virtualRow","elem","measureRef","style","transform","start","height","totalSize"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/MenuBase.tsx","../src/MenuDivider.tsx","../src/MenuItem.tsx","../src/MenuItemList.tsx","../src/MenuSearch.tsx","../src/utils.ts","../src/Menu.tsx"],"sourcesContent":["import type { MenuProps } from './Menu';\nimport type { ComponentPropsWithRef } from 'react';\n\nimport { cx } from 'classix';\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuBaseProps = ComponentPropsWithRef<'div'> & {\n isVirtual?: boolean;\n size?: MenuProps<string>['size'];\n};\n\nconst MenuBase = forwardRef<HTMLDivElement, MenuBaseProps>(\n ({ children, size, isVirtual, ...props }, ref) => {\n const classes = cx('Menu', isVirtual && 'Menu--isVirtual', size && `MenuSize--${size}`);\n\n return (\n <div {...props} role=\"menu\" className={classes} ref={ref}>\n {children}\n </div>\n );\n }\n);\n\nMenuBase.displayName = 'MenuBase';\n\nexport { MenuBase };\nexport type { MenuBaseProps };\n","import type { SeparatorProps } from '@react-aria/separator';\nimport type { RefObject } from 'react';\n\nimport { useSeparator } from '@react-aria/separator';\n\nimport './styles/Menu.css';\n\ntype MenuDividerProps = SeparatorProps & {\n innerRef?: RefObject<HTMLDivElement>;\n 'data-test-id'?: string;\n};\n\nconst MenuDivider = ({\n elementType = 'div',\n orientation,\n innerRef,\n 'data-test-id': testId = 'menu-divider',\n}: MenuDividerProps) => {\n const { separatorProps } = useSeparator({\n orientation,\n elementType,\n });\n\n return <div {...separatorProps} data-test-id={testId} ref={innerRef} className=\"Menu-divider\" />;\n};\n\nexport { MenuDivider };\nexport type { MenuDividerProps };\n","import type { Icon } from '@launchpad-ui/icons';\nimport type { PopoverPlacement } from '@launchpad-ui/popover';\nimport type { ComponentPropsWithRef, ElementType, PropsWithRef, ReactElement } from 'react';\n\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { Slot } from '@radix-ui/react-slot';\nimport { FocusRing } from '@react-aria/focus';\nimport { cx } from 'classix';\n\nimport './styles/Menu.css';\n\n// Merge two types and get rid of overlapping definitions\ntype Merge<T, U> = Omit<T, keyof U> & U;\n\ntype PropsWithComponent<P, T extends ElementType> = P & { component?: T };\n\ntype PolymorphicPropsWithRef<P, T extends ElementType> = Merge<\n T extends keyof JSX.IntrinsicElements\n ? PropsWithRef<JSX.IntrinsicElements[T]>\n : ComponentPropsWithRef<T>,\n PropsWithComponent<P, T>\n>;\n\ntype MenuItemOwnProps = {\n isHighlighted?: boolean;\n icon?: typeof Icon | null;\n disabled?: boolean;\n nested?: boolean;\n groupHeader?: boolean;\n tooltip?: string | ReactElement;\n tooltipOptions?: typeof Tooltip;\n tooltipPlacement?: PopoverPlacement;\n asChild?: boolean;\n 'data-test-id'?: string;\n};\n\nconst defaultElement = 'button';\n\ntype MenuItemProps<P, T extends ElementType = typeof defaultElement> = PolymorphicPropsWithRef<\n | (MenuItemOwnProps & {\n item: P; // Infer the type if it is included\n })\n | (MenuItemOwnProps & {\n item?: undefined;\n }),\n T\n>;\n\nconst MenuItem = <P, T extends ElementType = typeof defaultElement>({\n ...props\n}: MenuItemProps<P, T>) => {\n const {\n // TODO: remove component prop once we migrate over to asChild format\n component,\n children,\n isHighlighted,\n icon: Icon,\n nested,\n groupHeader,\n item,\n disabled,\n className,\n tooltip,\n role = 'menuitem',\n tooltipPlacement,\n onKeyDown,\n tooltipOptions,\n asChild,\n 'data-test-id': testId = 'menu-item',\n ...rest\n } = props;\n\n const Component: ElementType = component || (asChild ? Slot : defaultElement);\n\n const renderedItem = (\n <FocusRing focusRingClass=\"has-focus\">\n <Component\n {...rest}\n disabled={disabled}\n aria-disabled={disabled ? disabled : undefined}\n className={cx(\n 'Menu-item',\n className,\n isHighlighted && 'is-highlighted',\n nested && 'Menu-item--nested',\n groupHeader && 'Menu-item--header'\n )}\n data-test-id={testId}\n role={role}\n onKeyDown={onKeyDown}\n >\n {asChild ? (\n children\n ) : (\n <>\n {Icon && (\n <span className=\"Menu-item-icon\">\n <Icon size=\"small\" />\n </span>\n )}\n {children}\n </>\n )}\n </Component>\n </FocusRing>\n );\n\n if (tooltip) {\n return (\n <Tooltip\n content={tooltip}\n rootElementStyle={{ display: 'block' }}\n allowBoundaryElementOverflow\n placement={tooltipPlacement ? tooltipPlacement : 'bottom'}\n {...(tooltipOptions || {})}\n >\n {renderedItem}\n </Tooltip>\n );\n }\n\n return renderedItem;\n};\n\nexport { MenuItem };\nexport type { MenuItemProps };\n","import type { ComponentPropsWithRef } from 'react';\n\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuItemListProps = Omit<ComponentPropsWithRef<'div'>, 'className'>;\n\nconst MenuItemList = forwardRef<HTMLDivElement, MenuItemListProps>(({ children, ...rest }, ref) => (\n <div {...rest} ref={ref} data-test-id=\"menu-item-list\" className=\"Menu-item-list\">\n {children}\n </div>\n));\n\nMenuItemList.displayName = 'MenuItemList';\n\nexport { MenuItemList };\nexport type { MenuItemListProps };\n","import type { ChangeEvent } from 'react';\n\nimport { TextField } from '@launchpad-ui/form';\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuSearchProps = {\n ariaLabel?: string;\n value?: string;\n id?: string;\n placeholder?: string;\n onChange?(event: ChangeEvent<HTMLInputElement>): void;\n 'data-test-id'?: string;\n};\n\nconst MenuSearch = forwardRef<HTMLInputElement, MenuSearchProps>((props, ref) => {\n const {\n ariaLabel,\n placeholder,\n id,\n 'data-test-id': testId = 'menu-search',\n ...finalProps\n } = props;\n\n return (\n <div className=\"Menu-search\">\n <TextField\n {...finalProps}\n ref={ref}\n className=\"Menu-search-input\"\n tiny\n id={id}\n type=\"search\"\n data-test-id={testId}\n autoComplete=\"off\"\n placeholder={placeholder}\n aria-label={ariaLabel || 'Search'}\n />\n </div>\n );\n});\n\nMenuSearch.displayName = 'MenuSearch';\n\nexport { MenuSearch };\nexport type { MenuSearchProps };\n","import type { EventHandler, KeyboardEvent, SyntheticEvent } from 'react';\n\nconst createItemId = (index: number, id: string) => `${id}-item-${index}`;\n\nconst getNodeForIndex = (index: number | null, menuId: string) =>\n index === null ? index : document.getElementById(createItemId(index, menuId));\n\nconst handleKeyboardInteractions = (\n event: KeyboardEvent,\n keyHandlers: Partial<\n Record<'handleUp' | 'handleDown' | 'handleEnter', (e: KeyboardEvent) => void>\n >\n) => {\n const ops = {\n ArrowUp: keyHandlers.handleUp,\n ArrowDown: keyHandlers.handleDown,\n Enter: keyHandlers.handleEnter,\n } as Record<string, (e: KeyboardEvent) => void | undefined>;\n\n if (ops[event.key]) {\n event.preventDefault();\n ops[event.key]?.call(globalThis, event);\n }\n};\n\nconst chainEventHandlers =\n (...handlers: Array<EventHandler<SyntheticEvent> | undefined>) =>\n (event: SyntheticEvent) => {\n handlers.forEach((h) => typeof h === 'function' && h(event));\n };\n\nexport { createItemId, getNodeForIndex, handleKeyboardInteractions, chainEventHandlers };\n","import type { MenuItemProps } from './MenuItem';\nimport type { FocusManager } from '@react-aria/focus';\nimport type { KeyboardEvent, ReactElement, ReactNode } from 'react';\n\nimport { useFocusManager } from '@react-aria/focus';\nimport { cx } from 'classix';\nimport {\n Children,\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useVirtual } from 'react-virtual';\n\nimport { MenuBase } from './MenuBase';\nimport { MenuDivider } from './MenuDivider';\nimport { MenuItem } from './MenuItem';\nimport { MenuItemList } from './MenuItemList';\nimport { MenuSearch } from './MenuSearch';\nimport {\n chainEventHandlers,\n createItemId,\n getNodeForIndex,\n handleKeyboardInteractions,\n} from './utils';\n\ntype ControlledMenuProps<T> = {\n children: ReactNode;\n onSelect?: (item: T) => void;\n /**\n * Menus items are rendered using react-virtual for\n * additional rendering performance.\n */\n enableVirtualization?: boolean;\n /**\n * Class name to be applied to all MenuItem components\n * in the menu.\n */\n menuItemClassName?: string;\n /**\n * Sets the width of the menu. This is especially useful when using virtual items\n * since the width cannot be automatically set by the widest element.\n */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /**\n * Sets the number out of elements rendered outside of the view window\n * when using virtualization\n */\n overscan?: number;\n /**\n * Sets the height for each menu item when using virtualization.\n *\n */\n itemHeight?: number;\n 'data-test-id'?: string;\n};\n\ntype MenuProps<T extends number | string> = ControlledMenuProps<T>;\n\nconst Menu = <T extends number | string>(props: MenuProps<T>) => {\n const {\n children,\n menuItemClassName,\n onSelect,\n enableVirtualization,\n itemHeight,\n size,\n overscan = 1,\n 'data-test-id': testId = 'menu',\n } = props;\n\n const focusManager = useFocusManager();\n\n const handleArrowDown = useCallback(() => {\n focusManager.focusNext({ wrap: true });\n }, [focusManager]);\n\n const handleArrowUp = useCallback(() => {\n focusManager.focusPrevious({ wrap: true });\n }, [focusManager]);\n\n const reduceItems = useMemo(() => {\n const childrenProps = Children.toArray(children);\n if (enableVirtualization) {\n // the virtualized menu has its own handlers and props\n let searchElem = null;\n let elements: ReactElement[] = [];\n (childrenProps as ReactElement[]).forEach((child: ReactElement) => {\n switch (child.type) {\n case MenuSearch:\n searchElem = child;\n break;\n case MenuItem:\n case MenuDivider:\n elements = elements.concat(child);\n break;\n default:\n break;\n }\n });\n return { items: elements, searchElement: searchElem };\n }\n\n return (childrenProps as ReactElement[]).reduce(\n (\n { items, searchElement }: { items: ReactElement[]; searchElement: null | ReactElement },\n child\n ) => {\n switch (child.type) {\n case MenuSearch:\n return {\n items,\n searchElement: cloneElement(child, {\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardInteractions(e, {\n handleDown: handleArrowDown,\n handleUp: handleArrowUp,\n }),\n }),\n };\n case MenuItem:\n return {\n items: items.concat(\n child.props.disabled\n ? cloneElement(child, {\n onClick: () => undefined,\n onKeyDown: () => undefined,\n tabIndex: -1,\n disabled: true,\n })\n : cloneElement(child, {\n className: cx(child.props.className, menuItemClassName),\n item: child.props.item ?? items.length,\n // set focus on the first menu item if there is no search input, and set in the tab order\n onClick: chainEventHandlers(child.props.onClick, () => {\n onSelect?.(child.props.item ?? items.length);\n }),\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardInteractions(e, {\n handleDown: handleArrowDown,\n handleUp: handleArrowUp,\n }),\n })\n ),\n searchElement,\n };\n case MenuDivider:\n return { items: items.concat(child), searchElement };\n default:\n return { items, searchElement };\n }\n },\n { items: [], searchElement: null }\n );\n }, [children, enableVirtualization, menuItemClassName, handleArrowDown, handleArrowUp, onSelect]);\n\n if (enableVirtualization) {\n return (\n <MenuBase data-test-id={testId} isVirtual size={size}>\n <ItemVirtualizer<T>\n items={Children.toArray(reduceItems.items) as ReactElement[]}\n searchElement={reduceItems.searchElement}\n overscan={overscan}\n menuItemClassName={menuItemClassName}\n onSelect={onSelect}\n itemHeight={itemHeight}\n focusManager={focusManager}\n />\n </MenuBase>\n );\n }\n\n return (\n <MenuBase data-test-id={testId} size={size}>\n {reduceItems.searchElement}\n <MenuItemList role=\"presentation\">{reduceItems.items}</MenuItemList>\n </MenuBase>\n );\n};\n\ntype ItemVirtualizerProps<T> = Omit<ControlledMenuProps<T>, 'children'> & {\n items: ReactElement[] | null;\n searchElement?: ReactElement | null;\n focusManager: FocusManager;\n};\n\nconst ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<T>) => {\n const {\n overscan,\n searchElement,\n itemHeight = 33,\n menuItemClassName,\n items: items,\n focusManager,\n onSelect,\n } = props;\n\n const menuId = useRef(`menu-ctrl-${useId()}`);\n\n const focusedItemIndex = useRef<number | null>(null);\n const parentRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement>();\n\n const [nextFocusValue, setNextFocusValue] = useState<number | null>(null);\n\n const hasSearch = !!searchElement;\n\n const lastVirtualItemIndex = items ? items.length - 1 : 0;\n\n const rowVirtualizer = useVirtual({\n size: items !== null ? items.length : 0,\n parentRef,\n estimateSize: useCallback(() => itemHeight, [itemHeight]),\n overscan,\n });\n\n const focusSearchBar = useCallback(() => {\n rowVirtualizer.scrollToIndex(0);\n searchRef.current?.focus?.();\n }, [rowVirtualizer]);\n\n /**\n * Scrolls to the menu item with the index provided and\n * then manually focuses it using a side effect in useEffect\n */\n const focusMenuItem = useCallback(\n (index: number) => {\n rowVirtualizer.scrollToIndex(index);\n setNextFocusValue(index);\n },\n [rowVirtualizer]\n );\n\n const handleKeyboardFocusInteraction = useCallback(\n (direction: 'next' | 'previous') => {\n if (focusedItemIndex.current === null || focusedItemIndex.current === undefined) {\n return;\n }\n const nextIndex =\n direction === 'next' ? focusedItemIndex.current + 1 : focusedItemIndex.current - 1;\n const shouldWrap =\n (direction === 'next' && focusedItemIndex.current === lastVirtualItemIndex) ||\n (direction === 'previous' && focusedItemIndex.current === 0);\n if (shouldWrap) {\n // we are at the end of the list so we will\n // scroll back to the beginning of the list\n if (hasSearch) {\n focusSearchBar();\n } else {\n // if at end, wrap to beginning, else focus last item\n focusMenuItem(direction === 'next' ? 0 : lastVirtualItemIndex);\n }\n return;\n }\n switch (direction) {\n case 'next':\n rowVirtualizer.scrollToIndex(nextIndex);\n focusManager.focusNext();\n break;\n case 'previous':\n rowVirtualizer.scrollToIndex(nextIndex);\n focusManager.focusPrevious();\n break;\n default:\n break;\n }\n },\n [focusManager, focusMenuItem, focusSearchBar, hasSearch, lastVirtualItemIndex, rowVirtualizer]\n );\n\n const getItemProps = useCallback(\n (itemElem: ReactElement, index: number) => {\n const childProps = itemElem.props as MenuItemProps<T>;\n switch (itemElem.type) {\n case MenuItem:\n return {\n className: cx(childProps.className, menuItemClassName),\n // set focus on the first menu item if there is no search input, and set in the tab order\n onKeyDown: childProps.disabled\n ? () => undefined\n : (e: KeyboardEvent) =>\n handleKeyboardFocusKeydown(e, {\n handleFocusBackward: handleKeyboardFocusInteraction,\n handleFocusForward: handleKeyboardFocusInteraction,\n }),\n onFocus: chainEventHandlers(childProps.onFocus, () => {\n focusedItemIndex.current = index;\n }),\n id: createItemId(index, menuId.current),\n onBlur: chainEventHandlers(childProps.onBlur, () => {\n focusedItemIndex.current = null;\n }),\n onClick: childProps.disabled\n ? () => undefined\n : chainEventHandlers(childProps.onClick, () => {\n onSelect?.(childProps.item as T);\n }),\n } as MenuItemProps<T>;\n default:\n return {};\n }\n },\n [handleKeyboardFocusInteraction, menuItemClassName, onSelect]\n );\n\n useEffect(() => {\n if (nextFocusValue !== null) {\n requestAnimationFrame(() => {\n const element = getNodeForIndex(nextFocusValue, menuId.current);\n element?.focus();\n });\n setNextFocusValue(null);\n }\n }, [nextFocusValue]);\n\n /**\n * Calls handleFocusForward when the user is attempting to focus forward using\n * tab or arrow keys. Calls handleFocusBackward when the users wants to move backward.\n */\n const handleKeyboardFocusKeydown = (\n e: KeyboardEvent,\n callbacks: Record<\n 'handleFocusForward' | 'handleFocusBackward',\n (direction: 'next' | 'previous') => void\n >\n ) => {\n const keyOps = ['Tab', 'ArrowUp', 'ArrowDown'];\n if (keyOps.includes(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n if ((e.key === 'Tab' && e.shiftKey) || e.key === 'ArrowUp') {\n callbacks.handleFocusBackward?.('previous');\n } else if (e.key === 'ArrowDown' || e.key === 'Tab') {\n callbacks.handleFocusForward?.('next');\n }\n }\n };\n\n const renderSearch = useMemo(\n () =>\n searchElement\n ? cloneElement(searchElement, {\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardFocusKeydown(e, {\n handleFocusBackward: () => focusMenuItem(lastVirtualItemIndex),\n handleFocusForward: () => focusMenuItem(0),\n }),\n ref: searchRef,\n })\n : null,\n [searchElement, lastVirtualItemIndex, focusMenuItem]\n );\n\n const renderItems = useMemo(\n () =>\n rowVirtualizer.virtualItems.map((virtualRow) => {\n if (!items) {\n return null;\n }\n const elem = items[virtualRow.index];\n return (\n <div\n key={virtualRow.index}\n ref={elem.type !== MenuItem ? virtualRow.measureRef : undefined}\n role=\"presentation\"\n className={cx('VirtualMenu-item')}\n style={{\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {cloneElement(elem, getItemProps(elem, virtualRow.index))}\n </div>\n );\n }),\n [rowVirtualizer.virtualItems, items, getItemProps]\n );\n\n return (\n <>\n {renderSearch}\n <MenuItemList ref={parentRef} role=\"presentation\">\n <div\n role=\"presentation\"\n className=\"VirtualMenu-item-list\"\n style={{\n height: `${rowVirtualizer.totalSize}px`,\n }}\n >\n {renderItems}\n </div>\n </MenuItemList>\n </>\n );\n};\n\nexport { Menu, ItemVirtualizer };\nexport type { MenuProps, ItemVirtualizerProps };\n"],"names":["MenuBase","forwardRef","children","size","isVirtual","props","ref","classes","cx","role","className","displayName","MenuDivider","elementType","orientation","innerRef","testId","separatorProps","useSeparator","defaultElement","MenuItem","component","isHighlighted","icon","Icon","nested","groupHeader","item","disabled","tooltip","tooltipPlacement","onKeyDown","tooltipOptions","asChild","rest","Component","Slot","renderedItem","FocusRing","focusRingClass","undefined","_jsxs","_Fragment","_jsx","Tooltip","content","rootElementStyle","display","allowBoundaryElementOverflow","placement","MenuItemList","MenuSearch","ariaLabel","placeholder","id","finalProps","TextField","tiny","type","autoComplete","Menu","menuItemClassName","onSelect","enableVirtualization","itemHeight","overscan","focusManager","useFocusManager","handleArrowDown","useCallback","focusNext","wrap","handleArrowUp","focusPrevious","reduceItems","useMemo","childrenProps","Children","toArray","searchElem","elements","forEach","child","concat","items","searchElement","reduce","cloneElement","e","handleKeyboardInteractions","handleDown","handleUp","onClick","tabIndex","length","chainEventHandlers","ItemVirtualizer","menuId","useRef","useId","focusedItemIndex","parentRef","searchRef","nextFocusValue","setNextFocusValue","useState","hasSearch","lastVirtualItemIndex","rowVirtualizer","useVirtual","estimateSize","focusSearchBar","scrollToIndex","current","focus","focusMenuItem","index","handleKeyboardFocusInteraction","direction","nextIndex","shouldWrap","getItemProps","itemElem","childProps","handleKeyboardFocusKeydown","handleFocusBackward","handleFocusForward","onFocus","createItemId","onBlur","useEffect","requestAnimationFrame","element","getNodeForIndex","callbacks","keyOps","includes","key","preventDefault","stopPropagation","shiftKey","renderSearch","renderItems","virtualItems","map","virtualRow","elem","measureRef","style","transform","start","height","totalSize"],"mappings":"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"}
|
package/dist/index.js
CHANGED
@@ -8,7 +8,6 @@ const separator = require("@react-aria/separator");
|
|
8
8
|
const tooltip = require("@launchpad-ui/tooltip");
|
9
9
|
const reactSlot = require("@radix-ui/react-slot");
|
10
10
|
const focus = require("@react-aria/focus");
|
11
|
-
const reactRouterDom = require("react-router-dom");
|
12
11
|
const form = require("@launchpad-ui/form");
|
13
12
|
const reactVirtual = require("react-virtual");
|
14
13
|
const Menu$1 = "";
|
@@ -105,27 +104,6 @@ const MenuItem = ({
|
|
105
104
|
}
|
106
105
|
return renderedItem;
|
107
106
|
};
|
108
|
-
const MenuItemLink = ({
|
109
|
-
to,
|
110
|
-
disabled = false,
|
111
|
-
useHistory = true,
|
112
|
-
newTab = false,
|
113
|
-
children,
|
114
|
-
...props
|
115
|
-
}) => {
|
116
|
-
const finalProps = {
|
117
|
-
...props,
|
118
|
-
disabled,
|
119
|
-
component: useHistory ? reactRouterDom.Link : "a",
|
120
|
-
[useHistory ? "to" : "href"]: disabled ? "" : to,
|
121
|
-
rel: newTab ? "noopener noreferrer" : void 0,
|
122
|
-
target: newTab ? "_blank" : void 0
|
123
|
-
};
|
124
|
-
return /* @__PURE__ */ jsxRuntime.jsx(MenuItem, {
|
125
|
-
...finalProps,
|
126
|
-
children
|
127
|
-
});
|
128
|
-
};
|
129
107
|
const MenuItemList = react.forwardRef(({
|
130
108
|
children,
|
131
109
|
...rest
|
@@ -141,6 +119,7 @@ const MenuSearch = react.forwardRef((props, ref) => {
|
|
141
119
|
const {
|
142
120
|
ariaLabel,
|
143
121
|
placeholder,
|
122
|
+
id,
|
144
123
|
"data-test-id": testId = "menu-search",
|
145
124
|
...finalProps
|
146
125
|
} = props;
|
@@ -151,6 +130,7 @@ const MenuSearch = react.forwardRef((props, ref) => {
|
|
151
130
|
ref,
|
152
131
|
className: "Menu-search-input",
|
153
132
|
tiny: true,
|
133
|
+
id,
|
154
134
|
type: "search",
|
155
135
|
"data-test-id": testId,
|
156
136
|
autoComplete: "off",
|
@@ -210,7 +190,6 @@ const Menu = (props) => {
|
|
210
190
|
searchElem = child;
|
211
191
|
break;
|
212
192
|
case MenuItem:
|
213
|
-
case MenuItemLink:
|
214
193
|
case MenuDivider:
|
215
194
|
elements = elements.concat(child);
|
216
195
|
break;
|
@@ -238,7 +217,6 @@ const Menu = (props) => {
|
|
238
217
|
})
|
239
218
|
};
|
240
219
|
case MenuItem:
|
241
|
-
case MenuItemLink:
|
242
220
|
return {
|
243
221
|
items: items.concat(child.props.disabled ? react.cloneElement(child, {
|
244
222
|
onClick: () => void 0,
|
@@ -361,7 +339,6 @@ const ItemVirtualizer = (props) => {
|
|
361
339
|
const childProps = itemElem.props;
|
362
340
|
switch (itemElem.type) {
|
363
341
|
case MenuItem:
|
364
|
-
case MenuItemLink:
|
365
342
|
return {
|
366
343
|
className: classix.cx(childProps.className, menuItemClassName),
|
367
344
|
onKeyDown: childProps.disabled ? () => void 0 : (e) => handleKeyboardFocusKeydown(e, {
|
@@ -418,7 +395,7 @@ const ItemVirtualizer = (props) => {
|
|
418
395
|
}
|
419
396
|
const elem = items[virtualRow.index];
|
420
397
|
return /* @__PURE__ */ jsxRuntime.jsx("div", {
|
421
|
-
ref: elem.type !== MenuItem
|
398
|
+
ref: elem.type !== MenuItem ? virtualRow.measureRef : void 0,
|
422
399
|
role: "presentation",
|
423
400
|
className: classix.cx("VirtualMenu-item"),
|
424
401
|
style: {
|
@@ -446,7 +423,6 @@ exports.Menu = Menu;
|
|
446
423
|
exports.MenuBase = MenuBase;
|
447
424
|
exports.MenuDivider = MenuDivider;
|
448
425
|
exports.MenuItem = MenuItem;
|
449
|
-
exports.MenuItemLink = MenuItemLink;
|
450
426
|
exports.MenuItemList = MenuItemList;
|
451
427
|
exports.MenuSearch = MenuSearch;
|
452
428
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/MenuBase.tsx","../src/MenuDivider.tsx","../src/MenuItem.tsx","../src/MenuItemList.tsx","../src/MenuSearch.tsx","../src/utils.ts","../src/Menu.tsx"],"sourcesContent":["import type { MenuProps } from './Menu';\nimport type { ComponentPropsWithRef } from 'react';\n\nimport { cx } from 'classix';\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuBaseProps = ComponentPropsWithRef<'div'> & {\n isVirtual?: boolean;\n size?: MenuProps<string>['size'];\n};\n\nconst MenuBase = forwardRef<HTMLDivElement, MenuBaseProps>(\n ({ children, size, isVirtual, ...props }, ref) => {\n const classes = cx('Menu', isVirtual && 'Menu--isVirtual', size && `MenuSize--${size}`);\n\n return (\n <div {...props} role=\"menu\" className={classes} ref={ref}>\n {children}\n </div>\n );\n }\n);\n\nMenuBase.displayName = 'MenuBase';\n\nexport { MenuBase };\nexport type { MenuBaseProps };\n","import type { SeparatorProps } from '@react-aria/separator';\nimport type { RefObject } from 'react';\n\nimport { useSeparator } from '@react-aria/separator';\n\nimport './styles/Menu.css';\n\ntype MenuDividerProps = SeparatorProps & {\n innerRef?: RefObject<HTMLDivElement>;\n 'data-test-id'?: string;\n};\n\nconst MenuDivider = ({\n elementType = 'div',\n orientation,\n innerRef,\n 'data-test-id': testId = 'menu-divider',\n}: MenuDividerProps) => {\n const { separatorProps } = useSeparator({\n orientation,\n elementType,\n });\n\n return <div {...separatorProps} data-test-id={testId} ref={innerRef} className=\"Menu-divider\" />;\n};\n\nexport { MenuDivider };\nexport type { MenuDividerProps };\n","import type { Icon } from '@launchpad-ui/icons';\nimport type { PopoverPlacement } from '@launchpad-ui/popover';\nimport type { ComponentPropsWithRef, ElementType, PropsWithRef, ReactElement } from 'react';\n\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { Slot } from '@radix-ui/react-slot';\nimport { FocusRing } from '@react-aria/focus';\nimport { cx } from 'classix';\nimport { Link } from 'react-router-dom';\n\nimport './styles/Menu.css';\n\n// Merge two types and get rid of overlapping definitions\ntype Merge<T, U> = Omit<T, keyof U> & U;\n\ntype PropsWithComponent<P, T extends ElementType> = P & { component?: T };\n\ntype PolymorphicPropsWithRef<P, T extends ElementType> = Merge<\n T extends keyof JSX.IntrinsicElements\n ? PropsWithRef<JSX.IntrinsicElements[T]>\n : ComponentPropsWithRef<T>,\n PropsWithComponent<P, T>\n>;\n\ntype MenuItemOwnProps = {\n isHighlighted?: boolean;\n icon?: typeof Icon | null;\n disabled?: boolean;\n nested?: boolean;\n groupHeader?: boolean;\n tooltip?: string | ReactElement;\n tooltipOptions?: typeof Tooltip;\n tooltipPlacement?: PopoverPlacement;\n asChild?: boolean;\n 'data-test-id'?: string;\n};\n\nconst defaultElement = 'button';\n\ntype MenuItemProps<P, T extends ElementType = typeof defaultElement> = PolymorphicPropsWithRef<\n | (MenuItemOwnProps & {\n item: P; // Infer the type if it is included\n })\n | (MenuItemOwnProps & {\n item?: undefined;\n }),\n T\n>;\n\nconst MenuItem = <P, T extends ElementType = typeof defaultElement>({\n ...props\n}: MenuItemProps<P, T>) => {\n const {\n // TODO: remove component prop once we migrate over to asChild format\n component,\n children,\n isHighlighted,\n icon: Icon,\n nested,\n groupHeader,\n item,\n disabled,\n className,\n tooltip,\n role = 'menuitem',\n tooltipPlacement,\n onKeyDown,\n tooltipOptions,\n asChild,\n 'data-test-id': testId = 'menu-item',\n ...rest\n } = props;\n\n const Component: ElementType = component || (asChild ? Slot : defaultElement);\n\n const renderedItem = (\n <FocusRing focusRingClass=\"has-focus\">\n <Component\n {...rest}\n disabled={disabled}\n aria-disabled={disabled ? disabled : undefined}\n className={cx(\n 'Menu-item',\n className,\n isHighlighted && 'is-highlighted',\n nested && 'Menu-item--nested',\n groupHeader && 'Menu-item--header'\n )}\n data-test-id={testId}\n role={role}\n onKeyDown={onKeyDown}\n >\n {asChild ? (\n children\n ) : (\n <>\n {Icon && (\n <span className=\"Menu-item-icon\">\n <Icon size=\"small\" />\n </span>\n )}\n {children}\n </>\n )}\n </Component>\n </FocusRing>\n );\n\n if (tooltip) {\n return (\n <Tooltip\n content={tooltip}\n rootElementStyle={{ display: 'block' }}\n allowBoundaryElementOverflow\n placement={tooltipPlacement ? tooltipPlacement : 'bottom'}\n {...(tooltipOptions || {})}\n >\n {renderedItem}\n </Tooltip>\n );\n }\n\n return renderedItem;\n};\n\ntype MenuItemLinkOwnProps = {\n disabled?: boolean;\n useHistory?: boolean;\n newTab?: boolean;\n};\n\ntype MenuItemLinkProps<P, T extends ElementType = typeof Link> =\n | Merge<Omit<MenuItemProps<P, T>, 'component' | 'item'>, MenuItemLinkOwnProps> &\n (\n | {\n item?: undefined;\n }\n | {\n item: P;\n }\n );\n\n// By default, this is a Link component whenever useHistory is\n// explicitly not false\n// TODO: deprecate this component\nconst MenuItemLink = <P, T extends ElementType = typeof Link>({\n to,\n disabled = false,\n useHistory = true,\n newTab = false,\n children,\n ...props\n}: MenuItemLinkProps<P, T>) => {\n const finalProps = {\n ...props,\n disabled,\n component: useHistory ? Link : ('a' as const),\n [useHistory ? 'to' : 'href']: disabled ? '' : to,\n rel: newTab ? 'noopener noreferrer' : undefined,\n target: newTab ? '_blank' : undefined,\n };\n\n // Ideally if this item is disabled, it should be a button rather\n // than a link https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md\n\n return <MenuItem {...finalProps}>{children}</MenuItem>;\n};\n\nexport { MenuItem, MenuItemLink };\nexport type { MenuItemProps, MenuItemLinkProps };\n","import type { ComponentPropsWithRef } from 'react';\n\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuItemListProps = Omit<ComponentPropsWithRef<'div'>, 'className'>;\n\nconst MenuItemList = forwardRef<HTMLDivElement, MenuItemListProps>(({ children, ...rest }, ref) => (\n <div {...rest} ref={ref} data-test-id=\"menu-item-list\" className=\"Menu-item-list\">\n {children}\n </div>\n));\n\nMenuItemList.displayName = 'MenuItemList';\n\nexport { MenuItemList };\nexport type { MenuItemListProps };\n","import type { ChangeEvent } from 'react';\n\nimport { TextField } from '@launchpad-ui/form';\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuSearchProps = {\n ariaLabel?: string;\n value?: string;\n placeholder?: string;\n onChange?(event: ChangeEvent<HTMLInputElement>): void;\n 'data-test-id'?: string;\n};\n\nconst MenuSearch = forwardRef<HTMLInputElement, MenuSearchProps>((props, ref) => {\n const { ariaLabel, placeholder, 'data-test-id': testId = 'menu-search', ...finalProps } = props;\n\n return (\n <div className=\"Menu-search\">\n <TextField\n {...finalProps}\n ref={ref}\n className=\"Menu-search-input\"\n tiny\n type=\"search\"\n data-test-id={testId}\n autoComplete=\"off\"\n placeholder={placeholder}\n aria-label={ariaLabel || 'Search'}\n />\n </div>\n );\n});\n\nMenuSearch.displayName = 'MenuSearch';\n\nexport { MenuSearch };\nexport type { MenuSearchProps };\n","import type { EventHandler, KeyboardEvent, SyntheticEvent } from 'react';\n\nconst createItemId = (index: number, id: string) => `${id}-item-${index}`;\n\nconst getNodeForIndex = (index: number | null, menuId: string) =>\n index === null ? index : document.getElementById(createItemId(index, menuId));\n\nconst handleKeyboardInteractions = (\n event: KeyboardEvent,\n keyHandlers: Partial<\n Record<'handleUp' | 'handleDown' | 'handleEnter', (e: KeyboardEvent) => void>\n >\n) => {\n const ops = {\n ArrowUp: keyHandlers.handleUp,\n ArrowDown: keyHandlers.handleDown,\n Enter: keyHandlers.handleEnter,\n } as Record<string, (e: KeyboardEvent) => void | undefined>;\n\n if (ops[event.key]) {\n event.preventDefault();\n ops[event.key]?.call(globalThis, event);\n }\n};\n\nconst chainEventHandlers =\n (...handlers: Array<EventHandler<SyntheticEvent> | undefined>) =>\n (event: SyntheticEvent) => {\n handlers.forEach((h) => typeof h === 'function' && h(event));\n };\n\nexport { createItemId, getNodeForIndex, handleKeyboardInteractions, chainEventHandlers };\n","import type { MenuItemProps } from './MenuItem';\nimport type { FocusManager } from '@react-aria/focus';\nimport type { KeyboardEvent, ReactElement, ReactNode } from 'react';\n\nimport { useFocusManager } from '@react-aria/focus';\nimport { cx } from 'classix';\nimport {\n Children,\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useVirtual } from 'react-virtual';\n\nimport { MenuBase } from './MenuBase';\nimport { MenuDivider } from './MenuDivider';\nimport { MenuItem, MenuItemLink } from './MenuItem';\nimport { MenuItemList } from './MenuItemList';\nimport { MenuSearch } from './MenuSearch';\nimport {\n chainEventHandlers,\n createItemId,\n getNodeForIndex,\n handleKeyboardInteractions,\n} from './utils';\n\ntype ControlledMenuProps<T> = {\n children: ReactNode;\n onSelect?: (item: T) => void;\n /**\n * Menus items are rendered using react-virtual for\n * additional rendering performance.\n */\n enableVirtualization?: boolean;\n /**\n * Class name to be applied to all MenuItem and MenuItemLink components\n * in the menu.\n */\n menuItemClassName?: string;\n /**\n * Sets the width of the menu. This is especially useful when using virtual items\n * since the width cannot be automatically set by the widest element.\n */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /**\n * Sets the number out of elements rendered outside of the view window\n * when using virtualization\n */\n overscan?: number;\n /**\n * Sets the height for each menu item when using virtualization.\n *\n */\n itemHeight?: number;\n 'data-test-id'?: string;\n};\n\ntype MenuProps<T extends number | string> = ControlledMenuProps<T>;\n\nconst Menu = <T extends number | string>(props: MenuProps<T>) => {\n const {\n children,\n menuItemClassName,\n onSelect,\n enableVirtualization,\n itemHeight,\n size,\n overscan = 1,\n 'data-test-id': testId = 'menu',\n } = props;\n\n const focusManager = useFocusManager();\n\n const handleArrowDown = useCallback(() => {\n focusManager.focusNext({ wrap: true });\n }, [focusManager]);\n\n const handleArrowUp = useCallback(() => {\n focusManager.focusPrevious({ wrap: true });\n }, [focusManager]);\n\n const reduceItems = useMemo(() => {\n const childrenProps = Children.toArray(children);\n if (enableVirtualization) {\n // the virtualized menu has its own handlers and props\n let searchElem = null;\n let elements: ReactElement[] = [];\n (childrenProps as ReactElement[]).forEach((child: ReactElement) => {\n switch (child.type) {\n case MenuSearch:\n searchElem = child;\n break;\n case MenuItem:\n case MenuItemLink:\n case MenuDivider:\n elements = elements.concat(child);\n break;\n default:\n break;\n }\n });\n return { items: elements, searchElement: searchElem };\n }\n\n return (childrenProps as ReactElement[]).reduce(\n (\n { items, searchElement }: { items: ReactElement[]; searchElement: null | ReactElement },\n child\n ) => {\n switch (child.type) {\n case MenuSearch:\n return {\n items,\n searchElement: cloneElement(child, {\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardInteractions(e, {\n handleDown: handleArrowDown,\n handleUp: handleArrowUp,\n }),\n }),\n };\n case MenuItem:\n case MenuItemLink:\n return {\n items: items.concat(\n child.props.disabled\n ? cloneElement(child, {\n onClick: () => undefined,\n onKeyDown: () => undefined,\n tabIndex: -1,\n disabled: true,\n })\n : cloneElement(child, {\n className: cx(child.props.className, menuItemClassName),\n item: child.props.item ?? items.length,\n // set focus on the first menu item if there is no search input, and set in the tab order\n onClick: chainEventHandlers(child.props.onClick, () => {\n onSelect?.(child.props.item ?? items.length);\n }),\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardInteractions(e, {\n handleDown: handleArrowDown,\n handleUp: handleArrowUp,\n }),\n })\n ),\n searchElement,\n };\n case MenuDivider:\n return { items: items.concat(child), searchElement };\n default:\n return { items, searchElement };\n }\n },\n { items: [], searchElement: null }\n );\n }, [children, enableVirtualization, menuItemClassName, handleArrowDown, handleArrowUp, onSelect]);\n\n if (enableVirtualization) {\n return (\n <MenuBase data-test-id={testId} isVirtual size={size}>\n <ItemVirtualizer<T>\n items={Children.toArray(reduceItems.items) as ReactElement[]}\n searchElement={reduceItems.searchElement}\n overscan={overscan}\n menuItemClassName={menuItemClassName}\n onSelect={onSelect}\n itemHeight={itemHeight}\n focusManager={focusManager}\n />\n </MenuBase>\n );\n }\n\n return (\n <MenuBase data-test-id={testId} size={size}>\n {reduceItems.searchElement}\n <MenuItemList role=\"presentation\">{reduceItems.items}</MenuItemList>\n </MenuBase>\n );\n};\n\ntype ItemVirtualizerProps<T> = Omit<ControlledMenuProps<T>, 'children'> & {\n items: ReactElement[] | null;\n searchElement?: ReactElement | null;\n focusManager: FocusManager;\n};\n\nconst ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<T>) => {\n const {\n overscan,\n searchElement,\n itemHeight = 33,\n menuItemClassName,\n items: items,\n focusManager,\n onSelect,\n } = props;\n\n const menuId = useRef(`menu-ctrl-${useId()}`);\n\n const focusedItemIndex = useRef<number | null>(null);\n const parentRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement>();\n\n const [nextFocusValue, setNextFocusValue] = useState<number | null>(null);\n\n const hasSearch = !!searchElement;\n\n const lastVirtualItemIndex = items ? items.length - 1 : 0;\n\n const rowVirtualizer = useVirtual({\n size: items !== null ? items.length : 0,\n parentRef,\n estimateSize: useCallback(() => itemHeight, [itemHeight]),\n overscan,\n });\n\n const focusSearchBar = useCallback(() => {\n rowVirtualizer.scrollToIndex(0);\n searchRef.current?.focus?.();\n }, [rowVirtualizer]);\n\n /**\n * Scrolls to the menu item with the index provided and\n * then manually focuses it using a side effect in useEffect\n */\n const focusMenuItem = useCallback(\n (index: number) => {\n rowVirtualizer.scrollToIndex(index);\n setNextFocusValue(index);\n },\n [rowVirtualizer]\n );\n\n const handleKeyboardFocusInteraction = useCallback(\n (direction: 'next' | 'previous') => {\n if (focusedItemIndex.current === null || focusedItemIndex.current === undefined) {\n return;\n }\n const nextIndex =\n direction === 'next' ? focusedItemIndex.current + 1 : focusedItemIndex.current - 1;\n const shouldWrap =\n (direction === 'next' && focusedItemIndex.current === lastVirtualItemIndex) ||\n (direction === 'previous' && focusedItemIndex.current === 0);\n if (shouldWrap) {\n // we are at the end of the list so we will\n // scroll back to the beginning of the list\n if (hasSearch) {\n focusSearchBar();\n } else {\n // if at end, wrap to beginning, else focus last item\n focusMenuItem(direction === 'next' ? 0 : lastVirtualItemIndex);\n }\n return;\n }\n switch (direction) {\n case 'next':\n rowVirtualizer.scrollToIndex(nextIndex);\n focusManager.focusNext();\n break;\n case 'previous':\n rowVirtualizer.scrollToIndex(nextIndex);\n focusManager.focusPrevious();\n break;\n default:\n break;\n }\n },\n [focusManager, focusMenuItem, focusSearchBar, hasSearch, lastVirtualItemIndex, rowVirtualizer]\n );\n\n const getItemProps = useCallback(\n (itemElem: ReactElement, index: number) => {\n const childProps = itemElem.props as MenuItemProps<T>;\n switch (itemElem.type) {\n case MenuItem:\n case MenuItemLink:\n return {\n className: cx(childProps.className, menuItemClassName),\n // set focus on the first menu item if there is no search input, and set in the tab order\n onKeyDown: childProps.disabled\n ? () => undefined\n : (e: KeyboardEvent) =>\n handleKeyboardFocusKeydown(e, {\n handleFocusBackward: handleKeyboardFocusInteraction,\n handleFocusForward: handleKeyboardFocusInteraction,\n }),\n onFocus: chainEventHandlers(childProps.onFocus, () => {\n focusedItemIndex.current = index;\n }),\n id: createItemId(index, menuId.current),\n onBlur: chainEventHandlers(childProps.onBlur, () => {\n focusedItemIndex.current = null;\n }),\n onClick: childProps.disabled\n ? () => undefined\n : chainEventHandlers(childProps.onClick, () => {\n onSelect?.(childProps.item as T);\n }),\n } as MenuItemProps<T>;\n default:\n return {};\n }\n },\n [handleKeyboardFocusInteraction, menuItemClassName, onSelect]\n );\n\n useEffect(() => {\n if (nextFocusValue !== null) {\n requestAnimationFrame(() => {\n const element = getNodeForIndex(nextFocusValue, menuId.current);\n element?.focus();\n });\n setNextFocusValue(null);\n }\n }, [nextFocusValue]);\n\n /**\n * Calls handleFocusForward when the user is attempting to focus forward using\n * tab or arrow keys. Calls handleFocusBackward when the users wants to move backward.\n */\n const handleKeyboardFocusKeydown = (\n e: KeyboardEvent,\n callbacks: Record<\n 'handleFocusForward' | 'handleFocusBackward',\n (direction: 'next' | 'previous') => void\n >\n ) => {\n const keyOps = ['Tab', 'ArrowUp', 'ArrowDown'];\n if (keyOps.includes(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n if ((e.key === 'Tab' && e.shiftKey) || e.key === 'ArrowUp') {\n callbacks.handleFocusBackward?.('previous');\n } else if (e.key === 'ArrowDown' || e.key === 'Tab') {\n callbacks.handleFocusForward?.('next');\n }\n }\n };\n\n const renderSearch = useMemo(\n () =>\n searchElement\n ? cloneElement(searchElement, {\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardFocusKeydown(e, {\n handleFocusBackward: () => focusMenuItem(lastVirtualItemIndex),\n handleFocusForward: () => focusMenuItem(0),\n }),\n ref: searchRef,\n })\n : null,\n [searchElement, lastVirtualItemIndex, focusMenuItem]\n );\n\n const renderItems = useMemo(\n () =>\n rowVirtualizer.virtualItems.map((virtualRow) => {\n if (!items) {\n return null;\n }\n const elem = items[virtualRow.index];\n return (\n <div\n key={virtualRow.index}\n ref={\n elem.type !== MenuItem || elem.type !== MenuItemLink\n ? virtualRow.measureRef\n : undefined\n }\n role=\"presentation\"\n className={cx('VirtualMenu-item')}\n style={{\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {cloneElement(elem, getItemProps(elem, virtualRow.index))}\n </div>\n );\n }),\n [rowVirtualizer.virtualItems, items, getItemProps]\n );\n\n return (\n <>\n {renderSearch}\n <MenuItemList ref={parentRef} role=\"presentation\">\n <div\n role=\"presentation\"\n className=\"VirtualMenu-item-list\"\n style={{\n height: `${rowVirtualizer.totalSize}px`,\n }}\n >\n {renderItems}\n </div>\n </MenuItemList>\n </>\n );\n};\n\nexport { Menu, ItemVirtualizer };\nexport type { MenuProps, ItemVirtualizerProps };\n"],"names":["MenuBase","forwardRef","children","size","isVirtual","props","ref","classes","cx","role","className","displayName","MenuDivider","elementType","orientation","innerRef","testId","separatorProps","useSeparator","defaultElement","MenuItem","component","isHighlighted","icon","Icon","nested","groupHeader","item","disabled","tooltip","tooltipPlacement","onKeyDown","tooltipOptions","asChild","rest","Component","Slot","renderedItem","FocusRing","focusRingClass","undefined","_jsxs","_Fragment","_jsx","Tooltip","content","rootElementStyle","display","allowBoundaryElementOverflow","placement","MenuItemLink","to","useHistory","newTab","finalProps","Link","rel","target","MenuItemList","MenuSearch","ariaLabel","placeholder","TextField","tiny","type","autoComplete","Menu","menuItemClassName","onSelect","enableVirtualization","itemHeight","overscan","focusManager","useFocusManager","handleArrowDown","useCallback","focusNext","wrap","handleArrowUp","focusPrevious","reduceItems","useMemo","childrenProps","Children","toArray","searchElem","elements","forEach","child","concat","items","searchElement","reduce","cloneElement","e","handleKeyboardInteractions","handleDown","handleUp","onClick","tabIndex","length","chainEventHandlers","ItemVirtualizer","menuId","useRef","useId","focusedItemIndex","parentRef","searchRef","nextFocusValue","setNextFocusValue","useState","hasSearch","lastVirtualItemIndex","rowVirtualizer","useVirtual","estimateSize","focusSearchBar","scrollToIndex","current","focus","focusMenuItem","index","handleKeyboardFocusInteraction","direction","nextIndex","shouldWrap","getItemProps","itemElem","childProps","handleKeyboardFocusKeydown","handleFocusBackward","handleFocusForward","onFocus","id","createItemId","onBlur","useEffect","requestAnimationFrame","element","getNodeForIndex","callbacks","keyOps","includes","key","preventDefault","stopPropagation","shiftKey","renderSearch","renderItems","virtualItems","map","virtualRow","elem","measureRef","style","transform","start","height","totalSize"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/MenuBase.tsx","../src/MenuDivider.tsx","../src/MenuItem.tsx","../src/MenuItemList.tsx","../src/MenuSearch.tsx","../src/utils.ts","../src/Menu.tsx"],"sourcesContent":["import type { MenuProps } from './Menu';\nimport type { ComponentPropsWithRef } from 'react';\n\nimport { cx } from 'classix';\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuBaseProps = ComponentPropsWithRef<'div'> & {\n isVirtual?: boolean;\n size?: MenuProps<string>['size'];\n};\n\nconst MenuBase = forwardRef<HTMLDivElement, MenuBaseProps>(\n ({ children, size, isVirtual, ...props }, ref) => {\n const classes = cx('Menu', isVirtual && 'Menu--isVirtual', size && `MenuSize--${size}`);\n\n return (\n <div {...props} role=\"menu\" className={classes} ref={ref}>\n {children}\n </div>\n );\n }\n);\n\nMenuBase.displayName = 'MenuBase';\n\nexport { MenuBase };\nexport type { MenuBaseProps };\n","import type { SeparatorProps } from '@react-aria/separator';\nimport type { RefObject } from 'react';\n\nimport { useSeparator } from '@react-aria/separator';\n\nimport './styles/Menu.css';\n\ntype MenuDividerProps = SeparatorProps & {\n innerRef?: RefObject<HTMLDivElement>;\n 'data-test-id'?: string;\n};\n\nconst MenuDivider = ({\n elementType = 'div',\n orientation,\n innerRef,\n 'data-test-id': testId = 'menu-divider',\n}: MenuDividerProps) => {\n const { separatorProps } = useSeparator({\n orientation,\n elementType,\n });\n\n return <div {...separatorProps} data-test-id={testId} ref={innerRef} className=\"Menu-divider\" />;\n};\n\nexport { MenuDivider };\nexport type { MenuDividerProps };\n","import type { Icon } from '@launchpad-ui/icons';\nimport type { PopoverPlacement } from '@launchpad-ui/popover';\nimport type { ComponentPropsWithRef, ElementType, PropsWithRef, ReactElement } from 'react';\n\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { Slot } from '@radix-ui/react-slot';\nimport { FocusRing } from '@react-aria/focus';\nimport { cx } from 'classix';\n\nimport './styles/Menu.css';\n\n// Merge two types and get rid of overlapping definitions\ntype Merge<T, U> = Omit<T, keyof U> & U;\n\ntype PropsWithComponent<P, T extends ElementType> = P & { component?: T };\n\ntype PolymorphicPropsWithRef<P, T extends ElementType> = Merge<\n T extends keyof JSX.IntrinsicElements\n ? PropsWithRef<JSX.IntrinsicElements[T]>\n : ComponentPropsWithRef<T>,\n PropsWithComponent<P, T>\n>;\n\ntype MenuItemOwnProps = {\n isHighlighted?: boolean;\n icon?: typeof Icon | null;\n disabled?: boolean;\n nested?: boolean;\n groupHeader?: boolean;\n tooltip?: string | ReactElement;\n tooltipOptions?: typeof Tooltip;\n tooltipPlacement?: PopoverPlacement;\n asChild?: boolean;\n 'data-test-id'?: string;\n};\n\nconst defaultElement = 'button';\n\ntype MenuItemProps<P, T extends ElementType = typeof defaultElement> = PolymorphicPropsWithRef<\n | (MenuItemOwnProps & {\n item: P; // Infer the type if it is included\n })\n | (MenuItemOwnProps & {\n item?: undefined;\n }),\n T\n>;\n\nconst MenuItem = <P, T extends ElementType = typeof defaultElement>({\n ...props\n}: MenuItemProps<P, T>) => {\n const {\n // TODO: remove component prop once we migrate over to asChild format\n component,\n children,\n isHighlighted,\n icon: Icon,\n nested,\n groupHeader,\n item,\n disabled,\n className,\n tooltip,\n role = 'menuitem',\n tooltipPlacement,\n onKeyDown,\n tooltipOptions,\n asChild,\n 'data-test-id': testId = 'menu-item',\n ...rest\n } = props;\n\n const Component: ElementType = component || (asChild ? Slot : defaultElement);\n\n const renderedItem = (\n <FocusRing focusRingClass=\"has-focus\">\n <Component\n {...rest}\n disabled={disabled}\n aria-disabled={disabled ? disabled : undefined}\n className={cx(\n 'Menu-item',\n className,\n isHighlighted && 'is-highlighted',\n nested && 'Menu-item--nested',\n groupHeader && 'Menu-item--header'\n )}\n data-test-id={testId}\n role={role}\n onKeyDown={onKeyDown}\n >\n {asChild ? (\n children\n ) : (\n <>\n {Icon && (\n <span className=\"Menu-item-icon\">\n <Icon size=\"small\" />\n </span>\n )}\n {children}\n </>\n )}\n </Component>\n </FocusRing>\n );\n\n if (tooltip) {\n return (\n <Tooltip\n content={tooltip}\n rootElementStyle={{ display: 'block' }}\n allowBoundaryElementOverflow\n placement={tooltipPlacement ? tooltipPlacement : 'bottom'}\n {...(tooltipOptions || {})}\n >\n {renderedItem}\n </Tooltip>\n );\n }\n\n return renderedItem;\n};\n\nexport { MenuItem };\nexport type { MenuItemProps };\n","import type { ComponentPropsWithRef } from 'react';\n\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuItemListProps = Omit<ComponentPropsWithRef<'div'>, 'className'>;\n\nconst MenuItemList = forwardRef<HTMLDivElement, MenuItemListProps>(({ children, ...rest }, ref) => (\n <div {...rest} ref={ref} data-test-id=\"menu-item-list\" className=\"Menu-item-list\">\n {children}\n </div>\n));\n\nMenuItemList.displayName = 'MenuItemList';\n\nexport { MenuItemList };\nexport type { MenuItemListProps };\n","import type { ChangeEvent } from 'react';\n\nimport { TextField } from '@launchpad-ui/form';\nimport { forwardRef } from 'react';\n\nimport './styles/Menu.css';\n\ntype MenuSearchProps = {\n ariaLabel?: string;\n value?: string;\n id?: string;\n placeholder?: string;\n onChange?(event: ChangeEvent<HTMLInputElement>): void;\n 'data-test-id'?: string;\n};\n\nconst MenuSearch = forwardRef<HTMLInputElement, MenuSearchProps>((props, ref) => {\n const {\n ariaLabel,\n placeholder,\n id,\n 'data-test-id': testId = 'menu-search',\n ...finalProps\n } = props;\n\n return (\n <div className=\"Menu-search\">\n <TextField\n {...finalProps}\n ref={ref}\n className=\"Menu-search-input\"\n tiny\n id={id}\n type=\"search\"\n data-test-id={testId}\n autoComplete=\"off\"\n placeholder={placeholder}\n aria-label={ariaLabel || 'Search'}\n />\n </div>\n );\n});\n\nMenuSearch.displayName = 'MenuSearch';\n\nexport { MenuSearch };\nexport type { MenuSearchProps };\n","import type { EventHandler, KeyboardEvent, SyntheticEvent } from 'react';\n\nconst createItemId = (index: number, id: string) => `${id}-item-${index}`;\n\nconst getNodeForIndex = (index: number | null, menuId: string) =>\n index === null ? index : document.getElementById(createItemId(index, menuId));\n\nconst handleKeyboardInteractions = (\n event: KeyboardEvent,\n keyHandlers: Partial<\n Record<'handleUp' | 'handleDown' | 'handleEnter', (e: KeyboardEvent) => void>\n >\n) => {\n const ops = {\n ArrowUp: keyHandlers.handleUp,\n ArrowDown: keyHandlers.handleDown,\n Enter: keyHandlers.handleEnter,\n } as Record<string, (e: KeyboardEvent) => void | undefined>;\n\n if (ops[event.key]) {\n event.preventDefault();\n ops[event.key]?.call(globalThis, event);\n }\n};\n\nconst chainEventHandlers =\n (...handlers: Array<EventHandler<SyntheticEvent> | undefined>) =>\n (event: SyntheticEvent) => {\n handlers.forEach((h) => typeof h === 'function' && h(event));\n };\n\nexport { createItemId, getNodeForIndex, handleKeyboardInteractions, chainEventHandlers };\n","import type { MenuItemProps } from './MenuItem';\nimport type { FocusManager } from '@react-aria/focus';\nimport type { KeyboardEvent, ReactElement, ReactNode } from 'react';\n\nimport { useFocusManager } from '@react-aria/focus';\nimport { cx } from 'classix';\nimport {\n Children,\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useVirtual } from 'react-virtual';\n\nimport { MenuBase } from './MenuBase';\nimport { MenuDivider } from './MenuDivider';\nimport { MenuItem } from './MenuItem';\nimport { MenuItemList } from './MenuItemList';\nimport { MenuSearch } from './MenuSearch';\nimport {\n chainEventHandlers,\n createItemId,\n getNodeForIndex,\n handleKeyboardInteractions,\n} from './utils';\n\ntype ControlledMenuProps<T> = {\n children: ReactNode;\n onSelect?: (item: T) => void;\n /**\n * Menus items are rendered using react-virtual for\n * additional rendering performance.\n */\n enableVirtualization?: boolean;\n /**\n * Class name to be applied to all MenuItem components\n * in the menu.\n */\n menuItemClassName?: string;\n /**\n * Sets the width of the menu. This is especially useful when using virtual items\n * since the width cannot be automatically set by the widest element.\n */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /**\n * Sets the number out of elements rendered outside of the view window\n * when using virtualization\n */\n overscan?: number;\n /**\n * Sets the height for each menu item when using virtualization.\n *\n */\n itemHeight?: number;\n 'data-test-id'?: string;\n};\n\ntype MenuProps<T extends number | string> = ControlledMenuProps<T>;\n\nconst Menu = <T extends number | string>(props: MenuProps<T>) => {\n const {\n children,\n menuItemClassName,\n onSelect,\n enableVirtualization,\n itemHeight,\n size,\n overscan = 1,\n 'data-test-id': testId = 'menu',\n } = props;\n\n const focusManager = useFocusManager();\n\n const handleArrowDown = useCallback(() => {\n focusManager.focusNext({ wrap: true });\n }, [focusManager]);\n\n const handleArrowUp = useCallback(() => {\n focusManager.focusPrevious({ wrap: true });\n }, [focusManager]);\n\n const reduceItems = useMemo(() => {\n const childrenProps = Children.toArray(children);\n if (enableVirtualization) {\n // the virtualized menu has its own handlers and props\n let searchElem = null;\n let elements: ReactElement[] = [];\n (childrenProps as ReactElement[]).forEach((child: ReactElement) => {\n switch (child.type) {\n case MenuSearch:\n searchElem = child;\n break;\n case MenuItem:\n case MenuDivider:\n elements = elements.concat(child);\n break;\n default:\n break;\n }\n });\n return { items: elements, searchElement: searchElem };\n }\n\n return (childrenProps as ReactElement[]).reduce(\n (\n { items, searchElement }: { items: ReactElement[]; searchElement: null | ReactElement },\n child\n ) => {\n switch (child.type) {\n case MenuSearch:\n return {\n items,\n searchElement: cloneElement(child, {\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardInteractions(e, {\n handleDown: handleArrowDown,\n handleUp: handleArrowUp,\n }),\n }),\n };\n case MenuItem:\n return {\n items: items.concat(\n child.props.disabled\n ? cloneElement(child, {\n onClick: () => undefined,\n onKeyDown: () => undefined,\n tabIndex: -1,\n disabled: true,\n })\n : cloneElement(child, {\n className: cx(child.props.className, menuItemClassName),\n item: child.props.item ?? items.length,\n // set focus on the first menu item if there is no search input, and set in the tab order\n onClick: chainEventHandlers(child.props.onClick, () => {\n onSelect?.(child.props.item ?? items.length);\n }),\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardInteractions(e, {\n handleDown: handleArrowDown,\n handleUp: handleArrowUp,\n }),\n })\n ),\n searchElement,\n };\n case MenuDivider:\n return { items: items.concat(child), searchElement };\n default:\n return { items, searchElement };\n }\n },\n { items: [], searchElement: null }\n );\n }, [children, enableVirtualization, menuItemClassName, handleArrowDown, handleArrowUp, onSelect]);\n\n if (enableVirtualization) {\n return (\n <MenuBase data-test-id={testId} isVirtual size={size}>\n <ItemVirtualizer<T>\n items={Children.toArray(reduceItems.items) as ReactElement[]}\n searchElement={reduceItems.searchElement}\n overscan={overscan}\n menuItemClassName={menuItemClassName}\n onSelect={onSelect}\n itemHeight={itemHeight}\n focusManager={focusManager}\n />\n </MenuBase>\n );\n }\n\n return (\n <MenuBase data-test-id={testId} size={size}>\n {reduceItems.searchElement}\n <MenuItemList role=\"presentation\">{reduceItems.items}</MenuItemList>\n </MenuBase>\n );\n};\n\ntype ItemVirtualizerProps<T> = Omit<ControlledMenuProps<T>, 'children'> & {\n items: ReactElement[] | null;\n searchElement?: ReactElement | null;\n focusManager: FocusManager;\n};\n\nconst ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<T>) => {\n const {\n overscan,\n searchElement,\n itemHeight = 33,\n menuItemClassName,\n items: items,\n focusManager,\n onSelect,\n } = props;\n\n const menuId = useRef(`menu-ctrl-${useId()}`);\n\n const focusedItemIndex = useRef<number | null>(null);\n const parentRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement>();\n\n const [nextFocusValue, setNextFocusValue] = useState<number | null>(null);\n\n const hasSearch = !!searchElement;\n\n const lastVirtualItemIndex = items ? items.length - 1 : 0;\n\n const rowVirtualizer = useVirtual({\n size: items !== null ? items.length : 0,\n parentRef,\n estimateSize: useCallback(() => itemHeight, [itemHeight]),\n overscan,\n });\n\n const focusSearchBar = useCallback(() => {\n rowVirtualizer.scrollToIndex(0);\n searchRef.current?.focus?.();\n }, [rowVirtualizer]);\n\n /**\n * Scrolls to the menu item with the index provided and\n * then manually focuses it using a side effect in useEffect\n */\n const focusMenuItem = useCallback(\n (index: number) => {\n rowVirtualizer.scrollToIndex(index);\n setNextFocusValue(index);\n },\n [rowVirtualizer]\n );\n\n const handleKeyboardFocusInteraction = useCallback(\n (direction: 'next' | 'previous') => {\n if (focusedItemIndex.current === null || focusedItemIndex.current === undefined) {\n return;\n }\n const nextIndex =\n direction === 'next' ? focusedItemIndex.current + 1 : focusedItemIndex.current - 1;\n const shouldWrap =\n (direction === 'next' && focusedItemIndex.current === lastVirtualItemIndex) ||\n (direction === 'previous' && focusedItemIndex.current === 0);\n if (shouldWrap) {\n // we are at the end of the list so we will\n // scroll back to the beginning of the list\n if (hasSearch) {\n focusSearchBar();\n } else {\n // if at end, wrap to beginning, else focus last item\n focusMenuItem(direction === 'next' ? 0 : lastVirtualItemIndex);\n }\n return;\n }\n switch (direction) {\n case 'next':\n rowVirtualizer.scrollToIndex(nextIndex);\n focusManager.focusNext();\n break;\n case 'previous':\n rowVirtualizer.scrollToIndex(nextIndex);\n focusManager.focusPrevious();\n break;\n default:\n break;\n }\n },\n [focusManager, focusMenuItem, focusSearchBar, hasSearch, lastVirtualItemIndex, rowVirtualizer]\n );\n\n const getItemProps = useCallback(\n (itemElem: ReactElement, index: number) => {\n const childProps = itemElem.props as MenuItemProps<T>;\n switch (itemElem.type) {\n case MenuItem:\n return {\n className: cx(childProps.className, menuItemClassName),\n // set focus on the first menu item if there is no search input, and set in the tab order\n onKeyDown: childProps.disabled\n ? () => undefined\n : (e: KeyboardEvent) =>\n handleKeyboardFocusKeydown(e, {\n handleFocusBackward: handleKeyboardFocusInteraction,\n handleFocusForward: handleKeyboardFocusInteraction,\n }),\n onFocus: chainEventHandlers(childProps.onFocus, () => {\n focusedItemIndex.current = index;\n }),\n id: createItemId(index, menuId.current),\n onBlur: chainEventHandlers(childProps.onBlur, () => {\n focusedItemIndex.current = null;\n }),\n onClick: childProps.disabled\n ? () => undefined\n : chainEventHandlers(childProps.onClick, () => {\n onSelect?.(childProps.item as T);\n }),\n } as MenuItemProps<T>;\n default:\n return {};\n }\n },\n [handleKeyboardFocusInteraction, menuItemClassName, onSelect]\n );\n\n useEffect(() => {\n if (nextFocusValue !== null) {\n requestAnimationFrame(() => {\n const element = getNodeForIndex(nextFocusValue, menuId.current);\n element?.focus();\n });\n setNextFocusValue(null);\n }\n }, [nextFocusValue]);\n\n /**\n * Calls handleFocusForward when the user is attempting to focus forward using\n * tab or arrow keys. Calls handleFocusBackward when the users wants to move backward.\n */\n const handleKeyboardFocusKeydown = (\n e: KeyboardEvent,\n callbacks: Record<\n 'handleFocusForward' | 'handleFocusBackward',\n (direction: 'next' | 'previous') => void\n >\n ) => {\n const keyOps = ['Tab', 'ArrowUp', 'ArrowDown'];\n if (keyOps.includes(e.key)) {\n e.preventDefault();\n e.stopPropagation();\n if ((e.key === 'Tab' && e.shiftKey) || e.key === 'ArrowUp') {\n callbacks.handleFocusBackward?.('previous');\n } else if (e.key === 'ArrowDown' || e.key === 'Tab') {\n callbacks.handleFocusForward?.('next');\n }\n }\n };\n\n const renderSearch = useMemo(\n () =>\n searchElement\n ? cloneElement(searchElement, {\n onKeyDown: (e: KeyboardEvent) =>\n handleKeyboardFocusKeydown(e, {\n handleFocusBackward: () => focusMenuItem(lastVirtualItemIndex),\n handleFocusForward: () => focusMenuItem(0),\n }),\n ref: searchRef,\n })\n : null,\n [searchElement, lastVirtualItemIndex, focusMenuItem]\n );\n\n const renderItems = useMemo(\n () =>\n rowVirtualizer.virtualItems.map((virtualRow) => {\n if (!items) {\n return null;\n }\n const elem = items[virtualRow.index];\n return (\n <div\n key={virtualRow.index}\n ref={elem.type !== MenuItem ? virtualRow.measureRef : undefined}\n role=\"presentation\"\n className={cx('VirtualMenu-item')}\n style={{\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {cloneElement(elem, getItemProps(elem, virtualRow.index))}\n </div>\n );\n }),\n [rowVirtualizer.virtualItems, items, getItemProps]\n );\n\n return (\n <>\n {renderSearch}\n <MenuItemList ref={parentRef} role=\"presentation\">\n <div\n role=\"presentation\"\n className=\"VirtualMenu-item-list\"\n style={{\n height: `${rowVirtualizer.totalSize}px`,\n }}\n >\n {renderItems}\n </div>\n </MenuItemList>\n </>\n );\n};\n\nexport { Menu, ItemVirtualizer };\nexport type { MenuProps, ItemVirtualizerProps };\n"],"names":["MenuBase","forwardRef","children","size","isVirtual","props","ref","classes","cx","role","className","displayName","MenuDivider","elementType","orientation","innerRef","testId","separatorProps","useSeparator","defaultElement","MenuItem","component","isHighlighted","icon","Icon","nested","groupHeader","item","disabled","tooltip","tooltipPlacement","onKeyDown","tooltipOptions","asChild","rest","Component","Slot","renderedItem","FocusRing","focusRingClass","undefined","_jsxs","_Fragment","_jsx","Tooltip","content","rootElementStyle","display","allowBoundaryElementOverflow","placement","MenuItemList","MenuSearch","ariaLabel","placeholder","id","finalProps","TextField","tiny","type","autoComplete","Menu","menuItemClassName","onSelect","enableVirtualization","itemHeight","overscan","focusManager","useFocusManager","handleArrowDown","useCallback","focusNext","wrap","handleArrowUp","focusPrevious","reduceItems","useMemo","childrenProps","Children","toArray","searchElem","elements","forEach","child","concat","items","searchElement","reduce","cloneElement","e","handleKeyboardInteractions","handleDown","handleUp","onClick","tabIndex","length","chainEventHandlers","ItemVirtualizer","menuId","useRef","useId","focusedItemIndex","parentRef","searchRef","nextFocusValue","setNextFocusValue","useState","hasSearch","lastVirtualItemIndex","rowVirtualizer","useVirtual","estimateSize","focusSearchBar","scrollToIndex","current","focus","focusMenuItem","index","handleKeyboardFocusInteraction","direction","nextIndex","shouldWrap","getItemProps","itemElem","childProps","handleKeyboardFocusKeydown","handleFocusBackward","handleFocusForward","onFocus","createItemId","onBlur","useEffect","requestAnimationFrame","element","getNodeForIndex","callbacks","keyOps","includes","key","preventDefault","stopPropagation","shiftKey","renderSearch","renderItems","virtualItems","map","virtualRow","elem","measureRef","style","transform","start","height","totalSize"],"mappings":"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"}
|
package/dist/style.css
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@launchpad-ui/menu",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.9.0",
|
4
4
|
"status": "beta",
|
5
5
|
"publishConfig": {
|
6
6
|
"access": "public"
|
@@ -30,7 +30,6 @@
|
|
30
30
|
"@react-aria/focus": "3.10.0",
|
31
31
|
"@react-aria/separator": "3.2.6",
|
32
32
|
"classix": "2.1.17",
|
33
|
-
"react-router-dom": "6.9.0",
|
34
33
|
"react-virtual": "2.10.4",
|
35
34
|
"@launchpad-ui/form": "~0.8.12",
|
36
35
|
"@launchpad-ui/icons": "~0.8.6",
|