@launchpad-ui/menu 0.8.11 → 0.10.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 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 and MenuItemLink components
12
+ * Class name to be applied to all MenuItem components
13
13
  * in the menu.
14
14
  */
15
15
  menuItemClassName?: string;
@@ -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,iEAyHT,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,4EAoNpB,CAAC;AAEF,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACjC,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC"}
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"}
@@ -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
- type MenuItemLinkOwnProps = {
32
- disabled?: boolean;
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
@@ -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;AAIhD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,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,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,GAAG,OAAO,IAAI,IACzD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,EAAE,oBAAoB,CAAC,GAC1E,CACI;IACE,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,GACD;IACE,IAAI,EAAE,CAAC,CAAC;CACT,CACJ,CAAC;AAKR,QAAA,MAAM,YAAY;WAVC,SAAS;;;kBA+B3B,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AAClC,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,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/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, MenuItemLinkProps } from './MenuItem';
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, MenuItemLink } from './MenuItem';
9
+ export { MenuItem } from './MenuItem';
10
10
  export { MenuItemList } from './MenuItemList';
11
11
  export { MenuSearch } from './MenuSearch';
12
12
  export { Menu } from './Menu';
@@ -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,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACnE,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,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC"}
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
@@ -210,7 +188,6 @@ const Menu = (props) => {
210
188
  searchElem = child;
211
189
  break;
212
190
  case MenuItem:
213
- case MenuItemLink:
214
191
  case MenuDivider:
215
192
  elements = elements.concat(child);
216
193
  break;
@@ -238,7 +215,6 @@ const Menu = (props) => {
238
215
  })
239
216
  };
240
217
  case MenuItem:
241
- case MenuItemLink:
242
218
  return {
243
219
  items: items.concat(child.props.disabled ? cloneElement(child, {
244
220
  onClick: () => void 0,
@@ -304,7 +280,7 @@ const ItemVirtualizer = (props) => {
304
280
  const {
305
281
  overscan,
306
282
  searchElement,
307
- itemHeight = 33,
283
+ itemHeight = 31.5,
308
284
  menuItemClassName,
309
285
  items,
310
286
  focusManager,
@@ -361,7 +337,6 @@ const ItemVirtualizer = (props) => {
361
337
  const childProps = itemElem.props;
362
338
  switch (itemElem.type) {
363
339
  case MenuItem:
364
- case MenuItemLink:
365
340
  return {
366
341
  className: cx(childProps.className, menuItemClassName),
367
342
  onKeyDown: childProps.disabled ? () => void 0 : (e) => handleKeyboardFocusKeydown(e, {
@@ -418,7 +393,7 @@ const ItemVirtualizer = (props) => {
418
393
  }
419
394
  const elem = items[virtualRow.index];
420
395
  return /* @__PURE__ */ jsx("div", {
421
- ref: elem.type !== MenuItem || elem.type !== MenuItemLink ? virtualRow.measureRef : void 0,
396
+ ref: virtualRow.measureRef,
422
397
  role: "presentation",
423
398
  className: cx("VirtualMenu-item"),
424
399
  style: {
@@ -447,7 +422,6 @@ export {
447
422
  MenuBase,
448
423
  MenuDivider,
449
424
  MenuItem,
450
- MenuItemLink,
451
425
  MenuItemList,
452
426
  MenuSearch
453
427
  };
@@ -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 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, 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","id","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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"}
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 = 31.5,\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={virtualRow.measureRef}\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
@@ -212,7 +190,6 @@ const Menu = (props) => {
212
190
  searchElem = child;
213
191
  break;
214
192
  case MenuItem:
215
- case MenuItemLink:
216
193
  case MenuDivider:
217
194
  elements = elements.concat(child);
218
195
  break;
@@ -240,7 +217,6 @@ const Menu = (props) => {
240
217
  })
241
218
  };
242
219
  case MenuItem:
243
- case MenuItemLink:
244
220
  return {
245
221
  items: items.concat(child.props.disabled ? react.cloneElement(child, {
246
222
  onClick: () => void 0,
@@ -306,7 +282,7 @@ const ItemVirtualizer = (props) => {
306
282
  const {
307
283
  overscan,
308
284
  searchElement,
309
- itemHeight = 33,
285
+ itemHeight = 31.5,
310
286
  menuItemClassName,
311
287
  items,
312
288
  focusManager,
@@ -363,7 +339,6 @@ const ItemVirtualizer = (props) => {
363
339
  const childProps = itemElem.props;
364
340
  switch (itemElem.type) {
365
341
  case MenuItem:
366
- case MenuItemLink:
367
342
  return {
368
343
  className: classix.cx(childProps.className, menuItemClassName),
369
344
  onKeyDown: childProps.disabled ? () => void 0 : (e) => handleKeyboardFocusKeydown(e, {
@@ -420,7 +395,7 @@ const ItemVirtualizer = (props) => {
420
395
  }
421
396
  const elem = items[virtualRow.index];
422
397
  return /* @__PURE__ */ jsxRuntime.jsx("div", {
423
- ref: elem.type !== MenuItem || elem.type !== MenuItemLink ? virtualRow.measureRef : void 0,
398
+ ref: virtualRow.measureRef,
424
399
  role: "presentation",
425
400
  className: classix.cx("VirtualMenu-item"),
426
401
  style: {
@@ -448,7 +423,6 @@ exports.Menu = Menu;
448
423
  exports.MenuBase = MenuBase;
449
424
  exports.MenuDivider = MenuDivider;
450
425
  exports.MenuItem = MenuItem;
451
- exports.MenuItemLink = MenuItemLink;
452
426
  exports.MenuItemList = MenuItemList;
453
427
  exports.MenuSearch = MenuSearch;
454
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 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, 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","id","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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"}
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 = 31.5,\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={virtualRow.measureRef}\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
@@ -76,7 +76,7 @@
76
76
  outline: none;
77
77
  }
78
78
 
79
- /* Override our link styles for MenuItemLink component */
79
+ /* Override our link styles for link component */
80
80
 
81
81
  .Menu a.Menu-item:focus:not(:hover):not(.has-focus) {
82
82
  -webkit-text-decoration: none;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@launchpad-ui/menu",
3
- "version": "0.8.11",
3
+ "version": "0.10.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",