@reactzero/combo 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/LICENSE +21 -0
  3. package/README.md +188 -0
  4. package/dist/Combo-Cx3kSkop.cjs +2 -0
  5. package/dist/Combo-Cx3kSkop.cjs.map +1 -0
  6. package/dist/Combo-qs6_L512.js +439 -0
  7. package/dist/Combo-qs6_L512.js.map +1 -0
  8. package/dist/components/Combo.d.ts +71 -0
  9. package/dist/components/Combo.d.ts.map +1 -0
  10. package/dist/components/LiveRegion.d.ts +7 -0
  11. package/dist/components/LiveRegion.d.ts.map +1 -0
  12. package/dist/components/Portal.d.ts +8 -0
  13. package/dist/components/Portal.d.ts.map +1 -0
  14. package/dist/components/slots/CheckboxItem.d.ts +38 -0
  15. package/dist/components/slots/CheckboxItem.d.ts.map +1 -0
  16. package/dist/components/slots/CustomItem.d.ts +35 -0
  17. package/dist/components/slots/CustomItem.d.ts.map +1 -0
  18. package/dist/components/slots/FooterActions.d.ts +42 -0
  19. package/dist/components/slots/FooterActions.d.ts.map +1 -0
  20. package/dist/components/slots/GroupSeparator.d.ts +30 -0
  21. package/dist/components/slots/GroupSeparator.d.ts.map +1 -0
  22. package/dist/components/slots/index.d.ts +9 -0
  23. package/dist/components/slots/index.d.ts.map +1 -0
  24. package/dist/components/tabs/TabbedCombo.d.ts +45 -0
  25. package/dist/components/tabs/TabbedCombo.d.ts.map +1 -0
  26. package/dist/components/tabs/index.d.ts +3 -0
  27. package/dist/components/tabs/index.d.ts.map +1 -0
  28. package/dist/core/announce.d.ts +10 -0
  29. package/dist/core/announce.d.ts.map +1 -0
  30. package/dist/core/ids.d.ts +13 -0
  31. package/dist/core/ids.d.ts.map +1 -0
  32. package/dist/core/keyboard.d.ts +13 -0
  33. package/dist/core/keyboard.d.ts.map +1 -0
  34. package/dist/core/scroll.d.ts +5 -0
  35. package/dist/core/scroll.d.ts.map +1 -0
  36. package/dist/core/stateMachine.d.ts +32 -0
  37. package/dist/core/stateMachine.d.ts.map +1 -0
  38. package/dist/core/utils.d.ts +26 -0
  39. package/dist/core/utils.d.ts.map +1 -0
  40. package/dist/defaults-iFGq2Q-7.cjs +2 -0
  41. package/dist/defaults-iFGq2Q-7.cjs.map +1 -0
  42. package/dist/defaults-rhC5DFTg.js +53 -0
  43. package/dist/defaults-rhC5DFTg.js.map +1 -0
  44. package/dist/entries/hook-bare.d.ts +4 -0
  45. package/dist/entries/hook-bare.d.ts.map +1 -0
  46. package/dist/entries/hook.d.ts +4 -0
  47. package/dist/entries/hook.d.ts.map +1 -0
  48. package/dist/entries/icons.d.ts +4 -0
  49. package/dist/entries/icons.d.ts.map +1 -0
  50. package/dist/entries/index.d.ts +9 -0
  51. package/dist/entries/index.d.ts.map +1 -0
  52. package/dist/entries/position.d.ts +3 -0
  53. package/dist/entries/position.d.ts.map +1 -0
  54. package/dist/entries/slots.d.ts +9 -0
  55. package/dist/entries/slots.d.ts.map +1 -0
  56. package/dist/entries/tabs.d.ts +4 -0
  57. package/dist/entries/tabs.d.ts.map +1 -0
  58. package/dist/hook-bare.cjs +2 -0
  59. package/dist/hook-bare.cjs.map +1 -0
  60. package/dist/hook-bare.js +9 -0
  61. package/dist/hook-bare.js.map +1 -0
  62. package/dist/hook.cjs +2 -0
  63. package/dist/hook.cjs.map +1 -0
  64. package/dist/hook.js +11 -0
  65. package/dist/hook.js.map +1 -0
  66. package/dist/hooks/useCombo.d.ts +3 -0
  67. package/dist/hooks/useCombo.d.ts.map +1 -0
  68. package/dist/hooks/usePosition.d.ts +16 -0
  69. package/dist/hooks/usePosition.d.ts.map +1 -0
  70. package/dist/icons/defaults.d.ts +16 -0
  71. package/dist/icons/defaults.d.ts.map +1 -0
  72. package/dist/icons/icons.d.ts +30 -0
  73. package/dist/icons/icons.d.ts.map +1 -0
  74. package/dist/icons-Ch1Q5AhF.js +40 -0
  75. package/dist/icons-Ch1Q5AhF.js.map +1 -0
  76. package/dist/icons-vzkEacAb.cjs +2 -0
  77. package/dist/icons-vzkEacAb.cjs.map +1 -0
  78. package/dist/icons.cjs +2 -0
  79. package/dist/icons.cjs.map +1 -0
  80. package/dist/icons.js +20 -0
  81. package/dist/icons.js.map +1 -0
  82. package/dist/index.cjs +2 -0
  83. package/dist/index.cjs.map +1 -0
  84. package/dist/index.d.ts +2 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +12 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/position.cjs +2 -0
  89. package/dist/position.cjs.map +1 -0
  90. package/dist/position.js +5 -0
  91. package/dist/position.js.map +1 -0
  92. package/dist/slots.cjs +2 -0
  93. package/dist/slots.cjs.map +1 -0
  94. package/dist/slots.js +92 -0
  95. package/dist/slots.js.map +1 -0
  96. package/dist/style.css +1 -0
  97. package/dist/styles/base.css +205 -0
  98. package/dist/styles/checkbox.css +36 -0
  99. package/dist/styles/chips.css +71 -0
  100. package/dist/styles/custom-item.css +64 -0
  101. package/dist/styles/footer.css +73 -0
  102. package/dist/styles/groups.css +23 -0
  103. package/dist/styles/meta.css +30 -0
  104. package/dist/styles/radio.css +36 -0
  105. package/dist/styles/select.css +35 -0
  106. package/dist/styles/states.css +22 -0
  107. package/dist/tabs.cjs +2 -0
  108. package/dist/tabs.cjs.map +1 -0
  109. package/dist/tabs.js +132 -0
  110. package/dist/tabs.js.map +1 -0
  111. package/dist/themes/dark.css +96 -0
  112. package/dist/themes/default.css +126 -0
  113. package/dist/themes/high-contrast.css +98 -0
  114. package/dist/types.d.ts +168 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/useCombo-D_vriwVz.cjs +2 -0
  117. package/dist/useCombo-D_vriwVz.cjs.map +1 -0
  118. package/dist/useCombo-gPeBdkRf.js +887 -0
  119. package/dist/useCombo-gPeBdkRf.js.map +1 -0
  120. package/dist/usePosition-6GfutqGX.cjs +2 -0
  121. package/dist/usePosition-6GfutqGX.cjs.map +1 -0
  122. package/dist/usePosition-DVw8IlwA.js +36 -0
  123. package/dist/usePosition-DVw8IlwA.js.map +1 -0
  124. package/package.json +219 -0
@@ -0,0 +1,439 @@
1
+ import { jsx as r, Fragment as Te, jsxs as s } from "react/jsx-runtime";
2
+ import { useRef as oe, useEffect as Ie, useMemo as B } from "react";
3
+ import { u as Pe } from "./useCombo-gPeBdkRf.js";
4
+ import { u as we } from "./usePosition-DVw8IlwA.js";
5
+ import { createPortal as De } from "react-dom";
6
+ function Me({ children: d, target: p, disabled: h }) {
7
+ if (h) return /* @__PURE__ */ r(Te, { children: d });
8
+ const m = p ?? (typeof document < "u" ? document.body : null);
9
+ return m ? De(d, m) : null;
10
+ }
11
+ const Ce = {
12
+ position: "absolute",
13
+ width: "1px",
14
+ height: "1px",
15
+ padding: 0,
16
+ margin: "-1px",
17
+ overflow: "hidden",
18
+ clip: "rect(0,0,0,0)",
19
+ whiteSpace: "nowrap",
20
+ borderWidth: 0
21
+ };
22
+ function Le({
23
+ message: d,
24
+ id: p,
25
+ clearAfterMs: h = 3e3
26
+ }) {
27
+ const m = oe(null);
28
+ return Ie(() => {
29
+ if (!m.current || !d) return;
30
+ const b = m.current;
31
+ b.textContent = "";
32
+ const P = requestAnimationFrame(() => {
33
+ b.textContent = d;
34
+ }), w = setTimeout(() => {
35
+ b.textContent = "";
36
+ }, h);
37
+ return () => {
38
+ cancelAnimationFrame(P), clearTimeout(w);
39
+ };
40
+ }, [d, h]), /* @__PURE__ */ r(
41
+ "div",
42
+ {
43
+ ref: m,
44
+ id: p,
45
+ role: "status",
46
+ "aria-live": "polite",
47
+ "aria-atomic": "true",
48
+ style: Ce
49
+ }
50
+ );
51
+ }
52
+ function i(...d) {
53
+ return d.filter(Boolean).join(" ");
54
+ }
55
+ function $e(d) {
56
+ const {
57
+ placeholder: p,
58
+ label: h,
59
+ theme: m,
60
+ itemVariant: b,
61
+ renderItem: P,
62
+ renderEmpty: w,
63
+ renderLoading: U,
64
+ renderError: A,
65
+ renderFooter: G,
66
+ renderTrigger: W,
67
+ renderGroupHeader: q,
68
+ renderListHeader: J,
69
+ hintText: H,
70
+ errorText: D,
71
+ minSelected: f,
72
+ onInputKeyDown: Q,
73
+ classNames: n = {},
74
+ ...t
75
+ } = d, ne = B(() => t.groups && !t.items?.length ? t.groups.flatMap((e) => e.items) : t.items, [t.groups, t.items]), ae = Pe({ ...t, items: ne }), {
76
+ isOpen: l,
77
+ selectedItem: M,
78
+ highlightedIndex: le,
79
+ filteredItems: N,
80
+ hasSelection: z,
81
+ triggerLabel: C,
82
+ isLoading: v,
83
+ isError: y,
84
+ error: ie,
85
+ getLabelProps: se,
86
+ getInputProps: k,
87
+ getToggleButtonProps: E,
88
+ getClearButtonProps: $,
89
+ getMenuProps: ce,
90
+ getItemProps: X,
91
+ getGroupProps: de,
92
+ getChevronProps: L,
93
+ getTriggerProps: Y,
94
+ icons: O,
95
+ chevronIcon: R,
96
+ inputRef: Z,
97
+ listboxRef: me,
98
+ triggerRef: ue,
99
+ inputValue: ge,
100
+ openMenu: pe,
101
+ closeMenu: he,
102
+ clearSelection: be,
103
+ removeItem: fe,
104
+ selectedItems: g
105
+ } = ae, F = t.itemToString ?? ((e) => e != null ? String(e) : ""), u = t.itemToValue ?? ((e) => typeof e == "object" && e != null && "value" in e ? e.value : String(e)), ve = t.isItemDisabled ?? (() => !1), _ = t.variant === "select", x = t.mode === "multi", V = y || !!D, ee = oe(null), T = we({
106
+ triggerRef: _ ? ue : x ? ee : Z,
107
+ listboxRef: me,
108
+ isOpen: l
109
+ }), Ne = B(() => {
110
+ if (!l) return "";
111
+ if (v) return "Loading options...";
112
+ const e = N.length;
113
+ return e === 0 ? "No options available" : `${e} option${e !== 1 ? "s" : ""} available`;
114
+ }, [l, v, N.length]), ze = m ? { "data-rzero-theme": m } : {}, S = t.disabled === !0, te = B(() => {
115
+ const e = /* @__PURE__ */ new Map();
116
+ return N.forEach((o, a) => {
117
+ e.set(u(o), a);
118
+ }), e;
119
+ }, [N, u]), j = B(() => t.groups ? t.groups.map((e, o) => {
120
+ const a = e.items.map((c) => ({
121
+ item: c,
122
+ globalIndex: te.get(u(c))
123
+ })).filter(
124
+ (c) => c.globalIndex !== void 0
125
+ );
126
+ return { group: e, groupIdx: o, items: a };
127
+ }).filter((e) => e.items.length > 0) : null, [t.groups, te, u]);
128
+ function re(e, o) {
129
+ const a = le === o, c = x ? g.some((xe) => u(xe) === u(e)) : M != null && u(M) === u(e), I = ve(e), K = b && b !== "default" ? b : void 0;
130
+ return P ? /* @__PURE__ */ r(
131
+ "li",
132
+ {
133
+ ...X({ item: e, index: o, variant: K }),
134
+ className: i(
135
+ "rzero-combo-item",
136
+ n.item,
137
+ a && n.itemHighlighted,
138
+ c && n.itemSelected,
139
+ I && n.itemDisabled
140
+ ),
141
+ children: P({
142
+ item: e,
143
+ index: o,
144
+ isHighlighted: a,
145
+ isSelected: c,
146
+ isDisabled: I
147
+ })
148
+ },
149
+ o
150
+ ) : /* @__PURE__ */ s(
151
+ "li",
152
+ {
153
+ ...X({ item: e, index: o, variant: K }),
154
+ className: i(
155
+ "rzero-combo-item",
156
+ n.item,
157
+ a && n.itemHighlighted,
158
+ c && n.itemSelected,
159
+ I && n.itemDisabled
160
+ ),
161
+ children: [
162
+ /* @__PURE__ */ r("span", { children: F(e) }),
163
+ c && !K && /* @__PURE__ */ r("span", { className: "rzero-combo-check", "aria-hidden": "true", children: O.check })
164
+ ]
165
+ },
166
+ o
167
+ );
168
+ }
169
+ function Se() {
170
+ if (x)
171
+ return /* @__PURE__ */ s(
172
+ "div",
173
+ {
174
+ ref: ee,
175
+ className: i("rzero-combo-trigger", "rzero-combo-trigger--multi", n.trigger),
176
+ "data-rzero-trigger": "",
177
+ "data-disabled": S || void 0,
178
+ "data-readonly": t.readOnly || void 0,
179
+ "data-loading": t.disabled === "loading" || void 0,
180
+ "data-error": V || void 0,
181
+ onClick: (o) => {
182
+ if (S || t.readOnly) return;
183
+ const a = o.target;
184
+ a.tagName === "INPUT" || a.tagName === "BUTTON" || a.closest("button") || (Z.current?.focus(), l || pe());
185
+ },
186
+ onMouseDown: (o) => {
187
+ o.target.tagName !== "INPUT" && o.preventDefault();
188
+ },
189
+ children: [
190
+ /* @__PURE__ */ s("div", { className: "rzero-combo-trigger-content", children: [
191
+ g.map((o) => /* @__PURE__ */ s("span", { className: "rzero-combo-chip", children: [
192
+ /* @__PURE__ */ r("span", { className: "rzero-combo-chip-label", children: F(o) }),
193
+ !S && !t.readOnly && /* @__PURE__ */ r(
194
+ "button",
195
+ {
196
+ type: "button",
197
+ className: "rzero-combo-chip-remove",
198
+ "aria-label": `Remove ${F(o)}`,
199
+ onMouseDown: (a) => a.preventDefault(),
200
+ onClick: (a) => {
201
+ a.stopPropagation(), fe(o);
202
+ },
203
+ children: /* @__PURE__ */ r("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", children: /* @__PURE__ */ r("path", { d: "M18 6 6 18M6 6l12 12" }) })
204
+ }
205
+ )
206
+ ] }, String(u(o)))),
207
+ /* @__PURE__ */ r(
208
+ "input",
209
+ {
210
+ ...k({
211
+ placeholder: g.length === 0 ? p : "",
212
+ className: n.input,
213
+ onKeyDown: Q
214
+ })
215
+ }
216
+ )
217
+ ] }),
218
+ /* @__PURE__ */ s("div", { className: "rzero-combo-trigger-actions", children: [
219
+ z && !S && !t.readOnly && /* @__PURE__ */ r(
220
+ "button",
221
+ {
222
+ ...$({
223
+ className: n.clearButton
224
+ }),
225
+ children: O.clear
226
+ }
227
+ ),
228
+ /* @__PURE__ */ r(
229
+ "button",
230
+ {
231
+ ...E({
232
+ className: n.toggleButton
233
+ }),
234
+ children: /* @__PURE__ */ r("span", { ...L(), children: R })
235
+ }
236
+ )
237
+ ] })
238
+ ]
239
+ }
240
+ );
241
+ const e = z && l && ge !== C;
242
+ return /* @__PURE__ */ s(
243
+ "div",
244
+ {
245
+ className: i("rzero-combo-trigger", n.trigger),
246
+ "data-rzero-trigger": "",
247
+ "data-disabled": S || void 0,
248
+ "data-readonly": t.readOnly || void 0,
249
+ "data-loading": t.disabled === "loading" || void 0,
250
+ "data-error": V || void 0,
251
+ "data-has-hidden-selection": e || void 0,
252
+ children: [
253
+ /* @__PURE__ */ r(
254
+ "input",
255
+ {
256
+ ...k({
257
+ placeholder: z ? C : p,
258
+ className: n.input,
259
+ onKeyDown: Q
260
+ })
261
+ }
262
+ ),
263
+ z && !S && !t.readOnly && /* @__PURE__ */ r(
264
+ "button",
265
+ {
266
+ ...$({
267
+ className: n.clearButton
268
+ }),
269
+ children: O.clear
270
+ }
271
+ ),
272
+ /* @__PURE__ */ r(
273
+ "button",
274
+ {
275
+ ...E({
276
+ className: n.toggleButton
277
+ }),
278
+ children: /* @__PURE__ */ r("span", { ...L(), children: R })
279
+ }
280
+ )
281
+ ]
282
+ }
283
+ );
284
+ }
285
+ function ye() {
286
+ return /* @__PURE__ */ s(
287
+ "button",
288
+ {
289
+ ...Y({
290
+ className: i("rzero-combo-select-trigger", n.trigger),
291
+ "data-error": V || void 0
292
+ }),
293
+ children: [
294
+ /* @__PURE__ */ r("span", { className: "rzero-combo-select-value", children: z ? C : p || "Select..." }),
295
+ /* @__PURE__ */ r("span", { ...L(), children: R })
296
+ ]
297
+ }
298
+ );
299
+ }
300
+ return /* @__PURE__ */ s(
301
+ "div",
302
+ {
303
+ className: i("rzero-combo", n.root),
304
+ ...ze,
305
+ "data-rzero-root": "",
306
+ children: [
307
+ h && /* @__PURE__ */ r(
308
+ "label",
309
+ {
310
+ ...se({
311
+ className: i("rzero-combo-label", n.label)
312
+ }),
313
+ children: h
314
+ }
315
+ ),
316
+ W ? W({
317
+ getInputProps: k,
318
+ getToggleButtonProps: E,
319
+ getTriggerProps: Y,
320
+ getClearButtonProps: $,
321
+ getChevronProps: L,
322
+ selectedItem: M,
323
+ hasSelection: z,
324
+ triggerLabel: C,
325
+ isOpen: l,
326
+ icons: O,
327
+ chevronIcon: R
328
+ }) : _ ? ye() : Se(),
329
+ (D || H || x && (f != null || t.maxSelected != null)) && /* @__PURE__ */ s("div", { className: "rzero-combo-meta", children: [
330
+ D ? /* @__PURE__ */ r("span", { className: "rzero-combo-error-text", children: D }) : H ? /* @__PURE__ */ r("span", { className: "rzero-combo-hint", children: H }) : /* @__PURE__ */ r("span", {}),
331
+ x && (f != null || t.maxSelected != null) && /* @__PURE__ */ s(
332
+ "span",
333
+ {
334
+ className: "rzero-combo-selection-count",
335
+ "data-warning": f != null && g.length < f || t.maxSelected != null && g.length >= t.maxSelected ? "" : void 0,
336
+ children: [
337
+ g.length,
338
+ t.maxSelected != null ? ` / ${t.maxSelected}` : "",
339
+ f != null && g.length < f ? ` · min ${f}` : ""
340
+ ]
341
+ }
342
+ )
343
+ ] }),
344
+ /* @__PURE__ */ r(
345
+ Me,
346
+ {
347
+ disabled: t.disablePortal,
348
+ target: t.portalTarget,
349
+ children: /* @__PURE__ */ s(
350
+ "ul",
351
+ {
352
+ ...ce({
353
+ className: i("rzero-combo-list", n.list),
354
+ style: l ? {
355
+ position: "absolute",
356
+ top: T.top,
357
+ left: T.left,
358
+ width: T.width,
359
+ maxHeight: T.maxHeight,
360
+ overflow: "auto",
361
+ zIndex: "var(--rzero-combo-z-index, 9999)",
362
+ margin: 0
363
+ } : { display: "none" }
364
+ }),
365
+ "data-state": l ? "open" : "closed",
366
+ "data-placement": T.placement,
367
+ hidden: !l,
368
+ children: [
369
+ l && J && /* @__PURE__ */ r("li", { role: "presentation", children: J() }),
370
+ l && v && /* @__PURE__ */ r(
371
+ "li",
372
+ {
373
+ role: "presentation",
374
+ className: i("rzero-combo-loading", n.loadingState),
375
+ children: U ? U() : "Loading..."
376
+ }
377
+ ),
378
+ l && !v && y && A && /* @__PURE__ */ r(
379
+ "li",
380
+ {
381
+ role: "presentation",
382
+ className: i("rzero-combo-error", n.errorState),
383
+ children: A({ error: ie })
384
+ }
385
+ ),
386
+ l && !v && !y && N.length === 0 && /* @__PURE__ */ r(
387
+ "li",
388
+ {
389
+ role: "presentation",
390
+ className: i("rzero-combo-empty", n.emptyState),
391
+ children: w ? w() : "No results found"
392
+ }
393
+ ),
394
+ l && !v && !y && j && j.map(({ group: e, groupIdx: o, items: a }) => /* @__PURE__ */ s("li", { role: "presentation", children: [
395
+ /* @__PURE__ */ r(
396
+ "div",
397
+ {
398
+ ...de({ group: e, index: o }),
399
+ className: i(
400
+ "rzero-combo-group-header",
401
+ n.groupHeader
402
+ ),
403
+ children: q ? q({ group: e, index: o }) : e.label
404
+ }
405
+ ),
406
+ /* @__PURE__ */ r("ul", { role: "group", "aria-label": e.label, style: { listStyle: "none", margin: 0, padding: 0 }, children: a.map(
407
+ ({ item: c, globalIndex: I }) => re(c, I)
408
+ ) })
409
+ ] }, `group-${o}`)),
410
+ l && !v && !y && !j && N.map((e, o) => re(e, o)),
411
+ l && G && /* @__PURE__ */ r(
412
+ "li",
413
+ {
414
+ role: "presentation",
415
+ className: i("rzero-combo-footer", n.footer),
416
+ children: G({
417
+ selectedItem: M,
418
+ selectedItems: g,
419
+ closeMenu: he,
420
+ clearSelection: be
421
+ })
422
+ }
423
+ )
424
+ ]
425
+ }
426
+ )
427
+ }
428
+ ),
429
+ /* @__PURE__ */ r(Le, { message: Ne })
430
+ ]
431
+ }
432
+ );
433
+ }
434
+ export {
435
+ $e as C,
436
+ Le as L,
437
+ Me as P
438
+ };
439
+ //# sourceMappingURL=Combo-qs6_L512.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Combo-qs6_L512.js","sources":["../src/components/Portal.tsx","../src/components/LiveRegion.tsx","../src/components/Combo.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport type { ReactNode } from 'react';\n\nexport interface PortalProps {\n children: ReactNode;\n target?: Element | null;\n disabled?: boolean;\n}\n\nexport function Portal({ children, target, disabled }: PortalProps) {\n if (disabled) return <>{children}</>;\n\n const mountNode =\n target ?? (typeof document !== 'undefined' ? document.body : null);\n if (!mountNode) return null;\n\n return createPortal(children, mountNode);\n}\n","import { useEffect, useRef } from 'react';\n\nexport interface LiveRegionProps {\n message: string;\n id?: string;\n clearAfterMs?: number;\n}\n\nconst srOnlyStyle: React.CSSProperties = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: 0,\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0,0,0,0)',\n whiteSpace: 'nowrap',\n borderWidth: 0,\n};\n\nexport function LiveRegion({\n message,\n id,\n clearAfterMs = 3000,\n}: LiveRegionProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!ref.current || !message) return;\n const el = ref.current;\n // Clear then set — forces screen readers to re-announce\n el.textContent = '';\n const raf = requestAnimationFrame(() => {\n el.textContent = message;\n });\n const timer = setTimeout(() => {\n el.textContent = '';\n }, clearAfterMs);\n return () => {\n cancelAnimationFrame(raf);\n clearTimeout(timer);\n };\n }, [message, clearAfterMs]);\n\n return (\n <div\n ref={ref}\n id={id}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style={srOnlyStyle}\n />\n );\n}\n","import React, { useMemo, useRef } from 'react';\nimport { useCombo } from '../hooks/useCombo';\nimport { usePosition } from '../hooks/usePosition';\nimport { Portal } from './Portal';\nimport { LiveRegion } from './LiveRegion';\nimport type {\n UseComboOptions,\n UseComboReturn,\n ComboGroup,\n IconSlots,\n} from '../types';\n\nexport interface ComboClassNames {\n root?: string;\n label?: string;\n input?: string;\n trigger?: string;\n popover?: string;\n list?: string;\n item?: string;\n itemSelected?: string;\n itemHighlighted?: string;\n itemDisabled?: string;\n clearButton?: string;\n toggleButton?: string;\n groupHeader?: string;\n loadingState?: string;\n emptyState?: string;\n errorState?: string;\n footer?: string;\n}\n\nexport type ItemVariant = 'default' | 'checkbox' | 'radio';\n\nexport interface ComboProps<T> extends UseComboOptions<T> {\n placeholder?: string;\n label?: string;\n theme?: 'default' | 'dark' | 'high-contrast' | 'system';\n itemVariant?: ItemVariant;\n renderItem?: (props: {\n item: T;\n index: number;\n isHighlighted: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n }) => React.ReactNode;\n renderEmpty?: () => React.ReactNode;\n renderLoading?: () => React.ReactNode;\n renderError?: (props: { error: Error | null }) => React.ReactNode;\n renderFooter?: (props: {\n selectedItem: T | null;\n selectedItems: T[];\n closeMenu: () => void;\n clearSelection: () => void;\n }) => React.ReactNode;\n renderTrigger?: (props: {\n getInputProps: UseComboReturn<T>['getInputProps'];\n getToggleButtonProps: UseComboReturn<T>['getToggleButtonProps'];\n getTriggerProps: UseComboReturn<T>['getTriggerProps'];\n getClearButtonProps: UseComboReturn<T>['getClearButtonProps'];\n getChevronProps: UseComboReturn<T>['getChevronProps'];\n selectedItem: T | null;\n hasSelection: boolean;\n triggerLabel: string;\n isOpen: boolean;\n icons: IconSlots;\n chevronIcon: React.ReactNode;\n }) => React.ReactNode;\n renderGroupHeader?: (props: {\n group: ComboGroup<T>;\n index: number;\n }) => React.ReactNode;\n renderListHeader?: () => React.ReactNode;\n hintText?: string;\n errorText?: string;\n minSelected?: number;\n onInputKeyDown?: (e: React.KeyboardEvent) => void;\n classNames?: ComboClassNames;\n}\n\nfunction cx(...args: (string | false | null | undefined)[]): string {\n return args.filter(Boolean).join(' ');\n}\n\nexport function Combo<T>(props: ComboProps<T>) {\n const {\n placeholder,\n label,\n theme,\n itemVariant,\n renderItem,\n renderEmpty,\n renderLoading,\n renderError,\n renderFooter,\n renderTrigger,\n renderGroupHeader,\n renderListHeader,\n hintText,\n errorText,\n minSelected,\n onInputKeyDown,\n classNames = {},\n ...hookOptions\n } = props;\n\n // When groups are provided, flatten into items for the hook\n const flatItems = useMemo(() => {\n if (hookOptions.groups && !hookOptions.items?.length) {\n return hookOptions.groups.flatMap((g) => g.items);\n }\n return hookOptions.items;\n }, [hookOptions.groups, hookOptions.items]);\n\n const combo = useCombo({ ...hookOptions, items: flatItems });\n const {\n isOpen,\n selectedItem,\n highlightedIndex,\n filteredItems,\n hasSelection,\n triggerLabel,\n isLoading,\n isError,\n error,\n getLabelProps,\n getInputProps,\n getToggleButtonProps,\n getClearButtonProps,\n getMenuProps,\n getItemProps,\n getGroupProps,\n getChevronProps,\n getTriggerProps,\n icons,\n chevronIcon,\n inputRef,\n listboxRef,\n triggerRef,\n inputValue,\n openMenu,\n closeMenu,\n clearSelection,\n removeItem,\n selectedItems,\n } = combo;\n\n const itemToString =\n hookOptions.itemToString ??\n ((item: T | null) => (item != null ? String(item) : ''));\n const itemToValue =\n hookOptions.itemToValue ??\n ((item: T) => {\n if (\n typeof item === 'object' &&\n item != null &&\n 'value' in (item as object)\n )\n return (item as Record<string, unknown>).value as string | number;\n return String(item);\n });\n const isItemDisabled = hookOptions.isItemDisabled ?? (() => false);\n const isSelectVariant = hookOptions.variant === 'select';\n const isMultiMode = hookOptions.mode === 'multi';\n const hasError = isError || !!errorText;\n\n // Stable ref for the multi-select trigger container so the popover\n // anchors to the outer div rather than the input (which shifts as chips wrap).\n const multiTriggerRef = useRef<HTMLDivElement>(null);\n\n const positionTriggerRef = isSelectVariant\n ? triggerRef\n : isMultiMode\n ? multiTriggerRef\n : inputRef;\n\n const position = usePosition({\n triggerRef: positionTriggerRef,\n listboxRef,\n isOpen,\n });\n\n const liveMessage = useMemo(() => {\n if (!isOpen) return '';\n if (isLoading) return 'Loading options...';\n const count = filteredItems.length;\n return count === 0\n ? 'No options available'\n : `${count} option${count !== 1 ? 's' : ''} available`;\n }, [isOpen, isLoading, filteredItems.length]);\n\n const themeAttr = theme ? { 'data-rzero-theme': theme } : {};\n const isDisabled = hookOptions.disabled === true;\n\n // Build a value → filteredItems index map for grouped rendering\n const valueToIndex = useMemo(() => {\n const map = new Map<string | number, number>();\n filteredItems.forEach((item, index) => {\n map.set(itemToValue(item), index);\n });\n return map;\n }, [filteredItems, itemToValue]);\n\n // Compute grouped items with global indices\n const groupedItems = useMemo(() => {\n if (!hookOptions.groups) return null;\n return hookOptions.groups\n .map((group, groupIdx) => {\n const items = group.items\n .map((item) => ({\n item,\n globalIndex: valueToIndex.get(itemToValue(item)),\n }))\n .filter(\n (entry): entry is { item: T; globalIndex: number } =>\n entry.globalIndex !== undefined,\n );\n return { group, groupIdx, items };\n })\n .filter((g) => g.items.length > 0);\n }, [hookOptions.groups, valueToIndex, itemToValue]);\n\n // Shared item renderer\n\n function renderItemLi(item: T, index: number) {\n const isHighlighted = highlightedIndex === index;\n const isSelected = isMultiMode\n ? selectedItems.some((si: T) => itemToValue(si) === itemToValue(item))\n : selectedItem != null &&\n itemToValue(selectedItem) === itemToValue(item);\n const itemDisabled = isItemDisabled(item);\n\n const variantForItem =\n itemVariant && itemVariant !== 'default' ? itemVariant : undefined;\n\n if (renderItem) {\n return (\n <li\n key={index}\n {...getItemProps({ item, index, variant: variantForItem })}\n className={cx(\n 'rzero-combo-item',\n classNames.item,\n isHighlighted && classNames.itemHighlighted,\n isSelected && classNames.itemSelected,\n itemDisabled && classNames.itemDisabled,\n )}\n >\n {renderItem({\n item,\n index,\n isHighlighted,\n isSelected,\n isDisabled: itemDisabled,\n })}\n </li>\n );\n }\n\n return (\n <li\n key={index}\n {...getItemProps({ item, index, variant: variantForItem })}\n className={cx(\n 'rzero-combo-item',\n classNames.item,\n isHighlighted && classNames.itemHighlighted,\n isSelected && classNames.itemSelected,\n itemDisabled && classNames.itemDisabled,\n )}\n >\n <span>{itemToString(item)}</span>\n {isSelected && !variantForItem && (\n <span className=\"rzero-combo-check\" aria-hidden=\"true\">\n {icons.check}\n </span>\n )}\n </li>\n );\n }\n\n // Default trigger (input variant)\n function renderDefaultTrigger() {\n if (isMultiMode) {\n return (\n <div\n ref={multiTriggerRef}\n className={cx('rzero-combo-trigger', 'rzero-combo-trigger--multi', classNames.trigger)}\n data-rzero-trigger=\"\"\n data-disabled={isDisabled || undefined}\n data-readonly={hookOptions.readOnly || undefined}\n data-loading={hookOptions.disabled === 'loading' || undefined}\n data-error={hasError || undefined}\n onClick={(e) => {\n if (isDisabled || hookOptions.readOnly) return;\n // Only handle clicks on the container itself, not on input/buttons\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'BUTTON' || target.closest('button')) return;\n inputRef.current?.focus();\n if (!isOpen) openMenu();\n }}\n onMouseDown={(e) => {\n // Prevent blur when clicking the container (not input)\n const target = e.target as HTMLElement;\n if (target.tagName !== 'INPUT') {\n e.preventDefault();\n }\n }}\n >\n <div className=\"rzero-combo-trigger-content\">\n {selectedItems.map((item: T) => (\n <span className=\"rzero-combo-chip\" key={String(itemToValue(item))}>\n <span className=\"rzero-combo-chip-label\">{itemToString(item)}</span>\n {!isDisabled && !hookOptions.readOnly && (\n <button\n type=\"button\"\n className=\"rzero-combo-chip-remove\"\n aria-label={`Remove ${itemToString(item)}`}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation();\n removeItem(item);\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n )}\n </span>\n ))}\n <input\n {...getInputProps({\n placeholder: selectedItems.length === 0 ? placeholder : '',\n className: classNames.input,\n onKeyDown: onInputKeyDown,\n } as Record<string, unknown>)}\n />\n </div>\n\n <div className=\"rzero-combo-trigger-actions\">\n {hasSelection && !isDisabled && !hookOptions.readOnly && (\n <button\n {...getClearButtonProps({\n className: classNames.clearButton,\n } as Record<string, unknown>)}\n >\n {icons.clear}\n </button>\n )}\n\n <button\n {...getToggleButtonProps({\n className: classNames.toggleButton,\n } as Record<string, unknown>)}\n >\n <span {...getChevronProps()}>{chevronIcon}</span>\n </button>\n </div>\n </div>\n );\n }\n\n const hasHiddenSelection = hasSelection && isOpen && inputValue !== triggerLabel;\n\n return (\n <div\n className={cx('rzero-combo-trigger', classNames.trigger)}\n data-rzero-trigger=\"\"\n data-disabled={isDisabled || undefined}\n data-readonly={hookOptions.readOnly || undefined}\n data-loading={hookOptions.disabled === 'loading' || undefined}\n data-error={hasError || undefined}\n data-has-hidden-selection={hasHiddenSelection || undefined}\n >\n <input\n {...getInputProps({\n placeholder: hasSelection ? triggerLabel : placeholder,\n className: classNames.input,\n onKeyDown: onInputKeyDown,\n } as Record<string, unknown>)}\n />\n\n {hasSelection && !isDisabled && !hookOptions.readOnly && (\n <button\n {...getClearButtonProps({\n className: classNames.clearButton,\n } as Record<string, unknown>)}\n >\n {icons.clear}\n </button>\n )}\n\n <button\n {...getToggleButtonProps({\n className: classNames.toggleButton,\n } as Record<string, unknown>)}\n >\n <span {...getChevronProps()}>{chevronIcon}</span>\n </button>\n </div>\n );\n }\n\n // Select variant trigger\n function renderSelectTrigger() {\n return (\n <button\n {...getTriggerProps({\n className: cx('rzero-combo-select-trigger', classNames.trigger),\n 'data-error': hasError || undefined,\n } as Record<string, unknown>)}\n >\n <span className=\"rzero-combo-select-value\">\n {hasSelection ? triggerLabel : placeholder || 'Select...'}\n </span>\n <span {...getChevronProps()}>{chevronIcon}</span>\n </button>\n );\n }\n\n return (\n <div\n className={cx('rzero-combo', classNames.root)}\n {...themeAttr}\n data-rzero-root=\"\"\n >\n {/* Label */}\n {label && (\n <label\n {...getLabelProps({\n className: cx('rzero-combo-label', classNames.label),\n } as Record<string, unknown>)}\n >\n {label}\n </label>\n )}\n\n {/* Trigger */}\n {renderTrigger\n ? renderTrigger({\n getInputProps,\n getToggleButtonProps,\n getTriggerProps,\n getClearButtonProps,\n getChevronProps,\n selectedItem,\n hasSelection,\n triggerLabel,\n isOpen,\n icons,\n chevronIcon,\n })\n : isSelectVariant\n ? renderSelectTrigger()\n : renderDefaultTrigger()}\n\n {/* Meta row: hint/error text + selection count */}\n {(errorText || hintText || (isMultiMode && (minSelected != null || hookOptions.maxSelected != null))) && (\n <div className=\"rzero-combo-meta\">\n {errorText ? (\n <span className=\"rzero-combo-error-text\">{errorText}</span>\n ) : hintText ? (\n <span className=\"rzero-combo-hint\">{hintText}</span>\n ) : (\n <span />\n )}\n {isMultiMode && (minSelected != null || hookOptions.maxSelected != null) && (\n <span\n className=\"rzero-combo-selection-count\"\n data-warning={\n (minSelected != null && selectedItems.length < minSelected) ||\n (hookOptions.maxSelected != null && selectedItems.length >= hookOptions.maxSelected)\n ? ''\n : undefined\n }\n >\n {selectedItems.length}\n {hookOptions.maxSelected != null ? ` / ${hookOptions.maxSelected}` : ''}\n {minSelected != null && selectedItems.length < minSelected\n ? ` \\u00B7 min ${minSelected}`\n : ''}\n </span>\n )}\n </div>\n )}\n\n {/* Popover */}\n <Portal\n disabled={hookOptions.disablePortal}\n target={hookOptions.portalTarget}\n >\n <ul\n {...getMenuProps({\n className: cx('rzero-combo-list', classNames.list),\n style: isOpen\n ? ({\n position: 'absolute',\n top: position.top,\n left: position.left,\n width: position.width,\n maxHeight: position.maxHeight,\n overflow: 'auto',\n zIndex: 'var(--rzero-combo-z-index, 9999)',\n margin: 0,\n } as React.CSSProperties)\n : ({ display: 'none' } as React.CSSProperties),\n } as Record<string, unknown>)}\n data-state={isOpen ? 'open' : 'closed'}\n data-placement={position.placement}\n hidden={!isOpen}\n >\n {/* List header (e.g. tab strip) */}\n {isOpen && renderListHeader && (\n <li role=\"presentation\">\n {renderListHeader()}\n </li>\n )}\n\n {/* Loading */}\n {isOpen && isLoading && (\n <li\n role=\"presentation\"\n className={cx('rzero-combo-loading', classNames.loadingState)}\n >\n {renderLoading ? renderLoading() : 'Loading...'}\n </li>\n )}\n\n {/* Error */}\n {isOpen && !isLoading && isError && renderError && (\n <li\n role=\"presentation\"\n className={cx('rzero-combo-error', classNames.errorState)}\n >\n {renderError({ error })}\n </li>\n )}\n\n {/* Empty */}\n {isOpen &&\n !isLoading &&\n !isError &&\n filteredItems.length === 0 && (\n <li\n role=\"presentation\"\n className={cx('rzero-combo-empty', classNames.emptyState)}\n >\n {renderEmpty ? renderEmpty() : 'No results found'}\n </li>\n )}\n\n {/* Items — grouped rendering */}\n {isOpen &&\n !isLoading &&\n !isError &&\n groupedItems &&\n groupedItems.map(({ group, groupIdx, items }) => (\n <li key={`group-${groupIdx}`} role=\"presentation\">\n <div\n {...getGroupProps({ group, index: groupIdx })}\n className={cx(\n 'rzero-combo-group-header',\n classNames.groupHeader,\n )}\n >\n {renderGroupHeader\n ? renderGroupHeader({ group, index: groupIdx })\n : group.label}\n </div>\n <ul role=\"group\" aria-label={group.label} style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {items.map(({ item, globalIndex }) =>\n renderItemLi(item, globalIndex),\n )}\n </ul>\n </li>\n ))}\n\n {/* Items — flat rendering (no groups) */}\n {isOpen &&\n !isLoading &&\n !isError &&\n !groupedItems &&\n filteredItems.map((item, index) => renderItemLi(item, index))}\n\n {/* Footer */}\n {isOpen && renderFooter && (\n <li\n role=\"presentation\"\n className={cx('rzero-combo-footer', classNames.footer)}\n >\n {renderFooter({\n selectedItem,\n selectedItems,\n closeMenu,\n clearSelection,\n })}\n </li>\n )}\n </ul>\n </Portal>\n\n {/* Live region */}\n <LiveRegion message={liveMessage} />\n </div>\n );\n}\n"],"names":["Portal","children","target","disabled","jsx","Fragment","mountNode","createPortal","srOnlyStyle","LiveRegion","message","id","clearAfterMs","ref","useRef","useEffect","el","raf","timer","cx","args","Combo","props","placeholder","label","theme","itemVariant","renderItem","renderEmpty","renderLoading","renderError","renderFooter","renderTrigger","renderGroupHeader","renderListHeader","hintText","errorText","minSelected","onInputKeyDown","classNames","hookOptions","flatItems","useMemo","g","combo","useCombo","isOpen","selectedItem","highlightedIndex","filteredItems","hasSelection","triggerLabel","isLoading","isError","error","getLabelProps","getInputProps","getToggleButtonProps","getClearButtonProps","getMenuProps","getItemProps","getGroupProps","getChevronProps","getTriggerProps","icons","chevronIcon","inputRef","listboxRef","triggerRef","inputValue","openMenu","closeMenu","clearSelection","removeItem","selectedItems","itemToString","item","itemToValue","isItemDisabled","isSelectVariant","isMultiMode","hasError","multiTriggerRef","position","usePosition","liveMessage","count","themeAttr","isDisabled","valueToIndex","map","index","groupedItems","group","groupIdx","items","entry","renderItemLi","isHighlighted","isSelected","si","itemDisabled","variantForItem","jsxs","renderDefaultTrigger","e","hasHiddenSelection","renderSelectTrigger","globalIndex"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import React from 'react';
2
+ import type { UseComboOptions, UseComboReturn, ComboGroup, IconSlots } from '../types';
3
+ export interface ComboClassNames {
4
+ root?: string;
5
+ label?: string;
6
+ input?: string;
7
+ trigger?: string;
8
+ popover?: string;
9
+ list?: string;
10
+ item?: string;
11
+ itemSelected?: string;
12
+ itemHighlighted?: string;
13
+ itemDisabled?: string;
14
+ clearButton?: string;
15
+ toggleButton?: string;
16
+ groupHeader?: string;
17
+ loadingState?: string;
18
+ emptyState?: string;
19
+ errorState?: string;
20
+ footer?: string;
21
+ }
22
+ export type ItemVariant = 'default' | 'checkbox' | 'radio';
23
+ export interface ComboProps<T> extends UseComboOptions<T> {
24
+ placeholder?: string;
25
+ label?: string;
26
+ theme?: 'default' | 'dark' | 'high-contrast' | 'system';
27
+ itemVariant?: ItemVariant;
28
+ renderItem?: (props: {
29
+ item: T;
30
+ index: number;
31
+ isHighlighted: boolean;
32
+ isSelected: boolean;
33
+ isDisabled: boolean;
34
+ }) => React.ReactNode;
35
+ renderEmpty?: () => React.ReactNode;
36
+ renderLoading?: () => React.ReactNode;
37
+ renderError?: (props: {
38
+ error: Error | null;
39
+ }) => React.ReactNode;
40
+ renderFooter?: (props: {
41
+ selectedItem: T | null;
42
+ selectedItems: T[];
43
+ closeMenu: () => void;
44
+ clearSelection: () => void;
45
+ }) => React.ReactNode;
46
+ renderTrigger?: (props: {
47
+ getInputProps: UseComboReturn<T>['getInputProps'];
48
+ getToggleButtonProps: UseComboReturn<T>['getToggleButtonProps'];
49
+ getTriggerProps: UseComboReturn<T>['getTriggerProps'];
50
+ getClearButtonProps: UseComboReturn<T>['getClearButtonProps'];
51
+ getChevronProps: UseComboReturn<T>['getChevronProps'];
52
+ selectedItem: T | null;
53
+ hasSelection: boolean;
54
+ triggerLabel: string;
55
+ isOpen: boolean;
56
+ icons: IconSlots;
57
+ chevronIcon: React.ReactNode;
58
+ }) => React.ReactNode;
59
+ renderGroupHeader?: (props: {
60
+ group: ComboGroup<T>;
61
+ index: number;
62
+ }) => React.ReactNode;
63
+ renderListHeader?: () => React.ReactNode;
64
+ hintText?: string;
65
+ errorText?: string;
66
+ minSelected?: number;
67
+ onInputKeyDown?: (e: React.KeyboardEvent) => void;
68
+ classNames?: ComboClassNames;
69
+ }
70
+ export declare function Combo<T>(props: ComboProps<T>): import("react/jsx-runtime").JSX.Element;
71
+ //# sourceMappingURL=Combo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Combo.d.ts","sourceRoot":"","sources":["../../src/components/Combo.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface LiveRegionProps {
2
+ message: string;
3
+ id?: string;
4
+ clearAfterMs?: number;
5
+ }
6
+ export declare function LiveRegion({ message, id, clearAfterMs, }: LiveRegionProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=LiveRegion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveRegion.d.ts","sourceRoot":"","sources":["../../src/components/LiveRegion.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,EAAE,EACF,YAAmB,GACpB,EAAE,eAAe,2CA8BjB"}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface PortalProps {
3
+ children: ReactNode;
4
+ target?: Element | null;
5
+ disabled?: boolean;
6
+ }
7
+ export declare function Portal({ children, target, disabled }: PortalProps): import("react/jsx-runtime").JSX.Element | null;
8
+ //# sourceMappingURL=Portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Portal.d.ts","sourceRoot":"","sources":["../../src/components/Portal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,WAAW,kDAQjE"}
@@ -0,0 +1,38 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface CheckboxItemProps {
3
+ /** Display label for the item */
4
+ label: string;
5
+ /** Optional secondary description text */
6
+ description?: string;
7
+ /** Optional leading icon */
8
+ icon?: ReactNode;
9
+ /** Whether the item is currently highlighted */
10
+ isHighlighted?: boolean;
11
+ /** Whether the item is currently selected */
12
+ isSelected?: boolean;
13
+ /** Whether the item is disabled */
14
+ isDisabled?: boolean;
15
+ }
16
+ /**
17
+ * Pre-built item content for checkbox-style multi-select.
18
+ * Pair with `itemVariant="checkbox"` on the Combo for CSS-driven checkbox visuals.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <Combo
23
+ * items={items}
24
+ * itemVariant="checkbox"
25
+ * renderItem={({ item, isHighlighted, isSelected, isDisabled }) => (
26
+ * <CheckboxItem
27
+ * label={item.label}
28
+ * description={item.description}
29
+ * isHighlighted={isHighlighted}
30
+ * isSelected={isSelected}
31
+ * isDisabled={isDisabled}
32
+ * />
33
+ * )}
34
+ * />
35
+ * ```
36
+ */
37
+ export declare function CheckboxItem({ label, description, icon, }: CheckboxItemProps): import("react/jsx-runtime").JSX.Element;
38
+ //# sourceMappingURL=CheckboxItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxItem.d.ts","sourceRoot":"","sources":["../../../src/components/slots/CheckboxItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,gDAAgD;IAChD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mCAAmC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,IAAI,GAGL,EAAE,iBAAiB,2CAkBnB"}