@oneplatformdev/ui 0.1.99-beta.21 → 0.1.99-beta.211

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 (186) 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 +3 -2
  6. package/AlertDialog/AlertDialog.stories.js.map +1 -1
  7. package/AlertDialog/AlertDialogRoot.d.ts.map +1 -1
  8. package/AlertDialog/AlertDialogRoot.js +26 -24
  9. package/AlertDialog/AlertDialogRoot.js.map +1 -1
  10. package/Button/Button.d.ts.map +1 -1
  11. package/Button/Button.js +43 -43
  12. package/Button/Button.js.map +1 -1
  13. package/Button/Button.utils.d.ts +3 -0
  14. package/Button/Button.utils.d.ts.map +1 -0
  15. package/Button/Button.utils.js +14 -0
  16. package/Button/Button.utils.js.map +1 -0
  17. package/Button/buttonVariants.d.ts.map +1 -1
  18. package/Button/buttonVariants.js +2 -1
  19. package/Button/buttonVariants.js.map +1 -1
  20. package/Button/index.d.ts +1 -0
  21. package/Button/index.d.ts.map +1 -1
  22. package/Button/index.js +8 -6
  23. package/Button/index.js.map +1 -1
  24. package/ButtonIcon/ButtonIcon.d.ts.map +1 -1
  25. package/ButtonIcon/ButtonIcon.js +41 -39
  26. package/ButtonIcon/ButtonIcon.js.map +1 -1
  27. package/ButtonIcon/ButtonIcon.stories.js +35 -33
  28. package/ButtonIcon/ButtonIcon.stories.js.map +1 -1
  29. package/ButtonIcon/buttonIconVariants.d.ts.map +1 -1
  30. package/ButtonIcon/buttonIconVariants.js +2 -1
  31. package/ButtonIcon/buttonIconVariants.js.map +1 -1
  32. package/CHANGELOG.md +1016 -0
  33. package/Calendar/Calendar.js +5 -4
  34. package/Calendar/Calendar.js.map +1 -1
  35. package/Checkbox/Checkbox.d.ts.map +1 -1
  36. package/Checkbox/Checkbox.js +36 -34
  37. package/Checkbox/Checkbox.js.map +1 -1
  38. package/Checkbox/Checkbox.stories.js +108 -0
  39. package/Checkbox/Checkbox.stories.js.map +1 -0
  40. package/Combobox/Combobox.d.ts +1 -1
  41. package/Combobox/Combobox.d.ts.map +1 -1
  42. package/Combobox/Combobox.js +234 -183
  43. package/Combobox/Combobox.js.map +1 -1
  44. package/Combobox/Combobox.stories.js +260 -0
  45. package/Combobox/Combobox.stories.js.map +1 -0
  46. package/Combobox/Combobox.types.d.ts +46 -20
  47. package/Combobox/Combobox.types.d.ts.map +1 -1
  48. package/Combobox/ComboboxOptionItem.d.ts +4 -3
  49. package/Combobox/ComboboxOptionItem.d.ts.map +1 -1
  50. package/Combobox/ComboboxOptionItem.js +49 -22
  51. package/Combobox/ComboboxOptionItem.js.map +1 -1
  52. package/Combobox/ComboboxOptions.d.ts +2 -2
  53. package/Combobox/ComboboxOptions.d.ts.map +1 -1
  54. package/Combobox/ComboboxOptions.js +61 -51
  55. package/Combobox/ComboboxOptions.js.map +1 -1
  56. package/Command/Command.d.ts +6 -1
  57. package/Command/Command.d.ts.map +1 -1
  58. package/Command/Command.js +61 -43
  59. package/Command/Command.js.map +1 -1
  60. package/DataTable/DataTable.js +16 -15
  61. package/DataTable/DataTable.js.map +1 -1
  62. package/Dialog/Dialog.d.ts +4 -1
  63. package/Dialog/Dialog.d.ts.map +1 -1
  64. package/Dialog/Dialog.js +69 -35
  65. package/Dialog/Dialog.js.map +1 -1
  66. package/Dialog/Dialog.stories.js +102 -0
  67. package/Dialog/Dialog.stories.js.map +1 -0
  68. package/Dialog/Dialog.types.d.ts +4 -0
  69. package/Dialog/Dialog.types.d.ts.map +1 -0
  70. package/Dialog/Dialog.types.js +2 -0
  71. package/Dialog/Dialog.types.js.map +1 -0
  72. package/Dialog/index.d.ts +1 -0
  73. package/Dialog/index.d.ts.map +1 -1
  74. package/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  75. package/DropdownMenu/DropdownMenu.js +33 -20
  76. package/DropdownMenu/DropdownMenu.js.map +1 -1
  77. package/Dropzone/Dropzone.d.ts.map +1 -1
  78. package/Dropzone/Dropzone.js +46 -28
  79. package/Dropzone/Dropzone.js.map +1 -1
  80. package/Dropzone/Dropzone.stories.js +100 -0
  81. package/Dropzone/Dropzone.stories.js.map +1 -0
  82. package/Form/Form.d.ts.map +1 -1
  83. package/Form/Form.js.map +1 -1
  84. package/Form/FormRenderControl.d.ts +1 -1
  85. package/Form/FormRenderControl.d.ts.map +1 -1
  86. package/Form/FormRenderControl.js +54 -14
  87. package/Form/FormRenderControl.js.map +1 -1
  88. package/Form/FormRenderControl.types.d.ts +4 -1
  89. package/Form/FormRenderControl.types.d.ts.map +1 -1
  90. package/FormCombobox/FormCombobox.d.ts +1 -1
  91. package/FormCombobox/FormCombobox.d.ts.map +1 -1
  92. package/FormCombobox/FormCombobox.js +15 -13
  93. package/FormCombobox/FormCombobox.js.map +1 -1
  94. package/FormCombobox/FormCombobox.types.d.ts +1 -1
  95. package/FormCombobox/FormCombobox.types.d.ts.map +1 -1
  96. package/FormDatePicker/FormDatePicker.d.ts.map +1 -1
  97. package/FormDatePicker/FormDatePicker.js +18 -16
  98. package/FormDatePicker/FormDatePicker.js.map +1 -1
  99. package/FormDropzone/FormDropzone.d.ts.map +1 -1
  100. package/FormDropzone/FormDropzone.js +11 -9
  101. package/FormDropzone/FormDropzone.js.map +1 -1
  102. package/FormInput/FormInput.d.ts.map +1 -1
  103. package/FormInput/FormInput.js +47 -27
  104. package/FormInput/FormInput.js.map +1 -1
  105. package/FormInput/FormInput.stories.js +61 -0
  106. package/FormInput/FormInput.stories.js.map +1 -0
  107. package/FormInput/FormInput.types.d.ts +1 -0
  108. package/FormInput/FormInput.types.d.ts.map +1 -1
  109. package/FormSelect/FormSelect.d.ts.map +1 -1
  110. package/FormSelect/FormSelect.js +21 -17
  111. package/FormSelect/FormSelect.js.map +1 -1
  112. package/FormTextarea/FormTextarea.d.ts.map +1 -1
  113. package/FormTextarea/FormTextarea.js +15 -13
  114. package/FormTextarea/FormTextarea.js.map +1 -1
  115. package/InfoBlock/InfoBlock.d.ts +7 -0
  116. package/InfoBlock/InfoBlock.d.ts.map +1 -0
  117. package/InfoBlock/InfoBlock.js +28 -0
  118. package/InfoBlock/InfoBlock.js.map +1 -0
  119. package/InfoBlock/InfoBlock.stories.js +50 -0
  120. package/InfoBlock/InfoBlock.stories.js.map +1 -0
  121. package/InfoBlock/InfoBlock.types.d.ts +9 -0
  122. package/InfoBlock/InfoBlock.types.d.ts.map +1 -0
  123. package/InfoBlock/InfoBlock.types.js +2 -0
  124. package/InfoBlock/InfoBlock.types.js.map +1 -0
  125. package/InfoBlock/index.d.ts +3 -0
  126. package/InfoBlock/index.d.ts.map +1 -0
  127. package/InfoBlock/index.js +5 -0
  128. package/InfoBlock/index.js.map +1 -0
  129. package/InfoBlock/infoBlockVariants.d.ts +6 -0
  130. package/InfoBlock/infoBlockVariants.d.ts.map +1 -0
  131. package/InfoBlock/infoBlockVariants.js +27 -0
  132. package/InfoBlock/infoBlockVariants.js.map +1 -0
  133. package/Input/Input.d.ts.map +1 -1
  134. package/Input/Input.js +65 -51
  135. package/Input/Input.js.map +1 -1
  136. package/Input/Input.types.d.ts +1 -0
  137. package/Input/Input.types.d.ts.map +1 -1
  138. package/Input/inputVariants.d.ts.map +1 -1
  139. package/Input/inputVariants.js +5 -4
  140. package/Input/inputVariants.js.map +1 -1
  141. package/LoadingMask/LoadingMask.d.ts +1 -2
  142. package/LoadingMask/LoadingMask.d.ts.map +1 -1
  143. package/LoadingMask/LoadingMask.js +8 -8
  144. package/LoadingMask/LoadingMask.js.map +1 -1
  145. package/LoadingMask/LoadingMask.types.d.ts +1 -0
  146. package/LoadingMask/LoadingMask.types.d.ts.map +1 -1
  147. package/Popover/Popover.d.ts.map +1 -1
  148. package/Popover/Popover.js +9 -5
  149. package/Popover/Popover.js.map +1 -1
  150. package/Search/Search.d.ts.map +1 -1
  151. package/Search/Search.js +41 -32
  152. package/Search/Search.js.map +1 -1
  153. package/Search/Search.stories.js +17 -0
  154. package/Search/Search.stories.js.map +1 -0
  155. package/Select/Select.d.ts.map +1 -1
  156. package/Select/Select.js +53 -48
  157. package/Select/Select.js.map +1 -1
  158. package/Select/Select.types.d.ts +4 -0
  159. package/Select/Select.types.d.ts.map +1 -1
  160. package/Select/SelectRoot.js +1 -1
  161. package/Select/SelectRoot.js.map +1 -1
  162. package/TablePagination/TablePagination.js +9 -8
  163. package/TablePagination/TablePagination.js.map +1 -1
  164. package/Textarea/Textarea.d.ts.map +1 -1
  165. package/Textarea/Textarea.js +48 -43
  166. package/Textarea/Textarea.js.map +1 -1
  167. package/Textarea/Textarea.stories.js +1 -1
  168. package/Textarea/Textarea.stories.js.map +1 -1
  169. package/Textarea/Textarea.types.d.ts +3 -1
  170. package/Textarea/Textarea.types.d.ts.map +1 -1
  171. package/Toast/Toast.d.ts +1 -1
  172. package/Toast/toastVariants.d.ts +1 -1
  173. package/Tooltip/Tooltip.d.ts.map +1 -1
  174. package/Tooltip/Tooltip.js +41 -29
  175. package/Tooltip/Tooltip.js.map +1 -1
  176. package/Tooltip/Tooltip.types.d.ts +1 -0
  177. package/Tooltip/Tooltip.types.d.ts.map +1 -1
  178. package/Tooltip/tooltipVariants.d.ts +4 -0
  179. package/Tooltip/tooltipVariants.d.ts.map +1 -0
  180. package/Tooltip/tooltipVariants.js +23 -0
  181. package/Tooltip/tooltipVariants.js.map +1 -0
  182. package/index.d.ts +1 -0
  183. package/index.d.ts.map +1 -1
  184. package/index.js +332 -328
  185. package/index.js.map +1 -1
  186. package/package.json +6 -5
@@ -0,0 +1,260 @@
1
+ import { jsx as t, jsxs as u } from "react/jsx-runtime";
2
+ import { useState as v, useMemo as g } from "react";
3
+ import { Combobox as f } from "./Combobox.js";
4
+ const b = (e) => new Promise((l) => setTimeout(l, e)), x = (e = []) => {
5
+ const l = [], n = (o) => {
6
+ if (o?.length)
7
+ for (const s of o)
8
+ l.push(s), s.items?.length && n(s.items);
9
+ };
10
+ return n(e), l;
11
+ }, d = (e, l = 350) => async (n) => {
12
+ await b(l);
13
+ const o = (n ?? "").trim().toLowerCase();
14
+ if (!o) return e;
15
+ const s = x(e), h = 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 !(h.has(String(c.value)) || String(c.label).toLowerCase().includes(o)) && !p?.length ? null : { ...c, items: p };
20
+ }).filter(Boolean);
21
+ return m(e);
22
+ }, r = [
23
+ { value: "ua", label: "Ukraine" },
24
+ { value: "pl", label: "Poland" },
25
+ { value: "de", label: "Germany" },
26
+ { value: "fr", label: "France" },
27
+ { value: "es", label: "Spain" },
28
+ { value: "it", label: "Italy" }
29
+ ], y = [
30
+ {
31
+ value: "europe",
32
+ label: "Europe",
33
+ items: [
34
+ {
35
+ value: "fr",
36
+ label: "France",
37
+ items: [
38
+ {
39
+ value: "paris",
40
+ label: "Paris (Île-de-France)",
41
+ items: [
42
+ { value: "paris-1", label: "Paris 1st arrondissement" },
43
+ { value: "paris-3", label: "Paris 3rd arrondissement" },
44
+ { value: "paris-10", label: "Paris 10th arrondissement" }
45
+ ]
46
+ },
47
+ { value: "marseille", label: "Marseille (Provence-Alpes-Côte d'Azur)" },
48
+ {
49
+ value: "lyon",
50
+ label: "Lyon (Auvergne-Rhône-Alpes)",
51
+ items: [
52
+ { value: "lyon-presquile", label: "Presqu'île (1st/2nd)" },
53
+ { value: "lyon-vieux", label: "Vieux Lyon" }
54
+ ]
55
+ },
56
+ { value: "toulouse", label: "Toulouse (Occitanie)" },
57
+ { value: "bordeaux", label: "Bordeaux (Nouvelle-Aquitaine)" },
58
+ { value: "strasbourg", label: "Strasbourg (Grand Est)" },
59
+ {
60
+ value: "rennes",
61
+ label: "Rennes (Brittany)",
62
+ items: [
63
+ { value: "rennes-centre", label: "Rennes Centre" },
64
+ { value: "rennes-beauregard", label: "Beauregard" }
65
+ ]
66
+ }
67
+ ]
68
+ },
69
+ { value: "ua", label: "Ukraine" },
70
+ { value: "pl", label: "Poland" },
71
+ { value: "de", label: "Germany" }
72
+ ]
73
+ },
74
+ {
75
+ value: "north-america",
76
+ label: "North America",
77
+ items: [
78
+ { value: "us", label: "United States" },
79
+ { value: "ca", label: "Canada" },
80
+ { value: "mx", label: "Mexico" }
81
+ ]
82
+ }
83
+ ];
84
+ function a({ initialValue: e = "", ...l }) {
85
+ const [n, o] = v(e), s = g(
86
+ () => l.fetchOptions,
87
+ // eslint-disable-next-line react-hooks/exhaustive-deps
88
+ []
89
+ );
90
+ return /* @__PURE__ */ u("div", { className: "max-w-sm", children: [
91
+ /* @__PURE__ */ t(f, { ...l, value: n, onChange: o, fetchOptions: s }),
92
+ /* @__PURE__ */ u("div", { className: "mt-3 text-xs text-muted-foreground", children: [
93
+ "value: ",
94
+ /* @__PURE__ */ t("span", { className: "font-mono", children: String(n || "") })
95
+ ] })
96
+ ] });
97
+ }
98
+ const A = {
99
+ title: "Combobox",
100
+ component: f,
101
+ parameters: {
102
+ layout: "centered"
103
+ },
104
+ args: {
105
+ placeholder: "Select option...",
106
+ searchLabel: "Type to search...",
107
+ emptyLabel: "No options",
108
+ disabled: !1,
109
+ fetchOptions: d(r, 250)
110
+ },
111
+ argTypes: {
112
+ fetchOptions: { control: !1 },
113
+ onChange: { control: !1 },
114
+ onMount: { control: !1 },
115
+ emptyAction: { control: !1 },
116
+ commandInputAction: { control: !1 },
117
+ listHeadAction: { control: !1 },
118
+ options: { control: !1 },
119
+ value: { control: !1 }
120
+ },
121
+ decorators: [
122
+ (e) => /* @__PURE__ */ t("div", { className: "p-6 w-[420px]", children: /* @__PURE__ */ t(e, {}) })
123
+ ]
124
+ }, w = {
125
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
126
+ }, L = {
127
+ render: (e) => /* @__PURE__ */ t(a, { ...e, initialValue: "pl" })
128
+ }, P = {
129
+ args: { disabled: !0 },
130
+ render: (e) => /* @__PURE__ */ t(a, { ...e, initialValue: "de" })
131
+ }, M = {
132
+ args: {
133
+ options: r,
134
+ fetchOptions: async () => r
135
+ },
136
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
137
+ }, T = {
138
+ args: {
139
+ fetchOptions: d(r, 1200)
140
+ },
141
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
142
+ }, k = {
143
+ args: {
144
+ emptyLabel: "Nothing found",
145
+ emptyAction: (e) => {
146
+ const l = !!e.search?.trim();
147
+ return /* @__PURE__ */ t(
148
+ "button",
149
+ {
150
+ type: "button",
151
+ className: "inline-flex items-center justify-center rounded-md border px-3 py-1.5 text-sm",
152
+ disabled: !l,
153
+ onClick: () => {
154
+ const n = e.search.trim(), o = { value: n, label: `Create "${n}"` };
155
+ e.setOptions([o]), e.setLoading(!1);
156
+ },
157
+ children: "Create option"
158
+ }
159
+ );
160
+ }
161
+ },
162
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
163
+ }, F = {
164
+ args: {
165
+ commandInputAction: (e) => /* @__PURE__ */ u("div", { className: "px-3 py-2 flex items-center justify-between text-xs text-muted-foreground", children: [
166
+ /* @__PURE__ */ u("span", { children: [
167
+ "results: ",
168
+ /* @__PURE__ */ t("span", { className: "font-mono", children: e.options.length })
169
+ ] }),
170
+ /* @__PURE__ */ t(
171
+ "button",
172
+ {
173
+ type: "button",
174
+ className: "underline",
175
+ onClick: () => {
176
+ e.setSearch(""), e.setLoading(!1);
177
+ },
178
+ children: "Clear search"
179
+ }
180
+ )
181
+ ] })
182
+ },
183
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
184
+ }, I = {
185
+ args: {
186
+ listHeadAction: (e) => /* @__PURE__ */ t(
187
+ "button",
188
+ {
189
+ type: "button",
190
+ className: "w-full text-left px-3 py-2 text-sm",
191
+ onClick: () => {
192
+ e.setSearch(""), e.setOpen(!1);
193
+ },
194
+ children: "Close list"
195
+ }
196
+ )
197
+ },
198
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
199
+ }, B = {
200
+ args: {
201
+ listFooterAction: (e) => /* @__PURE__ */ t(
202
+ "button",
203
+ {
204
+ type: "button",
205
+ className: "w-full text-left min-h-10 text-sm",
206
+ onClick: () => {
207
+ e.setSearch(""), e.setOpen(!1);
208
+ },
209
+ children: "list footer action"
210
+ }
211
+ )
212
+ },
213
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
214
+ }, E = {
215
+ args: {
216
+ fetchOptions: d(y, 250),
217
+ defaultNodeDisabled: !1,
218
+ defaultNodeMatched: !1,
219
+ defaultNodeMuted: !0,
220
+ defaultNodeInteractive: !1
221
+ },
222
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
223
+ }, V = {
224
+ args: {
225
+ fetchOptions: d(r, 250),
226
+ onMount: async (e) => {
227
+ await b(900), e.setOptions(r), e.setLoading(!1);
228
+ }
229
+ },
230
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
231
+ }, W = {
232
+ args: {
233
+ renderTrigger: (e) => (console.log("state", e), /* @__PURE__ */ t(
234
+ "button",
235
+ {
236
+ type: "button",
237
+ className: "w-full",
238
+ onClick: () => e.setOpen((l) => !l),
239
+ children: e.selectedOption ? `Selected: ${e.selectedOption.label}` : "Select option..."
240
+ }
241
+ ))
242
+ },
243
+ render: (e) => /* @__PURE__ */ t(a, { ...e })
244
+ };
245
+ export {
246
+ w as Default,
247
+ P as Disabled,
248
+ k as EmptyStateWithAction,
249
+ E as NestedOptions,
250
+ V as OnMountPrefetch,
251
+ W as RenderCustomTrigger,
252
+ T as SlowFetchLoading,
253
+ F as WithCommandInputAction,
254
+ B as WithListFooterAction,
255
+ I as WithListHeadAction,
256
+ M as WithStaticOptionsProp,
257
+ L as WithValueSelected,
258
+ A as default
259
+ };
260
+ //# sourceMappingURL=Combobox.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Combobox.stories.js","sources":["../../src/Combobox/Combobox.stories.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react';\n\nimport { Combobox } from './Combobox';\nimport type {\n ComboboxCallbackStateParams,\n ComboboxOption,\n ComboboxProps,\n} from './Combobox.types';\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nconst flatten = (nodes: ComboboxOption[] = []): ComboboxOption[] => {\n const res: ComboboxOption[] = [];\n const walk = (list?: ComboboxOption[]) => {\n if (!list?.length) return;\n for (const n of list) {\n res.push(n);\n if (n.items?.length) walk(n.items);\n }\n };\n walk(nodes);\n return res;\n};\n\nconst createFetchOptions =\n (all: ComboboxOption[], delayMs = 350): ComboboxProps['fetchOptions'] =>\n async (search?: string) => {\n await sleep(delayMs);\n\n const q = (search ?? '').trim().toLowerCase();\n if (!q) return all;\n\n // simple \"contains\" search across flattened options; then return top-level filtered\n // (enough for Storybook demos; your real API can do better)\n const allFlat = flatten(all);\n const matchedValues = new Set(\n allFlat\n .filter((o) => String(o.label).toLowerCase().includes(q))\n .map((o) => String(o.value)),\n );\n\n const filterTree = (list: ComboboxOption[]): ComboboxOption[] => {\n return list\n .map((n) => {\n const items = n.items?.length ? filterTree(n.items) : undefined;\n const selfMatch =\n matchedValues.has(String(n.value)) ||\n String(n.label).toLowerCase().includes(q);\n\n if (!selfMatch && !items?.length) return null;\n return { ...n, items };\n })\n .filter(Boolean) as ComboboxOption[];\n };\n\n return filterTree(all);\n };\n\nconst BASE_OPTIONS: ComboboxOption[] = [\n { value: 'ua', label: 'Ukraine' },\n { value: 'pl', label: 'Poland' },\n { value: 'de', label: 'Germany' },\n { value: 'fr', label: 'France' },\n { value: 'es', label: 'Spain' },\n { value: 'it', label: 'Italy' },\n];\n\nconst NESTED_OPTIONS: ComboboxOption[] = [\n {\n value: 'europe',\n label: 'Europe',\n items: [\n {\n value: 'fr',\n label: 'France',\n items: [\n {\n value: 'paris',\n label: 'Paris (Île-de-France)',\n items: [\n { value: 'paris-1', label: 'Paris 1st arrondissement' },\n { value: 'paris-3', label: 'Paris 3rd arrondissement' },\n { value: 'paris-10', label: 'Paris 10th arrondissement' },\n ],\n },\n { value: 'marseille', label: 'Marseille (Provence-Alpes-Côte d\\'Azur)' },\n {\n value: 'lyon',\n label: 'Lyon (Auvergne-Rhône-Alpes)',\n items: [\n { value: 'lyon-presquile', label: 'Presqu\\'île (1st/2nd)' },\n { value: 'lyon-vieux', label: 'Vieux Lyon' },\n ],\n },\n { value: 'toulouse', label: 'Toulouse (Occitanie)' },\n { value: 'bordeaux', label: 'Bordeaux (Nouvelle-Aquitaine)' },\n { value: 'strasbourg', label: 'Strasbourg (Grand Est)' },\n {\n value: 'rennes',\n label: 'Rennes (Brittany)',\n items: [\n { value: 'rennes-centre', label: 'Rennes Centre' },\n { value: 'rennes-beauregard', label: 'Beauregard' },\n ],\n },\n ]\n },\n { value: 'ua', label: 'Ukraine' },\n { value: 'pl', label: 'Poland' },\n { value: 'de', label: 'Germany' },\n ],\n },\n {\n value: 'north-america',\n label: 'North America',\n items: [\n { value: 'us', label: 'United States' },\n { value: 'ca', label: 'Canada' },\n { value: 'mx', label: 'Mexico' },\n ],\n },\n];\n\ntype ControlledProps = Omit<ComboboxProps, 'value' | 'onChange'> & {\n initialValue?: ComboboxProps['value'];\n};\n\nfunction ControlledCombobox({ initialValue = '', ...args }: ControlledProps) {\n const [value, setValue] = useState<ComboboxProps['value']>(initialValue);\n\n // keep stable reference if someone passes inline fetchOptions\n const fetchOptions = useMemo(\n () => args.fetchOptions,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n return (\n <div className=\"max-w-sm\">\n <Combobox {...args} value={value} onChange={setValue} fetchOptions={fetchOptions} />\n <div className=\"mt-3 text-xs text-muted-foreground\">\n value: <span className=\"font-mono\">{String(value || '')}</span>\n </div>\n </div>\n );\n}\n\nconst meta = {\n title: 'Combobox',\n component: Combobox,\n parameters: {\n layout: 'centered',\n },\n args: {\n placeholder: 'Select option...',\n searchLabel: 'Type to search...',\n emptyLabel: 'No options',\n disabled: false,\n fetchOptions: createFetchOptions(BASE_OPTIONS, 250),\n },\n argTypes: {\n fetchOptions: { control: false },\n onChange: { control: false },\n onMount: { control: false },\n emptyAction: { control: false },\n commandInputAction: { control: false },\n listHeadAction: { control: false },\n options: { control: false },\n value: { control: false },\n },\n decorators: [\n (Story) => (\n <div className=\"p-6 w-[420px]\">\n <Story />\n </div>\n ),\n ],\n} satisfies Meta<typeof Combobox>;\n\nexport default meta;\n\ntype Story = StoryObj<typeof meta>;\n\n/** 1) Default (async options) */\nexport const Default: Story = {\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 2) With initial selected value */\nexport const WithValueSelected: Story = {\n render: (args) => <ControlledCombobox {...args} initialValue=\"pl\" />,\n};\n\n/** 3) Disabled */\nexport const Disabled: Story = {\n args: { disabled: true },\n render: (args) => <ControlledCombobox {...args} initialValue=\"de\" />,\n};\n\n/** 4) Static options via `options` prop (no async needed, but fetchOptions still required) */\nexport const WithStaticOptionsProp: Story = {\n args: {\n options: BASE_OPTIONS,\n fetchOptions: async () => BASE_OPTIONS,\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 5) Slow fetch to show loading state on open/search */\nexport const SlowFetchLoading: Story = {\n args: {\n fetchOptions: createFetchOptions(BASE_OPTIONS, 1200),\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 6) Empty state with action (search something like \"zzz\") */\nexport const EmptyStateWithAction: Story = {\n args: {\n emptyLabel: 'Nothing found',\n emptyAction: (st: ComboboxCallbackStateParams) => {\n const canCreate = Boolean(st.search?.trim());\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md border px-3 py-1.5 text-sm\"\n disabled={!canCreate}\n onClick={() => {\n const v = st.search.trim();\n const next: ComboboxOption = { value: v, label: `Create \"${v}\"` };\n st.setOptions([next]);\n st.setLoading(false);\n }}\n >\n Create option\n </button>\n );\n },\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 7) commandInputAction (helper row under input) */\nexport const WithCommandInputAction: Story = {\n args: {\n commandInputAction: (st: ComboboxCallbackStateParams) => (\n <div className=\"px-3 py-2 flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n results: <span className=\"font-mono\">{st.options.length}</span>\n </span>\n <button\n type=\"button\"\n className=\"underline\"\n onClick={() => {\n st.setSearch('');\n st.setLoading(false);\n }}\n >\n Clear search\n </button>\n </div>\n ),\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 8) listHeadAction (top action inside list) */\nexport const WithListHeadAction: Story = {\n args: {\n listHeadAction: (st: ComboboxCallbackStateParams) => (\n <button\n type=\"button\"\n className=\"w-full text-left px-3 py-2 text-sm\"\n onClick={() => {\n st.setSearch('');\n st.setOpen(false);\n }}\n >\n Close list\n </button>\n ),\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 9) listHeadAction (footer action outside of list) */\nexport const WithListFooterAction: Story = {\n args: {\n listFooterAction: (st: ComboboxCallbackStateParams) => (\n <button\n type=\"button\"\n className=\"w-full text-left min-h-10 text-sm\"\n onClick={() => {\n st.setSearch('');\n st.setOpen(false);\n }}\n >\n list footer action\n </button>\n ),\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 10) Nested options tree */\nexport const NestedOptions: Story = {\n args: {\n fetchOptions: createFetchOptions(NESTED_OPTIONS, 250),\n defaultNodeDisabled: false,\n defaultNodeMatched: false,\n defaultNodeMuted: true,\n defaultNodeInteractive: false,\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 11) onMount initial loading (simulate prefetch on mount) */\nexport const OnMountPrefetch: Story = {\n args: {\n fetchOptions: createFetchOptions(BASE_OPTIONS, 250),\n onMount: async (st: ComboboxCallbackStateParams) => {\n await sleep(900);\n st.setOptions(BASE_OPTIONS);\n st.setLoading(false);\n },\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\n\n/** 12) render custom trigger */\nexport const RenderCustomTrigger: Story = {\n args: {\n renderTrigger: (state) => {\n console.log('state', state);\n return (\n <button\n type=\"button\"\n className=\"w-full\"\n onClick={() => state.setOpen((o) => !o)}\n >\n {state.selectedOption ? `Selected: ${state.selectedOption.label}` : 'Select option...'}\n </button>\n )\n }\n },\n render: (args) => <ControlledCombobox {...args} />,\n};\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","WithListFooterAction","NestedOptions","OnMountPrefetch","RenderCustomTrigger","state"],"mappings":"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"}
@@ -1,50 +1,76 @@
1
- import { Dispatch, ReactNode, SetStateAction } from 'react';
2
- export interface ComboboxOption {
1
+ import { Dispatch, HTMLAttributes, ReactNode, SetStateAction } from 'react';
2
+ export interface ComboboxOption<Data extends object = object> {
3
3
  value: string;
4
4
  label: string;
5
- items?: ComboboxOption[];
5
+ node?: Data;
6
+ items?: ComboboxOption<Data>[];
7
+ path?: string[];
8
+ parent?: string;
9
+ level?: number;
10
+ matched?: boolean;
6
11
  }
7
- export interface ComboboxCallbackStateParams {
8
- options: ComboboxOption[];
9
- setOptions: Dispatch<SetStateAction<ComboboxOption[]>>;
10
- selectedOption?: ComboboxOption;
11
- setSelectedOption: Dispatch<SetStateAction<ComboboxOption | undefined>>;
12
+ export interface ComboboxCallbackStateParams<Data extends object = object> {
13
+ options: ComboboxOption<Data>[];
14
+ setOptions: Dispatch<SetStateAction<ComboboxOption<Data>[]>>;
15
+ selectedOption?: ComboboxOption<Data>;
16
+ setSelectedOption: Dispatch<SetStateAction<ComboboxOption<Data> | undefined>>;
12
17
  search: string;
13
18
  setSearch: Dispatch<SetStateAction<string>>;
19
+ onChangeOption: (option: ComboboxOption<Data>) => void;
14
20
  open: boolean;
15
21
  setOpen: Dispatch<SetStateAction<boolean>>;
16
22
  loading: boolean;
17
23
  setLoading: Dispatch<SetStateAction<boolean>>;
18
24
  isEmptyList: boolean;
19
25
  isSearchedEmptyList: boolean;
26
+ placeholder?: string;
27
+ }
28
+ export interface IComboboxOptionsNodeHandlersProps<Data extends object = object> {
29
+ defaultNodeOpen?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
30
+ defaultNodeDisabled?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
31
+ defaultNodeMatched?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
32
+ defaultNodeMuted?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
33
+ defaultNodeInteractive?: boolean | ((option: ComboboxOption<Data>, deep: number) => boolean | undefined);
20
34
  }
21
- export interface IComboboxOptionsNodeProps {
35
+ export interface IComboboxOptionsNodeProps<Data extends object = object> extends IComboboxOptionsNodeHandlersProps<Data> {
36
+ searchTerm?: string;
22
37
  value?: string;
23
- option: ComboboxOption;
24
- onChangeOption?: (option: ComboboxOption) => void;
38
+ option: ComboboxOption<Data>;
39
+ onChangeOption?: (option: ComboboxOption<Data>) => void;
25
40
  deep?: number;
26
41
  setOpen: Dispatch<SetStateAction<boolean>>;
27
42
  }
28
- export interface IComboboxOptionsProps extends Omit<IComboboxOptionsNodeProps, 'option'> {
29
- options?: ComboboxOption[];
43
+ export interface IComboboxOptionsProps<Data extends object = object> extends Omit<IComboboxOptionsNodeProps<Data>, 'option'>, IComboboxOptionsNodeHandlersProps<Data> {
44
+ options?: ComboboxOption<Data>[];
45
+ }
46
+ interface IListActionProps extends HTMLAttributes<HTMLDivElement> {
47
+ bordered?: boolean;
30
48
  }
31
- export interface ComboboxProps {
49
+ export interface ComboboxProps<Data extends object = object> extends IComboboxOptionsNodeHandlersProps {
32
50
  value: string;
33
51
  onChange: (value: string) => void;
34
52
  placeholder?: string;
35
53
  searchLabel?: string;
36
54
  disabled?: boolean;
37
- fetchOptions: (search?: string) => Promise<ComboboxOption[]>;
38
- options?: ComboboxOption[];
55
+ fetchOptions: (search?: string) => Promise<ComboboxOption<Data>[]>;
56
+ options?: ComboboxOption<Data>[];
39
57
  /** Command Empty list label*/
40
58
  emptyLabel?: string;
41
59
  /** Command Empty list action */
42
- emptyAction?: ((params: ComboboxCallbackStateParams) => ReactNode) | ReactNode;
60
+ emptyAction?: ((params: ComboboxCallbackStateParams<Data>) => ReactNode) | ReactNode;
43
61
  /** Command Input footer action */
44
- commandInputAction?: ((params: ComboboxCallbackStateParams) => ReactNode) | ReactNode;
62
+ commandInputAction?: ((params: ComboboxCallbackStateParams<Data>) => ReactNode) | ReactNode;
45
63
  /** Command List first element action */
46
- listHeadAction?: ((params: ComboboxCallbackStateParams) => ReactNode) | ReactNode;
64
+ listHeadAction?: ((params: ComboboxCallbackStateParams<Data>) => ReactNode) | ReactNode;
65
+ /** Command List footer element action */
66
+ listFooterAction?: ((params: ComboboxCallbackStateParams<Data>) => ReactNode) | ReactNode;
47
67
  /** Callback for load data on start component */
48
- onMount?: (params: ComboboxCallbackStateParams) => Promise<void>;
68
+ onMount?: (params: ComboboxCallbackStateParams<Data>) => Promise<void>;
69
+ renderTrigger?: (params: ComboboxCallbackStateParams<Data>) => ReactNode;
70
+ renderList?: (params: ComboboxCallbackStateParams<Data>) => ReactNode;
71
+ slotProps?: {
72
+ listFooterAction?: IListActionProps;
73
+ };
49
74
  }
75
+ export {};
50
76
  //# sourceMappingURL=Combobox.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.types.d.ts","sourceRoot":"","sources":["../../src/Combobox/Combobox.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;IACvD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,EAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC,CAAA;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;CAC3C;AAED,MAAM,WAAW,qBACf,SAAQ,IAAI,CAAC,yBAAyB,EAAE,QAAQ,CAAC;IACjD,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,2BAA2B,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAC/E,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,2BAA2B,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACtF,wCAAwC;IACxC,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,2BAA2B,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAClF,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE"}
1
+ {"version":3,"file":"Combobox.types.d.ts","sourceRoot":"","sources":["../../src/Combobox/Combobox.types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
+ import { PropsWithChildren } from 'react';
1
2
  import { IComboboxOptionsNodeProps } from './Combobox.types';
2
- export declare const ComboboxOptionItem: import('react').ForwardRefExoticComponent<IComboboxOptionsNodeProps & {
3
- children?: import('react').ReactNode | undefined;
4
- } & import('react').RefAttributes<HTMLDivElement>>;
3
+ export declare const ComboboxOptionItem: <Data extends object>(props: PropsWithChildren<IComboboxOptionsNodeProps<Data>> & {
4
+ onCollapseToggle?: () => void;
5
+ }) => import("react/jsx-runtime").JSX.Element;
5
6
  //# sourceMappingURL=ComboboxOptionItem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComboboxOptionItem.d.ts","sourceRoot":"","sources":["../../src/Combobox/ComboboxOptionItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAM7D,eAAO,MAAM,kBAAkB;;kDAsC7B,CAAC"}
1
+ {"version":3,"file":"ComboboxOptionItem.d.ts","sourceRoot":"","sources":["../../src/Combobox/ComboboxOptionItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAK7D,eAAO,MAAM,kBAAkB,GAAI,IAAI,SAAS,MAAM,EACpD,OAAO,iBAAiB,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,GAAG;IAC1D,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B,4CAsFF,CAAA"}
@@ -1,38 +1,65 @@
1
- import { jsxs as s, jsx as a } from "react/jsx-runtime";
2
- import { forwardRef as c } from "react";
3
- import { CommandItem as f } from "../Command/Command.js";
4
- import { Check as d } from "lucide-react";
5
- import { cn as t } from "@oneplatformdev/utils";
6
- const u = 8, C = c((i, n) => {
7
- const { children: r, setOpen: m, option: e, onChangeOption: o, value: l = "", deep: p = 0 } = i;
8
- return /* @__PURE__ */ s(
9
- f,
1
+ import { jsxs as v, jsx as r } from "react/jsx-runtime";
2
+ import { CommandItem as y } from "../Command/Command.js";
3
+ import { Check as h } from "lucide-react";
4
+ import { cn as p } from "@oneplatformdev/utils";
5
+ const N = 24, O = (f) => {
6
+ const {
7
+ children: u,
8
+ setOpen: d,
9
+ option: e,
10
+ onChangeOption: s,
11
+ value: c = "",
12
+ deep: a = 0,
13
+ onCollapseToggle: m,
14
+ defaultNodeDisabled: n,
15
+ defaultNodeMatched: i,
16
+ defaultNodeMuted: l,
17
+ defaultNodeInteractive: t
18
+ } = f;
19
+ return /* @__PURE__ */ v(
20
+ y,
10
21
  {
11
- ref: n,
12
22
  value: e.value,
23
+ "data-matched": e.matched ?? !0,
13
24
  onSelect: () => {
14
- l === e.value ? o?.({ value: "", label: "" }) : o?.(e), m(!1);
25
+ if (!(typeof t == "function" ? t(e, a) : t ?? !0)) return m?.();
26
+ c === e.value ? s?.({ value: "", label: "" }) : s?.(e), d(!1);
15
27
  },
28
+ onClick: (o) => {
29
+ (typeof t == "function" ? t(e, a) : t ?? !0) || (o?.preventDefault(), o?.stopPropagation());
30
+ },
31
+ className: "py-0 gap-0",
16
32
  style: {
17
- paddingLeft: (p + 1) * u
33
+ "--deep-space": `${a * N}px`
18
34
  },
35
+ disabled: typeof n == "function" ? n(e, a) : n ?? !1,
19
36
  children: [
20
- r,
21
- /* @__PURE__ */ a(
37
+ /* @__PURE__ */ r(
38
+ "div",
39
+ {
40
+ style: { paddingLeft: "var(--deep-space)" },
41
+ className: "relative min-w-10 h-10 aspect-square",
42
+ children: u
43
+ }
44
+ ),
45
+ /* @__PURE__ */ r(
22
46
  "span",
23
47
  {
24
- className: t(
25
- "overflow-hidden whitespace-wrap text-ellipsis line-clamp-2"
48
+ className: p(
49
+ "overflow-hidden whitespace-wrap text-ellipsis line-clamp-2",
50
+ (typeof i == "function" ? i(e, a) : i ?? !1) && "font-bold",
51
+ (typeof l == "function" ? l(e, a) : l ?? !1) && "opacity-60",
52
+ !(typeof t == "function" ? t(e, a) : t ?? !0) && "pointer-events-none"
26
53
  ),
27
54
  children: e.label
28
55
  }
29
56
  ),
30
- /* @__PURE__ */ a(
31
- d,
57
+ /* @__PURE__ */ r(
58
+ h,
32
59
  {
33
- className: t(
60
+ className: p(
34
61
  "ml-auto",
35
- l === e.value ? "opacity-100" : "opacity-0"
62
+ c === e.value ? "opacity-100" : "opacity-0"
36
63
  )
37
64
  }
38
65
  )
@@ -40,8 +67,8 @@ const u = 8, C = c((i, n) => {
40
67
  },
41
68
  e.value
42
69
  );
43
- });
70
+ };
44
71
  export {
45
- C as ComboboxOptionItem
72
+ O as ComboboxOptionItem
46
73
  };
47
74
  //# sourceMappingURL=ComboboxOptionItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComboboxOptionItem.js","sources":["../../src/Combobox/ComboboxOptionItem.tsx"],"sourcesContent":["import { forwardRef, PropsWithChildren } from 'react';\nimport { CommandItem } from '../Command';\nimport { IComboboxOptionsNodeProps } from './Combobox.types';\nimport { Check } from 'lucide-react';\nimport { cn } from '@oneplatformdev/utils';\n\nconst DEEP_OFFSET = 8;\n\nexport const ComboboxOptionItem = forwardRef<\n HTMLDivElement,\n PropsWithChildren<IComboboxOptionsNodeProps>\n>((props, ref) => {\n const { children, setOpen, option, onChangeOption, value = '', deep = 0 } = props;\n return (\n <CommandItem\n ref={ref}\n key={option.value}\n value={option.value}\n onSelect={() => {\n if (value === option.value) {\n onChangeOption?.({ value: '', label: '' });\n } else {\n onChangeOption?.(option);\n }\n setOpen(false);\n }}\n style={{\n paddingLeft: (deep + 1) * DEEP_OFFSET,\n }}\n >\n {children}\n <span\n className={cn(\n 'overflow-hidden whitespace-wrap text-ellipsis line-clamp-2'\n )}\n >\n {option.label}\n </span>\n <Check\n className={cn(\n 'ml-auto',\n value === option.value ? 'opacity-100' : 'opacity-0'\n )}\n />\n </CommandItem>\n );\n});\n"],"names":["DEEP_OFFSET","ComboboxOptionItem","forwardRef","props","ref","children","setOpen","option","onChangeOption","value","deep","jsxs","CommandItem","jsx","cn","Check"],"mappings":";;;;;AAMA,MAAMA,IAAc,GAEPC,IAAqBC,EAGhC,CAACC,GAAOC,MAAQ;AAChB,QAAM,EAAE,UAAAC,GAAU,SAAAC,GAAS,QAAAC,GAAQ,gBAAAC,GAAgB,OAAAC,IAAQ,IAAI,MAAAC,IAAO,EAAA,IAAMP;AAC5E,SACE,gBAAAQ;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAAR;AAAA,MAEA,OAAOG,EAAO;AAAA,MACd,UAAU,MAAM;AACd,QAAIE,MAAUF,EAAO,QACnBC,IAAiB,EAAE,OAAO,IAAI,OAAO,IAAI,IAEzCA,IAAiBD,CAAM,GAEzBD,EAAQ,EAAK;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,cAAcI,IAAO,KAAKV;AAAA,MAAA;AAAA,MAG3B,UAAA;AAAA,QAAAK;AAAA,QACD,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,YAAA;AAAA,YAGD,UAAAP,EAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAEV,gBAAAM;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAL,MAAUF,EAAO,QAAQ,gBAAgB;AAAA,YAAA;AAAA,UAC3C;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IA3BKA,EAAO;AAAA,EAAA;AA8BlB,CAAC;"}
1
+ {"version":3,"file":"ComboboxOptionItem.js","sources":["../../src/Combobox/ComboboxOptionItem.tsx"],"sourcesContent":["import { CSSProperties, PropsWithChildren } from 'react';\nimport { CommandItem } from '../Command';\nimport { IComboboxOptionsNodeProps } from './Combobox.types';\nimport { Check } from 'lucide-react';\nimport { cn } from '@oneplatformdev/utils';\n\nconst DEEP_OFFSET = 24;\nexport const ComboboxOptionItem = <Data extends object>(\n props: PropsWithChildren<IComboboxOptionsNodeProps<Data>> & {\n onCollapseToggle?: () => void;\n }\n) => {\n const {\n children,\n setOpen,\n option,\n onChangeOption,\n value = '',\n deep = 0,\n onCollapseToggle,\n defaultNodeDisabled,\n defaultNodeMatched,\n defaultNodeMuted,\n defaultNodeInteractive,\n } = props;\n return (\n <CommandItem\n key={option.value}\n value={option.value}\n data-matched={option.matched ?? true}\n onSelect={() => {\n const interactive = typeof defaultNodeInteractive === \"function\"\n ? defaultNodeInteractive(option, deep)\n : defaultNodeInteractive ?? true\n if(!interactive) return onCollapseToggle?.();\n\n if (value === option.value) onChangeOption?.({ value: '', label: '' });\n else onChangeOption?.(option);\n\n setOpen(false);\n }}\n onClick={(e) => {\n const interactive = typeof defaultNodeInteractive === \"function\"\n ? defaultNodeInteractive(option, deep)\n : defaultNodeInteractive ?? true\n\n if(!interactive) {\n e?.preventDefault();\n e?.stopPropagation();\n }\n }}\n className='py-0 gap-0'\n style={{\n '--deep-space': `${deep * DEEP_OFFSET}px`,\n } as CSSProperties}\n disabled={typeof defaultNodeDisabled === \"function\"\n ? defaultNodeDisabled(option, deep)\n : defaultNodeDisabled ?? false}\n >\n <div\n style={{ paddingLeft: 'var(--deep-space)' }}\n className='relative min-w-10 h-10 aspect-square'\n >\n {children}\n </div>\n <span\n className={cn(\n 'overflow-hidden whitespace-wrap text-ellipsis line-clamp-2',\n (() => {\n return typeof defaultNodeMatched === \"function\"\n ? defaultNodeMatched(option, deep)\n : defaultNodeMatched ?? false\n })() && 'font-bold',\n (() => {\n return typeof defaultNodeMuted === \"function\"\n ? defaultNodeMuted(option, deep)\n : defaultNodeMuted ?? false\n })() && 'opacity-60',\n (() => {\n const res = typeof defaultNodeInteractive === \"function\"\n ? defaultNodeInteractive(option, deep)\n : defaultNodeInteractive ?? true\n return !res;\n })() && 'pointer-events-none',\n )}\n >\n {option.label}\n </span>\n <Check\n className={cn(\n 'ml-auto',\n value === option.value ? 'opacity-100' : 'opacity-0'\n )}\n />\n </CommandItem>\n );\n}\n"],"names":["DEEP_OFFSET","ComboboxOptionItem","props","children","setOpen","option","onChangeOption","value","deep","onCollapseToggle","defaultNodeDisabled","defaultNodeMatched","defaultNodeMuted","defaultNodeInteractive","jsxs","CommandItem","e","jsx","cn","Check"],"mappings":";;;;AAMA,MAAMA,IAAc,IACPC,IAAqB,CAChCC,MAGG;AACH,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,MAAAC,IAAO;AAAA,IACP,kBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,wBAAAC;AAAA,EAAA,IACEX;AACJ,SACE,gBAAAY;AAAA,IAACC;AAAA,IAAA;AAAA,MAEC,OAAOV,EAAO;AAAA,MACd,gBAAcA,EAAO,WAAW;AAAA,MAChC,UAAU,MAAM;AAId,YAAG,EAHiB,OAAOQ,KAA2B,aAClDA,EAAuBR,GAAQG,CAAI,IACnCK,KAA0B,IACb,QAAOJ,IAAA;AAExB,QAAIF,MAAUF,EAAO,QAAOC,IAAiB,EAAE,OAAO,IAAI,OAAO,IAAI,QAC/CD,CAAM,GAE5BD,EAAQ,EAAK;AAAA,MACf;AAAA,MACA,SAAS,CAACY,MAAM;AAKd,SAJoB,OAAOH,KAA2B,aAClDA,EAAuBR,GAAQG,CAAI,IACnCK,KAA0B,QAG5BG,GAAG,eAAA,GACHA,GAAG,gBAAA;AAAA,MAEP;AAAA,MACA,WAAU;AAAA,MACV,OAAO;AAAA,QACL,gBAAgB,GAAGR,IAAOR,CAAW;AAAA,MAAA;AAAA,MAEvC,UAAU,OAAOU,KAAwB,aACrCA,EAAoBL,GAAQG,CAAI,IAChCE,KAAuB;AAAA,MAE3B,UAAA;AAAA,QAAA,gBAAAO;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO,EAAE,aAAa,oBAAA;AAAA,YACtB,WAAU;AAAA,YAET,UAAAd;AAAA,UAAA;AAAA,QAAA;AAAA,QAEH,gBAAAc;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,eAEO,OAAOP,KAAuB,aACjCA,EAAmBN,GAAQG,CAAI,IAC/BG,KAAsB,OAClB;AAAA,eAEC,OAAOC,KAAqB,aAC/BA,EAAiBP,GAAQG,CAAI,IAC7BI,KAAoB,OAClB;AAAA,cAKC,EAHK,OAAOC,KAA2B,aAC1CA,EAAuBR,GAAQG,CAAI,IACnCK,KAA0B,OAExB;AAAA,YAAA;AAAA,YAGT,UAAAR,EAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAEV,gBAAAY;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAX,MAAUF,EAAO,QAAQ,gBAAgB;AAAA,YAAA;AAAA,UAC3C;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAlEKA,EAAO;AAAA,EAAA;AAqElB;"}
@@ -1,4 +1,4 @@
1
1
  import { IComboboxOptionsNodeProps, IComboboxOptionsProps } from './Combobox.types';
2
- export declare const ComboboxOptionsNode: import('react').ForwardRefExoticComponent<IComboboxOptionsNodeProps & import('react').RefAttributes<HTMLDivElement>>;
3
- export declare const ComboboxOptions: import('react').ForwardRefExoticComponent<IComboboxOptionsProps & import('react').RefAttributes<HTMLDivElement>>;
2
+ export declare const ComboboxOptionsNode: <Data extends object>(props: IComboboxOptionsNodeProps<Data>) => import("react/jsx-runtime").JSX.Element;
3
+ export declare const ComboboxOptions: <Data extends object>(props: IComboboxOptionsProps<Data>) => import("react/jsx-runtime").JSX.Element;
4
4
  //# sourceMappingURL=ComboboxOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComboboxOptions.d.ts","sourceRoot":"","sources":["../../src/Combobox/ComboboxOptions.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAY1B,eAAO,MAAM,mBAAmB,sHA4D9B,CAAC;AAEH,eAAO,MAAM,eAAe,kHAY1B,CAAC"}
1
+ {"version":3,"file":"ComboboxOptions.d.ts","sourceRoot":"","sources":["../../src/Combobox/ComboboxOptions.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAY1B,eAAO,MAAM,mBAAmB,GAAI,IAAI,SAAS,MAAM,EAAE,OAAO,yBAAyB,CAAC,IAAI,CAAC,4CAyE9F,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,IAAI,SAAS,MAAM,EAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,4CAStF,CAAA"}