@zentauri-ui/zentauri-components 1.9.2 → 2.0.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 (215) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +32 -5
  3. package/cli/registry.json +14 -0
  4. package/dist/{chunk-L4PDJ6IB.mjs → chunk-44NX3DAZ.mjs} +3 -3
  5. package/dist/{chunk-L4PDJ6IB.mjs.map → chunk-44NX3DAZ.mjs.map} +1 -1
  6. package/dist/chunk-FAMHSJTK.js +19 -0
  7. package/dist/{chunk-AQHY4S33.js.map → chunk-FAMHSJTK.js.map} +1 -1
  8. package/dist/chunk-I42UYWYA.mjs +128 -0
  9. package/dist/chunk-I42UYWYA.mjs.map +1 -0
  10. package/dist/{chunk-5J6QMTES.js → chunk-IKXO5SJ4.js} +21 -5
  11. package/dist/chunk-IKXO5SJ4.js.map +1 -0
  12. package/dist/{chunk-OPUO55TO.mjs → chunk-JXSM2EHC.mjs} +3 -3
  13. package/dist/{chunk-OPUO55TO.mjs.map → chunk-JXSM2EHC.mjs.map} +1 -1
  14. package/dist/{chunk-LQPKZ5ZD.js → chunk-LS4GY2ZQ.js} +6 -6
  15. package/dist/{chunk-LQPKZ5ZD.js.map → chunk-LS4GY2ZQ.js.map} +1 -1
  16. package/dist/{chunk-VIKQGO4W.mjs → chunk-VQQHVKEU.mjs} +21 -5
  17. package/dist/{chunk-VIKQGO4W.mjs.map → chunk-VQQHVKEU.mjs.map} +1 -1
  18. package/dist/chunk-ZVRGLG35.js +144 -0
  19. package/dist/chunk-ZVRGLG35.js.map +1 -0
  20. package/dist/design-system/combobox.d.ts +124 -0
  21. package/dist/design-system/combobox.d.ts.map +1 -0
  22. package/dist/design-system/facade.js +6 -5
  23. package/dist/design-system/facade.js.map +1 -1
  24. package/dist/design-system/facade.mjs +5 -4
  25. package/dist/design-system/facade.mjs.map +1 -1
  26. package/dist/design-system/index.d.ts +1 -0
  27. package/dist/design-system/index.d.ts.map +1 -1
  28. package/dist/hooks/index.d.ts +13 -0
  29. package/dist/hooks/index.d.ts.map +1 -1
  30. package/dist/hooks/useCookie/index.d.ts +2 -0
  31. package/dist/hooks/useCookie/index.d.ts.map +1 -0
  32. package/dist/hooks/useCookie/useCookie.d.ts +36 -0
  33. package/dist/hooks/useCookie/useCookie.d.ts.map +1 -0
  34. package/dist/hooks/useCookie.js +82 -0
  35. package/dist/hooks/useCookie.js.map +1 -0
  36. package/dist/hooks/useCookie.mjs +80 -0
  37. package/dist/hooks/useCookie.mjs.map +1 -0
  38. package/dist/hooks/useCountdown/index.d.ts +2 -0
  39. package/dist/hooks/useCountdown/index.d.ts.map +1 -0
  40. package/dist/hooks/useCountdown/useCountdown.d.ts +40 -0
  41. package/dist/hooks/useCountdown/useCountdown.d.ts.map +1 -0
  42. package/dist/hooks/useCountdown.js +60 -0
  43. package/dist/hooks/useCountdown.js.map +1 -0
  44. package/dist/hooks/useCountdown.mjs +58 -0
  45. package/dist/hooks/useCountdown.mjs.map +1 -0
  46. package/dist/hooks/useEventListener/index.d.ts +2 -0
  47. package/dist/hooks/useEventListener/index.d.ts.map +1 -0
  48. package/dist/hooks/useEventListener/useEventListener.d.ts +22 -0
  49. package/dist/hooks/useEventListener/useEventListener.d.ts.map +1 -0
  50. package/dist/hooks/useEventListener.js +45 -0
  51. package/dist/hooks/useEventListener.js.map +1 -0
  52. package/dist/hooks/useEventListener.mjs +43 -0
  53. package/dist/hooks/useEventListener.mjs.map +1 -0
  54. package/dist/hooks/useGeolocation/index.d.ts +2 -0
  55. package/dist/hooks/useGeolocation/index.d.ts.map +1 -0
  56. package/dist/hooks/useGeolocation/useGeolocation.d.ts +48 -0
  57. package/dist/hooks/useGeolocation/useGeolocation.d.ts.map +1 -0
  58. package/dist/hooks/useGeolocation.js +111 -0
  59. package/dist/hooks/useGeolocation.js.map +1 -0
  60. package/dist/hooks/useGeolocation.mjs +109 -0
  61. package/dist/hooks/useGeolocation.mjs.map +1 -0
  62. package/dist/hooks/useHotkeys/index.d.ts +2 -0
  63. package/dist/hooks/useHotkeys/index.d.ts.map +1 -0
  64. package/dist/hooks/useHotkeys/useHotkeys.d.ts +24 -0
  65. package/dist/hooks/useHotkeys/useHotkeys.d.ts.map +1 -0
  66. package/dist/hooks/useHotkeys.js +86 -0
  67. package/dist/hooks/useHotkeys.js.map +1 -0
  68. package/dist/hooks/useHotkeys.mjs +84 -0
  69. package/dist/hooks/useHotkeys.mjs.map +1 -0
  70. package/dist/hooks/useIdleTimeout/index.d.ts +2 -0
  71. package/dist/hooks/useIdleTimeout/index.d.ts.map +1 -0
  72. package/dist/hooks/useIdleTimeout/useIdleTimeout.d.ts +31 -0
  73. package/dist/hooks/useIdleTimeout/useIdleTimeout.d.ts.map +1 -0
  74. package/dist/hooks/useIdleTimeout.js +77 -0
  75. package/dist/hooks/useIdleTimeout.js.map +1 -0
  76. package/dist/hooks/useIdleTimeout.mjs +75 -0
  77. package/dist/hooks/useIdleTimeout.mjs.map +1 -0
  78. package/dist/hooks/useInterval/index.d.ts +2 -0
  79. package/dist/hooks/useInterval/index.d.ts.map +1 -0
  80. package/dist/hooks/useInterval/useInterval.d.ts +12 -0
  81. package/dist/hooks/useInterval/useInterval.d.ts.map +1 -0
  82. package/dist/hooks/useInterval.js +27 -0
  83. package/dist/hooks/useInterval.js.map +1 -0
  84. package/dist/hooks/useInterval.mjs +25 -0
  85. package/dist/hooks/useInterval.mjs.map +1 -0
  86. package/dist/hooks/useKeyPress/index.d.ts +2 -0
  87. package/dist/hooks/useKeyPress/index.d.ts.map +1 -0
  88. package/dist/hooks/useKeyPress/useKeyPress.d.ts +15 -0
  89. package/dist/hooks/useKeyPress/useKeyPress.d.ts.map +1 -0
  90. package/dist/hooks/useKeyPress.js +47 -0
  91. package/dist/hooks/useKeyPress.js.map +1 -0
  92. package/dist/hooks/useKeyPress.mjs +45 -0
  93. package/dist/hooks/useKeyPress.mjs.map +1 -0
  94. package/dist/hooks/useLongPress/index.d.ts +2 -0
  95. package/dist/hooks/useLongPress/index.d.ts.map +1 -0
  96. package/dist/hooks/useLongPress/useLongPress.d.ts +46 -0
  97. package/dist/hooks/useLongPress/useLongPress.d.ts.map +1 -0
  98. package/dist/hooks/useLongPress.js +116 -0
  99. package/dist/hooks/useLongPress.js.map +1 -0
  100. package/dist/hooks/useLongPress.mjs +114 -0
  101. package/dist/hooks/useLongPress.mjs.map +1 -0
  102. package/dist/hooks/usePrevious/index.d.ts +2 -0
  103. package/dist/hooks/usePrevious/index.d.ts.map +1 -0
  104. package/dist/hooks/usePrevious/usePrevious.d.ts +13 -0
  105. package/dist/hooks/usePrevious/usePrevious.d.ts.map +1 -0
  106. package/dist/hooks/usePrevious.js +17 -0
  107. package/dist/hooks/usePrevious.js.map +1 -0
  108. package/dist/hooks/usePrevious.mjs +15 -0
  109. package/dist/hooks/usePrevious.mjs.map +1 -0
  110. package/dist/hooks/useScrollPosition/index.d.ts +2 -0
  111. package/dist/hooks/useScrollPosition/index.d.ts.map +1 -0
  112. package/dist/hooks/useScrollPosition/useScrollPosition.d.ts +37 -0
  113. package/dist/hooks/useScrollPosition/useScrollPosition.d.ts.map +1 -0
  114. package/dist/hooks/useScrollPosition.js +41 -0
  115. package/dist/hooks/useScrollPosition.js.map +1 -0
  116. package/dist/hooks/useScrollPosition.mjs +39 -0
  117. package/dist/hooks/useScrollPosition.mjs.map +1 -0
  118. package/dist/hooks/useTimeout/index.d.ts +2 -0
  119. package/dist/hooks/useTimeout/index.d.ts.map +1 -0
  120. package/dist/hooks/useTimeout/useTimeout.d.ts +19 -0
  121. package/dist/hooks/useTimeout/useTimeout.d.ts.map +1 -0
  122. package/dist/hooks/useTimeout.js +38 -0
  123. package/dist/hooks/useTimeout.js.map +1 -0
  124. package/dist/hooks/useTimeout.mjs +36 -0
  125. package/dist/hooks/useTimeout.mjs.map +1 -0
  126. package/dist/hooks/useVirtualList/index.d.ts +2 -0
  127. package/dist/hooks/useVirtualList/index.d.ts.map +1 -0
  128. package/dist/hooks/useVirtualList/useVirtualList.d.ts +47 -0
  129. package/dist/hooks/useVirtualList/useVirtualList.d.ts.map +1 -0
  130. package/dist/hooks/useVirtualList.js +87 -0
  131. package/dist/hooks/useVirtualList.js.map +1 -0
  132. package/dist/hooks/useVirtualList.mjs +85 -0
  133. package/dist/hooks/useVirtualList.mjs.map +1 -0
  134. package/dist/lib/facade.d.ts.map +1 -1
  135. package/dist/ui/buttons/animated.js +8 -7
  136. package/dist/ui/buttons/animated.js.map +1 -1
  137. package/dist/ui/buttons/animated.mjs +6 -5
  138. package/dist/ui/buttons/animated.mjs.map +1 -1
  139. package/dist/ui/buttons.js +9 -8
  140. package/dist/ui/buttons.mjs +7 -6
  141. package/dist/ui/combobox/combobox-base.d.ts +37 -0
  142. package/dist/ui/combobox/combobox-base.d.ts.map +1 -0
  143. package/dist/ui/combobox/combobox.d.ts +6 -0
  144. package/dist/ui/combobox/combobox.d.ts.map +1 -0
  145. package/dist/ui/combobox/index.d.ts +4 -0
  146. package/dist/ui/combobox/index.d.ts.map +1 -0
  147. package/dist/ui/combobox/types.d.ts +70 -0
  148. package/dist/ui/combobox/types.d.ts.map +1 -0
  149. package/dist/ui/combobox/variants.d.ts +17 -0
  150. package/dist/ui/combobox/variants.d.ts.map +1 -0
  151. package/dist/ui/combobox.js +510 -0
  152. package/dist/ui/combobox.js.map +1 -0
  153. package/dist/ui/combobox.mjs +495 -0
  154. package/dist/ui/combobox.mjs.map +1 -0
  155. package/dist/ui/dynamic-stepper.js +18 -17
  156. package/dist/ui/dynamic-stepper.js.map +1 -1
  157. package/dist/ui/dynamic-stepper.mjs +7 -6
  158. package/dist/ui/dynamic-stepper.mjs.map +1 -1
  159. package/dist/ui/pagination.js +14 -13
  160. package/dist/ui/pagination.js.map +1 -1
  161. package/dist/ui/pagination.mjs +6 -5
  162. package/dist/ui/pagination.mjs.map +1 -1
  163. package/package.json +1 -1
  164. package/src/design-system/combobox.ts +204 -0
  165. package/src/design-system/index.ts +1 -0
  166. package/src/hooks/index.ts +50 -0
  167. package/src/hooks/useCookie/index.ts +5 -0
  168. package/src/hooks/useCookie/useCookie.test.ts +57 -0
  169. package/src/hooks/useCookie/useCookie.ts +133 -0
  170. package/src/hooks/useCountdown/index.ts +5 -0
  171. package/src/hooks/useCountdown/useCountdown.test.ts +113 -0
  172. package/src/hooks/useCountdown/useCountdown.ts +106 -0
  173. package/src/hooks/useEventListener/index.ts +4 -0
  174. package/src/hooks/useEventListener/useEventListener.test.ts +60 -0
  175. package/src/hooks/useEventListener/useEventListener.ts +98 -0
  176. package/src/hooks/useGeolocation/index.ts +6 -0
  177. package/src/hooks/useGeolocation/useGeolocation.test.ts +108 -0
  178. package/src/hooks/useGeolocation/useGeolocation.ts +173 -0
  179. package/src/hooks/useHotkeys/index.ts +5 -0
  180. package/src/hooks/useHotkeys/useHotkeys.test.ts +82 -0
  181. package/src/hooks/useHotkeys/useHotkeys.ts +130 -0
  182. package/src/hooks/useIdleTimeout/index.ts +5 -0
  183. package/src/hooks/useIdleTimeout/useIdleTimeout.test.ts +97 -0
  184. package/src/hooks/useIdleTimeout/useIdleTimeout.ts +111 -0
  185. package/src/hooks/useInterval/index.ts +1 -0
  186. package/src/hooks/useInterval/useInterval.test.ts +56 -0
  187. package/src/hooks/useInterval/useInterval.ts +36 -0
  188. package/src/hooks/useKeyPress/index.ts +1 -0
  189. package/src/hooks/useKeyPress/useKeyPress.test.ts +67 -0
  190. package/src/hooks/useKeyPress/useKeyPress.ts +65 -0
  191. package/src/hooks/useLongPress/index.ts +5 -0
  192. package/src/hooks/useLongPress/useLongPress.test.ts +180 -0
  193. package/src/hooks/useLongPress/useLongPress.ts +177 -0
  194. package/src/hooks/usePrevious/index.ts +1 -0
  195. package/src/hooks/usePrevious/usePrevious.test.ts +33 -0
  196. package/src/hooks/usePrevious/usePrevious.ts +24 -0
  197. package/src/hooks/useScrollPosition/index.ts +5 -0
  198. package/src/hooks/useScrollPosition/useScrollPosition.test.ts +69 -0
  199. package/src/hooks/useScrollPosition/useScrollPosition.ts +88 -0
  200. package/src/hooks/useTimeout/index.ts +1 -0
  201. package/src/hooks/useTimeout/useTimeout.test.ts +63 -0
  202. package/src/hooks/useTimeout/useTimeout.ts +58 -0
  203. package/src/hooks/useVirtualList/index.ts +6 -0
  204. package/src/hooks/useVirtualList/useVirtualList.test.ts +102 -0
  205. package/src/hooks/useVirtualList/useVirtualList.ts +144 -0
  206. package/src/lib/facade.test.ts +7 -7
  207. package/src/lib/facade.ts +6 -2
  208. package/src/ui/combobox/combobox-base.tsx +552 -0
  209. package/src/ui/combobox/combobox.test.tsx +292 -0
  210. package/src/ui/combobox/combobox.tsx +8 -0
  211. package/src/ui/combobox/index.ts +33 -0
  212. package/src/ui/combobox/types.ts +91 -0
  213. package/src/ui/combobox/variants.ts +58 -0
  214. package/dist/chunk-5J6QMTES.js.map +0 -1
  215. package/dist/chunk-AQHY4S33.js +0 -19
@@ -0,0 +1,495 @@
1
+ "use client";
2
+ import { zuiComboboxTriggerBase, zuiComboboxSizes, zuiComboboxTriggerVariants, zuiComboboxItemBase, zuiComboboxDisabled, zuiComboboxItemAppearances, zuiComboboxListBase, zuiComboboxListAppearances, zuiComboboxContentBase, zuiComboboxSpacing, zuiComboboxContentAppearances, zuiComboboxSearchRowBase, zuiComboboxSearchIconBase, zuiComboboxSearchInputBase, zuiComboboxEmptyBase } from '../chunk-I42UYWYA.mjs';
3
+ import { cn } from '../chunk-4D54YOL6.mjs';
4
+ import '../chunk-J5LGTIGS.mjs';
5
+ import { createContext, useContext, useId, useState, useRef, useEffect, useMemo, useCallback } from 'react';
6
+ import { cva } from 'class-variance-authority';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var comboboxTriggerVariants = cva(zuiComboboxTriggerBase, {
10
+ variants: {
11
+ variant: zuiComboboxTriggerVariants,
12
+ size: zuiComboboxSizes
13
+ },
14
+ defaultVariants: {
15
+ variant: "default",
16
+ size: "md"
17
+ }
18
+ });
19
+ var comboboxItemVariants = cva(zuiComboboxItemBase, {
20
+ variants: {
21
+ appearance: zuiComboboxItemAppearances,
22
+ disabled: zuiComboboxDisabled
23
+ },
24
+ defaultVariants: {
25
+ appearance: "default"
26
+ }
27
+ });
28
+ var comboboxListVariants = cva(zuiComboboxListBase, {
29
+ variants: {
30
+ appearance: zuiComboboxListAppearances
31
+ },
32
+ defaultVariants: {
33
+ appearance: "default"
34
+ }
35
+ });
36
+ var comboboxContentVariants = cva(zuiComboboxContentBase, {
37
+ variants: {
38
+ appearance: zuiComboboxContentAppearances,
39
+ size: zuiComboboxSizes,
40
+ spacing: zuiComboboxSpacing
41
+ },
42
+ defaultVariants: {
43
+ appearance: "default",
44
+ size: "md",
45
+ spacing: "default"
46
+ }
47
+ });
48
+ var ComboboxContext = createContext(null);
49
+ var ComboboxAppearanceContext = createContext("default");
50
+ var useCombobox = () => {
51
+ const ctx = useContext(ComboboxContext);
52
+ if (!ctx) throw new Error("Combobox components must be used inside Combobox");
53
+ return ctx;
54
+ };
55
+ var Combobox = ({
56
+ children,
57
+ value,
58
+ defaultValue = [],
59
+ onChange,
60
+ multiple = false,
61
+ className
62
+ }) => {
63
+ const baseId = useId();
64
+ const triggerId = `${baseId}-trigger`;
65
+ const listboxId = `${baseId}-listbox`;
66
+ const [internal, setInternal] = useState(defaultValue);
67
+ const [open, setOpen] = useState(false);
68
+ const [options, setOptions] = useState([]);
69
+ const [query, setQuery] = useState("");
70
+ const [activeValue, setActiveValue] = useState(null);
71
+ const rootRef = useRef(null);
72
+ const searchRef = useRef(null);
73
+ const triggerRef = useRef(null);
74
+ const selected = value ?? internal;
75
+ useEffect(() => {
76
+ if (!open) return;
77
+ const handlePointerDown = (event) => {
78
+ const root = rootRef.current;
79
+ if (!root) return;
80
+ if (event.target instanceof Node && !root.contains(event.target)) {
81
+ setOpen(false);
82
+ }
83
+ };
84
+ document.addEventListener("pointerdown", handlePointerDown);
85
+ return () => document.removeEventListener("pointerdown", handlePointerDown);
86
+ }, [open]);
87
+ useEffect(() => {
88
+ if (!open) {
89
+ setQuery("");
90
+ setActiveValue(null);
91
+ }
92
+ }, [open]);
93
+ const visibleValues = useMemo(() => {
94
+ const normalized = query.trim().toLowerCase();
95
+ if (!normalized) return options.map((o) => o.value);
96
+ return options.filter((o) => {
97
+ if (o.disabled) return false;
98
+ const labelText = typeof o.label === "string" ? o.label.toLowerCase() : "";
99
+ return o.value.toLowerCase().includes(normalized) || labelText.includes(normalized);
100
+ }).map((o) => o.value);
101
+ }, [query, options]);
102
+ useEffect(() => {
103
+ if (!open) return;
104
+ if (!activeValue) return;
105
+ if (visibleValues.includes(activeValue)) return;
106
+ setActiveValue(null);
107
+ }, [open, activeValue, visibleValues]);
108
+ const setSelected = (vals) => {
109
+ if (value !== void 0) {
110
+ onChange?.(vals);
111
+ } else {
112
+ setInternal(vals);
113
+ onChange?.(vals);
114
+ }
115
+ };
116
+ const toggleValue = useCallback(
117
+ (val) => {
118
+ if (multiple) {
119
+ const next = selected.includes(val) ? selected.filter((v) => v !== val) : [...selected, val];
120
+ setSelected(next);
121
+ } else {
122
+ setSelected([val]);
123
+ setOpen(false);
124
+ }
125
+ },
126
+ // eslint-disable-next-line react-hooks/exhaustive-deps
127
+ [multiple, selected]
128
+ );
129
+ const isSelected = useCallback(
130
+ (val) => selected.includes(val),
131
+ [selected]
132
+ );
133
+ const isVisible = useCallback(
134
+ (val) => visibleValues.includes(val),
135
+ [visibleValues]
136
+ );
137
+ const registerOption = useCallback((opt) => {
138
+ setOptions((prev) => {
139
+ const existing = prev.find((o) => o.value === opt.value);
140
+ if (existing) {
141
+ const labelChanged = (typeof opt.label === "string" || typeof opt.label === "number") && existing.label !== opt.label;
142
+ const disabledChanged = existing.disabled !== opt.disabled;
143
+ if (labelChanged || disabledChanged) {
144
+ return prev.map((o) => o.value === opt.value ? opt : o);
145
+ }
146
+ return prev;
147
+ }
148
+ return [...prev, opt];
149
+ });
150
+ }, []);
151
+ return /* @__PURE__ */ jsx(
152
+ ComboboxContext.Provider,
153
+ {
154
+ value: {
155
+ open,
156
+ setOpen,
157
+ query,
158
+ setQuery,
159
+ selected,
160
+ toggleValue,
161
+ isSelected,
162
+ multiple,
163
+ options,
164
+ registerOption,
165
+ visibleValues,
166
+ isVisible,
167
+ activeValue,
168
+ setActiveValue,
169
+ triggerId,
170
+ listboxId,
171
+ searchRef,
172
+ triggerRef
173
+ },
174
+ children: /* @__PURE__ */ jsx("div", { ref: rootRef, className: cn("relative w-full", className), children })
175
+ }
176
+ );
177
+ };
178
+ Combobox.displayName = "Combobox";
179
+ var ComboboxTrigger = ({
180
+ className,
181
+ variant,
182
+ size,
183
+ onClick,
184
+ ref: refProp,
185
+ ...props
186
+ }) => {
187
+ const { open, setOpen, triggerId, listboxId, triggerRef } = useCombobox();
188
+ return /* @__PURE__ */ jsx(
189
+ "button",
190
+ {
191
+ ref: (node) => {
192
+ triggerRef.current = node;
193
+ if (typeof refProp === "function") {
194
+ refProp(node);
195
+ } else if (refProp) {
196
+ refProp.current = node;
197
+ }
198
+ },
199
+ id: triggerId,
200
+ type: "button",
201
+ "aria-expanded": open,
202
+ "aria-haspopup": "listbox",
203
+ "aria-controls": listboxId,
204
+ "data-slot": "combobox-trigger",
205
+ className: cn(comboboxTriggerVariants({ variant, size }), className),
206
+ ...props,
207
+ onClick: (event) => {
208
+ onClick?.(event);
209
+ if (!event.defaultPrevented) {
210
+ setOpen(!open);
211
+ }
212
+ }
213
+ }
214
+ );
215
+ };
216
+ ComboboxTrigger.displayName = "ComboboxTrigger";
217
+ var ComboboxValue = ({
218
+ placeholder = "Select...",
219
+ className,
220
+ ...props
221
+ }) => {
222
+ const { selected, options } = useCombobox();
223
+ const selectedOptions = options.filter((o) => selected.includes(o.value));
224
+ if (selectedOptions.length === 0) {
225
+ return /* @__PURE__ */ jsx(
226
+ "span",
227
+ {
228
+ "data-slot": "combobox-placeholder",
229
+ className: cn(
230
+ "text-[color:var(--zui-combobox-value-placeholder-fg,oklch(55.1%_0.027_264.364))] dark:text-white",
231
+ className
232
+ ),
233
+ ...props,
234
+ children: placeholder
235
+ }
236
+ );
237
+ }
238
+ return /* @__PURE__ */ jsx("span", { "data-slot": "combobox-value", className: cn(className), ...props, children: selectedOptions.map((option, index) => /* @__PURE__ */ jsxs("span", { children: [
239
+ index > 0 ? ", " : null,
240
+ option.label
241
+ ] }, option.value)) });
242
+ };
243
+ ComboboxValue.displayName = "ComboboxValue";
244
+ var ComboboxContent = ({
245
+ children,
246
+ className,
247
+ appearance = "default",
248
+ size = "md",
249
+ spacing = "default",
250
+ ...props
251
+ }) => {
252
+ const { open, triggerId, listboxId, searchRef } = useCombobox();
253
+ useEffect(() => {
254
+ if (open) {
255
+ searchRef.current?.focus();
256
+ }
257
+ }, [open, searchRef]);
258
+ if (!open) return null;
259
+ return /* @__PURE__ */ jsx(ComboboxAppearanceContext.Provider, { value: appearance, children: /* @__PURE__ */ jsx(
260
+ "div",
261
+ {
262
+ "aria-labelledby": triggerId,
263
+ "data-slot": "combobox-content",
264
+ className: cn(
265
+ comboboxContentVariants({ appearance, size, spacing }),
266
+ className
267
+ ),
268
+ ...props,
269
+ children
270
+ }
271
+ ) });
272
+ };
273
+ ComboboxContent.displayName = "ComboboxContent";
274
+ var ComboboxSearch = ({
275
+ className,
276
+ placeholder = "Search...",
277
+ ref: refProp,
278
+ ...props
279
+ }) => {
280
+ const {
281
+ query,
282
+ setQuery,
283
+ visibleValues,
284
+ activeValue,
285
+ setActiveValue,
286
+ toggleValue,
287
+ setOpen,
288
+ searchRef,
289
+ listboxId,
290
+ options,
291
+ triggerRef
292
+ } = useCombobox();
293
+ const optionByValue = useMemo(
294
+ () => new Map(options.map((option) => [option.value, option])),
295
+ [options]
296
+ );
297
+ const moveActive = (direction) => {
298
+ if (visibleValues.length === 0) return;
299
+ const currentIndex = activeValue ? visibleValues.indexOf(activeValue) : -1;
300
+ let nextIndex = currentIndex;
301
+ for (let i = 0; i < visibleValues.length; i++) {
302
+ if (nextIndex === -1) {
303
+ nextIndex = direction === 1 ? 0 : visibleValues.length - 1;
304
+ } else {
305
+ nextIndex = (nextIndex + direction + visibleValues.length) % visibleValues.length;
306
+ }
307
+ const candidate = optionByValue.get(visibleValues[nextIndex] ?? "");
308
+ if (candidate && !candidate.disabled) {
309
+ setActiveValue(visibleValues[nextIndex] ?? null);
310
+ return;
311
+ }
312
+ }
313
+ };
314
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "combobox-search-row", className: zuiComboboxSearchRowBase, children: [
315
+ /* @__PURE__ */ jsxs(
316
+ "svg",
317
+ {
318
+ "aria-hidden": true,
319
+ viewBox: "0 0 24 24",
320
+ className: zuiComboboxSearchIconBase,
321
+ fill: "none",
322
+ stroke: "currentColor",
323
+ strokeWidth: "2",
324
+ strokeLinecap: "round",
325
+ strokeLinejoin: "round",
326
+ children: [
327
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "8" }),
328
+ /* @__PURE__ */ jsx("path", { d: "m21 21-4.3-4.3" })
329
+ ]
330
+ }
331
+ ),
332
+ /* @__PURE__ */ jsx(
333
+ "input",
334
+ {
335
+ ref: (node) => {
336
+ searchRef.current = node;
337
+ if (typeof refProp === "function") {
338
+ refProp(node);
339
+ } else if (refProp) {
340
+ refProp.current = node;
341
+ }
342
+ },
343
+ type: "text",
344
+ role: "combobox",
345
+ "aria-expanded": true,
346
+ "aria-controls": listboxId,
347
+ "aria-autocomplete": "list",
348
+ "aria-activedescendant": activeValue ? `${listboxId}-option-${activeValue}` : void 0,
349
+ "data-slot": "combobox-search",
350
+ className: cn(zuiComboboxSearchInputBase, className),
351
+ placeholder,
352
+ value: query,
353
+ onChange: (event) => setQuery(event.target.value),
354
+ onKeyDown: (event) => {
355
+ if (event.key === "ArrowDown") {
356
+ event.preventDefault();
357
+ moveActive(1);
358
+ } else if (event.key === "ArrowUp") {
359
+ event.preventDefault();
360
+ moveActive(-1);
361
+ } else if (event.key === "Enter") {
362
+ event.preventDefault();
363
+ if (activeValue && visibleValues.includes(activeValue)) {
364
+ const option = optionByValue.get(activeValue);
365
+ if (option && !option.disabled) {
366
+ toggleValue(activeValue);
367
+ }
368
+ }
369
+ } else if (event.key === "Escape") {
370
+ event.preventDefault();
371
+ setOpen(false);
372
+ triggerRef.current?.focus();
373
+ }
374
+ },
375
+ ...props
376
+ }
377
+ )
378
+ ] });
379
+ };
380
+ ComboboxSearch.displayName = "ComboboxSearch";
381
+ var ComboboxList = ({
382
+ children,
383
+ className,
384
+ ...props
385
+ }) => {
386
+ const { listboxId, triggerId } = useCombobox();
387
+ const appearance = useContext(ComboboxAppearanceContext);
388
+ return /* @__PURE__ */ jsx(
389
+ "div",
390
+ {
391
+ id: listboxId,
392
+ role: "listbox",
393
+ "aria-labelledby": triggerId,
394
+ "data-slot": "combobox-list",
395
+ className: cn(comboboxListVariants({ appearance }), className),
396
+ ...props,
397
+ children
398
+ }
399
+ );
400
+ };
401
+ ComboboxList.displayName = "ComboboxList";
402
+ var ComboboxItem = ({
403
+ value,
404
+ children,
405
+ disabled,
406
+ appearance = "default",
407
+ className,
408
+ ...props
409
+ }) => {
410
+ const {
411
+ toggleValue,
412
+ isSelected,
413
+ registerOption,
414
+ isVisible,
415
+ activeValue,
416
+ setActiveValue,
417
+ listboxId
418
+ } = useCombobox();
419
+ useEffect(() => {
420
+ registerOption({ label: children, value, disabled });
421
+ }, [children, disabled, registerOption, value]);
422
+ const visible = isVisible(value);
423
+ const isActive = isSelected(value);
424
+ const isHighlighted = activeValue === value;
425
+ if (!visible) return null;
426
+ return /* @__PURE__ */ jsxs(
427
+ "div",
428
+ {
429
+ id: `${listboxId}-option-${value}`,
430
+ role: "option",
431
+ "aria-selected": isActive,
432
+ "aria-disabled": disabled ? true : void 0,
433
+ tabIndex: -1,
434
+ "data-slot": "combobox-item",
435
+ "data-selected": isActive ? "true" : "false",
436
+ "data-active": isHighlighted ? "true" : void 0,
437
+ onMouseEnter: () => !disabled && setActiveValue(value),
438
+ onClick: () => !disabled && toggleValue(value),
439
+ onKeyDown: (e) => {
440
+ if (disabled) return;
441
+ if (e.key === "Enter" || e.key === " ") {
442
+ e.preventDefault();
443
+ toggleValue(value);
444
+ }
445
+ },
446
+ className: cn(
447
+ comboboxItemVariants({ disabled, appearance }),
448
+ "flex justify-between",
449
+ isHighlighted && "bg-[var(--zui-combobox-item-active-bg,oklch(93%_0.006_264.531))] dark:bg-[var(--zui-combobox-item-active-bg-dark,oklch(22%_0.006_264.531))]",
450
+ className
451
+ ),
452
+ ...props,
453
+ children: [
454
+ children,
455
+ isActive && /* @__PURE__ */ jsx(
456
+ "svg",
457
+ {
458
+ "aria-hidden": true,
459
+ viewBox: "0 0 24 24",
460
+ className: "size-4 shrink-0",
461
+ fill: "none",
462
+ stroke: "currentColor",
463
+ strokeWidth: "2.5",
464
+ strokeLinecap: "round",
465
+ strokeLinejoin: "round",
466
+ children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" })
467
+ }
468
+ )
469
+ ]
470
+ }
471
+ );
472
+ };
473
+ ComboboxItem.displayName = "ComboboxItem";
474
+ var ComboboxEmpty = ({
475
+ className,
476
+ children,
477
+ ...props
478
+ }) => {
479
+ const { visibleValues } = useCombobox();
480
+ if (visibleValues.length > 0) return null;
481
+ return /* @__PURE__ */ jsx(
482
+ "div",
483
+ {
484
+ "data-slot": "combobox-empty",
485
+ className: cn(zuiComboboxEmptyBase, className),
486
+ ...props,
487
+ children
488
+ }
489
+ );
490
+ };
491
+ ComboboxEmpty.displayName = "ComboboxEmpty";
492
+
493
+ export { Combobox, ComboboxContent, ComboboxContext, ComboboxEmpty, ComboboxItem, ComboboxList, ComboboxSearch, ComboboxTrigger, ComboboxValue, comboboxContentVariants, comboboxItemVariants, comboboxListVariants, comboboxTriggerVariants, useCombobox };
494
+ //# sourceMappingURL=combobox.mjs.map
495
+ //# sourceMappingURL=combobox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/combobox/variants.ts","../../src/ui/combobox/combobox-base.tsx"],"names":[],"mappings":"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","file":"combobox.mjs","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nimport {\n zuiComboboxContentAppearances,\n zuiComboboxContentBase,\n zuiComboboxDisabled,\n zuiComboboxItemAppearances,\n zuiComboboxItemBase,\n zuiComboboxListAppearances,\n zuiComboboxListBase,\n zuiComboboxSizes,\n zuiComboboxSpacing,\n zuiComboboxTriggerBase,\n zuiComboboxTriggerVariants,\n} from \"../../design-system/combobox\";\n\nexport const comboboxTriggerVariants = cva(zuiComboboxTriggerBase, {\n variants: {\n variant: zuiComboboxTriggerVariants,\n size: zuiComboboxSizes,\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\nexport const comboboxItemVariants = cva(zuiComboboxItemBase, {\n variants: {\n appearance: zuiComboboxItemAppearances,\n disabled: zuiComboboxDisabled,\n },\n defaultVariants: {\n appearance: \"default\",\n },\n});\n\nexport const comboboxListVariants = cva(zuiComboboxListBase, {\n variants: {\n appearance: zuiComboboxListAppearances,\n },\n defaultVariants: {\n appearance: \"default\",\n },\n});\n\nexport const comboboxContentVariants = cva(zuiComboboxContentBase, {\n variants: {\n appearance: zuiComboboxContentAppearances,\n size: zuiComboboxSizes,\n spacing: zuiComboboxSpacing,\n },\n defaultVariants: {\n appearance: \"default\",\n size: \"md\",\n spacing: \"default\",\n },\n});\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode, RefObject } from \"react\";\n\nimport {\n zuiComboboxEmptyBase,\n zuiComboboxSearchIconBase,\n zuiComboboxSearchInputBase,\n zuiComboboxSearchRowBase,\n} from \"../../design-system/combobox\";\nimport { cn } from \"../../lib/utils\";\nimport type {\n ComboboxAppearance,\n ComboboxContentProps,\n ComboboxContextType,\n ComboboxEmptyProps,\n ComboboxItemProps,\n ComboboxListProps,\n ComboboxOption,\n ComboboxProps,\n ComboboxSearchProps,\n ComboboxTriggerProps,\n ComboboxValueProps,\n} from \"./types\";\nimport {\n comboboxContentVariants,\n comboboxItemVariants,\n comboboxListVariants,\n comboboxTriggerVariants,\n} from \"./variants\";\n\nconst ComboboxContext = createContext<ComboboxContextType | null>(null);\nconst ComboboxAppearanceContext = createContext<ComboboxAppearance>(\"default\");\n\nexport const useCombobox = () => {\n const ctx = useContext(ComboboxContext);\n if (!ctx) throw new Error(\"Combobox components must be used inside Combobox\");\n return ctx;\n};\n\nexport { ComboboxContext };\n\nexport const Combobox = ({\n children,\n value,\n defaultValue = [],\n onChange,\n multiple = false,\n className,\n}: ComboboxProps) => {\n const baseId = useId();\n const triggerId = `${baseId}-trigger`;\n const listboxId = `${baseId}-listbox`;\n\n const [internal, setInternal] = useState<string[]>(defaultValue);\n const [open, setOpen] = useState(false);\n const [options, setOptions] = useState<ComboboxOption[]>([]);\n const [query, setQuery] = useState(\"\");\n const [activeValue, setActiveValue] = useState<string | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n\n const selected = value ?? internal;\n\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n const root = rootRef.current;\n if (!root) return;\n if (event.target instanceof Node && !root.contains(event.target)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n setQuery(\"\");\n setActiveValue(null);\n }\n }, [open]);\n\n const visibleValues = useMemo(() => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) return options.map((o) => o.value);\n return options\n .filter((o) => {\n if (o.disabled) return false;\n const labelText =\n typeof o.label === \"string\" ? o.label.toLowerCase() : \"\";\n return (\n o.value.toLowerCase().includes(normalized) ||\n labelText.includes(normalized)\n );\n })\n .map((o) => o.value);\n }, [query, options]);\n\n // If the current highlight gets filtered out while typing, clear it.\n // We do NOT auto-populate on open so ArrowDown always starts from the top.\n useEffect(() => {\n if (!open) return;\n if (!activeValue) return;\n if (visibleValues.includes(activeValue)) return;\n setActiveValue(null);\n }, [open, activeValue, visibleValues]);\n\n const setSelected = (vals: string[]) => {\n if (value !== undefined) {\n onChange?.(vals);\n } else {\n setInternal(vals);\n onChange?.(vals);\n }\n };\n\n const toggleValue = useCallback(\n (val: string) => {\n if (multiple) {\n const next = selected.includes(val)\n ? selected.filter((v) => v !== val)\n : [...selected, val];\n setSelected(next);\n } else {\n setSelected([val]);\n setOpen(false);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [multiple, selected],\n );\n\n const isSelected = useCallback(\n (val: string) => selected.includes(val),\n [selected],\n );\n\n const isVisible = useCallback(\n (val: string) => visibleValues.includes(val),\n [visibleValues],\n );\n\n const registerOption = useCallback((opt: ComboboxOption) => {\n setOptions((prev) => {\n const existing = prev.find((o) => o.value === opt.value);\n if (existing) {\n const labelChanged =\n (typeof opt.label === \"string\" || typeof opt.label === \"number\") &&\n existing.label !== opt.label;\n const disabledChanged = existing.disabled !== opt.disabled;\n if (labelChanged || disabledChanged) {\n return prev.map((o) => (o.value === opt.value ? opt : o));\n }\n return prev;\n }\n return [...prev, opt];\n });\n // No cleanup on unmount: options must persist across panel open/close so\n // ComboboxValue can still display the selected label when the panel is closed.\n }, []);\n\n return (\n <ComboboxContext.Provider\n value={{\n open,\n setOpen,\n query,\n setQuery,\n selected,\n toggleValue,\n isSelected,\n multiple,\n options,\n registerOption,\n visibleValues,\n isVisible,\n activeValue,\n setActiveValue,\n triggerId,\n listboxId,\n searchRef,\n triggerRef,\n }}\n >\n <div ref={rootRef} className={cn(\"relative w-full\", className)}>\n {children}\n </div>\n </ComboboxContext.Provider>\n );\n};\n\nCombobox.displayName = \"Combobox\";\n\nexport const ComboboxTrigger = ({\n className,\n variant,\n size,\n onClick,\n ref: refProp,\n ...props\n}: ComboboxTriggerProps) => {\n const { open, setOpen, triggerId, listboxId, triggerRef } = useCombobox();\n\n return (\n <button\n ref={(node) => {\n triggerRef.current = node;\n if (typeof refProp === \"function\") {\n refProp(node);\n } else if (refProp) {\n (refProp as RefObject<HTMLButtonElement | null>).current = node;\n }\n }}\n id={triggerId}\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n data-slot=\"combobox-trigger\"\n className={cn(comboboxTriggerVariants({ variant, size }), className)}\n {...props}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n setOpen(!open);\n }\n }}\n />\n );\n};\n\nComboboxTrigger.displayName = \"ComboboxTrigger\";\n\nexport const ComboboxValue = ({\n placeholder = \"Select...\",\n className,\n ...props\n}: ComboboxValueProps) => {\n const { selected, options } = useCombobox();\n const selectedOptions = options.filter((o) => selected.includes(o.value));\n\n if (selectedOptions.length === 0) {\n return (\n <span\n data-slot=\"combobox-placeholder\"\n className={cn(\n \"text-[color:var(--zui-combobox-value-placeholder-fg,oklch(55.1%_0.027_264.364))] dark:text-white\",\n className,\n )}\n {...props}\n >\n {placeholder}\n </span>\n );\n }\n\n return (\n <span data-slot=\"combobox-value\" className={cn(className)} {...props}>\n {selectedOptions.map((option, index) => (\n <span key={option.value}>\n {index > 0 ? \", \" : null}\n {option.label}\n </span>\n ))}\n </span>\n );\n};\n\nComboboxValue.displayName = \"ComboboxValue\";\n\nexport const ComboboxContent = ({\n children,\n className,\n appearance = \"default\",\n size = \"md\",\n spacing = \"default\",\n ...props\n}: ComboboxContentProps) => {\n const { open, triggerId, listboxId, searchRef } = useCombobox();\n\n useEffect(() => {\n if (open) {\n searchRef.current?.focus();\n }\n }, [open, searchRef]);\n\n if (!open) return null;\n\n return (\n <ComboboxAppearanceContext.Provider value={appearance}>\n <div\n aria-labelledby={triggerId}\n data-slot=\"combobox-content\"\n className={cn(\n comboboxContentVariants({ appearance, size, spacing }),\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </ComboboxAppearanceContext.Provider>\n );\n};\n\nComboboxContent.displayName = \"ComboboxContent\";\n\nexport const ComboboxSearch = ({\n className,\n placeholder = \"Search...\",\n ref: refProp,\n ...props\n}: ComboboxSearchProps) => {\n const {\n query,\n setQuery,\n visibleValues,\n activeValue,\n setActiveValue,\n toggleValue,\n setOpen,\n searchRef,\n listboxId,\n options,\n triggerRef,\n } = useCombobox();\n\n const optionByValue = useMemo(\n () => new Map(options.map((option) => [option.value, option])),\n [options],\n );\n\n const moveActive = (direction: 1 | -1) => {\n if (visibleValues.length === 0) return;\n const currentIndex = activeValue ? visibleValues.indexOf(activeValue) : -1;\n let nextIndex = currentIndex;\n for (let i = 0; i < visibleValues.length; i++) {\n if (nextIndex === -1) {\n nextIndex = direction === 1 ? 0 : visibleValues.length - 1;\n } else {\n nextIndex =\n (nextIndex + direction + visibleValues.length) % visibleValues.length;\n }\n const candidate = optionByValue.get(visibleValues[nextIndex] ?? \"\");\n if (candidate && !candidate.disabled) {\n setActiveValue(visibleValues[nextIndex] ?? null);\n return;\n }\n }\n };\n\n return (\n <div data-slot=\"combobox-search-row\" className={zuiComboboxSearchRowBase}>\n <svg\n aria-hidden\n viewBox=\"0 0 24 24\"\n className={zuiComboboxSearchIconBase}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n <input\n ref={(node) => {\n searchRef.current = node;\n if (typeof refProp === \"function\") {\n refProp(node);\n } else if (refProp) {\n (refProp as RefObject<HTMLInputElement | null>).current = node;\n }\n }}\n type=\"text\"\n role=\"combobox\"\n aria-expanded\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n activeValue ? `${listboxId}-option-${activeValue}` : undefined\n }\n data-slot=\"combobox-search\"\n className={cn(zuiComboboxSearchInputBase, className)}\n placeholder={placeholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n moveActive(1);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n moveActive(-1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n if (activeValue && visibleValues.includes(activeValue)) {\n const option = optionByValue.get(activeValue);\n if (option && !option.disabled) {\n toggleValue(activeValue);\n }\n }\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n }\n }}\n {...props}\n />\n </div>\n );\n};\n\nComboboxSearch.displayName = \"ComboboxSearch\";\n\nexport const ComboboxList = ({\n children,\n className,\n ...props\n}: ComboboxListProps) => {\n const { listboxId, triggerId } = useCombobox();\n const appearance = useContext(ComboboxAppearanceContext);\n\n return (\n <div\n id={listboxId}\n role=\"listbox\"\n aria-labelledby={triggerId}\n data-slot=\"combobox-list\"\n className={cn(comboboxListVariants({ appearance }), className)}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nComboboxList.displayName = \"ComboboxList\";\n\nexport const ComboboxItem = ({\n value,\n children,\n disabled,\n appearance = \"default\",\n className,\n ...props\n}: ComboboxItemProps) => {\n const {\n toggleValue,\n isSelected,\n registerOption,\n isVisible,\n activeValue,\n setActiveValue,\n listboxId,\n } = useCombobox();\n\n useEffect(() => {\n registerOption({ label: children, value, disabled });\n }, [children, disabled, registerOption, value]);\n\n const visible = isVisible(value);\n const isActive = isSelected(value);\n const isHighlighted = activeValue === value;\n\n if (!visible) return null;\n\n return (\n <div\n id={`${listboxId}-option-${value}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled ? true : undefined}\n tabIndex={-1}\n data-slot=\"combobox-item\"\n data-selected={isActive ? \"true\" : \"false\"}\n data-active={isHighlighted ? \"true\" : undefined}\n onMouseEnter={() => !disabled && setActiveValue(value)}\n onClick={() => !disabled && toggleValue(value)}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleValue(value);\n }\n }}\n className={cn(\n comboboxItemVariants({ disabled, appearance }),\n \"flex justify-between\",\n isHighlighted &&\n \"bg-[var(--zui-combobox-item-active-bg,oklch(93%_0.006_264.531))] dark:bg-[var(--zui-combobox-item-active-bg-dark,oklch(22%_0.006_264.531))]\",\n className,\n )}\n {...props}\n >\n {children}\n {isActive && (\n <svg\n aria-hidden\n viewBox=\"0 0 24 24\"\n className=\"size-4 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </div>\n );\n};\n\nComboboxItem.displayName = \"ComboboxItem\";\n\nexport const ComboboxEmpty = ({\n className,\n children,\n ...props\n}: ComboboxEmptyProps) => {\n const { visibleValues } = useCombobox();\n\n if (visibleValues.length > 0) return null;\n\n return (\n <div\n data-slot=\"combobox-empty\"\n className={cn(zuiComboboxEmptyBase, className)}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nComboboxEmpty.displayName = \"ComboboxEmpty\";\n"]}
@@ -3,10 +3,11 @@
3
3
 
4
4
  var chunkVMCOX3Z2_js = require('../chunk-VMCOX3Z2.js');
5
5
  require('../chunk-HPN7H5ZM.js');
6
- var chunkLQPKZ5ZD_js = require('../chunk-LQPKZ5ZD.js');
7
- require('../chunk-AQHY4S33.js');
8
- var chunk5J6QMTES_js = require('../chunk-5J6QMTES.js');
6
+ var chunkLS4GY2ZQ_js = require('../chunk-LS4GY2ZQ.js');
7
+ require('../chunk-FAMHSJTK.js');
8
+ var chunkIKXO5SJ4_js = require('../chunk-IKXO5SJ4.js');
9
9
  require('../chunk-USLP5NY6.js');
10
+ require('../chunk-P25NI2HG.js');
10
11
  require('../chunk-UU34Q42Q.js');
11
12
  require('../chunk-AADGUMYW.js');
12
13
  require('../chunk-3MK7CWEX.js');
@@ -17,27 +18,27 @@ require('../chunk-E7BPOL74.js');
17
18
  require('../chunk-3Z6L24ZK.js');
18
19
  require('../chunk-56DECC6D.js');
19
20
  require('../chunk-7M4TUP4I.js');
20
- require('../chunk-P25NI2HG.js');
21
+ require('../chunk-YN4ZS3R2.js');
21
22
  require('../chunk-MCYFKM7T.js');
22
23
  require('../chunk-22I54GJW.js');
23
24
  require('../chunk-LU6VEI4B.js');
24
25
  require('../chunk-FXDHDQTH.js');
25
26
  require('../chunk-FNNIH7R2.js');
26
27
  require('../chunk-VWHER5XN.js');
28
+ require('../chunk-L6AS5AVO.js');
27
29
  require('../chunk-JTMRSRYD.js');
28
30
  require('../chunk-I55QC57T.js');
29
31
  require('../chunk-7LFRU6AW.js');
30
32
  require('../chunk-L67EJJFN.js');
31
33
  require('../chunk-F6V74YMW.js');
32
- require('../chunk-YN4ZS3R2.js');
33
34
  require('../chunk-QTFOUK4H.js');
34
35
  require('../chunk-ISXAUMRW.js');
36
+ require('../chunk-ZVRGLG35.js');
35
37
  require('../chunk-R2256VSD.js');
36
38
  require('../chunk-Y4YQSCNL.js');
37
39
  require('../chunk-FWY22BZZ.js');
38
40
  require('../chunk-OGMIKRLJ.js');
39
41
  require('../chunk-Y7NRTCAT.js');
40
- require('../chunk-L6AS5AVO.js');
41
42
  require('../chunk-MUP7DVQR.js');
42
43
  require('../chunk-45CGVW7S.js');
43
44
  require('../chunk-S4OSJ4ZN.js');
@@ -52,37 +53,37 @@ var classVarianceAuthority = require('class-variance-authority');
52
53
  var jsxRuntime = require('react/jsx-runtime');
53
54
 
54
55
  function dynamicStepperIndicatorToneClass(state, tone) {
55
- return chunk5J6QMTES_js.zuiDynamicStepperIndicatorToneClasses[tone][state];
56
+ return chunkIKXO5SJ4_js.zuiDynamicStepperIndicatorToneClasses[tone][state];
56
57
  }
57
- var dynamicStepperRootVariants = classVarianceAuthority.cva(chunk5J6QMTES_js.zuiDynamicStepperRootBase, {
58
+ var dynamicStepperRootVariants = classVarianceAuthority.cva(chunkIKXO5SJ4_js.zuiDynamicStepperRootBase, {
58
59
  variants: {
59
- orientation: chunk5J6QMTES_js.zuiDynamicStepperRootOrientations
60
+ orientation: chunkIKXO5SJ4_js.zuiDynamicStepperRootOrientations
60
61
  },
61
62
  defaultVariants: {
62
63
  orientation: "horizontal"
63
64
  }
64
65
  });
65
- var dynamicStepperMapperVariants = classVarianceAuthority.cva(chunk5J6QMTES_js.zuiDynamicStepperMapperBase, {
66
+ var dynamicStepperMapperVariants = classVarianceAuthority.cva(chunkIKXO5SJ4_js.zuiDynamicStepperMapperBase, {
66
67
  variants: {
67
- orientation: chunk5J6QMTES_js.zuiDynamicStepperMapperOrientations
68
+ orientation: chunkIKXO5SJ4_js.zuiDynamicStepperMapperOrientations
68
69
  },
69
70
  defaultVariants: {
70
71
  orientation: "horizontal"
71
72
  }
72
73
  });
73
- var dynamicStepperItemVariants = classVarianceAuthority.cva(chunk5J6QMTES_js.zuiDynamicStepperItemBase, {
74
+ var dynamicStepperItemVariants = classVarianceAuthority.cva(chunkIKXO5SJ4_js.zuiDynamicStepperItemBase, {
74
75
  variants: {
75
- orientation: chunk5J6QMTES_js.zuiDynamicStepperItemOrientations
76
+ orientation: chunkIKXO5SJ4_js.zuiDynamicStepperItemOrientations
76
77
  },
77
78
  defaultVariants: {
78
79
  orientation: "horizontal"
79
80
  }
80
81
  });
81
82
  var dynamicStepperIndicatorVariants = classVarianceAuthority.cva(
82
- chunk5J6QMTES_js.zuiDynamicStepperIndicatorBase,
83
+ chunkIKXO5SJ4_js.zuiDynamicStepperIndicatorBase,
83
84
  {
84
85
  variants: {
85
- size: chunk5J6QMTES_js.zuiDynamicStepperIndicatorSizes
86
+ size: chunkIKXO5SJ4_js.zuiDynamicStepperIndicatorSizes
86
87
  },
87
88
  defaultVariants: {
88
89
  size: "md"
@@ -135,7 +136,7 @@ var DynamicStepper = ({
135
136
  ...rest,
136
137
  children: [
137
138
  /* @__PURE__ */ jsxRuntime.jsx(
138
- chunkLQPKZ5ZD_js.Button,
139
+ chunkLS4GY2ZQ_js.Button,
139
140
  {
140
141
  id: previousId,
141
142
  "data-slot": "dynamic-stepper-previous",
@@ -214,7 +215,7 @@ var DynamicStepper = ({
214
215
  }
215
216
  ),
216
217
  /* @__PURE__ */ jsxRuntime.jsx(
217
- chunkLQPKZ5ZD_js.Button,
218
+ chunkLS4GY2ZQ_js.Button,
218
219
  {
219
220
  id: nextId,
220
221
  "data-slot": "dynamic-stepper-next",