@luxfi/ui 1.0.1

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/dist/accordion.cjs +213 -0
  2. package/dist/accordion.js +186 -0
  3. package/dist/alert.cjs +553 -0
  4. package/dist/alert.js +531 -0
  5. package/dist/avatar.cjs +149 -0
  6. package/dist/avatar.js +125 -0
  7. package/dist/badge.cjs +611 -0
  8. package/dist/badge.js +589 -0
  9. package/dist/button.cjs +689 -0
  10. package/dist/button.js +664 -0
  11. package/dist/checkbox.cjs +265 -0
  12. package/dist/checkbox.js +241 -0
  13. package/dist/close-button.cjs +73 -0
  14. package/dist/close-button.js +51 -0
  15. package/dist/collapsible.cjs +711 -0
  16. package/dist/collapsible.js +685 -0
  17. package/dist/color-mode.cjs +36 -0
  18. package/dist/color-mode.js +32 -0
  19. package/dist/dialog.cjs +279 -0
  20. package/dist/dialog.js +246 -0
  21. package/dist/drawer.cjs +207 -0
  22. package/dist/drawer.js +175 -0
  23. package/dist/empty-state.cjs +93 -0
  24. package/dist/empty-state.js +71 -0
  25. package/dist/field.cjs +183 -0
  26. package/dist/field.js +160 -0
  27. package/dist/heading.cjs +46 -0
  28. package/dist/heading.js +40 -0
  29. package/dist/icon-button.cjs +491 -0
  30. package/dist/icon-button.js +470 -0
  31. package/dist/image.cjs +572 -0
  32. package/dist/image.js +551 -0
  33. package/dist/index.cjs +5749 -0
  34. package/dist/index.js +5586 -0
  35. package/dist/input-group.cjs +155 -0
  36. package/dist/input-group.js +133 -0
  37. package/dist/input.cjs +65 -0
  38. package/dist/input.js +59 -0
  39. package/dist/link.cjs +639 -0
  40. package/dist/link.js +612 -0
  41. package/dist/menu.cjs +305 -0
  42. package/dist/menu.js +269 -0
  43. package/dist/pin-input.cjs +182 -0
  44. package/dist/pin-input.js +160 -0
  45. package/dist/popover.cjs +327 -0
  46. package/dist/popover.js +294 -0
  47. package/dist/progress-circle.cjs +152 -0
  48. package/dist/progress-circle.js +128 -0
  49. package/dist/progress.cjs +117 -0
  50. package/dist/progress.js +94 -0
  51. package/dist/provider.cjs +22 -0
  52. package/dist/provider.js +20 -0
  53. package/dist/radio.cjs +177 -0
  54. package/dist/radio.js +153 -0
  55. package/dist/rating.cjs +80 -0
  56. package/dist/rating.js +58 -0
  57. package/dist/select.cjs +791 -0
  58. package/dist/select.js +757 -0
  59. package/dist/separator.cjs +57 -0
  60. package/dist/separator.js +51 -0
  61. package/dist/skeleton.cjs +370 -0
  62. package/dist/skeleton.js +346 -0
  63. package/dist/slider.cjs +138 -0
  64. package/dist/slider.js +115 -0
  65. package/dist/switch.cjs +163 -0
  66. package/dist/switch.js +140 -0
  67. package/dist/table.cjs +1053 -0
  68. package/dist/table.js +1019 -0
  69. package/dist/tabs.cjs +240 -0
  70. package/dist/tabs.js +213 -0
  71. package/dist/tag.cjs +651 -0
  72. package/dist/tag.js +628 -0
  73. package/dist/textarea.cjs +65 -0
  74. package/dist/textarea.js +59 -0
  75. package/dist/toaster.cjs +99 -0
  76. package/dist/toaster.js +96 -0
  77. package/dist/tooltip.cjs +171 -0
  78. package/dist/tooltip.js +148 -0
  79. package/dist/utils.cjs +11 -0
  80. package/dist/utils.js +9 -0
  81. package/package.json +296 -0
  82. package/src/accordion.tsx +285 -0
  83. package/src/alert.tsx +221 -0
  84. package/src/avatar.tsx +174 -0
  85. package/src/badge.tsx +158 -0
  86. package/src/button.tsx +411 -0
  87. package/src/checkbox.tsx +307 -0
  88. package/src/close-button.tsx +51 -0
  89. package/src/collapsible.tsx +126 -0
  90. package/src/color-mode.tsx +37 -0
  91. package/src/dialog.tsx +356 -0
  92. package/src/drawer.tsx +186 -0
  93. package/src/empty-state.tsx +97 -0
  94. package/src/field.tsx +202 -0
  95. package/src/heading.tsx +55 -0
  96. package/src/icon-button.tsx +192 -0
  97. package/src/image.tsx +280 -0
  98. package/src/index.ts +192 -0
  99. package/src/input-group.tsx +159 -0
  100. package/src/input.tsx +60 -0
  101. package/src/link.tsx +333 -0
  102. package/src/menu.tsx +471 -0
  103. package/src/pin-input.tsx +187 -0
  104. package/src/popover.tsx +400 -0
  105. package/src/progress-circle.tsx +180 -0
  106. package/src/progress.tsx +109 -0
  107. package/src/provider.tsx +12 -0
  108. package/src/radio.tsx +175 -0
  109. package/src/rating.tsx +79 -0
  110. package/src/select.tsx +696 -0
  111. package/src/separator.tsx +59 -0
  112. package/src/skeleton.tsx +302 -0
  113. package/src/slider.tsx +152 -0
  114. package/src/switch.tsx +158 -0
  115. package/src/table.tsx +621 -0
  116. package/src/tabs.tsx +354 -0
  117. package/src/tag.tsx +159 -0
  118. package/src/textarea.tsx +60 -0
  119. package/src/toaster.tsx +117 -0
  120. package/src/tokens.css +438 -0
  121. package/src/tooltip.tsx +184 -0
  122. package/src/utils/cn.ts +7 -0
  123. package/src/utils.ts +6 -0
  124. package/tokens.css +438 -0
@@ -0,0 +1,791 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var RadixSelect = require('@radix-ui/react-select');
5
+ var usehooks = require('@uidotdev/usehooks');
6
+ var React2 = require('react');
7
+ var clsx = require('clsx');
8
+ var tailwindMerge = require('tailwind-merge');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var RadixSelect__namespace = /*#__PURE__*/_interopNamespace(RadixSelect);
30
+ var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
31
+
32
+ function cn(...inputs) {
33
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
34
+ }
35
+ var SPACING_SCALE = 4;
36
+ function toStylePx(value) {
37
+ if (value === void 0) return void 0;
38
+ if (typeof value === "string") return value;
39
+ return `${value * SPACING_SCALE}px`;
40
+ }
41
+ function extractSkeletonStyleProps(props) {
42
+ const style = {};
43
+ const rest = {};
44
+ function resolveDimension(value) {
45
+ if (value === void 0 || value === null) return void 0;
46
+ if (typeof value === "number") return `${value * SPACING_SCALE}px`;
47
+ if (typeof value === "string") return value;
48
+ if (typeof value === "object") {
49
+ const obj = value;
50
+ return obj.base ?? obj.lg ?? obj.xl ?? Object.values(obj)[0];
51
+ }
52
+ return void 0;
53
+ }
54
+ for (const [key, value] of Object.entries(props)) {
55
+ if (value === void 0) continue;
56
+ switch (key) {
57
+ case "w": {
58
+ const v = resolveDimension(value);
59
+ if (v) style.width = v;
60
+ break;
61
+ }
62
+ case "h": {
63
+ const v = resolveDimension(value);
64
+ if (v) style.height = v;
65
+ break;
66
+ }
67
+ case "minW": {
68
+ const v = resolveDimension(value);
69
+ if (v) style.minWidth = v;
70
+ break;
71
+ }
72
+ case "maxW": {
73
+ const v = resolveDimension(value);
74
+ if (v) style.maxWidth = v;
75
+ break;
76
+ }
77
+ case "height":
78
+ style.height = value;
79
+ break;
80
+ case "display":
81
+ style.display = value;
82
+ break;
83
+ case "flexGrow":
84
+ style.flexGrow = value;
85
+ break;
86
+ case "flexShrink":
87
+ style.flexShrink = value;
88
+ break;
89
+ case "flexBasis":
90
+ style.flexBasis = value;
91
+ break;
92
+ case "fontWeight":
93
+ style.fontWeight = value;
94
+ break;
95
+ case "borderRadius":
96
+ style.borderRadius = value;
97
+ break;
98
+ case "alignSelf":
99
+ style.alignSelf = value;
100
+ break;
101
+ case "alignItems":
102
+ style.alignItems = value;
103
+ break;
104
+ case "justifyContent":
105
+ style.justifyContent = value;
106
+ break;
107
+ case "color":
108
+ style.color = value;
109
+ break;
110
+ case "mt":
111
+ style.marginTop = toStylePx(value);
112
+ break;
113
+ case "mb":
114
+ style.marginBottom = toStylePx(value);
115
+ break;
116
+ case "ml":
117
+ style.marginLeft = toStylePx(value);
118
+ break;
119
+ case "mr":
120
+ style.marginRight = toStylePx(value);
121
+ break;
122
+ case "overflow":
123
+ style.overflow = value;
124
+ break;
125
+ case "whiteSpace":
126
+ style.whiteSpace = value;
127
+ break;
128
+ case "textOverflow":
129
+ style.textOverflow = value;
130
+ break;
131
+ case "textTransform":
132
+ style.textTransform = value;
133
+ break;
134
+ case "gap":
135
+ style.gap = typeof value === "number" ? `${value * SPACING_SCALE}px` : value;
136
+ break;
137
+ case "gridTemplateColumns":
138
+ style.gridTemplateColumns = value;
139
+ break;
140
+ case "minWidth":
141
+ style.minWidth = value;
142
+ break;
143
+ case "boxSize": {
144
+ const s = typeof value === "number" ? `${value * SPACING_SCALE}px` : value;
145
+ style.width = s;
146
+ style.height = s;
147
+ break;
148
+ }
149
+ case "py": {
150
+ const v = toStylePx(value);
151
+ style.paddingTop = v;
152
+ style.paddingBottom = v;
153
+ break;
154
+ }
155
+ case "px": {
156
+ const v = toStylePx(value);
157
+ style.paddingLeft = v;
158
+ style.paddingRight = v;
159
+ break;
160
+ }
161
+ case "p": {
162
+ const v = toStylePx(value);
163
+ style.padding = v;
164
+ break;
165
+ }
166
+ case "hideBelow":
167
+ break;
168
+ // handled via className
169
+ case "textStyle":
170
+ break;
171
+ // drop textStyle, not directly applicable
172
+ case "fontSize":
173
+ style.fontSize = value;
174
+ break;
175
+ case "flexWrap":
176
+ style.flexWrap = value;
177
+ break;
178
+ case "wordBreak":
179
+ style.wordBreak = value;
180
+ break;
181
+ case "lineHeight":
182
+ style.lineHeight = value;
183
+ break;
184
+ case "marginRight":
185
+ style.marginRight = value;
186
+ break;
187
+ case "position":
188
+ style.position = value;
189
+ break;
190
+ case "background":
191
+ style.background = value;
192
+ break;
193
+ default:
194
+ rest[key] = value;
195
+ break;
196
+ }
197
+ }
198
+ return { style, rest };
199
+ }
200
+ var Skeleton = React2__namespace.forwardRef(
201
+ function Skeleton2(props, ref) {
202
+ const {
203
+ loading = false,
204
+ asChild,
205
+ className,
206
+ children,
207
+ style: styleProp,
208
+ // Destructure style-prop shims so they don't leak into DOM
209
+ w: _w,
210
+ h: _h,
211
+ minW: _minW,
212
+ maxW: _maxW,
213
+ display: _display,
214
+ flexGrow: _flexGrow,
215
+ flexShrink: _flexShrink,
216
+ flexBasis: _flexBasis,
217
+ fontWeight: _fontWeight,
218
+ textStyle: _textStyle,
219
+ borderRadius: _borderRadius,
220
+ alignSelf: _alignSelf,
221
+ alignItems: _alignItems,
222
+ justifyContent: _justifyContent,
223
+ color: _color,
224
+ mt: _mt,
225
+ mb: _mb,
226
+ ml: _ml,
227
+ mr: _mr,
228
+ height: _height,
229
+ overflow: _overflow,
230
+ whiteSpace: _whiteSpace,
231
+ textOverflow: _textOverflow,
232
+ textTransform: _textTransform,
233
+ gap: _gap,
234
+ gridTemplateColumns: _gridTemplateColumns,
235
+ minWidth: _minWidth,
236
+ boxSize: _boxSize,
237
+ py: _py,
238
+ px: _px,
239
+ p: _p,
240
+ hideBelow: _hideBelow,
241
+ fontSize: _fontSize,
242
+ flexWrap: _flexWrap,
243
+ wordBreak: _wordBreak,
244
+ lineHeight: _lineHeight,
245
+ marginRight: _marginRight,
246
+ position: _position,
247
+ background: _background,
248
+ as: Component = "div",
249
+ ...htmlRest
250
+ } = props;
251
+ const { style: shimStyle } = extractSkeletonStyleProps({
252
+ w: _w,
253
+ h: _h,
254
+ minW: _minW,
255
+ maxW: _maxW,
256
+ display: _display,
257
+ flexGrow: _flexGrow,
258
+ flexShrink: _flexShrink,
259
+ flexBasis: _flexBasis,
260
+ fontWeight: _fontWeight,
261
+ textStyle: _textStyle,
262
+ borderRadius: _borderRadius,
263
+ alignSelf: _alignSelf,
264
+ alignItems: _alignItems,
265
+ justifyContent: _justifyContent,
266
+ color: _color,
267
+ mt: _mt,
268
+ mb: _mb,
269
+ ml: _ml,
270
+ mr: _mr,
271
+ height: _height,
272
+ overflow: _overflow,
273
+ whiteSpace: _whiteSpace,
274
+ textOverflow: _textOverflow,
275
+ textTransform: _textTransform,
276
+ gap: _gap,
277
+ gridTemplateColumns: _gridTemplateColumns,
278
+ minWidth: _minWidth,
279
+ boxSize: _boxSize,
280
+ py: _py,
281
+ px: _px,
282
+ p: _p,
283
+ hideBelow: _hideBelow,
284
+ fontSize: _fontSize,
285
+ flexWrap: _flexWrap,
286
+ wordBreak: _wordBreak,
287
+ lineHeight: _lineHeight,
288
+ marginRight: _marginRight,
289
+ position: _position,
290
+ background: _background
291
+ });
292
+ const mergedStyle = Object.keys(shimStyle).length > 0 || styleProp ? { ...shimStyle, ...styleProp } : void 0;
293
+ const HIDE_BELOW_MAP = { lg: "lg:hidden", md: "md:hidden", sm: "sm:hidden" };
294
+ const hideBelowClass = _hideBelow ? HIDE_BELOW_MAP[_hideBelow] : void 0;
295
+ const finalClassName = hideBelowClass ? cn(className, hideBelowClass) : className;
296
+ if (!loading) {
297
+ if (asChild && React2__namespace.isValidElement(children)) {
298
+ return children;
299
+ }
300
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, { ref, className: finalClassName, style: mergedStyle, ...htmlRest, children });
301
+ }
302
+ if (asChild && React2__namespace.isValidElement(children)) {
303
+ return /* @__PURE__ */ jsxRuntime.jsx(
304
+ Component,
305
+ {
306
+ ref,
307
+ "data-loading": true,
308
+ className: cn(
309
+ "animate-skeleton-shimmer rounded-sm",
310
+ "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
311
+ "bg-[length:200%_100%]",
312
+ "text-transparent [&_*]:invisible",
313
+ finalClassName
314
+ ),
315
+ style: mergedStyle,
316
+ ...htmlRest,
317
+ children
318
+ }
319
+ );
320
+ }
321
+ return /* @__PURE__ */ jsxRuntime.jsx(
322
+ Component,
323
+ {
324
+ ref,
325
+ "data-loading": true,
326
+ className: cn(
327
+ "animate-skeleton-shimmer rounded-sm",
328
+ "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
329
+ "bg-[length:200%_100%]",
330
+ children ? "text-transparent [&_*]:invisible" : "min-h-5",
331
+ finalClassName
332
+ ),
333
+ style: mergedStyle,
334
+ ...htmlRest,
335
+ children
336
+ }
337
+ );
338
+ }
339
+ );
340
+ React2__namespace.forwardRef(
341
+ function SkeletonCircle2(props, ref) {
342
+ const { size = 40, loading = true, className, ...rest } = props;
343
+ const dimension = typeof size === "number" ? `${size}px` : size;
344
+ return /* @__PURE__ */ jsxRuntime.jsx(
345
+ Skeleton,
346
+ {
347
+ ref,
348
+ loading,
349
+ className: cn("rounded-full shrink-0", className),
350
+ style: { width: dimension, height: dimension, ...rest.style },
351
+ ...rest
352
+ }
353
+ );
354
+ }
355
+ );
356
+ React2__namespace.forwardRef(
357
+ function SkeletonText2(props, ref) {
358
+ const { noOfLines = 3, loading = true, className, ...rest } = props;
359
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...rest, children: Array.from({ length: noOfLines }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
360
+ Skeleton,
361
+ {
362
+ loading,
363
+ className: cn("h-4", index === noOfLines - 1 && "max-w-[80%]")
364
+ },
365
+ index
366
+ )) });
367
+ }
368
+ );
369
+ function createListCollection(config) {
370
+ return { items: config.items };
371
+ }
372
+ var ArrowIcon = ({ className }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { className, viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 15L12.5 10L7.5 5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) });
373
+ var CheckIcon = ({ className }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { className, viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16.667 5L7.5 14.167 3.333 10", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) });
374
+ function FilterInput({ placeholder, initialValue = "", onChange }) {
375
+ const [value, setValue] = React2__namespace.useState(initialValue);
376
+ const handleChange = React2__namespace.useCallback((e) => {
377
+ setValue(e.target.value);
378
+ onChange?.(e.target.value);
379
+ }, [onChange]);
380
+ return /* @__PURE__ */ jsxRuntime.jsx(
381
+ "input",
382
+ {
383
+ type: "text",
384
+ placeholder,
385
+ value,
386
+ onChange: handleChange,
387
+ className: cn(
388
+ "w-full px-3 py-2 text-sm outline-none",
389
+ "bg-transparent border-b border-[var(--color-border-divider)]",
390
+ "placeholder:text-[var(--color-input-placeholder)]"
391
+ )
392
+ }
393
+ );
394
+ }
395
+ var SelectInternalContext = React2__namespace.createContext(null);
396
+ function useSelectInternalContext() {
397
+ const ctx = React2__namespace.useContext(SelectInternalContext);
398
+ if (!ctx) {
399
+ throw new Error("Select compound components must be rendered inside <SelectRoot>");
400
+ }
401
+ return ctx;
402
+ }
403
+ var SelectRoot = React2__namespace.forwardRef(
404
+ function SelectRoot2(props, ref) {
405
+ const {
406
+ children,
407
+ collection: collectionProp,
408
+ defaultValue: defaultValueArr,
409
+ value: valueProp,
410
+ onValueChange: onValueChangeProp,
411
+ onInteractOutside,
412
+ name,
413
+ disabled,
414
+ readOnly,
415
+ required,
416
+ invalid,
417
+ size,
418
+ variant,
419
+ open: openProp,
420
+ defaultOpen,
421
+ onOpenChange,
422
+ positioning: _positioning,
423
+ lazyMount: _lazyMount,
424
+ unmountOnExit: _unmountOnExit,
425
+ asChild: _asChild,
426
+ className,
427
+ style,
428
+ w,
429
+ maxW,
430
+ minW,
431
+ hideFrom: _hideFrom
432
+ } = props;
433
+ const collection = collectionProp ?? createListCollection({ items: [] });
434
+ const [internalValue, setInternalValue] = React2__namespace.useState(defaultValueArr ?? []);
435
+ const currentValue = valueProp ?? internalValue;
436
+ const selectedItems = React2__namespace.useMemo(() => {
437
+ return currentValue.map((v) => collection.items.find((item) => item.value === v)).filter(Boolean);
438
+ }, [currentValue, collection.items]);
439
+ const [open, setOpen] = React2__namespace.useState(defaultOpen ?? false);
440
+ const isOpen = openProp ?? open;
441
+ const handleOpenChange = React2__namespace.useCallback((nextOpen) => {
442
+ setOpen(nextOpen);
443
+ onOpenChange?.(nextOpen);
444
+ if (!nextOpen) {
445
+ onInteractOutside?.();
446
+ }
447
+ }, [onOpenChange, onInteractOutside]);
448
+ const handleRadixValueChange = React2__namespace.useCallback((radixValue) => {
449
+ const nextArr = [radixValue];
450
+ if (!valueProp) {
451
+ setInternalValue(nextArr);
452
+ }
453
+ const items = collection.items.filter((item) => nextArr.includes(item.value));
454
+ onValueChangeProp?.({ value: nextArr, items });
455
+ }, [valueProp, collection.items, onValueChangeProp]);
456
+ const ctxValue = React2__namespace.useMemo(() => ({
457
+ value: currentValue,
458
+ selectedItems,
459
+ collection,
460
+ onValueChange: (details) => {
461
+ if (!valueProp) {
462
+ setInternalValue(details.value);
463
+ }
464
+ onValueChangeProp?.(details);
465
+ },
466
+ open: isOpen,
467
+ size,
468
+ variant,
469
+ disabled
470
+ }), [currentValue, selectedItems, collection, valueProp, onValueChangeProp, isOpen, size, variant, disabled]);
471
+ const resolveVal = (v) => {
472
+ if (!v) return void 0;
473
+ if (typeof v === "string") return v;
474
+ return v.base ?? v.lg ?? Object.values(v)[0];
475
+ };
476
+ const inlineStyle = React2__namespace.useMemo(() => {
477
+ const s = { ...style };
478
+ const rw = resolveVal(w);
479
+ if (rw) s.width = rw;
480
+ const rmw = resolveVal(maxW);
481
+ if (rmw) s.maxWidth = rmw;
482
+ const rminw = resolveVal(minW);
483
+ if (rminw) s.minWidth = rminw;
484
+ return s;
485
+ }, [style, w, maxW, minW]);
486
+ return /* @__PURE__ */ jsxRuntime.jsx(SelectInternalContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxRuntime.jsx(
487
+ RadixSelect__namespace.Root,
488
+ {
489
+ value: currentValue[0] ?? "",
490
+ defaultValue: defaultValueArr?.[0],
491
+ onValueChange: handleRadixValueChange,
492
+ open: isOpen,
493
+ onOpenChange: handleOpenChange,
494
+ disabled: disabled || readOnly,
495
+ name,
496
+ required,
497
+ children: /* @__PURE__ */ jsxRuntime.jsx(
498
+ "div",
499
+ {
500
+ ref,
501
+ className: cn("relative inline-flex", className),
502
+ style: inlineStyle,
503
+ "data-invalid": invalid || void 0,
504
+ "data-disabled": disabled || void 0,
505
+ "data-variant": variant || void 0,
506
+ "data-size": size || void 0,
507
+ children
508
+ }
509
+ )
510
+ }
511
+ ) });
512
+ }
513
+ );
514
+ var SelectControl = React2__namespace.forwardRef(
515
+ function SelectControl2(props, ref) {
516
+ const { children, noIndicator, triggerProps, loading, defaultValue } = props;
517
+ const ctx = useSelectInternalContext();
518
+ const isDefaultValue = Array.isArray(defaultValue) ? ctx.value.every((item) => defaultValue.includes(item)) : false;
519
+ const { asChild, px: _px, className: triggerClassName, ...radixTriggerProps } = triggerProps ?? {};
520
+ const trigger = /* @__PURE__ */ jsxRuntime.jsx(
521
+ RadixSelect__namespace.Trigger,
522
+ {
523
+ ref,
524
+ asChild,
525
+ className: cn(
526
+ "group peer inline-flex items-center gap-2 cursor-pointer",
527
+ "rounded-lg text-sm transition-colors outline-none",
528
+ "border border-[var(--color-input-border)] bg-[var(--color-input-bg)] text-[var(--color-input-fg)]",
529
+ "hover:border-[var(--color-input-border-hover)]",
530
+ "focus-visible:border-[var(--color-input-border-focus)]",
531
+ "disabled:opacity-50 disabled:cursor-not-allowed",
532
+ ctx.variant === "plain" && "border-transparent bg-transparent px-1 py-0.5",
533
+ ctx.variant !== "plain" && ctx.size === "lg" && "px-4 py-2.5 min-h-[52px]",
534
+ ctx.variant !== "plain" && ctx.size !== "lg" && "px-3 py-1.5 min-h-[36px]",
535
+ triggerClassName
536
+ ),
537
+ "data-default-value": isDefaultValue || void 0,
538
+ ...radixTriggerProps,
539
+ children: asChild ? children : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
540
+ children,
541
+ !noIndicator && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto shrink-0 transition-transform data-[state=open]:rotate-180 text-[var(--color-icon-secondary)]", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon, { className: "h-5 w-5 -rotate-90" }) })
542
+ ] })
543
+ }
544
+ );
545
+ if (loading) {
546
+ return /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { loading, asChild: true, children: trigger });
547
+ }
548
+ return trigger;
549
+ }
550
+ );
551
+ var SelectClearTrigger = React2__namespace.forwardRef(
552
+ function SelectClearTrigger2(props, ref) {
553
+ const { className, ...rest } = props;
554
+ const ctx = useSelectInternalContext();
555
+ const handleClick = React2__namespace.useCallback(() => {
556
+ ctx.onValueChange({ value: [], items: [] });
557
+ }, [ctx]);
558
+ return /* @__PURE__ */ jsxRuntime.jsx(
559
+ "button",
560
+ {
561
+ ref,
562
+ type: "button",
563
+ onClick: handleClick,
564
+ className: cn("pointer-events-auto", className),
565
+ "aria-label": "Clear selection",
566
+ ...rest,
567
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) })
568
+ }
569
+ );
570
+ }
571
+ );
572
+ var SelectContent = React2__namespace.forwardRef(
573
+ function SelectContent2(props, ref) {
574
+ const { portalled = true, portalRef, children, className, ...rest } = props;
575
+ const content = /* @__PURE__ */ jsxRuntime.jsx(
576
+ RadixSelect__namespace.Content,
577
+ {
578
+ ref,
579
+ position: "popper",
580
+ sideOffset: 4,
581
+ className: cn(
582
+ "z-50 min-w-[8rem] overflow-hidden rounded-lg",
583
+ "bg-[var(--color-popover-bg)] shadow-[var(--shadow-popover)]",
584
+ "border border-[var(--color-border-divider)]",
585
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
586
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
587
+ className
588
+ ),
589
+ ...rest,
590
+ children: /* @__PURE__ */ jsxRuntime.jsx(RadixSelect__namespace.Viewport, { className: "p-1", children })
591
+ }
592
+ );
593
+ if (portalled) {
594
+ return /* @__PURE__ */ jsxRuntime.jsx(RadixSelect__namespace.Portal, { container: portalRef?.current ?? void 0, children: content });
595
+ }
596
+ return content;
597
+ }
598
+ );
599
+ var SelectItem = React2__namespace.forwardRef(
600
+ function SelectItem2(props, ref) {
601
+ const { item, children, className, ...rest } = props;
602
+ return /* @__PURE__ */ jsxRuntime.jsxs(
603
+ RadixSelect__namespace.Item,
604
+ {
605
+ ref,
606
+ value: item.value,
607
+ textValue: item.label,
608
+ className: cn(
609
+ "relative flex cursor-pointer select-none items-center gap-2",
610
+ "rounded-md px-3 py-2 text-sm outline-none",
611
+ "text-[var(--color-text-primary)]",
612
+ "data-[highlighted]:bg-[var(--color-selected-control-bg)]",
613
+ "data-[state=checked]:font-medium",
614
+ "data-[disabled]:opacity-50 data-[disabled]:pointer-events-none",
615
+ className
616
+ ),
617
+ ...rest,
618
+ children: [
619
+ item.icon,
620
+ /* @__PURE__ */ jsxRuntime.jsx(RadixSelect__namespace.ItemText, { children }),
621
+ /* @__PURE__ */ jsxRuntime.jsx(RadixSelect__namespace.ItemIndicator, { className: "ml-auto shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { className: "h-5 w-5" }) })
622
+ ]
623
+ }
624
+ );
625
+ }
626
+ );
627
+ var SelectValueText = React2__namespace.forwardRef(
628
+ function SelectValueText2(props, ref) {
629
+ const { children, size, required, invalid, errorText, mode, className, style, placeholder: placeholderProp, ...rest } = props;
630
+ const ctx = useSelectInternalContext();
631
+ const placeholderText = `${placeholderProp ?? ""}${required ? "*" : ""}${invalid && errorText ? ` - ${errorText}` : ""}`;
632
+ const content = (() => {
633
+ const items = ctx.selectedItems;
634
+ if (items.length === 0) return null;
635
+ if (children) return children(items);
636
+ if (items.length === 1) {
637
+ const item = items[0];
638
+ if (!item) return null;
639
+ const label = size === "lg" ? /* @__PURE__ */ jsxRuntime.jsx(
640
+ "span",
641
+ {
642
+ className: cn(
643
+ "text-xs block",
644
+ invalid ? "text-[var(--color-text-error)]" : "text-[var(--color-input-placeholder)]"
645
+ ),
646
+ style: { display: "-webkit-box" },
647
+ children: placeholderText
648
+ }
649
+ ) : null;
650
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
651
+ label,
652
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center flex-nowrap gap-1", children: [
653
+ item.icon,
654
+ mode !== "compact" && /* @__PURE__ */ jsxRuntime.jsx(
655
+ "span",
656
+ {
657
+ style: {
658
+ WebkitLineClamp: 1,
659
+ WebkitBoxOrient: "vertical",
660
+ display: "-webkit-box",
661
+ overflow: "hidden"
662
+ },
663
+ children: item.renderLabel ? item.renderLabel("value-text") : item.label
664
+ }
665
+ )
666
+ ] })
667
+ ] });
668
+ }
669
+ return `${items.length} selected`;
670
+ })();
671
+ return /* @__PURE__ */ jsxRuntime.jsx(
672
+ RadixSelect__namespace.Value,
673
+ {
674
+ ref,
675
+ placeholder: placeholderText,
676
+ className: cn("flex flex-col justify-center min-w-0 truncate", className),
677
+ ...rest,
678
+ children: content
679
+ }
680
+ );
681
+ }
682
+ );
683
+ var SelectItemGroup = React2__namespace.forwardRef(
684
+ function SelectItemGroup2(props, ref) {
685
+ const { children, label, className, ...rest } = props;
686
+ return /* @__PURE__ */ jsxRuntime.jsxs(RadixSelect__namespace.Group, { ref, className: cn("py-1", className), ...rest, children: [
687
+ /* @__PURE__ */ jsxRuntime.jsx(RadixSelect__namespace.Label, { className: "px-3 py-1.5 text-xs font-medium text-[var(--color-text-secondary)]", children: label }),
688
+ children
689
+ ] });
690
+ }
691
+ );
692
+ var SelectLabel = RadixSelect__namespace.Label;
693
+ var SelectItemText = RadixSelect__namespace.ItemText;
694
+ var Select = React2__namespace.forwardRef((props, ref) => {
695
+ const { collection, placeholder, portalled = true, loading, errorText, contentProps, contentHeader, itemFilter, mode, ...rest } = props;
696
+ return /* @__PURE__ */ jsxRuntime.jsxs(
697
+ SelectRoot,
698
+ {
699
+ ref,
700
+ collection,
701
+ ...rest,
702
+ children: [
703
+ /* @__PURE__ */ jsxRuntime.jsx(SelectControl, { loading, children: /* @__PURE__ */ jsxRuntime.jsx(
704
+ SelectValueText,
705
+ {
706
+ placeholder,
707
+ size: props.size,
708
+ required: props.required,
709
+ invalid: props.invalid,
710
+ errorText,
711
+ mode
712
+ }
713
+ ) }),
714
+ /* @__PURE__ */ jsxRuntime.jsxs(SelectContent, { portalled, ...contentProps, children: [
715
+ contentHeader,
716
+ collection.items.filter(itemFilter ?? (() => true)).map((item) => /* @__PURE__ */ jsxRuntime.jsxs(React2__namespace.Fragment, { children: [
717
+ /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { item, children: item.renderLabel ? item.renderLabel("item") : item.label }),
718
+ item.afterElement
719
+ ] }, item.value))
720
+ ] })
721
+ ]
722
+ }
723
+ );
724
+ });
725
+ var SelectAsync = React2__namespace.forwardRef((props, ref) => {
726
+ const { placeholder, portalled = true, loading, loadOptions, extraControls, onValueChange, errorText, mode, contentHeader, ...rest } = props;
727
+ const [collection, setCollection] = React2__namespace.useState(createListCollection({ items: [] }));
728
+ const [inputValue, setInputValue] = React2__namespace.useState("");
729
+ const [value, setValue] = React2__namespace.useState([]);
730
+ const debouncedInputValue = usehooks.useDebounce(inputValue, 300);
731
+ React2__namespace.useEffect(() => {
732
+ loadOptions(debouncedInputValue, value).then(setCollection);
733
+ }, [debouncedInputValue, loadOptions, value]);
734
+ const handleFilterChange = React2__namespace.useCallback((val) => {
735
+ setInputValue(val);
736
+ }, []);
737
+ const handleValueChange = React2__namespace.useCallback(({ value: v, items }) => {
738
+ setValue(v);
739
+ onValueChange?.({ value: v, items });
740
+ }, [onValueChange]);
741
+ return /* @__PURE__ */ jsxRuntime.jsxs(
742
+ SelectRoot,
743
+ {
744
+ ref,
745
+ collection,
746
+ onValueChange: handleValueChange,
747
+ ...rest,
748
+ children: [
749
+ /* @__PURE__ */ jsxRuntime.jsx(SelectControl, { loading, children: /* @__PURE__ */ jsxRuntime.jsx(
750
+ SelectValueText,
751
+ {
752
+ placeholder,
753
+ size: props.size,
754
+ required: props.required,
755
+ invalid: props.invalid,
756
+ errorText,
757
+ mode
758
+ }
759
+ ) }),
760
+ /* @__PURE__ */ jsxRuntime.jsxs(SelectContent, { portalled, children: [
761
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-4", children: [
762
+ /* @__PURE__ */ jsxRuntime.jsx(
763
+ FilterInput,
764
+ {
765
+ placeholder: "Search",
766
+ initialValue: inputValue,
767
+ onChange: handleFilterChange
768
+ }
769
+ ),
770
+ extraControls
771
+ ] }),
772
+ contentHeader,
773
+ collection.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { item, children: item.renderLabel ? item.renderLabel("item") : item.label }, item.value))
774
+ ] })
775
+ ]
776
+ }
777
+ );
778
+ });
779
+
780
+ exports.Select = Select;
781
+ exports.SelectAsync = SelectAsync;
782
+ exports.SelectClearTrigger = SelectClearTrigger;
783
+ exports.SelectContent = SelectContent;
784
+ exports.SelectControl = SelectControl;
785
+ exports.SelectItem = SelectItem;
786
+ exports.SelectItemGroup = SelectItemGroup;
787
+ exports.SelectItemText = SelectItemText;
788
+ exports.SelectLabel = SelectLabel;
789
+ exports.SelectRoot = SelectRoot;
790
+ exports.SelectValueText = SelectValueText;
791
+ exports.createListCollection = createListCollection;