se-design 1.0.73-dev2 → 1.0.73-dev6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/components/CustomModal/index.d.ts +16 -0
  2. package/dist/components/MenuList/index.d.ts +3 -2
  3. package/dist/components/Modal/index.d.ts +1 -0
  4. package/dist/components/Popover/index.d.ts +2 -2
  5. package/dist/index11.js +53 -38
  6. package/dist/index11.js.map +1 -1
  7. package/dist/index12.js +30 -18
  8. package/dist/index12.js.map +1 -1
  9. package/dist/index15.js +1 -1
  10. package/dist/index17.js +36 -33
  11. package/dist/index17.js.map +1 -1
  12. package/dist/index18.js +129 -124
  13. package/dist/index18.js.map +1 -1
  14. package/dist/index188.js +5 -5
  15. package/dist/index192.js +43 -0
  16. package/dist/index192.js.map +1 -0
  17. package/dist/index193.js +62 -0
  18. package/dist/index193.js.map +1 -0
  19. package/dist/index194.js +20 -21
  20. package/dist/index194.js.map +1 -1
  21. package/dist/index197.js +27 -0
  22. package/dist/index197.js.map +1 -0
  23. package/dist/{index196.js → index199.js} +3 -3
  24. package/dist/{index196.js.map → index199.js.map} +1 -1
  25. package/dist/{index206.js → index208.js} +1 -1
  26. package/dist/{index206.js.map → index208.js.map} +1 -1
  27. package/dist/{index214.js → index216.js} +1 -1
  28. package/dist/{index214.js.map → index216.js.map} +1 -1
  29. package/dist/{index217.js → index219.js} +1 -1
  30. package/dist/{index217.js.map → index219.js.map} +1 -1
  31. package/dist/index228.js +3 -58
  32. package/dist/index228.js.map +1 -1
  33. package/dist/index230.js +20 -52
  34. package/dist/index230.js.map +1 -1
  35. package/dist/index231.js +51 -16
  36. package/dist/index231.js.map +1 -1
  37. package/dist/index232.js +18 -9
  38. package/dist/index232.js.map +1 -1
  39. package/dist/index233.js +9 -9
  40. package/dist/index233.js.map +1 -1
  41. package/dist/index234.js +9 -4
  42. package/dist/index234.js.map +1 -1
  43. package/dist/index235.js +5 -170
  44. package/dist/index235.js.map +1 -1
  45. package/dist/index236.js +170 -11
  46. package/dist/index236.js.map +1 -1
  47. package/dist/index237.js +11 -6
  48. package/dist/index237.js.map +1 -1
  49. package/dist/index238.js +5 -5
  50. package/dist/index238.js.map +1 -1
  51. package/dist/index239.js +5 -37
  52. package/dist/index239.js.map +1 -1
  53. package/dist/index24.js +1 -1
  54. package/dist/index240.js +38 -2
  55. package/dist/index240.js.map +1 -1
  56. package/dist/index241.js +2 -8
  57. package/dist/index241.js.map +1 -1
  58. package/dist/index242.js +7 -326
  59. package/dist/index242.js.map +1 -1
  60. package/dist/index243.js +324 -47
  61. package/dist/index243.js.map +1 -1
  62. package/dist/index244.js +50 -2
  63. package/dist/index244.js.map +1 -1
  64. package/dist/index245.js +2 -76
  65. package/dist/index245.js.map +1 -1
  66. package/dist/index246.js +65 -82
  67. package/dist/index246.js.map +1 -1
  68. package/dist/index247.js +89 -48
  69. package/dist/index247.js.map +1 -1
  70. package/dist/index248.js +51 -7
  71. package/dist/index248.js.map +1 -1
  72. package/dist/index249.js +7 -4
  73. package/dist/index249.js.map +1 -1
  74. package/dist/index250.js +4 -51
  75. package/dist/index250.js.map +1 -1
  76. package/dist/index251.js +52 -2
  77. package/dist/index251.js.map +1 -1
  78. package/dist/index252.js +2 -2
  79. package/dist/index253.js +5 -0
  80. package/dist/index253.js.map +1 -0
  81. package/dist/index27.js +1 -1
  82. package/dist/index28.js +94 -90
  83. package/dist/index28.js.map +1 -1
  84. package/dist/index32.js +42 -44
  85. package/dist/index32.js.map +1 -1
  86. package/dist/index37.js +1 -1
  87. package/dist/index39.js +1 -1
  88. package/dist/index44.js +1 -1
  89. package/dist/index45.js +2 -2
  90. package/dist/index48.js +1 -1
  91. package/dist/index52.js +1 -1
  92. package/dist/index62.js +1 -1
  93. package/dist/index64.js +52 -60
  94. package/dist/index64.js.map +1 -1
  95. package/package.json +1 -1
  96. package/dist/index198.js +0 -26
  97. package/dist/index198.js.map +0 -1
  98. package/dist/index226.js +0 -7
  99. package/dist/index226.js.map +0 -1
  100. package/dist/index229.js +0 -25
  101. package/dist/index229.js.map +0 -1
@@ -10,4 +10,20 @@ export interface CustomModalProps {
10
10
  contentClassName?: string;
11
11
  automationId?: string;
12
12
  }
13
+ /**
14
+ * A11y note: CustomModal handles focus trap and Escape dismissal automatically.
15
+ * Consumers are responsible for adding dialog semantics to the content rendered
16
+ * via `renderModalContent`:
17
+ *
18
+ * <div
19
+ * role="dialog"
20
+ * aria-modal="true"
21
+ * aria-labelledby={titleId} // or aria-label if no visible heading
22
+ * >
23
+ * <h2 id={titleId}>...</h2>
24
+ * ...
25
+ * </div>
26
+ *
27
+ * See Paywall/index.tsx for a reference implementation.
28
+ */
13
29
  export declare const CustomModal: FC<CustomModalProps>;
@@ -1,4 +1,4 @@
1
- import { FC } from 'react';
1
+ import { default as React } from 'react';
2
2
  import { MenuItemProps } from '../MenuItem';
3
3
  export type MenuListProps = {
4
4
  items: MenuItemProps[];
@@ -7,5 +7,6 @@ export type MenuListProps = {
7
7
  searchPlaceholder?: string;
8
8
  searchBy?: string;
9
9
  searchResultEmptyMessage?: string;
10
+ className?: string;
10
11
  };
11
- export declare const MenuList: FC<MenuListProps>;
12
+ export declare const MenuList: React.ForwardRefExoticComponent<MenuListProps & React.RefAttributes<HTMLDivElement>>;
@@ -2,6 +2,7 @@ import { default as React, FC } from 'react';
2
2
  import { ButtonProps } from '../Button';
3
3
  export interface ModalProps {
4
4
  title?: string;
5
+ ariaLabel?: string;
5
6
  content: string | React.ReactNode;
6
7
  successButtonProps?: ButtonProps;
7
8
  cancelButtonProps?: ButtonProps;
@@ -1,6 +1,6 @@
1
1
  import { default as React, ReactNode } from 'react';
2
2
  export interface PopoverHandle {
3
- togglePopover: (focusFirst?: boolean) => void;
3
+ togglePopover: (focusFirst?: boolean | 'last') => void;
4
4
  }
5
5
  export interface PopoverProps {
6
6
  className?: string;
@@ -11,7 +11,7 @@ export interface PopoverProps {
11
11
  }) => ReactNode;
12
12
  renderPopoverSrcElement: (props: {
13
13
  displayPopover: boolean;
14
- togglePopover: (focusFirst?: boolean) => void;
14
+ togglePopover: (focusFirst?: boolean | 'last') => void;
15
15
  }) => ReactNode;
16
16
  position?: 'bottom-center' | 'bottom-left' | 'bottom-right' | 'top-center' | 'top-left' | 'top-right';
17
17
  onPopoverToggle?: (displayPopover: boolean) => void;
package/dist/index11.js CHANGED
@@ -1,57 +1,72 @@
1
1
  import e from "react";
2
- import { Button as i } from "./index3.js";
3
- import { Icon as b } from "./index5.js";
4
- function l() {
5
- return l = Object.assign ? Object.assign.bind() : function(o) {
6
- for (var a = 1; a < arguments.length; a++) {
7
- var t = arguments[a];
8
- for (var n in t) ({}).hasOwnProperty.call(t, n) && (o[n] = t[n]);
2
+ import { Button as m } from "./index3.js";
3
+ import { Icon as E } from "./index5.js";
4
+ import { useModalA11y as C } from "./index192.js";
5
+ function n() {
6
+ return n = Object.assign ? Object.assign.bind() : function(l) {
7
+ for (var t = 1; t < arguments.length; t++) {
8
+ var o = arguments[t];
9
+ for (var a in o) ({}).hasOwnProperty.call(o, a) && (l[a] = o[a]);
9
10
  }
10
- return o;
11
- }, l.apply(null, arguments);
11
+ return l;
12
+ }, n.apply(null, arguments);
12
13
  }
13
- const E = (o) => {
14
+ const I = (l) => {
14
15
  const {
15
- title: a,
16
- content: t = "",
17
- showCloseIcon: n = !1,
18
- successButtonProps: s,
19
- cancelButtonProps: r,
20
- cancelAction: c,
21
- successAction: m,
22
- isOpen: d,
23
- width: u = "500px",
24
- height: p = "auto",
25
- automationId: g = "",
26
- customModalClassName: f = ""
27
- } = o, v = typeof t == "string";
16
+ title: t,
17
+ ariaLabel: o,
18
+ content: a = "",
19
+ showCloseIcon: d = !1,
20
+ successButtonProps: r,
21
+ cancelButtonProps: i,
22
+ cancelAction: s,
23
+ successAction: u,
24
+ isOpen: c,
25
+ width: p = "500px",
26
+ height: g = "auto",
27
+ automationId: f = "",
28
+ customModalClassName: b = ""
29
+ } = l, {
30
+ containerRef: v,
31
+ titleId: h,
32
+ dialogProps: x
33
+ } = C({
34
+ isOpen: c,
35
+ onDismiss: s,
36
+ title: t,
37
+ ariaLabel: o
38
+ }), y = typeof a == "string";
28
39
  return /* @__PURE__ */ e.createElement("div", {
29
- className: `${f} se-design-modal fixed inset-0 flex items-start justify-center z-[2001] backdrop-brightness-50 backdrop-blur-sm ${d ? "visible" : "invisible pointer-events-none"}`
30
- }, /* @__PURE__ */ e.createElement("div", {
40
+ className: `${b} se-design-modal fixed inset-0 flex items-start justify-center z-[2001] backdrop-brightness-50 backdrop-blur-sm ${c ? "visible" : "invisible pointer-events-none"}`
41
+ }, /* @__PURE__ */ e.createElement("div", n({
42
+ ref: v
43
+ }, x, {
31
44
  className: "modal-content flex flex-col gap-3 bg-[var(--color-white)] rounded-xl shadow-lg p-7 mt-[48px] relative",
32
45
  style: {
33
- width: u,
34
- height: p,
46
+ width: p,
47
+ height: g,
35
48
  maxWidth: "100vw"
36
49
  },
37
- "data-automation-id": g
38
- }, a && /* @__PURE__ */ e.createElement("div", {
50
+ "data-automation-id": f
51
+ }), t && /* @__PURE__ */ e.createElement("h2", {
52
+ id: h,
39
53
  className: "text-lg font-semibold color-[var(--color-gray-900)]"
40
- }, a), v ? /* @__PURE__ */ e.createElement("p", {
54
+ }, t), y ? /* @__PURE__ */ e.createElement("p", {
41
55
  className: "leading-normal color-[var(--color-gray-700)]"
42
- }, t) : t, /* @__PURE__ */ e.createElement("div", {
56
+ }, a) : a, /* @__PURE__ */ e.createElement("div", {
43
57
  className: "flex items-center justify-end gap-4 pt-3"
44
- }, r?.label && /* @__PURE__ */ e.createElement(i, l({}, r, {
45
- onClick: c
46
- })), s?.label && /* @__PURE__ */ e.createElement(i, l({}, s, {
47
- onClick: m
48
- }))), n && /* @__PURE__ */ e.createElement(b, {
58
+ }, i?.label && /* @__PURE__ */ e.createElement(m, n({}, i, {
59
+ onClick: s
60
+ })), r?.label && /* @__PURE__ */ e.createElement(m, n({}, r, {
61
+ onClick: u
62
+ }))), d && /* @__PURE__ */ e.createElement(E, {
49
63
  name: "close",
50
- onClick: c,
64
+ onClick: s,
65
+ ariaLabel: "Close dialog",
51
66
  className: "absolute top-8 right-8 cursor-pointer"
52
67
  })));
53
68
  };
54
69
  export {
55
- E as Modal
70
+ I as Modal
56
71
  };
57
72
  //# sourceMappingURL=index11.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index11.js","sources":["../src/components/Modal/index.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport { Button } from 'src/components/Button';\nimport { ButtonProps } from 'src/components/Button';\nimport { Icon } from '../Icon';\n\nexport interface ModalProps {\n title?: string;\n content: string | React.ReactNode;\n successButtonProps?: ButtonProps;\n cancelButtonProps?: ButtonProps;\n cancelAction?: () => void;\n successAction?: () => void;\n showCloseIcon?: boolean;\n isOpen: boolean;\n width?: string;\n height?: string;\n automationId?: string;\n customModalClassName?: string;\n}\n\nexport const Modal: FC<ModalProps> = (props) => {\n const {\n title,\n content = '',\n showCloseIcon = false,\n successButtonProps,\n cancelButtonProps,\n cancelAction,\n successAction,\n isOpen,\n width = '500px',\n height = 'auto',\n automationId = '',\n customModalClassName = ''\n } = props;\n\n const isContentString = typeof content === 'string';\n\n return (\n <div\n className={`${customModalClassName} se-design-modal fixed inset-0 flex items-start justify-center z-[2001] backdrop-brightness-50 backdrop-blur-sm ${isOpen ? 'visible' : 'invisible pointer-events-none'\n }`}\n >\n <div\n className=\"modal-content flex flex-col gap-3 bg-[var(--color-white)] rounded-xl shadow-lg p-7 mt-[48px] relative\"\n style={{ width, height, maxWidth: '100vw' }}\n data-automation-id={automationId}\n >\n {title && <div className=\"text-lg font-semibold color-[var(--color-gray-900)]\">{title}</div>}\n {isContentString ? <p className=\"leading-normal color-[var(--color-gray-700)]\">{content}</p> : content}\n <div className=\"flex items-center justify-end gap-4 pt-3\">\n {cancelButtonProps?.label && <Button {...cancelButtonProps} onClick={cancelAction} />}\n {successButtonProps?.label && <Button {...successButtonProps} onClick={successAction} />}\n </div>\n {showCloseIcon && (\n <Icon name=\"close\" onClick={cancelAction} className=\"absolute top-8 right-8 cursor-pointer\" />\n )}\n </div>\n </div>\n );\n};\n"],"names":["Modal","props","title","content","showCloseIcon","successButtonProps","cancelButtonProps","cancelAction","successAction","isOpen","width","height","automationId","customModalClassName","isContentString","React","createElement","className","style","maxWidth","label","Button","_extends","onClick","Icon","name"],"mappings":";;;;;;;;;;;;AAoBO,MAAMA,IAAyBC,CAAAA,MAAU;AAC9C,QAAM;AAAA,IACJC,OAAAA;AAAAA,IACAC,SAAAA,IAAU;AAAA,IACVC,eAAAA,IAAgB;AAAA,IAChBC,oBAAAA;AAAAA,IACAC,mBAAAA;AAAAA,IACAC,cAAAA;AAAAA,IACAC,eAAAA;AAAAA,IACAC,QAAAA;AAAAA,IACAC,OAAAA,IAAQ;AAAA,IACRC,QAAAA,IAAS;AAAA,IACTC,cAAAA,IAAe;AAAA,IACfC,sBAAAA,IAAuB;AAAA,EAAA,IACrBZ,GAEEa,IAAkB,OAAOX,KAAY;AAE3C,SACEY,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IACEC,WAAW,GAAGJ,CAAoB,mHAAmHJ,IAAS,YAAY,+BAA+B;AAAA,EAAA,GAGzMM,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IACEC,WAAU;AAAA,IACVC,OAAO;AAAA,MAAER,OAAAA;AAAAA,MAAOC,QAAAA;AAAAA,MAAQQ,UAAU;AAAA,IAAA;AAAA,IAClC,sBAAoBP;AAAAA,EAAAA,GAEnBV,KAASa,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKC,WAAU;AAAA,EAAA,GAAuDf,CAAW,GAC1FY,IAAkBC,gBAAAA,EAAAC,cAAA,KAAA;AAAA,IAAGC,WAAU;AAAA,EAAA,GAAgDd,CAAW,IAAIA,GAC/FY,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKC,WAAU;AAAA,EAAA,GACZX,GAAmBc,SAASL,gBAAAA,EAAAC,cAACK,GAAMC,EAAA,CAAA,GAAKhB,GAAiB;AAAA,IAAEiB,SAAShB;AAAAA,EAAAA,CAAa,CAAE,GACnFF,GAAoBe,SAASL,gBAAAA,EAAAC,cAACK,GAAMC,MAAKjB,GAAkB;AAAA,IAAEkB,SAASf;AAAAA,EAAAA,CAAc,CAAE,CACpF,GACJJ,KACCW,gBAAAA,EAAAC,cAACQ,GAAI;AAAA,IAACC,MAAK;AAAA,IAAQF,SAAShB;AAAAA,IAAcU,WAAU;AAAA,EAAA,CAAyC,CAE5F,CACF;AAET;"}
1
+ {"version":3,"file":"index11.js","sources":["../src/components/Modal/index.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport { Button } from 'src/components/Button';\nimport { ButtonProps } from 'src/components/Button';\nimport { Icon } from '../Icon';\nimport { useModalA11y } from 'src/utils/a11y';\n\nexport interface ModalProps {\n title?: string;\n ariaLabel?: string;\n content: string | React.ReactNode;\n successButtonProps?: ButtonProps;\n cancelButtonProps?: ButtonProps;\n cancelAction?: () => void;\n successAction?: () => void;\n showCloseIcon?: boolean;\n isOpen: boolean;\n width?: string;\n height?: string;\n automationId?: string;\n customModalClassName?: string;\n}\n\nexport const Modal: FC<ModalProps> = (props) => {\n const {\n title,\n ariaLabel,\n content = '',\n showCloseIcon = false,\n successButtonProps,\n cancelButtonProps,\n cancelAction,\n successAction,\n isOpen,\n width = '500px',\n height = 'auto',\n automationId = '',\n customModalClassName = ''\n } = props;\n\n const { containerRef, titleId, dialogProps } = useModalA11y({\n isOpen,\n onDismiss: cancelAction,\n title,\n ariaLabel,\n });\n\n const isContentString = typeof content === 'string';\n\n return (\n <div\n className={`${customModalClassName} se-design-modal fixed inset-0 flex items-start justify-center z-[2001] backdrop-brightness-50 backdrop-blur-sm ${isOpen ? 'visible' : 'invisible pointer-events-none'\n }`}\n >\n <div\n ref={containerRef}\n {...dialogProps}\n className=\"modal-content flex flex-col gap-3 bg-[var(--color-white)] rounded-xl shadow-lg p-7 mt-[48px] relative\"\n style={{ width, height, maxWidth: '100vw' }}\n data-automation-id={automationId}\n >\n {title && <h2 id={titleId} className=\"text-lg font-semibold color-[var(--color-gray-900)]\">{title}</h2>}\n {isContentString ? <p className=\"leading-normal color-[var(--color-gray-700)]\">{content}</p> : content}\n <div className=\"flex items-center justify-end gap-4 pt-3\">\n {cancelButtonProps?.label && <Button {...cancelButtonProps} onClick={cancelAction} />}\n {successButtonProps?.label && <Button {...successButtonProps} onClick={successAction} />}\n </div>\n {showCloseIcon && (\n <Icon name=\"close\" onClick={cancelAction} ariaLabel=\"Close dialog\" className=\"absolute top-8 right-8 cursor-pointer\" />\n )}\n </div>\n </div>\n );\n};\n"],"names":["Modal","props","title","ariaLabel","content","showCloseIcon","successButtonProps","cancelButtonProps","cancelAction","successAction","isOpen","width","height","automationId","customModalClassName","containerRef","titleId","dialogProps","useModalA11y","onDismiss","isContentString","React","createElement","className","_extends","ref","style","maxWidth","id","label","Button","onClick","Icon","name"],"mappings":";;;;;;;;;;;;;AAsBO,MAAMA,IAAyBC,CAAAA,MAAU;AAC9C,QAAM;AAAA,IACJC,OAAAA;AAAAA,IACAC,WAAAA;AAAAA,IACAC,SAAAA,IAAU;AAAA,IACVC,eAAAA,IAAgB;AAAA,IAChBC,oBAAAA;AAAAA,IACAC,mBAAAA;AAAAA,IACAC,cAAAA;AAAAA,IACAC,eAAAA;AAAAA,IACAC,QAAAA;AAAAA,IACAC,OAAAA,IAAQ;AAAA,IACRC,QAAAA,IAAS;AAAA,IACTC,cAAAA,IAAe;AAAA,IACfC,sBAAAA,IAAuB;AAAA,EAAA,IACrBb,GAEE;AAAA,IAAEc,cAAAA;AAAAA,IAAcC,SAAAA;AAAAA,IAASC,aAAAA;AAAAA,EAAAA,IAAgBC,EAAa;AAAA,IAC1DR,QAAAA;AAAAA,IACAS,WAAWX;AAAAA,IACXN,OAAAA;AAAAA,IACAC,WAAAA;AAAAA,EAAAA,CACD,GAEKiB,IAAkB,OAAOhB,KAAY;AAE3C,SACEiB,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IACEC,WAAW,GAAGT,CAAoB,mHAAmHJ,IAAS,YAAY,+BAA+B;AAAA,EAAA,GAGzMW,gBAAAA,EAAAC,cAAA,OAAAE,EAAA;AAAA,IACEC,KAAKV;AAAAA,EAAAA,GACDE,GAAW;AAAA,IACfM,WAAU;AAAA,IACVG,OAAO;AAAA,MAAEf,OAAAA;AAAAA,MAAOC,QAAAA;AAAAA,MAAQe,UAAU;AAAA,IAAA;AAAA,IAClC,sBAAoBd;AAAAA,EAAAA,CAAa,GAEhCX,KAASmB,gBAAAA,EAAAC,cAAA,MAAA;AAAA,IAAIM,IAAIZ;AAAAA,IAASO,WAAU;AAAA,EAAA,GAAuDrB,CAAU,GACrGkB,IAAkBC,gBAAAA,EAAAC,cAAA,KAAA;AAAA,IAAGC,WAAU;AAAA,EAAA,GAAgDnB,CAAW,IAAIA,GAC/FiB,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IAAKC,WAAU;AAAA,EAAA,GACZhB,GAAmBsB,SAASR,gBAAAA,EAAAC,cAACQ,GAAMN,EAAA,CAAA,GAAKjB,GAAiB;AAAA,IAAEwB,SAASvB;AAAAA,EAAAA,CAAa,CAAE,GACnFF,GAAoBuB,SAASR,gBAAAA,EAAAC,cAACQ,GAAMN,MAAKlB,GAAkB;AAAA,IAAEyB,SAAStB;AAAAA,EAAAA,CAAc,CAAE,CACpF,GACJJ,KACCgB,gBAAAA,EAAAC,cAACU,GAAI;AAAA,IAACC,MAAK;AAAA,IAAQF,SAASvB;AAAAA,IAAcL,WAAU;AAAA,IAAeoB,WAAU;AAAA,EAAA,CAAyC,CAErH,CACF;AAET;"}
package/dist/index12.js CHANGED
@@ -1,28 +1,40 @@
1
- import e from "react";
2
- const c = (t) => {
1
+ import o, { useRef as c } from "react";
2
+ import { useFocusTrap as u } from "./index193.js";
3
+ import { useDismissOnEscape as f } from "./index194.js";
4
+ const v = (s) => {
3
5
  const {
4
- renderModalContent: a,
5
- isOpen: o,
6
- width: n = "500px",
7
- className: s = "",
8
- contentClassName: i = "",
9
- automationId: l = "",
6
+ renderModalContent: n,
7
+ isOpen: e,
8
+ width: a = "500px",
9
+ className: i = "",
10
+ contentClassName: l = "",
11
+ automationId: r = "",
10
12
  onModalClick: d = () => {
11
- }
12
- } = t;
13
- return /* @__PURE__ */ e.createElement("div", {
14
- className: `se-design-modal fixed inset-0 flex items-start justify-center z-[2001] backdrop-brightness-50 backdrop-blur-sm ${o ? "visible" : "invisible pointer-events-none"} ${s}`,
15
- "data-automation-id": l,
13
+ },
14
+ onClose: m
15
+ } = s, t = c(null);
16
+ return u({
17
+ enabled: e,
18
+ containerRef: t,
19
+ restoreFocus: !0
20
+ }), f({
21
+ enabled: e,
22
+ containerRef: t,
23
+ onDismiss: m
24
+ }), /* @__PURE__ */ o.createElement("div", {
25
+ className: `se-design-modal fixed inset-0 flex items-start justify-center z-[2001] backdrop-brightness-50 backdrop-blur-sm ${e ? "visible" : "invisible pointer-events-none"} ${i}`,
26
+ "data-automation-id": r,
16
27
  onClick: d
17
- }, /* @__PURE__ */ e.createElement("div", {
18
- className: `modal-content flex flex-col gap-3 bg-[var(--color-white)] rounded shadow-lg p-8 mt-[48px] ${i}`,
28
+ }, /* @__PURE__ */ o.createElement("div", {
29
+ ref: t,
30
+ className: `modal-content flex flex-col gap-3 bg-[var(--color-white)] rounded shadow-lg p-8 mt-[48px] ${l}`,
19
31
  style: {
20
- width: n,
32
+ width: a,
21
33
  maxWidth: "100vw"
22
34
  }
23
- }, a()));
35
+ }, n()));
24
36
  };
25
37
  export {
26
- c as CustomModal
38
+ v as CustomModal
27
39
  };
28
40
  //# sourceMappingURL=index12.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index12.js","sources":["../src/components/CustomModal/index.tsx"],"sourcesContent":["import React, { FC } from 'react';\n\nexport interface CustomModalProps {\n onSubmit?: () => void;\n onClose?: () => void;\n onModalClick?: () => void;\n renderModalContent: () => React.ReactNode;\n isOpen: boolean;\n width?: string;\n className?: string;\n contentClassName?: string;\n automationId?: string;\n}\n\nexport const CustomModal: FC<CustomModalProps> = (props) => {\n const {\n renderModalContent,\n isOpen,\n width = '500px',\n className = '',\n contentClassName = '',\n automationId = '',\n onModalClick = () => {}\n } = props;\n\n return (\n <div\n className={`se-design-modal fixed inset-0 flex items-start justify-center z-[2001] backdrop-brightness-50 backdrop-blur-sm ${\n isOpen ? 'visible' : 'invisible pointer-events-none'\n } ${className}`}\n data-automation-id={automationId}\n onClick={onModalClick}\n >\n <div\n className={`modal-content flex flex-col gap-3 bg-[var(--color-white)] rounded shadow-lg p-8 mt-[48px] ${contentClassName}`}\n style={{ width, maxWidth: '100vw' }}\n >\n {renderModalContent()}\n </div>\n </div>\n );\n};\n"],"names":["React__default","CustomModal","props","renderModalContent","isOpen","width","className","contentClassName","automationId","onModalClick","React","createElement","onClick","style","maxWidth"],"mappings":"AAcO,OAAAA,OAAA;AAAA,MAAMC,IAAqCC,CAAAA,MAAU;AAC1D,QAAM;AAAA,IACJC,oBAAAA;AAAAA,IACAC,QAAAA;AAAAA,IACAC,OAAAA,IAAQ;AAAA,IACRC,WAAAA,IAAY;AAAA,IACZC,kBAAAA,IAAmB;AAAA,IACnBC,cAAAA,IAAe;AAAA,IACfC,cAAAA,IAAeA,MAAM;AAAA,IAAC;AAAA,EAAA,IACpBP;AAEJ,SACEQ,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IACEL,WAAW,kHACTF,IAAS,YAAY,+BAA+B,IAClDE,CAAS;AAAA,IACb,sBAAoBE;AAAAA,IACpBI,SAASH;AAAAA,EAAAA,GAETC,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IACEL,WAAW,6FAA6FC,CAAgB;AAAA,IACxHM,OAAO;AAAA,MAAER,OAAAA;AAAAA,MAAOS,UAAU;AAAA,IAAA;AAAA,EAAQ,GAEjCX,EAAAA,CACE,CACF;AAET;"}
1
+ {"version":3,"file":"index12.js","sources":["../src/components/CustomModal/index.tsx"],"sourcesContent":["import React, { FC, useRef } from 'react';\nimport { useFocusTrap, useDismissOnEscape } from 'src/utils/a11y';\n\nexport interface CustomModalProps {\n onSubmit?: () => void;\n onClose?: () => void;\n onModalClick?: () => void;\n renderModalContent: () => React.ReactNode;\n isOpen: boolean;\n width?: string;\n className?: string;\n contentClassName?: string;\n automationId?: string;\n}\n\n/**\n * A11y note: CustomModal handles focus trap and Escape dismissal automatically.\n * Consumers are responsible for adding dialog semantics to the content rendered\n * via `renderModalContent`:\n *\n * <div\n * role=\"dialog\"\n * aria-modal=\"true\"\n * aria-labelledby={titleId} // or aria-label if no visible heading\n * >\n * <h2 id={titleId}>...</h2>\n * ...\n * </div>\n *\n * See Paywall/index.tsx for a reference implementation.\n */\nexport const CustomModal: FC<CustomModalProps> = (props) => {\n const {\n renderModalContent,\n isOpen,\n width = '500px',\n className = '',\n contentClassName = '',\n automationId = '',\n onModalClick = () => {},\n onClose,\n } = props;\n\n const modalContentRef = useRef<HTMLDivElement>(null);\n\n useFocusTrap({\n enabled: isOpen,\n containerRef: modalContentRef,\n restoreFocus: true,\n });\n\n useDismissOnEscape({\n enabled: isOpen,\n containerRef: modalContentRef,\n onDismiss: onClose,\n });\n\n return (\n <div\n className={`se-design-modal fixed inset-0 flex items-start justify-center z-[2001] backdrop-brightness-50 backdrop-blur-sm ${\n isOpen ? 'visible' : 'invisible pointer-events-none'\n } ${className}`}\n data-automation-id={automationId}\n onClick={onModalClick}\n >\n <div\n ref={modalContentRef}\n className={`modal-content flex flex-col gap-3 bg-[var(--color-white)] rounded shadow-lg p-8 mt-[48px] ${contentClassName}`}\n style={{ width, maxWidth: '100vw' }}\n >\n {renderModalContent()}\n </div>\n </div>\n );\n};\n"],"names":["React__default","useRef","useFocusTrap","useDismissOnEscape","CustomModal","props","renderModalContent","isOpen","width","className","contentClassName","automationId","onModalClick","onClose","modalContentRef","enabled","containerRef","restoreFocus","onDismiss","React","createElement","onClick","ref","style","maxWidth"],"mappings":"AA+BO,OAAAA,KAAA,UAAAC,SAAA;AAAA,SAAA,gBAAAC,SAAA;AAAA,SAAA,sBAAAC,SAAA;AAAA,MAAMC,IAAqCC,CAAAA,MAAU;AAC1D,QAAM;AAAA,IACJC,oBAAAA;AAAAA,IACAC,QAAAA;AAAAA,IACAC,OAAAA,IAAQ;AAAA,IACRC,WAAAA,IAAY;AAAA,IACZC,kBAAAA,IAAmB;AAAA,IACnBC,cAAAA,IAAe;AAAA,IACfC,cAAAA,IAAeA,MAAM;AAAA,IAAC;AAAA,IACtBC,SAAAA;AAAAA,EAAAA,IACER,GAEES,IAAkBb,EAAuB,IAAI;AAEnDC,SAAAA,EAAa;AAAA,IACXa,SAASR;AAAAA,IACTS,cAAcF;AAAAA,IACdG,cAAc;AAAA,EAAA,CACf,GAEDd,EAAmB;AAAA,IACjBY,SAASR;AAAAA,IACTS,cAAcF;AAAAA,IACdI,WAAWL;AAAAA,EAAAA,CACZ,GAGCM,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IACEX,WAAW,kHACTF,IAAS,YAAY,+BAA+B,IAClDE,CAAS;AAAA,IACb,sBAAoBE;AAAAA,IACpBU,SAAST;AAAAA,EAAAA,GAETO,gBAAAA,EAAAC,cAAA,OAAA;AAAA,IACEE,KAAKR;AAAAA,IACLL,WAAW,6FAA6FC,CAAgB;AAAA,IACxHa,OAAO;AAAA,MAAEf,OAAAA;AAAAA,MAAOgB,UAAU;AAAA,IAAA;AAAA,EAAQ,GAEjClB,EAAAA,CACE,CACF;AAET;"}
package/dist/index15.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import m, { useState as N, useRef as $, useEffect as P } from "react";
2
2
  import V, { flushSync as Z } from "react-dom";
3
3
  import { useStableId as O } from "./index190.js";
4
- import { useDismissOnFocusOut as ee } from "./index194.js";
4
+ import { useDismissOnFocusOut as ee } from "./index197.js";
5
5
  function I() {
6
6
  return I = Object.assign ? Object.assign.bind() : function(g) {
7
7
  for (var h = 1; h < arguments.length; h++) {
package/dist/index17.js CHANGED
@@ -1,7 +1,7 @@
1
- import t, { useState as $, useMemo as y } from "react";
2
- import { MenuItem as k } from "./index16.js";
3
- import { InputWithIcon as F } from "./index51.js";
4
- import { useRovingFocus as R } from "./index68.js";
1
+ import t, { forwardRef as k, useState as F, useMemo as g } from "react";
2
+ import { MenuItem as L } from "./index16.js";
3
+ import { InputWithIcon as S } from "./index51.js";
4
+ import { useRovingFocus as C } from "./index68.js";
5
5
  function m() {
6
6
  return m = Object.assign ? Object.assign.bind() : function(a) {
7
7
  for (var o = 1; o < arguments.length; o++) {
@@ -11,17 +11,18 @@ function m() {
11
11
  return a;
12
12
  }, m.apply(null, arguments);
13
13
  }
14
- const P = ({
14
+ const O = /* @__PURE__ */ k(({
15
15
  items: a,
16
16
  maxHeight: o,
17
17
  shouldShowSearch: n = !1,
18
18
  searchPlaceholder: l = "Search...",
19
- searchBy: g = "label",
20
- searchResultEmptyMessage: v = "No results found"
21
- }) => {
22
- const [i, b] = $(""), I = () => i.trim() ? a.filter((e) => (e[g]?.toString().toLowerCase() || "").includes(i.toLowerCase())) : a, h = () => /* @__PURE__ */ t.createElement("div", {
19
+ searchBy: v = "label",
20
+ searchResultEmptyMessage: b = "No results found",
21
+ className: p = ""
22
+ }, I) => {
23
+ const [i, h] = F(""), x = () => i.trim() ? a.filter((e) => (e[v]?.toString().toLowerCase() || "").includes(i.toLowerCase())) : a, w = () => /* @__PURE__ */ t.createElement("div", {
23
24
  className: "w-full relative flex items-center border-b border-[var(--color-gray-300)] px-1"
24
- }, /* @__PURE__ */ t.createElement(F, {
25
+ }, /* @__PURE__ */ t.createElement(S, {
25
26
  leftIcon: {
26
27
  name: "search",
27
28
  position: "left",
@@ -30,7 +31,7 @@ const P = ({
30
31
  }
31
32
  },
32
33
  value: i,
33
- onChange: (e) => b(e),
34
+ onChange: (e) => h(e),
34
35
  placeholder: l,
35
36
  style: {
36
37
  margin: 0,
@@ -42,31 +43,32 @@ const P = ({
42
43
  outline: "none"
43
44
  },
44
45
  automationId: "se-design-menu-list-search"
45
- })), c = I(), x = o ? {
46
+ })), c = x(), E = o ? {
46
47
  maxHeight: o,
47
48
  overflowY: "auto"
48
- } : {}, d = y(() => {
49
+ } : {}, d = g(() => {
49
50
  const e = /* @__PURE__ */ new WeakMap(), r = /* @__PURE__ */ new Set();
50
- return a.forEach((s, p) => {
51
- const f = s.id || s.automationId || `menu-item-${p}`;
52
- let u = f;
53
- r.has(u) && (u = `${f}-${p}`), r.add(u), e.set(s, u);
51
+ return a.forEach((s, f) => {
52
+ const y = s.id || s.automationId || `menu-item-${f}`;
53
+ let u = y;
54
+ r.has(u) && (u = `${y}-${f}`), r.add(u), e.set(s, u);
54
55
  }), e;
55
- }, [a]), w = y(() => c.filter((e) => e.type !== "header" && e.type !== "separator").map((e) => d.get(e)), [c, d]), {
56
- getRovingItemProps: E,
57
- handleKeyDown: N,
58
- setFocusedId: M
59
- } = R({
60
- itemIds: w,
56
+ }, [a]), N = g(() => c.filter((e) => e.type !== "header" && e.type !== "separator").map((e) => d.get(e)), [c, d]), {
57
+ getRovingItemProps: $,
58
+ handleKeyDown: M,
59
+ setFocusedId: R
60
+ } = C({
61
+ itemIds: N,
61
62
  orientation: "vertical",
62
63
  loop: !0
63
64
  });
64
65
  return /* @__PURE__ */ t.createElement("div", {
65
- className: `se-design-menu-list border border-[var(--color-gray-200)] rounded shadow-md ${n ? "" : "py-2"}`,
66
+ ref: I,
67
+ className: `se-design-menu-list border border-[var(--color-gray-200)] rounded shadow-md ${n ? "" : "py-2"}${p ? ` ${p}` : ""}`,
66
68
  role: "menu",
67
69
  "aria-label": "Menu"
68
- }, n && h(), /* @__PURE__ */ t.createElement("div", {
69
- style: x,
70
+ }, n && w(), /* @__PURE__ */ t.createElement("div", {
71
+ style: E,
70
72
  className: `overflow-y-auto ${n ? "py-2" : ""}`
71
73
  }, c.length > 0 ? c.map((e) => {
72
74
  const r = d.get(e);
@@ -81,21 +83,22 @@ const P = ({
81
83
  className: "se-design-menu-header cursor-default px-2 mx-1 text-sm pt-2 text-[var(--color-gray-650)]",
82
84
  role: "presentation"
83
85
  }, e.label);
84
- const s = E(r);
85
- return /* @__PURE__ */ t.createElement(k, m({}, e, {
86
+ const s = $(r);
87
+ return /* @__PURE__ */ t.createElement(L, m({}, e, {
86
88
  key: r,
87
89
  ref: s.ref,
88
90
  tabIndex: s.tabIndex,
89
- onKeyDown: N,
90
- onFocus: () => M(r)
91
+ onKeyDown: M,
92
+ onFocus: () => R(r)
91
93
  }));
92
94
  }) : /* @__PURE__ */ t.createElement("div", {
93
95
  className: "px-3 py-4 text-center text-[var(--color-gray-700)] text-sm",
94
96
  role: "status",
95
97
  "aria-live": "polite"
96
- }, v)));
97
- };
98
+ }, b)));
99
+ });
100
+ O.displayName = "MenuList";
98
101
  export {
99
- P as MenuList
102
+ O as MenuList
100
103
  };
101
104
  //# sourceMappingURL=index17.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index17.js","sources":["../src/components/MenuList/index.tsx"],"sourcesContent":["import React, { FC, useState, useMemo } from 'react';\nimport { MenuItem, MenuItemProps } from 'src/components/MenuItem';\nimport { InputWithIcon } from '../InputWithIcon';\nimport { useRovingFocus } from 'src/utils/a11y/useRovingFocus';\n\nexport type MenuListProps = {\n items: MenuItemProps[];\n maxHeight?: string;\n shouldShowSearch?: boolean;\n searchPlaceholder?: string;\n searchBy?: string;\n searchResultEmptyMessage?: string;\n};\n\nexport const MenuList: FC<MenuListProps> = ({\n items,\n maxHeight,\n shouldShowSearch = false,\n searchPlaceholder = 'Search...',\n searchBy = 'label',\n searchResultEmptyMessage = 'No results found'\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n\n const getFilteredItems = () => {\n if (!searchQuery.trim()) {\n return items;\n }\n return items.filter((item) => {\n const searchValue = item[searchBy as keyof MenuItemProps]?.toString().toLowerCase() || '';\n return searchValue.includes(searchQuery.toLowerCase());\n });\n };\n\n const renderSearchBar = () => {\n return (\n <div className=\"w-full relative flex items-center border-b border-[var(--color-gray-300)] px-1\">\n <InputWithIcon\n leftIcon={{ name: 'search', position: 'left', style: { color: 'var(--color-gray-500)' } }}\n value={searchQuery}\n onChange={(value) => setSearchQuery(value)}\n placeholder={searchPlaceholder}\n style={{ margin: 0, gap: 0 }}\n inputStyle={{ width: '100%', border: 'none', outline: 'none' }}\n automationId=\"se-design-menu-list-search\"\n />\n </div>\n );\n };\n\n const filteredItems = getFilteredItems();\n const containerStyle = maxHeight\n ? {\n maxHeight,\n overflowY: 'auto' as const\n }\n : {};\n\n \n const itemIdByRef = useMemo(() => {\n const map = new WeakMap<MenuItemProps, string>();\n const seen = new Set<string>();\n\n items.forEach((item, index) => {\n const baseId = item.id || item.automationId || `menu-item-${index}`;\n let uniqueId = baseId;\n\n if (seen.has(uniqueId)) {\n uniqueId = `${baseId}-${index}`;\n }\n\n seen.add(uniqueId);\n map.set(item, uniqueId);\n });\n\n return map;\n }, [items]);\n\n const itemIds = useMemo(() => {\n return filteredItems\n .filter((item) => item.type !== 'header' && item.type !== 'separator')\n .map((item) => itemIdByRef.get(item) as string);\n }, [filteredItems, itemIdByRef]);\n\n // Use roving focus for arrow key navigation\n const { getRovingItemProps, handleKeyDown, setFocusedId } = useRovingFocus({\n itemIds,\n orientation: 'vertical',\n loop: true\n });\n\n return (\n <div\n className={`se-design-menu-list border border-[var(--color-gray-200)] rounded shadow-md ${\n shouldShowSearch ? '' : 'py-2'\n }`}\n role=\"menu\"\n aria-label=\"Menu\"\n >\n {shouldShowSearch && renderSearchBar()}\n <div style={containerStyle} className={`overflow-y-auto ${shouldShowSearch ? 'py-2' : ''}`}>\n {filteredItems.length > 0 ? (\n filteredItems.map((item) => {\n const stableId = itemIdByRef.get(item) as string;\n\n if (item.type === 'separator') {\n return (\n <hr key={stableId} className=\"se-design-menu-separator cursor-default border-[var(--color-gray-200)]\" />\n );\n }\n\n if (item.type === 'header') {\n return (\n <div\n key={stableId}\n className=\"se-design-menu-header cursor-default px-2 mx-1 text-sm pt-2 text-[var(--color-gray-650)]\"\n role=\"presentation\"\n >\n {item.label}\n </div>\n );\n }\n\n const rovingProps = getRovingItemProps(stableId);\n return (\n <MenuItem\n {...item}\n key={stableId}\n ref={rovingProps.ref}\n tabIndex={rovingProps.tabIndex}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocusedId(stableId)}\n />\n );\n })\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\" role=\"status\" aria-live=\"polite\">{searchResultEmptyMessage}</div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["MenuList","items","maxHeight","shouldShowSearch","searchPlaceholder","searchBy","searchResultEmptyMessage","searchQuery","setSearchQuery","useState","getFilteredItems","trim","filter","item","toString","toLowerCase","includes","renderSearchBar","React","createElement","className","InputWithIcon","leftIcon","name","position","style","color","value","onChange","placeholder","margin","gap","inputStyle","width","border","outline","automationId","filteredItems","containerStyle","overflowY","itemIdByRef","useMemo","map","WeakMap","seen","Set","forEach","index","baseId","id","uniqueId","has","add","set","itemIds","type","get","getRovingItemProps","handleKeyDown","setFocusedId","useRovingFocus","orientation","loop","role","length","stableId","key","label","rovingProps","MenuItem","_extends","ref","tabIndex","onKeyDown","onFocus"],"mappings":"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"}
1
+ {"version":3,"file":"index17.js","sources":["../src/components/MenuList/index.tsx"],"sourcesContent":["import React, { forwardRef, useState, useMemo } from 'react';\nimport { MenuItem, MenuItemProps } from 'src/components/MenuItem';\nimport { InputWithIcon } from '../InputWithIcon';\nimport { useRovingFocus } from 'src/utils/a11y/useRovingFocus';\n\nexport type MenuListProps = {\n items: MenuItemProps[];\n maxHeight?: string;\n shouldShowSearch?: boolean;\n searchPlaceholder?: string;\n searchBy?: string;\n searchResultEmptyMessage?: string;\n className?: string;\n};\n\nexport const MenuList = forwardRef<HTMLDivElement, MenuListProps>(({\n items,\n maxHeight,\n shouldShowSearch = false,\n searchPlaceholder = 'Search...',\n searchBy = 'label',\n searchResultEmptyMessage = 'No results found',\n className = ''\n}, ref) => {\n const [searchQuery, setSearchQuery] = useState('');\n\n const getFilteredItems = () => {\n if (!searchQuery.trim()) {\n return items;\n }\n return items.filter((item) => {\n const searchValue = item[searchBy as keyof MenuItemProps]?.toString().toLowerCase() || '';\n return searchValue.includes(searchQuery.toLowerCase());\n });\n };\n\n const renderSearchBar = () => {\n return (\n <div className=\"w-full relative flex items-center border-b border-[var(--color-gray-300)] px-1\">\n <InputWithIcon\n leftIcon={{ name: 'search', position: 'left', style: { color: 'var(--color-gray-500)' } }}\n value={searchQuery}\n onChange={(value) => setSearchQuery(value)}\n placeholder={searchPlaceholder}\n style={{ margin: 0, gap: 0 }}\n inputStyle={{ width: '100%', border: 'none', outline: 'none' }}\n automationId=\"se-design-menu-list-search\"\n />\n </div>\n );\n };\n\n const filteredItems = getFilteredItems();\n const containerStyle = maxHeight\n ? {\n maxHeight,\n overflowY: 'auto' as const\n }\n : {};\n\n \n const itemIdByRef = useMemo(() => {\n const map = new WeakMap<MenuItemProps, string>();\n const seen = new Set<string>();\n\n items.forEach((item, index) => {\n const baseId = item.id || item.automationId || `menu-item-${index}`;\n let uniqueId = baseId;\n\n if (seen.has(uniqueId)) {\n uniqueId = `${baseId}-${index}`;\n }\n\n seen.add(uniqueId);\n map.set(item, uniqueId);\n });\n\n return map;\n }, [items]);\n\n const itemIds = useMemo(() => {\n return filteredItems\n .filter((item) => item.type !== 'header' && item.type !== 'separator')\n .map((item) => itemIdByRef.get(item) as string);\n }, [filteredItems, itemIdByRef]);\n\n // Use roving focus for arrow key navigation\n const { getRovingItemProps, handleKeyDown, setFocusedId } = useRovingFocus({\n itemIds,\n orientation: 'vertical',\n loop: true\n });\n\n return (\n <div\n ref={ref}\n className={`se-design-menu-list border border-[var(--color-gray-200)] rounded shadow-md ${\n shouldShowSearch ? '' : 'py-2'\n }${className ? ` ${className}` : ''}`}\n role=\"menu\"\n aria-label=\"Menu\"\n >\n {shouldShowSearch && renderSearchBar()}\n <div style={containerStyle} className={`overflow-y-auto ${shouldShowSearch ? 'py-2' : ''}`}>\n {filteredItems.length > 0 ? (\n filteredItems.map((item) => {\n const stableId = itemIdByRef.get(item) as string;\n\n if (item.type === 'separator') {\n return (\n <hr key={stableId} className=\"se-design-menu-separator cursor-default border-[var(--color-gray-200)]\" />\n );\n }\n\n if (item.type === 'header') {\n return (\n <div\n key={stableId}\n className=\"se-design-menu-header cursor-default px-2 mx-1 text-sm pt-2 text-[var(--color-gray-650)]\"\n role=\"presentation\"\n >\n {item.label}\n </div>\n );\n }\n\n const rovingProps = getRovingItemProps(stableId);\n return (\n <MenuItem\n {...item}\n key={stableId}\n ref={rovingProps.ref}\n tabIndex={rovingProps.tabIndex}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocusedId(stableId)}\n />\n );\n })\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\" role=\"status\" aria-live=\"polite\">{searchResultEmptyMessage}</div>\n )}\n </div>\n </div>\n );\n});\n\nMenuList.displayName = 'MenuList';\n"],"names":["MenuList","items","maxHeight","shouldShowSearch","searchPlaceholder","searchBy","searchResultEmptyMessage","className","ref","searchQuery","setSearchQuery","useState","getFilteredItems","trim","filter","item","toString","toLowerCase","includes","renderSearchBar","React","createElement","InputWithIcon","leftIcon","name","position","style","color","value","onChange","placeholder","margin","gap","inputStyle","width","border","outline","automationId","filteredItems","containerStyle","overflowY","itemIdByRef","useMemo","map","WeakMap","seen","Set","forEach","index","baseId","id","uniqueId","has","add","set","itemIds","type","get","getRovingItemProps","handleKeyDown","setFocusedId","useRovingFocus","orientation","loop","role","length","stableId","key","label","rovingProps","MenuItem","_extends","tabIndex","onKeyDown","onFocus","displayName"],"mappings":"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"}