@oneplatformdev/ui 0.1.99-beta.27 → 0.1.99-beta.271

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 (252) hide show
  1. package/Accordion/Accordion.d.ts +1 -1
  2. package/Accordion/Accordion.d.ts.map +1 -1
  3. package/Accordion/Accordion.js +48 -26
  4. package/Accordion/Accordion.js.map +1 -1
  5. package/AlertDialog/AlertDialog.stories.js +66 -23
  6. package/AlertDialog/AlertDialog.stories.js.map +1 -1
  7. package/AlertDialog/AlertDialogRoot.d.ts.map +1 -1
  8. package/AlertDialog/AlertDialogRoot.js +19 -18
  9. package/AlertDialog/AlertDialogRoot.js.map +1 -1
  10. package/Button/Button.d.ts.map +1 -1
  11. package/Button/Button.js +40 -40
  12. package/Button/Button.js.map +1 -1
  13. package/Button/Button.stories.js +15 -12
  14. package/Button/Button.stories.js.map +1 -1
  15. package/Button/Button.utils.d.ts +3 -0
  16. package/Button/Button.utils.d.ts.map +1 -0
  17. package/Button/Button.utils.js +14 -0
  18. package/Button/Button.utils.js.map +1 -0
  19. package/Button/buttonVariants.d.ts +2 -2
  20. package/Button/buttonVariants.d.ts.map +1 -1
  21. package/Button/buttonVariants.js +38 -6
  22. package/Button/buttonVariants.js.map +1 -1
  23. package/Button/index.d.ts +1 -0
  24. package/Button/index.d.ts.map +1 -1
  25. package/Button/index.js +8 -6
  26. package/Button/index.js.map +1 -1
  27. package/ButtonIcon/ButtonIcon.d.ts.map +1 -1
  28. package/ButtonIcon/ButtonIcon.js +47 -47
  29. package/ButtonIcon/ButtonIcon.js.map +1 -1
  30. package/ButtonIcon/ButtonIcon.stories.js +35 -33
  31. package/ButtonIcon/ButtonIcon.stories.js.map +1 -1
  32. package/ButtonIcon/buttonIconVariants.d.ts +1 -1
  33. package/ButtonIcon/buttonIconVariants.d.ts.map +1 -1
  34. package/ButtonIcon/buttonIconVariants.js +3 -2
  35. package/ButtonIcon/buttonIconVariants.js.map +1 -1
  36. package/CHANGELOG.md +1527 -0
  37. package/Card/Card.d.ts.map +1 -1
  38. package/Card/Card.js +22 -21
  39. package/Card/Card.js.map +1 -1
  40. package/Checkbox/Checkbox.d.ts.map +1 -1
  41. package/Checkbox/Checkbox.js +35 -33
  42. package/Checkbox/Checkbox.js.map +1 -1
  43. package/Checkbox/Checkbox.stories.js +108 -0
  44. package/Checkbox/Checkbox.stories.js.map +1 -0
  45. package/Checkbox/Checkbox.types.d.ts +2 -1
  46. package/Checkbox/Checkbox.types.d.ts.map +1 -1
  47. package/Combobox/Combobox.d.ts +4 -2
  48. package/Combobox/Combobox.d.ts.map +1 -1
  49. package/Combobox/Combobox.js +222 -192
  50. package/Combobox/Combobox.js.map +1 -1
  51. package/Combobox/Combobox.stories.js +231 -85
  52. package/Combobox/Combobox.stories.js.map +1 -1
  53. package/Combobox/Combobox.types.d.ts +88 -24
  54. package/Combobox/Combobox.types.d.ts.map +1 -1
  55. package/Combobox/Combobox.types.js +4 -1
  56. package/Combobox/Combobox.types.js.map +1 -1
  57. package/Combobox/ComboboxOptionItem.d.ts +5 -3
  58. package/Combobox/ComboboxOptionItem.d.ts.map +1 -1
  59. package/Combobox/ComboboxOptionItem.js +80 -23
  60. package/Combobox/ComboboxOptionItem.js.map +1 -1
  61. package/Combobox/ComboboxRenderContent.d.ts +28 -0
  62. package/Combobox/ComboboxRenderContent.d.ts.map +1 -0
  63. package/Combobox/ComboboxRenderContent.js +142 -0
  64. package/Combobox/ComboboxRenderContent.js.map +1 -0
  65. package/Combobox/ComboboxRenderOptions.d.ts +4 -0
  66. package/Combobox/ComboboxRenderOptions.d.ts.map +1 -0
  67. package/Combobox/ComboboxRenderOptions.js +53 -0
  68. package/Combobox/ComboboxRenderOptions.js.map +1 -0
  69. package/Combobox/ComboboxRenderTrigger.d.ts +18 -0
  70. package/Combobox/ComboboxRenderTrigger.d.ts.map +1 -0
  71. package/Combobox/ComboboxRenderTrigger.js +118 -0
  72. package/Combobox/ComboboxRenderTrigger.js.map +1 -0
  73. package/Command/Command.d.ts +6 -1
  74. package/Command/Command.d.ts.map +1 -1
  75. package/Command/Command.js +66 -48
  76. package/Command/Command.js.map +1 -1
  77. package/ContextPopover/ContextDropdownMenu.d.ts +12 -0
  78. package/ContextPopover/ContextDropdownMenu.d.ts.map +1 -0
  79. package/ContextPopover/ContextDropdownMenu.js +41 -0
  80. package/ContextPopover/ContextDropdownMenu.js.map +1 -0
  81. package/ContextPopover/ContextPopover.d.ts +12 -0
  82. package/ContextPopover/ContextPopover.d.ts.map +1 -0
  83. package/ContextPopover/ContextPopover.js +34 -0
  84. package/ContextPopover/ContextPopover.js.map +1 -0
  85. package/ContextPopover/index.d.ts +4 -0
  86. package/ContextPopover/index.d.ts.map +1 -0
  87. package/ContextPopover/index.js +9 -0
  88. package/ContextPopover/index.js.map +1 -0
  89. package/ContextPopover/useContextPopoverHandler.d.ts +14 -0
  90. package/ContextPopover/useContextPopoverHandler.d.ts.map +1 -0
  91. package/ContextPopover/useContextPopoverHandler.js +21 -0
  92. package/ContextPopover/useContextPopoverHandler.js.map +1 -0
  93. package/DataTable/DataTable.js +6 -6
  94. package/DataTable/useDataTable.d.ts +1 -1
  95. package/Dialog/Dialog.d.ts +4 -1
  96. package/Dialog/Dialog.d.ts.map +1 -1
  97. package/Dialog/Dialog.js +82 -40
  98. package/Dialog/Dialog.js.map +1 -1
  99. package/Dialog/Dialog.stories.js +108 -0
  100. package/Dialog/Dialog.stories.js.map +1 -0
  101. package/Dialog/Dialog.types.d.ts +4 -0
  102. package/Dialog/Dialog.types.d.ts.map +1 -0
  103. package/Dialog/Dialog.types.js +2 -0
  104. package/Dialog/Dialog.types.js.map +1 -0
  105. package/Dialog/index.d.ts +1 -0
  106. package/Dialog/index.d.ts.map +1 -1
  107. package/Dialog/useDialogClosePosition.d.ts +11 -0
  108. package/Dialog/useDialogClosePosition.d.ts.map +1 -0
  109. package/Dialog/useDialogClosePosition.js +50 -0
  110. package/Dialog/useDialogClosePosition.js.map +1 -0
  111. package/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  112. package/DropdownMenu/DropdownMenu.js +33 -20
  113. package/DropdownMenu/DropdownMenu.js.map +1 -1
  114. package/Dropzone/Dropzone.d.ts.map +1 -1
  115. package/Dropzone/Dropzone.js +340 -141
  116. package/Dropzone/Dropzone.js.map +1 -1
  117. package/Dropzone/Dropzone.stories.js +308 -0
  118. package/Dropzone/Dropzone.stories.js.map +1 -0
  119. package/Dropzone/Dropzone.types.d.ts +17 -1
  120. package/Dropzone/Dropzone.types.d.ts.map +1 -1
  121. package/Dropzone/Dropzone.types.js +19 -8
  122. package/Dropzone/Dropzone.types.js.map +1 -1
  123. package/Dropzone/DropzoneFilePreview.d.ts.map +1 -1
  124. package/Dropzone/DropzoneFilePreview.js +46 -26
  125. package/Dropzone/DropzoneFilePreview.js.map +1 -1
  126. package/Dropzone/DropzoneSinglePickPreview.d.ts +5 -2
  127. package/Dropzone/DropzoneSinglePickPreview.d.ts.map +1 -1
  128. package/Dropzone/DropzoneSinglePickPreview.js +119 -22
  129. package/Dropzone/DropzoneSinglePickPreview.js.map +1 -1
  130. package/Dropzone/index.js +7 -5
  131. package/Form/FormRenderControl.d.ts +1 -1
  132. package/Form/FormRenderControl.d.ts.map +1 -1
  133. package/Form/FormRenderControl.js +51 -24
  134. package/Form/FormRenderControl.js.map +1 -1
  135. package/Form/FormRenderControl.types.d.ts +4 -1
  136. package/Form/FormRenderControl.types.d.ts.map +1 -1
  137. package/FormCombobox/FormCombobox.d.ts +4 -2
  138. package/FormCombobox/FormCombobox.d.ts.map +1 -1
  139. package/FormCombobox/FormCombobox.js +30 -17
  140. package/FormCombobox/FormCombobox.js.map +1 -1
  141. package/FormCombobox/FormCombobox.types.d.ts +6 -2
  142. package/FormCombobox/FormCombobox.types.d.ts.map +1 -1
  143. package/FormDatePicker/FormDatePicker.d.ts.map +1 -1
  144. package/FormDatePicker/FormDatePicker.js +18 -16
  145. package/FormDatePicker/FormDatePicker.js.map +1 -1
  146. package/FormDropzone/FormDropzone.d.ts.map +1 -1
  147. package/FormDropzone/FormDropzone.js +11 -9
  148. package/FormDropzone/FormDropzone.js.map +1 -1
  149. package/FormInput/FormInput.d.ts.map +1 -1
  150. package/FormInput/FormInput.js +47 -28
  151. package/FormInput/FormInput.js.map +1 -1
  152. package/FormInput/FormInput.stories.js +61 -0
  153. package/FormInput/FormInput.stories.js.map +1 -0
  154. package/FormInput/FormInput.types.d.ts +1 -0
  155. package/FormInput/FormInput.types.d.ts.map +1 -1
  156. package/FormSelect/FormSelect.d.ts.map +1 -1
  157. package/FormSelect/FormSelect.js +33 -29
  158. package/FormSelect/FormSelect.js.map +1 -1
  159. package/FormTextarea/FormTextarea.d.ts.map +1 -1
  160. package/FormTextarea/FormTextarea.js +15 -12
  161. package/FormTextarea/FormTextarea.js.map +1 -1
  162. package/InfoBlock/InfoBlock.d.ts +7 -0
  163. package/InfoBlock/InfoBlock.d.ts.map +1 -0
  164. package/InfoBlock/InfoBlock.js +28 -0
  165. package/InfoBlock/InfoBlock.js.map +1 -0
  166. package/InfoBlock/InfoBlock.stories.js +50 -0
  167. package/InfoBlock/InfoBlock.stories.js.map +1 -0
  168. package/InfoBlock/InfoBlock.types.d.ts +9 -0
  169. package/InfoBlock/InfoBlock.types.d.ts.map +1 -0
  170. package/InfoBlock/InfoBlock.types.js +2 -0
  171. package/InfoBlock/InfoBlock.types.js.map +1 -0
  172. package/InfoBlock/index.d.ts +3 -0
  173. package/InfoBlock/index.d.ts.map +1 -0
  174. package/InfoBlock/index.js +5 -0
  175. package/InfoBlock/index.js.map +1 -0
  176. package/InfoBlock/infoBlockVariants.d.ts +6 -0
  177. package/InfoBlock/infoBlockVariants.d.ts.map +1 -0
  178. package/InfoBlock/infoBlockVariants.js +27 -0
  179. package/InfoBlock/infoBlockVariants.js.map +1 -0
  180. package/Input/Input.d.ts.map +1 -1
  181. package/Input/Input.js +104 -53
  182. package/Input/Input.js.map +1 -1
  183. package/Input/Input.stories.js +225 -0
  184. package/Input/Input.stories.js.map +1 -0
  185. package/Input/Input.types.d.ts +5 -0
  186. package/Input/Input.types.d.ts.map +1 -1
  187. package/LoadingMask/LoadingMask.d.ts +1 -2
  188. package/LoadingMask/LoadingMask.d.ts.map +1 -1
  189. package/LoadingMask/LoadingMask.js +8 -8
  190. package/LoadingMask/LoadingMask.js.map +1 -1
  191. package/LoadingMask/LoadingMask.types.d.ts +1 -0
  192. package/LoadingMask/LoadingMask.types.d.ts.map +1 -1
  193. package/Popover/Popover.d.ts +3 -1
  194. package/Popover/Popover.d.ts.map +1 -1
  195. package/Popover/Popover.js +15 -10
  196. package/Popover/Popover.js.map +1 -1
  197. package/ScrollArea/ScrollArea.d.ts +5 -1
  198. package/ScrollArea/ScrollArea.d.ts.map +1 -1
  199. package/ScrollArea/ScrollArea.js +23 -17
  200. package/ScrollArea/ScrollArea.js.map +1 -1
  201. package/Search/Search.d.ts.map +1 -1
  202. package/Search/Search.js +40 -31
  203. package/Search/Search.js.map +1 -1
  204. package/Select/Select.d.ts.map +1 -1
  205. package/Select/Select.js +53 -48
  206. package/Select/Select.js.map +1 -1
  207. package/Select/Select.types.d.ts +4 -0
  208. package/Select/Select.types.d.ts.map +1 -1
  209. package/Select/SelectRoot.d.ts.map +1 -1
  210. package/Select/SelectRoot.js +81 -68
  211. package/Select/SelectRoot.js.map +1 -1
  212. package/Switch/Switch.d.ts +1 -1
  213. package/Switch/Switch.d.ts.map +1 -1
  214. package/Switch/Switch.js +19 -9
  215. package/Switch/Switch.js.map +1 -1
  216. package/Switch/Switch.stories.js +62 -0
  217. package/Switch/Switch.stories.js.map +1 -0
  218. package/Textarea/Textarea.d.ts.map +1 -1
  219. package/Textarea/Textarea.js +50 -45
  220. package/Textarea/Textarea.js.map +1 -1
  221. package/Textarea/Textarea.types.d.ts +3 -1
  222. package/Textarea/Textarea.types.d.ts.map +1 -1
  223. package/Toast/Toast.d.ts +1 -1
  224. package/Toast/toastVariants.d.ts +1 -1
  225. package/Tooltip/QuestionMarkIcon.svg.js +6 -0
  226. package/Tooltip/QuestionMarkIcon.svg.js.map +1 -0
  227. package/Tooltip/Tooltip.d.ts.map +1 -1
  228. package/Tooltip/Tooltip.js +52 -32
  229. package/Tooltip/Tooltip.js.map +1 -1
  230. package/Tooltip/Tooltip.types.d.ts +10 -0
  231. package/Tooltip/Tooltip.types.d.ts.map +1 -1
  232. package/Tooltip/tooltipVariants.d.ts +4 -0
  233. package/Tooltip/tooltipVariants.d.ts.map +1 -0
  234. package/Tooltip/tooltipVariants.js +23 -0
  235. package/Tooltip/tooltipVariants.js.map +1 -0
  236. package/index.d.ts +2 -0
  237. package/index.d.ts.map +1 -1
  238. package/index.js +352 -340
  239. package/index.js.map +1 -1
  240. package/package.json +10 -6
  241. package/styles.css +1 -0
  242. package/vite-env.d.js +2 -0
  243. package/vite-env.d.js.map +1 -0
  244. package/vite-env.d.ts +7 -0
  245. package/Combobox/ComboboxOptions.d.ts +0 -4
  246. package/Combobox/ComboboxOptions.d.ts.map +0 -1
  247. package/Combobox/ComboboxOptions.js +0 -64
  248. package/Combobox/ComboboxOptions.js.map +0 -1
  249. package/Form/FormTooltipButton.d.ts +0 -6
  250. package/Form/FormTooltipButton.d.ts.map +0 -1
  251. package/Form/FormTooltipButton.js +0 -33
  252. package/Form/FormTooltipButton.js.map +0 -1
@@ -1,40 +1,94 @@
1
- import { jsx as t, jsxs as u } from "react/jsx-runtime";
2
- import { useState as g, useMemo as v } from "react";
3
- import { Combobox as f } from "./Combobox.js";
4
- const h = (e) => new Promise((n) => setTimeout(n, e)), x = (e = []) => {
5
- const n = [], a = (o) => {
6
- if (o?.length)
7
- for (const s of o)
8
- n.push(s), s.items?.length && a(s.items);
1
+ import { jsx as a, jsxs as d } from "react/jsx-runtime";
2
+ import { useState as y, useMemo as x } from "react";
3
+ import { Combobox as g } from "./Combobox.js";
4
+ const b = (e) => new Promise((t) => setTimeout(t, e)), v = (e = []) => {
5
+ const t = [], l = (n) => {
6
+ if (n?.length)
7
+ for (const o of n)
8
+ t.push(o), o.items?.length && l(o.items);
9
9
  };
10
- return a(e), n;
11
- }, d = (e, n = 350) => async (a) => {
12
- await h(n);
13
- const o = (a ?? "").trim().toLowerCase();
14
- if (!o) return e;
15
- const s = x(e), b = new Set(
16
- s.filter((i) => String(i.label).toLowerCase().includes(o)).map((i) => String(i.value))
17
- ), m = (i) => i.map((c) => {
18
- const p = c.items?.length ? m(c.items) : void 0;
19
- return !(b.has(String(c.value)) || String(c.label).toLowerCase().includes(o)) && !p?.length ? null : { ...c, items: p };
10
+ return l(e), t;
11
+ }, p = (e, t = 150) => async ({ search: l }) => {
12
+ await b(t);
13
+ const n = (l ?? "").trim().toLowerCase();
14
+ if (!n) return e;
15
+ const o = v(e), u = new Set(
16
+ o.filter((s) => String(s.label).toLowerCase().includes(n)).map((s) => String(s.value))
17
+ ), i = (s) => s.map((c) => {
18
+ const h = c.items?.length ? i(c.items) : void 0;
19
+ return !(u.has(String(c.value)) || String(c.label).toLowerCase().includes(n)) && !h?.length ? null : { ...c, items: h };
20
20
  }).filter(Boolean);
21
- return m(e);
22
- }, r = [
21
+ return i(e);
22
+ }, C = (e, t) => {
23
+ const l = (t ?? "").trim().toLowerCase();
24
+ if (!l) return e;
25
+ const n = v(e), o = new Set(
26
+ n.filter((i) => String(i.label).toLowerCase().includes(l)).map((i) => String(i.value))
27
+ ), u = (i) => i.map((s) => {
28
+ const c = s.items?.length ? u(s.items) : void 0;
29
+ return !(o.has(String(s.value)) || String(s.label).toLowerCase().includes(l)) && !c?.length ? null : { ...s, items: c };
30
+ }).filter(Boolean);
31
+ return u(e);
32
+ }, N = (e, t = 250, l = 20) => async ({ search: n, offset: o = 0 }) => {
33
+ await b(t);
34
+ const u = C(e, n), i = v(u);
35
+ return {
36
+ data: i.slice(o, o + l),
37
+ total: i.length
38
+ };
39
+ }, m = [
23
40
  { value: "ua", label: "Ukraine" },
24
41
  { value: "pl", label: "Poland" },
25
42
  { value: "de", label: "Germany" },
26
43
  { value: "fr", label: "France" },
27
44
  { value: "es", label: "Spain" },
28
45
  { value: "it", label: "Italy" }
29
- ], y = [
46
+ ], w = Array.from({ length: 120 }).map((e, t) => ({
47
+ value: `option-${t + 1}`,
48
+ label: `Option ${t + 1}`
49
+ })), f = [
30
50
  {
31
51
  value: "europe",
32
52
  label: "Europe",
33
53
  items: [
54
+ {
55
+ value: "fr",
56
+ label: "France",
57
+ items: [
58
+ {
59
+ value: "paris",
60
+ label: "Paris (Île-de-France)",
61
+ items: [
62
+ { value: "paris-1", label: "Paris 1st arrondissement" },
63
+ { value: "paris-3", label: "Paris 3rd arrondissement" },
64
+ { value: "paris-10", label: "Paris 10th arrondissement" }
65
+ ]
66
+ },
67
+ { value: "marseille", label: "Marseille (Provence-Alpes-Côte d'Azur)" },
68
+ {
69
+ value: "lyon",
70
+ label: "Lyon (Auvergne-Rhône-Alpes)",
71
+ items: [
72
+ { value: "lyon-presquile", label: "Presqu'île (1st/2nd)" },
73
+ { value: "lyon-vieux", label: "Vieux Lyon" }
74
+ ]
75
+ },
76
+ { value: "toulouse", label: "Toulouse (Occitanie)" },
77
+ { value: "bordeaux", label: "Bordeaux (Nouvelle-Aquitaine)" },
78
+ { value: "strasbourg", label: "Strasbourg (Grand Est)" },
79
+ {
80
+ value: "rennes",
81
+ label: "Rennes (Brittany)",
82
+ items: [
83
+ { value: "rennes-centre", label: "Rennes Centre" },
84
+ { value: "rennes-beauregard", label: "Beauregard" }
85
+ ]
86
+ }
87
+ ]
88
+ },
34
89
  { value: "ua", label: "Ukraine" },
35
90
  { value: "pl", label: "Poland" },
36
- { value: "de", label: "Germany" },
37
- { value: "fr", label: "France" }
91
+ { value: "de", label: "Germany" }
38
92
  ]
39
93
  },
40
94
  {
@@ -43,27 +97,67 @@ const h = (e) => new Promise((n) => setTimeout(n, e)), x = (e = []) => {
43
97
  items: [
44
98
  { value: "us", label: "United States" },
45
99
  { value: "ca", label: "Canada" },
46
- { value: "mx", label: "Mexico" }
100
+ { value: "mx", label: "Mexico" },
101
+ { value: "north-america-long", label: "To long option to test wrapping. ".repeat(3) },
102
+ {
103
+ value: "north-america-long-single",
104
+ label: "To long option to test wrapping. ".replace(/ /g, "_").repeat(3)
105
+ }
47
106
  ]
48
107
  }
49
- ];
50
- function l({ initialValue: e = "", ...n }) {
51
- const [a, o] = g(e), s = v(
52
- () => n.fetchOptions,
108
+ ], S = (e) => e.flatMap((t) => [
109
+ t,
110
+ ...t.items ? S(t.items) : []
111
+ ]);
112
+ function r({ initialValue: e = "", ...t }) {
113
+ const [l, n] = y(e), o = x(
114
+ () => t.loadData,
53
115
  // eslint-disable-next-line react-hooks/exhaustive-deps
54
116
  []
55
117
  );
56
- return /* @__PURE__ */ u("div", { className: "max-w-sm", children: [
57
- /* @__PURE__ */ t(f, { ...n, value: a, onChange: o, fetchOptions: s }),
58
- /* @__PURE__ */ u("div", { className: "mt-3 text-xs text-muted-foreground", children: [
118
+ return /* @__PURE__ */ d("div", { className: "max-w-sm", children: [
119
+ /* @__PURE__ */ a(
120
+ g,
121
+ {
122
+ type: "single",
123
+ ...t,
124
+ value: l,
125
+ onChange: n,
126
+ loadData: o,
127
+ defaultNodeMatched: !0
128
+ }
129
+ ),
130
+ /* @__PURE__ */ d("div", { className: "mt-3 text-xs text-muted-foreground", children: [
131
+ "value: ",
132
+ /* @__PURE__ */ a("span", { className: "font-mono", children: String(l || "") })
133
+ ] })
134
+ ] });
135
+ }
136
+ function O({
137
+ initialValue: e = [],
138
+ ...t
139
+ }) {
140
+ const [l, n] = y(e), o = x(() => t.loadData, []);
141
+ return /* @__PURE__ */ d("div", { className: "max-w-sm", children: [
142
+ /* @__PURE__ */ a(
143
+ g,
144
+ {
145
+ ...t,
146
+ type: "multi",
147
+ value: l,
148
+ onChange: n,
149
+ loadData: o
150
+ }
151
+ ),
152
+ /* @__PURE__ */ d("div", { className: "mt-3 text-xs text-muted-foreground", children: [
59
153
  "value: ",
60
- /* @__PURE__ */ t("span", { className: "font-mono", children: String(a || "") })
154
+ /* @__PURE__ */ a("span", { className: "font-mono", children: (l || []).join(", ") })
61
155
  ] })
62
156
  ] });
63
157
  }
64
- const w = {
65
- title: "UI/Combobox",
66
- component: f,
158
+ const D = {
159
+ title: "Combobox",
160
+ component: g,
67
161
  parameters: {
68
162
  layout: "centered"
69
163
  },
@@ -72,10 +166,10 @@ const w = {
72
166
  searchLabel: "Type to search...",
73
167
  emptyLabel: "No options",
74
168
  disabled: !1,
75
- fetchOptions: d(r, 250)
169
+ loadData: p(m, 250)
76
170
  },
77
171
  argTypes: {
78
- fetchOptions: { control: !1 },
172
+ loadData: { control: !1 },
79
173
  onChange: { control: !1 },
80
174
  onMount: { control: !1 },
81
175
  emptyAction: { control: !1 },
@@ -85,55 +179,55 @@ const w = {
85
179
  value: { control: !1 }
86
180
  },
87
181
  decorators: [
88
- (e) => /* @__PURE__ */ t("div", { className: "p-6 w-[420px]", children: /* @__PURE__ */ t(e, {}) })
182
+ (e) => /* @__PURE__ */ a("div", { className: "p-6 w-[420px]", children: /* @__PURE__ */ a(e, {}) })
89
183
  ]
90
- }, A = {
91
- render: (e) => /* @__PURE__ */ t(l, { ...e })
92
- }, L = {
93
- render: (e) => /* @__PURE__ */ t(l, { ...e, initialValue: "pl" })
94
- }, I = {
184
+ }, P = {
185
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
186
+ }, F = {
187
+ render: (e) => /* @__PURE__ */ a(r, { ...e, initialValue: "pl" })
188
+ }, V = {
95
189
  args: { disabled: !0 },
96
- render: (e) => /* @__PURE__ */ t(l, { ...e, initialValue: "de" })
97
- }, M = {
190
+ render: (e) => /* @__PURE__ */ a(r, { ...e, initialValue: "de" })
191
+ }, k = {
98
192
  args: {
99
- options: r,
100
- fetchOptions: async () => r
193
+ options: m,
194
+ loadData: async () => m
101
195
  },
102
- render: (e) => /* @__PURE__ */ t(l, { ...e })
103
- }, P = {
196
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
197
+ }, B = {
104
198
  args: {
105
- fetchOptions: d(r, 1200)
199
+ loadData: p(m, 1200)
106
200
  },
107
- render: (e) => /* @__PURE__ */ t(l, { ...e })
108
- }, T = {
201
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
202
+ }, I = {
109
203
  args: {
110
204
  emptyLabel: "Nothing found",
111
205
  emptyAction: (e) => {
112
- const n = !!e.search?.trim();
113
- return /* @__PURE__ */ t(
206
+ const t = !!e.search?.trim();
207
+ return /* @__PURE__ */ a(
114
208
  "button",
115
209
  {
116
210
  type: "button",
117
211
  className: "inline-flex items-center justify-center rounded-md border px-3 py-1.5 text-sm",
118
- disabled: !n,
212
+ disabled: !t,
119
213
  onClick: () => {
120
- const a = e.search.trim(), o = { value: a, label: `Create "${a}"` };
121
- e.setOptions([o]), e.setLoading(!1);
214
+ const l = e.search.trim(), n = { value: l, label: `Create "${l}"` };
215
+ e.setOptions([n]), e.setLoading(!1);
122
216
  },
123
217
  children: "Create option"
124
218
  }
125
219
  );
126
220
  }
127
221
  },
128
- render: (e) => /* @__PURE__ */ t(l, { ...e })
129
- }, k = {
222
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
223
+ }, E = {
130
224
  args: {
131
- commandInputAction: (e) => /* @__PURE__ */ u("div", { className: "px-3 py-2 flex items-center justify-between text-xs text-muted-foreground", children: [
132
- /* @__PURE__ */ u("span", { children: [
225
+ commandInputAction: (e) => /* @__PURE__ */ d("div", { className: "px-3 py-2 flex items-center justify-between text-xs text-muted-foreground", children: [
226
+ /* @__PURE__ */ d("span", { children: [
133
227
  "results: ",
134
- /* @__PURE__ */ t("span", { className: "font-mono", children: e.options.length })
228
+ /* @__PURE__ */ a("span", { className: "font-mono", children: e.options.length })
135
229
  ] }),
136
- /* @__PURE__ */ t(
230
+ /* @__PURE__ */ a(
137
231
  "button",
138
232
  {
139
233
  type: "button",
@@ -146,10 +240,10 @@ const w = {
146
240
  )
147
241
  ] })
148
242
  },
149
- render: (e) => /* @__PURE__ */ t(l, { ...e })
150
- }, E = {
243
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
244
+ }, W = {
151
245
  args: {
152
- listHeadAction: (e) => /* @__PURE__ */ t(
246
+ listHeadAction: (e) => /* @__PURE__ */ a(
153
247
  "button",
154
248
  {
155
249
  type: "button",
@@ -161,32 +255,84 @@ const w = {
161
255
  }
162
256
  )
163
257
  },
164
- render: (e) => /* @__PURE__ */ t(l, { ...e })
165
- }, F = {
258
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
259
+ }, j = {
166
260
  args: {
167
- fetchOptions: d(y, 250)
261
+ listFooterAction: (e) => /* @__PURE__ */ a(
262
+ "button",
263
+ {
264
+ type: "button",
265
+ className: "w-full text-left min-h-10 text-sm",
266
+ onClick: () => {
267
+ e.setSearch(""), e.setOpen(!1);
268
+ },
269
+ children: "list footer action"
270
+ }
271
+ )
168
272
  },
169
- render: (e) => /* @__PURE__ */ t(l, { ...e })
170
- }, V = {
273
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
274
+ }, q = {
275
+ args: {
276
+ loadData: p(f, 250)
277
+ // defaultNodeDisabled: false,
278
+ // defaultNodeMatched: false,
279
+ // defaultNodeMuted: true,
280
+ // defaultNodeInteractive: false,
281
+ },
282
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
283
+ }, _ = {
284
+ args: {
285
+ loadData: p(f, 250),
286
+ onMount: async (e) => {
287
+ await b(900), e.setOptions(S(f));
288
+ }
289
+ },
290
+ render: (e) => /* @__PURE__ */ a(O, { ...e, initialValue: ["fr", "de"] })
291
+ }, R = {
171
292
  args: {
172
- fetchOptions: d(r, 250),
293
+ loadData: p(m, 250),
173
294
  onMount: async (e) => {
174
- await h(900), e.setOptions(r), e.setLoading(!1);
295
+ await b(900), e.setOptions(m);
175
296
  }
176
297
  },
177
- render: (e) => /* @__PURE__ */ t(l, { ...e })
298
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
299
+ }, $ = {
300
+ args: {
301
+ renderTrigger: (e) => (console.log("state", e), /* @__PURE__ */ a(
302
+ "button",
303
+ {
304
+ type: "button",
305
+ className: "w-full",
306
+ onClick: () => e.setOpen((t) => !t),
307
+ children: e.selectedOption ? `Selected: ${e.selectedOption.label}` : "Select option..."
308
+ }
309
+ ))
310
+ },
311
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
312
+ }, G = {
313
+ args: {
314
+ placeholder: "Select option...",
315
+ searchLabel: "Type to search...",
316
+ emptyLabel: "No options",
317
+ loadData: N(w, 500, 20)
318
+ },
319
+ render: (e) => /* @__PURE__ */ a(r, { ...e })
178
320
  };
179
321
  export {
180
- A as Default,
181
- I as Disabled,
182
- T as EmptyStateWithAction,
183
- F as NestedOptions,
184
- V as OnMountPrefetch,
185
- P as SlowFetchLoading,
186
- k as WithCommandInputAction,
187
- E as WithListHeadAction,
188
- M as WithStaticOptionsProp,
189
- L as WithValueSelected,
190
- w as default
322
+ P as Default,
323
+ V as Disabled,
324
+ I as EmptyStateWithAction,
325
+ G as InfiniteScrollLoadMore,
326
+ q as NestedOptions,
327
+ _ as NestedOptionsMulti,
328
+ R as OnMountPrefetch,
329
+ $ as RenderCustomTrigger,
330
+ B as SlowFetchLoading,
331
+ E as WithCommandInputAction,
332
+ j as WithListFooterAction,
333
+ W as WithListHeadAction,
334
+ k as WithStaticOptionsProp,
335
+ F as WithValueSelected,
336
+ D as default
191
337
  };
192
338
  //# sourceMappingURL=Combobox.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.stories.js","sources":["../../src/Combobox/Combobox.stories.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\r\nimport type { Meta, StoryObj } from '@storybook/react';\r\n\r\nimport { Combobox } from './Combobox';\r\nimport type {\r\n ComboboxCallbackStateParams,\r\n ComboboxOption,\r\n ComboboxProps,\r\n} from './Combobox.types';\r\n\r\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\r\n\r\nconst flatten = (nodes: ComboboxOption[] = []): ComboboxOption[] => {\r\n const res: ComboboxOption[] = [];\r\n const walk = (list?: ComboboxOption[]) => {\r\n if (!list?.length) return;\r\n for (const n of list) {\r\n res.push(n);\r\n if (n.items?.length) walk(n.items);\r\n }\r\n };\r\n walk(nodes);\r\n return res;\r\n};\r\n\r\nconst createFetchOptions =\r\n (all: ComboboxOption[], delayMs = 350): ComboboxProps['fetchOptions'] =>\r\n async (search?: string) => {\r\n await sleep(delayMs);\r\n\r\n const q = (search ?? '').trim().toLowerCase();\r\n if (!q) return all;\r\n\r\n // simple \"contains\" search across flattened options; then return top-level filtered\r\n // (enough for Storybook demos; your real API can do better)\r\n const allFlat = flatten(all);\r\n const matchedValues = new Set(\r\n allFlat\r\n .filter((o) => String(o.label).toLowerCase().includes(q))\r\n .map((o) => String(o.value)),\r\n );\r\n\r\n const filterTree = (list: ComboboxOption[]): ComboboxOption[] => {\r\n return list\r\n .map((n) => {\r\n const items = n.items?.length ? filterTree(n.items) : undefined;\r\n const selfMatch =\r\n matchedValues.has(String(n.value)) ||\r\n String(n.label).toLowerCase().includes(q);\r\n\r\n if (!selfMatch && !items?.length) return null;\r\n return { ...n, items };\r\n })\r\n .filter(Boolean) as ComboboxOption[];\r\n };\r\n\r\n return filterTree(all);\r\n };\r\n\r\nconst BASE_OPTIONS: ComboboxOption[] = [\r\n { value: 'ua', label: 'Ukraine' },\r\n { value: 'pl', label: 'Poland' },\r\n { value: 'de', label: 'Germany' },\r\n { value: 'fr', label: 'France' },\r\n { value: 'es', label: 'Spain' },\r\n { value: 'it', label: 'Italy' },\r\n];\r\n\r\nconst NESTED_OPTIONS: ComboboxOption[] = [\r\n {\r\n value: 'europe',\r\n label: 'Europe',\r\n items: [\r\n { value: 'ua', label: 'Ukraine' },\r\n { value: 'pl', label: 'Poland' },\r\n { value: 'de', label: 'Germany' },\r\n { value: 'fr', label: 'France' },\r\n ],\r\n },\r\n {\r\n value: 'north-america',\r\n label: 'North America',\r\n items: [\r\n { value: 'us', label: 'United States' },\r\n { value: 'ca', label: 'Canada' },\r\n { value: 'mx', label: 'Mexico' },\r\n ],\r\n },\r\n];\r\n\r\ntype ControlledProps = Omit<ComboboxProps, 'value' | 'onChange'> & {\r\n initialValue?: ComboboxProps['value'];\r\n};\r\n\r\nfunction ControlledCombobox({ initialValue = '', ...args }: ControlledProps) {\r\n const [value, setValue] = useState<ComboboxProps['value']>(initialValue);\r\n\r\n // keep stable reference if someone passes inline fetchOptions\r\n const fetchOptions = useMemo(\r\n () => args.fetchOptions,\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n\r\n return (\r\n <div className=\"max-w-sm\">\r\n <Combobox {...args} value={value} onChange={setValue} fetchOptions={fetchOptions} />\r\n <div className=\"mt-3 text-xs text-muted-foreground\">\r\n value: <span className=\"font-mono\">{String(value || '')}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nconst meta = {\r\n title: 'UI/Combobox',\r\n component: Combobox,\r\n parameters: {\r\n layout: 'centered',\r\n },\r\n args: {\r\n placeholder: 'Select option...',\r\n searchLabel: 'Type to search...',\r\n emptyLabel: 'No options',\r\n disabled: false,\r\n fetchOptions: createFetchOptions(BASE_OPTIONS, 250),\r\n },\r\n argTypes: {\r\n fetchOptions: { control: false },\r\n onChange: { control: false },\r\n onMount: { control: false },\r\n emptyAction: { control: false },\r\n commandInputAction: { control: false },\r\n listHeadAction: { control: false },\r\n options: { control: false },\r\n value: { control: false },\r\n },\r\n decorators: [\r\n (Story) => (\r\n <div className=\"p-6 w-[420px]\">\r\n <Story />\r\n </div>\r\n ),\r\n ],\r\n} satisfies Meta<typeof Combobox>;\r\n\r\nexport default meta;\r\n\r\ntype Story = StoryObj<typeof meta>;\r\n\r\n/** 1) Default (async options) */\r\nexport const Default: Story = {\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 2) With initial selected value */\r\nexport const WithValueSelected: Story = {\r\n render: (args) => <ControlledCombobox {...args} initialValue=\"pl\" />,\r\n};\r\n\r\n/** 3) Disabled */\r\nexport const Disabled: Story = {\r\n args: { disabled: true },\r\n render: (args) => <ControlledCombobox {...args} initialValue=\"de\" />,\r\n};\r\n\r\n/** 4) Static options via `options` prop (no async needed, but fetchOptions still required) */\r\nexport const WithStaticOptionsProp: Story = {\r\n args: {\r\n options: BASE_OPTIONS,\r\n fetchOptions: async () => BASE_OPTIONS,\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 5) Slow fetch to show loading state on open/search */\r\nexport const SlowFetchLoading: Story = {\r\n args: {\r\n fetchOptions: createFetchOptions(BASE_OPTIONS, 1200),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 6) Empty state with action (search something like \"zzz\") */\r\nexport const EmptyStateWithAction: Story = {\r\n args: {\r\n emptyLabel: 'Nothing found',\r\n emptyAction: (st: ComboboxCallbackStateParams) => {\r\n const canCreate = Boolean(st.search?.trim());\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"inline-flex items-center justify-center rounded-md border px-3 py-1.5 text-sm\"\r\n disabled={!canCreate}\r\n onClick={() => {\r\n const v = st.search.trim();\r\n const next: ComboboxOption = { value: v, label: `Create \"${v}\"` };\r\n st.setOptions([next]);\r\n st.setLoading(false);\r\n }}\r\n >\r\n Create option\r\n </button>\r\n );\r\n },\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 7) commandInputAction (helper row under input) */\r\nexport const WithCommandInputAction: Story = {\r\n args: {\r\n commandInputAction: (st: ComboboxCallbackStateParams) => (\r\n <div className=\"px-3 py-2 flex items-center justify-between text-xs text-muted-foreground\">\r\n <span>\r\n results: <span className=\"font-mono\">{st.options.length}</span>\r\n </span>\r\n <button\r\n type=\"button\"\r\n className=\"underline\"\r\n onClick={() => {\r\n st.setSearch('');\r\n st.setLoading(false);\r\n }}\r\n >\r\n Clear search\r\n </button>\r\n </div>\r\n ),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 8) listHeadAction (top action inside list) */\r\nexport const WithListHeadAction: Story = {\r\n args: {\r\n listHeadAction: (st: ComboboxCallbackStateParams) => (\r\n <button\r\n type=\"button\"\r\n className=\"w-full text-left px-3 py-2 text-sm\"\r\n onClick={() => {\r\n st.setSearch('');\r\n st.setOpen(false);\r\n }}\r\n >\r\n Close list\r\n </button>\r\n ),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 9) Nested options tree */\r\nexport const NestedOptions: Story = {\r\n args: {\r\n fetchOptions: createFetchOptions(NESTED_OPTIONS, 250),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 10) onMount initial loading (simulate prefetch on mount) */\r\nexport const OnMountPrefetch: Story = {\r\n args: {\r\n fetchOptions: createFetchOptions(BASE_OPTIONS, 250),\r\n onMount: async (st: ComboboxCallbackStateParams) => {\r\n await sleep(900);\r\n st.setOptions(BASE_OPTIONS);\r\n st.setLoading(false);\r\n },\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n"],"names":["sleep","ms","r","flatten","nodes","res","walk","list","n","createFetchOptions","all","delayMs","search","q","allFlat","matchedValues","o","filterTree","items","BASE_OPTIONS","NESTED_OPTIONS","ControlledCombobox","initialValue","args","value","setValue","useState","fetchOptions","useMemo","jsxs","jsx","Combobox","meta","Story","Default","WithValueSelected","Disabled","WithStaticOptionsProp","SlowFetchLoading","EmptyStateWithAction","st","canCreate","v","next","WithCommandInputAction","WithListHeadAction","NestedOptions","OnMountPrefetch"],"mappings":"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"}
1
+ {"version":3,"file":"Combobox.stories.js","sources":["../../src/Combobox/Combobox.stories.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\r\nimport type { Meta, StoryObj } from '@storybook/react';\r\n\r\nimport { Combobox } from './Combobox';\r\nimport {\r\n ComboboxCallbackStateParams,\r\n ComboboxOption,\r\n ComboboxProps, MultiComboboxProps, SingleComboboxProps,\r\n} from './Combobox.types';\r\n\r\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\r\n\r\nconst flatten = (nodes: ComboboxOption[] = []): ComboboxOption[] => {\r\n const res: ComboboxOption[] = [];\r\n const walk = (list?: ComboboxOption[]) => {\r\n if (!list?.length) return;\r\n for (const n of list) {\r\n res.push(n);\r\n if (n.items?.length) walk(n.items);\r\n }\r\n };\r\n walk(nodes);\r\n return res;\r\n};\r\n\r\nconst createFetchOptions =\r\n (all: ComboboxOption[], delayMs = 150): ComboboxProps['loadData'] =>\r\n async ({ search }) => {\r\n await sleep(delayMs);\r\n\r\n const q = (search ?? '').trim().toLowerCase();\r\n if (!q) return all;\r\n\r\n // simple \"contains\" search across flattened options; then return top-level filtered\r\n // (enough for Storybook demos; your real API can do better)\r\n const allFlat = flatten(all);\r\n const matchedValues = new Set(\r\n allFlat\r\n .filter((o) => String(o.label).toLowerCase().includes(q))\r\n .map((o) => String(o.value)),\r\n );\r\n\r\n const filterTree = (list: ComboboxOption[]): ComboboxOption[] => {\r\n return list\r\n .map((n) => {\r\n const items = n.items?.length ? filterTree(n.items) : undefined;\r\n const selfMatch =\r\n matchedValues.has(String(n.value)) ||\r\n String(n.label).toLowerCase().includes(q);\r\n\r\n if (!selfMatch && !items?.length) return null;\r\n return { ...n, items };\r\n })\r\n .filter(Boolean) as ComboboxOption[];\r\n };\r\n\r\n return filterTree(all);\r\n };\r\n\r\n\r\nconst filterTreeBySearch = (\r\n all: ComboboxOption[],\r\n search?: string,\r\n): ComboboxOption[] => {\r\n const q = (search ?? '').trim().toLowerCase();\r\n if (!q) return all;\r\n\r\n const allFlat = flatten(all);\r\n\r\n const matchedValues = new Set(\r\n allFlat\r\n .filter((o) => String(o.label).toLowerCase().includes(q))\r\n .map((o) => String(o.value)),\r\n );\r\n\r\n const filterTree = (list: ComboboxOption[]): ComboboxOption[] => {\r\n return list\r\n .map((n) => {\r\n const items = n.items?.length ? filterTree(n.items) : undefined;\r\n const selfMatch =\r\n matchedValues.has(String(n.value)) ||\r\n String(n.label).toLowerCase().includes(q);\r\n\r\n if (!selfMatch && !items?.length) return null;\r\n return { ...n, items };\r\n })\r\n .filter(Boolean) as ComboboxOption[];\r\n };\r\n\r\n return filterTree(all);\r\n};\r\n\r\nconst createPaginatedFetchOptions =\r\n (\r\n all: ComboboxOption[],\r\n delayMs = 250,\r\n limit = 20,\r\n ): ComboboxProps['loadData'] =>\r\n async ({ search, offset = 0 }) => {\r\n await sleep(delayMs);\r\n\r\n const filteredTree = filterTreeBySearch(all, search);\r\n const filteredFlat = flatten(filteredTree);\r\n\r\n const data = filteredFlat.slice(offset, offset + limit);\r\n\r\n return {\r\n data,\r\n total: filteredFlat.length,\r\n };\r\n };\r\n\r\nconst BASE_OPTIONS: ComboboxOption[] = [\r\n { value: 'ua', label: 'Ukraine' },\r\n { value: 'pl', label: 'Poland' },\r\n { value: 'de', label: 'Germany' },\r\n { value: 'fr', label: 'France' },\r\n { value: 'es', label: 'Spain' },\r\n { value: 'it', label: 'Italy' },\r\n];\r\n\r\nconst MANY_OPTIONS: ComboboxOption[] = Array.from({ length: 120 }).map((_, i) => ({\r\n value: `option-${i + 1}`,\r\n label: `Option ${i + 1}`,\r\n}));\r\n\r\nconst NESTED_OPTIONS: ComboboxOption[] = [\r\n {\r\n value: 'europe',\r\n label: 'Europe',\r\n items: [\r\n {\r\n value: 'fr',\r\n label: 'France',\r\n items: [\r\n {\r\n value: 'paris',\r\n label: 'Paris (Île-de-France)',\r\n items: [\r\n { value: 'paris-1', label: 'Paris 1st arrondissement' },\r\n { value: 'paris-3', label: 'Paris 3rd arrondissement' },\r\n { value: 'paris-10', label: 'Paris 10th arrondissement' },\r\n ],\r\n },\r\n { value: 'marseille', label: 'Marseille (Provence-Alpes-Côte d\\'Azur)' },\r\n {\r\n value: 'lyon',\r\n label: 'Lyon (Auvergne-Rhône-Alpes)',\r\n items: [\r\n { value: 'lyon-presquile', label: 'Presqu\\'île (1st/2nd)' },\r\n { value: 'lyon-vieux', label: 'Vieux Lyon' },\r\n ],\r\n },\r\n { value: 'toulouse', label: 'Toulouse (Occitanie)' },\r\n { value: 'bordeaux', label: 'Bordeaux (Nouvelle-Aquitaine)' },\r\n { value: 'strasbourg', label: 'Strasbourg (Grand Est)' },\r\n {\r\n value: 'rennes',\r\n label: 'Rennes (Brittany)',\r\n items: [\r\n { value: 'rennes-centre', label: 'Rennes Centre' },\r\n { value: 'rennes-beauregard', label: 'Beauregard' },\r\n ],\r\n },\r\n ]\r\n },\r\n { value: 'ua', label: 'Ukraine' },\r\n { value: 'pl', label: 'Poland' },\r\n { value: 'de', label: 'Germany' },\r\n ],\r\n },\r\n {\r\n value: 'north-america',\r\n label: 'North America',\r\n items: [\r\n { value: 'us', label: 'United States' },\r\n { value: 'ca', label: 'Canada' },\r\n { value: 'mx', label: 'Mexico' },\r\n { value: 'north-america-long', label: 'To long option to test wrapping. '.repeat(3) },\r\n {\r\n value: 'north-america-long-single',\r\n label: 'To long option to test wrapping. '.replace(/ /g, '_').repeat(3)\r\n },\r\n ],\r\n },\r\n];\r\nconst getFlattenOptions = (options: ComboboxOption[]) => {\r\n return options.flatMap(option => [\r\n option,\r\n ...(option.items ? getFlattenOptions(option.items) : [])\r\n ]);\r\n};\r\n\r\nconst getAllValues = (options: ComboboxOption[]): string[] => {\r\n return getFlattenOptions(options).map(o => o.value)\r\n};\r\n\r\ntype ControlledProps<T extends ComboboxProps = ComboboxProps> = Omit<T, 'value' | 'onChange'> & {\r\n initialValue?: T['value'];\r\n};\r\n\r\nfunction ControlledCombobox({ initialValue = '', ...args }: ControlledProps<SingleComboboxProps>) {\r\n const [ value, setValue ] = useState<SingleComboboxProps['value']>(initialValue);\r\n const loadData = useMemo(\r\n () => args.loadData,\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n\r\n return (\r\n <div className=\"max-w-sm\">\r\n <Combobox type='single' {...args} value={value} onChange={setValue} loadData={loadData}\r\n defaultNodeMatched/>\r\n <div className=\"mt-3 text-xs text-muted-foreground\">\r\n value: <span className=\"font-mono\">{String(value || '')}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ControlledComboboxMulti({\r\n initialValue = [],\r\n ...args\r\n }: ControlledProps<MultiComboboxProps>) {\r\n const [ value, setValue ] = useState<MultiComboboxProps['value'] | undefined>(initialValue);\r\n const loadData = useMemo(() => args.loadData, []);\r\n return (\r\n <div className=\"max-w-sm\">\r\n <Combobox\r\n {...args}\r\n type='multi'\r\n value={value}\r\n onChange={setValue}\r\n loadData={loadData}\r\n />\r\n <div className=\"mt-3 text-xs text-muted-foreground\">\r\n value: <span className=\"font-mono\">{(value || []).join(', ')}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nconst meta = {\r\n title: 'Combobox',\r\n component: Combobox,\r\n parameters: {\r\n layout: 'centered',\r\n },\r\n args: {\r\n placeholder: 'Select option...',\r\n searchLabel: 'Type to search...',\r\n emptyLabel: 'No options',\r\n disabled: false,\r\n loadData: createFetchOptions(BASE_OPTIONS, 250),\r\n },\r\n argTypes: {\r\n loadData: { control: false },\r\n onChange: { control: false },\r\n onMount: { control: false },\r\n emptyAction: { control: false },\r\n commandInputAction: { control: false },\r\n listHeadAction: { control: false },\r\n options: { control: false },\r\n value: { control: false },\r\n },\r\n decorators: [\r\n (Story) => (\r\n <div className=\"p-6 w-[420px]\">\r\n <Story/>\r\n </div>\r\n ),\r\n ],\r\n} satisfies Meta<typeof Combobox>;\r\n\r\nexport default meta;\r\n\r\ntype Story = StoryObj<typeof meta>;\r\n\r\n/** 1) Default (async options) */\r\nexport const Default: Story = {\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 2) With initial selected value */\r\nexport const WithValueSelected: Story = {\r\n render: (args) => <ControlledCombobox {...args} initialValue=\"pl\"/>,\r\n};\r\n\r\n/** 3) Disabled */\r\nexport const Disabled: Story = {\r\n args: { disabled: true },\r\n render: (args) => <ControlledCombobox {...args} initialValue=\"de\"/>,\r\n};\r\n\r\n/** 4) Static options via `options` prop (no async needed, but loadData still required) */\r\nexport const WithStaticOptionsProp: Story = {\r\n args: {\r\n options: BASE_OPTIONS,\r\n loadData: async () => BASE_OPTIONS,\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 5) Slow fetch to show loading state on open/search */\r\nexport const SlowFetchLoading: Story = {\r\n args: {\r\n loadData: createFetchOptions(BASE_OPTIONS, 1200),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 6) Empty state with action (search something like \"zzz\") */\r\nexport const EmptyStateWithAction: Story = {\r\n args: {\r\n emptyLabel: 'Nothing found',\r\n emptyAction: (st: ComboboxCallbackStateParams) => {\r\n const canCreate = Boolean(st.search?.trim());\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"inline-flex items-center justify-center rounded-md border px-3 py-1.5 text-sm\"\r\n disabled={!canCreate}\r\n onClick={() => {\r\n const v = st.search.trim();\r\n const next: ComboboxOption = { value: v, label: `Create \"${v}\"` };\r\n st.setOptions([ next ]);\r\n st.setLoading(false);\r\n }}\r\n >\r\n Create option\r\n </button>\r\n );\r\n },\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 7) commandInputAction (helper row under input) */\r\nexport const WithCommandInputAction: Story = {\r\n args: {\r\n commandInputAction: (st: ComboboxCallbackStateParams) => (\r\n <div className=\"px-3 py-2 flex items-center justify-between text-xs text-muted-foreground\">\r\n <span>\r\n results: <span className=\"font-mono\">{st.options.length}</span>\r\n </span>\r\n <button\r\n type=\"button\"\r\n className=\"underline\"\r\n onClick={() => {\r\n st.setSearch('');\r\n st.setLoading(false);\r\n }}\r\n >\r\n Clear search\r\n </button>\r\n </div>\r\n ),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 8) listHeadAction (top action inside list) */\r\nexport const WithListHeadAction: Story = {\r\n args: {\r\n listHeadAction: (st: ComboboxCallbackStateParams) => (\r\n <button\r\n type=\"button\"\r\n className=\"w-full text-left px-3 py-2 text-sm\"\r\n onClick={() => {\r\n st.setSearch('');\r\n st.setOpen(false);\r\n }}\r\n >\r\n Close list\r\n </button>\r\n ),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 9) listHeadAction (footer action outside of list) */\r\nexport const WithListFooterAction: Story = {\r\n args: {\r\n listFooterAction: (st: ComboboxCallbackStateParams) => (\r\n <button\r\n type=\"button\"\r\n className=\"w-full text-left min-h-10 text-sm\"\r\n onClick={() => {\r\n st.setSearch('');\r\n st.setOpen(false);\r\n }}\r\n >\r\n list footer action\r\n </button>\r\n ),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 10) Nested options tree */\r\nexport const NestedOptions: Story = {\r\n args: {\r\n loadData: createFetchOptions(NESTED_OPTIONS, 250),\r\n // defaultNodeDisabled: false,\r\n // defaultNodeMatched: false,\r\n // defaultNodeMuted: true,\r\n // defaultNodeInteractive: false,\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 11) Multi Nested options tree */\r\nexport const NestedOptionsMulti: Story = {\r\n args: {\r\n loadData: createFetchOptions(NESTED_OPTIONS, 250),\r\n onMount: async (st: ComboboxCallbackStateParams<object, 'single'>) => {\r\n await sleep(900);\r\n st.setOptions(getFlattenOptions(NESTED_OPTIONS));\r\n },\r\n },\r\n render: (args) => {\r\n const TEST_FULL = false;\r\n const initialValues = TEST_FULL ? getAllValues(NESTED_OPTIONS) : [ 'fr', 'de' ];\r\n return <ControlledComboboxMulti {...args} initialValue={initialValues}/>\r\n },\r\n};\r\n\r\n/** 12) onMount initial loading (simulate prefetch on mount) */\r\nexport const OnMountPrefetch: Story = {\r\n args: {\r\n loadData: createFetchOptions(BASE_OPTIONS, 250),\r\n onMount: async (st: ComboboxCallbackStateParams<object, 'multi'>) => {\r\n await sleep(900);\r\n st.setOptions(BASE_OPTIONS);\r\n },\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 13) render custom trigger */\r\nexport const RenderCustomTrigger: Story = {\r\n args: {\r\n renderTrigger: (state) => {\r\n console.log('state', state);\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"w-full\"\r\n onClick={() => state.setOpen((o) => !o)}\r\n >\r\n {state.selectedOption ? `Selected: ${state.selectedOption.label}` : 'Select option...'}\r\n </button>\r\n )\r\n }\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n\r\n/** 14) Load more with infinite scroll */\r\nexport const InfiniteScrollLoadMore: Story = {\r\n args: {\r\n placeholder: 'Select option...',\r\n searchLabel: 'Type to search...',\r\n emptyLabel: 'No options',\r\n loadData: createPaginatedFetchOptions(MANY_OPTIONS, 500, 20),\r\n },\r\n render: (args) => <ControlledCombobox {...args} />,\r\n};\r\n"],"names":["sleep","ms","r","flatten","nodes","res","walk","list","n","createFetchOptions","all","delayMs","search","q","allFlat","matchedValues","o","filterTree","items","filterTreeBySearch","createPaginatedFetchOptions","limit","offset","filteredTree","filteredFlat","BASE_OPTIONS","MANY_OPTIONS","_","i","NESTED_OPTIONS","getFlattenOptions","options","option","ControlledCombobox","initialValue","args","value","setValue","useState","loadData","useMemo","jsxs","jsx","Combobox","ControlledComboboxMulti","meta","Story","Default","WithValueSelected","Disabled","WithStaticOptionsProp","SlowFetchLoading","EmptyStateWithAction","st","canCreate","v","next","WithCommandInputAction","WithListHeadAction","WithListFooterAction","NestedOptions","NestedOptionsMulti","OnMountPrefetch","RenderCustomTrigger","state","InfiniteScrollLoadMore"],"mappings":"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"}
@@ -1,50 +1,114 @@
1
- import { Dispatch, ReactNode, SetStateAction } from 'react';
2
- export interface ComboboxOption {
1
+ import { Dispatch, HTMLAttributes, ReactNode, Ref, SetStateAction } from 'react';
2
+ export type ComboboxValueType = string | string[];
3
+ export type ComboboxSelectedType = 'single' | 'multi';
4
+ export declare const DEFAULT_COMBOBOX_TYPE: ComboboxSelectedType;
5
+ export interface ComboboxOption<Data extends object = object> {
3
6
  value: string;
4
7
  label: string;
5
- items?: ComboboxOption[];
8
+ node?: Data;
9
+ items?: ComboboxOption<Data>[];
10
+ path?: string[];
11
+ parent?: string;
12
+ level?: number;
13
+ matched?: boolean;
6
14
  }
7
- export interface ComboboxCallbackStateParams {
8
- options: ComboboxOption[];
9
- setOptions: Dispatch<SetStateAction<ComboboxOption[]>>;
10
- selectedOption?: ComboboxOption;
11
- setSelectedOption: Dispatch<SetStateAction<ComboboxOption | undefined>>;
15
+ export interface ComboboxCallbackStateParams<Data extends object = object, T extends ComboboxSelectedType = 'single'> {
16
+ options: ComboboxOption<Data>[];
17
+ setOptions: Dispatch<SetStateAction<ComboboxOption<Data>[]>>;
12
18
  search: string;
13
19
  setSearch: Dispatch<SetStateAction<string>>;
20
+ onChangeOption: (option: ComboboxOption<Data>) => void;
14
21
  open: boolean;
15
22
  setOpen: Dispatch<SetStateAction<boolean>>;
16
23
  loading: boolean;
17
24
  setLoading: Dispatch<SetStateAction<boolean>>;
18
25
  isEmptyList: boolean;
19
26
  isSearchedEmptyList: boolean;
27
+ placeholder?: string;
28
+ type: T;
29
+ selectedOption: T extends 'single' ? ComboboxOption<Data> | undefined : ComboboxOption<Data>[];
30
+ setSelectedOption: T extends 'single' ? Dispatch<SetStateAction<ComboboxOption<Data> | undefined>> : Dispatch<SetStateAction<ComboboxOption<Data>[] | undefined>>;
20
31
  }
21
- export interface IComboboxOptionsNodeProps {
22
- value?: string;
23
- option: ComboboxOption;
24
- onChangeOption?: (option: ComboboxOption) => void;
32
+ export type ComboboxCallbackStateParamsUnion<Data extends object = object> = ComboboxCallbackStateParams<Data, 'single'> | ComboboxCallbackStateParams<Data, 'multi'>;
33
+ export type ComboboxCallbackStateParamsRenderHandler<Data extends object = object> = (params: ComboboxCallbackStateParamsUnion<Data>) => ReactNode;
34
+ export interface IComboboxOptionsNodeHandlersProps<Data extends object = object> {
35
+ defaultNodeOpen?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
36
+ defaultNodeDisabled?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
37
+ defaultNodeMatched?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
38
+ defaultNodeMuted?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
39
+ defaultNodeInteractive?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
40
+ /** Use onPointerUp instead of cmdk onSelect. Fixes selection inside modal Dialog. */
41
+ forcePointerSelect?: boolean;
42
+ }
43
+ export interface IComboboxOptionsNodeProps<Data extends object = object> extends IComboboxOptionsNodeHandlersProps<Data> {
44
+ type: ComboboxSelectedType;
45
+ search?: string;
46
+ value?: ComboboxValueType;
47
+ option: ComboboxOption<Data>;
48
+ onSelect?: (option: ComboboxOption<Data>) => void;
25
49
  deep?: number;
26
- setOpen: Dispatch<SetStateAction<boolean>>;
27
50
  }
28
- export interface IComboboxOptionsProps extends Omit<IComboboxOptionsNodeProps, 'option'> {
29
- options?: ComboboxOption[];
51
+ export interface IComboboxOptionsProps<Data extends object = object> extends Omit<IComboboxOptionsNodeProps<Data>, 'option'>, IComboboxOptionsNodeHandlersProps<Data> {
52
+ options?: ComboboxOption<Data>[];
30
53
  }
31
- export interface ComboboxProps {
32
- value: string;
33
- onChange: (value: string) => void;
54
+ interface IListActionProps extends HTMLAttributes<HTMLDivElement> {
55
+ bordered?: boolean;
56
+ }
57
+ interface IPopoverSlotProps {
58
+ /** Set Popover modal mode. Use `true` when Combobox is inside a modal Dialog. */
59
+ modal?: boolean;
60
+ /** Container element for Popover portal. Use to render inside modal Dialog. */
61
+ container?: HTMLElement | null;
62
+ }
63
+ export interface ISlotProps {
64
+ popover?: IPopoverSlotProps;
65
+ listFooterAction?: IListActionProps;
66
+ }
67
+ type ComboboxLoadDataParams = {
68
+ search?: string;
69
+ offset?: number;
70
+ };
71
+ type ComboboxLoadDataResult<Data extends object = object> = {
72
+ data: ComboboxOption<Data>[];
73
+ total: number;
74
+ };
75
+ type ComboboxLoadDataReturn<Data extends object = object> = ComboboxOption<Data>[] | ComboboxLoadDataResult<Data>;
76
+ type ComboboxLoadData<Data extends object = object> = (params: ComboboxLoadDataParams, signal: AbortSignal, controller: ComboboxCallbackStateParams<Data, 'single'> | ComboboxCallbackStateParams<Data, 'multi'>) => Promise<ComboboxLoadDataReturn<Data>>;
77
+ export interface ComboboxBaseProps<Data extends object = object, T extends ComboboxSelectedType = 'single'> extends IComboboxOptionsNodeHandlersProps {
78
+ type?: T;
79
+ imperativeRef?: Ref<ComboboxCallbackStateParams<Data, 'single'> | ComboboxCallbackStateParams<Data, 'multi'> | null>;
34
80
  placeholder?: string;
35
81
  searchLabel?: string;
36
82
  disabled?: boolean;
37
- fetchOptions: (search?: string) => Promise<ComboboxOption[]>;
38
- options?: ComboboxOption[];
83
+ /** Callback for load data on search debounce */
84
+ loadData: ComboboxLoadData<Data>;
85
+ options?: ComboboxOption<Data>[];
39
86
  /** Command Empty list label*/
40
87
  emptyLabel?: string;
41
88
  /** Command Empty list action */
42
- emptyAction?: ((params: ComboboxCallbackStateParams) => ReactNode) | ReactNode;
89
+ emptyAction?: ((params: ComboboxCallbackStateParams<Data, T>) => ReactNode) | ReactNode;
43
90
  /** Command Input footer action */
44
- commandInputAction?: ((params: ComboboxCallbackStateParams) => ReactNode) | ReactNode;
91
+ commandInputAction?: ((params: ComboboxCallbackStateParams<Data, T>) => ReactNode) | ReactNode;
45
92
  /** Command List first element action */
46
- listHeadAction?: ((params: ComboboxCallbackStateParams) => ReactNode) | ReactNode;
93
+ listHeadAction?: ((params: ComboboxCallbackStateParams<Data, T>) => ReactNode) | ReactNode;
94
+ /** Command List footer element action */
95
+ listFooterAction?: ((params: ComboboxCallbackStateParams<Data, T>) => ReactNode) | ReactNode;
47
96
  /** Callback for load data on start component */
48
- onMount?: (params: ComboboxCallbackStateParams) => Promise<void>;
97
+ onMount?: (params: ComboboxCallbackStateParams<Data, T>) => Promise<void>;
98
+ renderTrigger?: (params: ComboboxCallbackStateParams<Data, T>) => ReactNode;
99
+ renderList?: (params: ComboboxCallbackStateParams<Data, T>) => ReactNode;
100
+ slotProps?: ISlotProps;
101
+ }
102
+ export interface SingleComboboxProps<Data extends object = object> extends ComboboxBaseProps<Data, 'single'> {
103
+ type?: 'single';
104
+ value?: string;
105
+ onChange: (value: string | undefined) => void;
106
+ }
107
+ export interface MultiComboboxProps<Data extends object = object> extends ComboboxBaseProps<Data, 'multi'> {
108
+ type: 'multi';
109
+ value?: string[];
110
+ onChange: (value: string[] | undefined) => void;
49
111
  }
112
+ export type ComboboxProps<Data extends object = object, T extends ComboboxSelectedType = 'single'> = T extends 'single' ? SingleComboboxProps<Data> : MultiComboboxProps<Data>;
113
+ export {};
50
114
  //# sourceMappingURL=Combobox.types.d.ts.map