@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
package/dist/badge.js ADDED
@@ -0,0 +1,589 @@
1
+ "use client";
2
+ import { cva } from 'class-variance-authority';
3
+ import * as React2 from 'react';
4
+ import React2__default from 'react';
5
+ import { clsx } from 'clsx';
6
+ import { twMerge } from 'tailwind-merge';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+ import * as RadixTooltip from '@radix-ui/react-tooltip';
9
+ import { useClickAway } from '@uidotdev/usehooks';
10
+
11
+ // src/badge.tsx
12
+ function cn(...inputs) {
13
+ return twMerge(clsx(inputs));
14
+ }
15
+ var SPACING_SCALE = 4;
16
+ function toStylePx(value) {
17
+ if (value === void 0) return void 0;
18
+ if (typeof value === "string") return value;
19
+ return `${value * SPACING_SCALE}px`;
20
+ }
21
+ function extractSkeletonStyleProps(props) {
22
+ const style = {};
23
+ const rest = {};
24
+ function resolveDimension(value) {
25
+ if (value === void 0 || value === null) return void 0;
26
+ if (typeof value === "number") return `${value * SPACING_SCALE}px`;
27
+ if (typeof value === "string") return value;
28
+ if (typeof value === "object") {
29
+ const obj = value;
30
+ return obj.base ?? obj.lg ?? obj.xl ?? Object.values(obj)[0];
31
+ }
32
+ return void 0;
33
+ }
34
+ for (const [key, value] of Object.entries(props)) {
35
+ if (value === void 0) continue;
36
+ switch (key) {
37
+ case "w": {
38
+ const v = resolveDimension(value);
39
+ if (v) style.width = v;
40
+ break;
41
+ }
42
+ case "h": {
43
+ const v = resolveDimension(value);
44
+ if (v) style.height = v;
45
+ break;
46
+ }
47
+ case "minW": {
48
+ const v = resolveDimension(value);
49
+ if (v) style.minWidth = v;
50
+ break;
51
+ }
52
+ case "maxW": {
53
+ const v = resolveDimension(value);
54
+ if (v) style.maxWidth = v;
55
+ break;
56
+ }
57
+ case "height":
58
+ style.height = value;
59
+ break;
60
+ case "display":
61
+ style.display = value;
62
+ break;
63
+ case "flexGrow":
64
+ style.flexGrow = value;
65
+ break;
66
+ case "flexShrink":
67
+ style.flexShrink = value;
68
+ break;
69
+ case "flexBasis":
70
+ style.flexBasis = value;
71
+ break;
72
+ case "fontWeight":
73
+ style.fontWeight = value;
74
+ break;
75
+ case "borderRadius":
76
+ style.borderRadius = value;
77
+ break;
78
+ case "alignSelf":
79
+ style.alignSelf = value;
80
+ break;
81
+ case "alignItems":
82
+ style.alignItems = value;
83
+ break;
84
+ case "justifyContent":
85
+ style.justifyContent = value;
86
+ break;
87
+ case "color":
88
+ style.color = value;
89
+ break;
90
+ case "mt":
91
+ style.marginTop = toStylePx(value);
92
+ break;
93
+ case "mb":
94
+ style.marginBottom = toStylePx(value);
95
+ break;
96
+ case "ml":
97
+ style.marginLeft = toStylePx(value);
98
+ break;
99
+ case "mr":
100
+ style.marginRight = toStylePx(value);
101
+ break;
102
+ case "overflow":
103
+ style.overflow = value;
104
+ break;
105
+ case "whiteSpace":
106
+ style.whiteSpace = value;
107
+ break;
108
+ case "textOverflow":
109
+ style.textOverflow = value;
110
+ break;
111
+ case "textTransform":
112
+ style.textTransform = value;
113
+ break;
114
+ case "gap":
115
+ style.gap = typeof value === "number" ? `${value * SPACING_SCALE}px` : value;
116
+ break;
117
+ case "gridTemplateColumns":
118
+ style.gridTemplateColumns = value;
119
+ break;
120
+ case "minWidth":
121
+ style.minWidth = value;
122
+ break;
123
+ case "boxSize": {
124
+ const s = typeof value === "number" ? `${value * SPACING_SCALE}px` : value;
125
+ style.width = s;
126
+ style.height = s;
127
+ break;
128
+ }
129
+ case "py": {
130
+ const v = toStylePx(value);
131
+ style.paddingTop = v;
132
+ style.paddingBottom = v;
133
+ break;
134
+ }
135
+ case "px": {
136
+ const v = toStylePx(value);
137
+ style.paddingLeft = v;
138
+ style.paddingRight = v;
139
+ break;
140
+ }
141
+ case "p": {
142
+ const v = toStylePx(value);
143
+ style.padding = v;
144
+ break;
145
+ }
146
+ case "hideBelow":
147
+ break;
148
+ // handled via className
149
+ case "textStyle":
150
+ break;
151
+ // drop textStyle, not directly applicable
152
+ case "fontSize":
153
+ style.fontSize = value;
154
+ break;
155
+ case "flexWrap":
156
+ style.flexWrap = value;
157
+ break;
158
+ case "wordBreak":
159
+ style.wordBreak = value;
160
+ break;
161
+ case "lineHeight":
162
+ style.lineHeight = value;
163
+ break;
164
+ case "marginRight":
165
+ style.marginRight = value;
166
+ break;
167
+ case "position":
168
+ style.position = value;
169
+ break;
170
+ case "background":
171
+ style.background = value;
172
+ break;
173
+ default:
174
+ rest[key] = value;
175
+ break;
176
+ }
177
+ }
178
+ return { style, rest };
179
+ }
180
+ var Skeleton = React2.forwardRef(
181
+ function Skeleton2(props, ref) {
182
+ const {
183
+ loading = false,
184
+ asChild,
185
+ className,
186
+ children,
187
+ style: styleProp,
188
+ // Destructure style-prop shims so they don't leak into DOM
189
+ w: _w,
190
+ h: _h,
191
+ minW: _minW,
192
+ maxW: _maxW,
193
+ display: _display,
194
+ flexGrow: _flexGrow,
195
+ flexShrink: _flexShrink,
196
+ flexBasis: _flexBasis,
197
+ fontWeight: _fontWeight,
198
+ textStyle: _textStyle,
199
+ borderRadius: _borderRadius,
200
+ alignSelf: _alignSelf,
201
+ alignItems: _alignItems,
202
+ justifyContent: _justifyContent,
203
+ color: _color,
204
+ mt: _mt,
205
+ mb: _mb,
206
+ ml: _ml,
207
+ mr: _mr,
208
+ height: _height,
209
+ overflow: _overflow,
210
+ whiteSpace: _whiteSpace,
211
+ textOverflow: _textOverflow,
212
+ textTransform: _textTransform,
213
+ gap: _gap,
214
+ gridTemplateColumns: _gridTemplateColumns,
215
+ minWidth: _minWidth,
216
+ boxSize: _boxSize,
217
+ py: _py,
218
+ px: _px,
219
+ p: _p,
220
+ hideBelow: _hideBelow,
221
+ fontSize: _fontSize,
222
+ flexWrap: _flexWrap,
223
+ wordBreak: _wordBreak,
224
+ lineHeight: _lineHeight,
225
+ marginRight: _marginRight,
226
+ position: _position,
227
+ background: _background,
228
+ as: Component = "div",
229
+ ...htmlRest
230
+ } = props;
231
+ const { style: shimStyle } = extractSkeletonStyleProps({
232
+ w: _w,
233
+ h: _h,
234
+ minW: _minW,
235
+ maxW: _maxW,
236
+ display: _display,
237
+ flexGrow: _flexGrow,
238
+ flexShrink: _flexShrink,
239
+ flexBasis: _flexBasis,
240
+ fontWeight: _fontWeight,
241
+ textStyle: _textStyle,
242
+ borderRadius: _borderRadius,
243
+ alignSelf: _alignSelf,
244
+ alignItems: _alignItems,
245
+ justifyContent: _justifyContent,
246
+ color: _color,
247
+ mt: _mt,
248
+ mb: _mb,
249
+ ml: _ml,
250
+ mr: _mr,
251
+ height: _height,
252
+ overflow: _overflow,
253
+ whiteSpace: _whiteSpace,
254
+ textOverflow: _textOverflow,
255
+ textTransform: _textTransform,
256
+ gap: _gap,
257
+ gridTemplateColumns: _gridTemplateColumns,
258
+ minWidth: _minWidth,
259
+ boxSize: _boxSize,
260
+ py: _py,
261
+ px: _px,
262
+ p: _p,
263
+ hideBelow: _hideBelow,
264
+ fontSize: _fontSize,
265
+ flexWrap: _flexWrap,
266
+ wordBreak: _wordBreak,
267
+ lineHeight: _lineHeight,
268
+ marginRight: _marginRight,
269
+ position: _position,
270
+ background: _background
271
+ });
272
+ const mergedStyle = Object.keys(shimStyle).length > 0 || styleProp ? { ...shimStyle, ...styleProp } : void 0;
273
+ const HIDE_BELOW_MAP = { lg: "lg:hidden", md: "md:hidden", sm: "sm:hidden" };
274
+ const hideBelowClass = _hideBelow ? HIDE_BELOW_MAP[_hideBelow] : void 0;
275
+ const finalClassName = hideBelowClass ? cn(className, hideBelowClass) : className;
276
+ if (!loading) {
277
+ if (asChild && React2.isValidElement(children)) {
278
+ return children;
279
+ }
280
+ return /* @__PURE__ */ jsx(Component, { ref, className: finalClassName, style: mergedStyle, ...htmlRest, children });
281
+ }
282
+ if (asChild && React2.isValidElement(children)) {
283
+ return /* @__PURE__ */ jsx(
284
+ Component,
285
+ {
286
+ ref,
287
+ "data-loading": true,
288
+ className: cn(
289
+ "animate-skeleton-shimmer rounded-sm",
290
+ "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
291
+ "bg-[length:200%_100%]",
292
+ "text-transparent [&_*]:invisible",
293
+ finalClassName
294
+ ),
295
+ style: mergedStyle,
296
+ ...htmlRest,
297
+ children
298
+ }
299
+ );
300
+ }
301
+ return /* @__PURE__ */ jsx(
302
+ Component,
303
+ {
304
+ ref,
305
+ "data-loading": true,
306
+ className: cn(
307
+ "animate-skeleton-shimmer rounded-sm",
308
+ "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
309
+ "bg-[length:200%_100%]",
310
+ children ? "text-transparent [&_*]:invisible" : "min-h-5",
311
+ finalClassName
312
+ ),
313
+ style: mergedStyle,
314
+ ...htmlRest,
315
+ children
316
+ }
317
+ );
318
+ }
319
+ );
320
+ React2.forwardRef(
321
+ function SkeletonCircle2(props, ref) {
322
+ const { size = 40, loading = true, className, ...rest } = props;
323
+ const dimension = typeof size === "number" ? `${size}px` : size;
324
+ return /* @__PURE__ */ jsx(
325
+ Skeleton,
326
+ {
327
+ ref,
328
+ loading,
329
+ className: cn("rounded-full shrink-0", className),
330
+ style: { width: dimension, height: dimension, ...rest.style },
331
+ ...rest
332
+ }
333
+ );
334
+ }
335
+ );
336
+ React2.forwardRef(
337
+ function SkeletonText2(props, ref) {
338
+ const { noOfLines = 3, loading = true, className, ...rest } = props;
339
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...rest, children: Array.from({ length: noOfLines }).map((_, index) => /* @__PURE__ */ jsx(
340
+ Skeleton,
341
+ {
342
+ loading,
343
+ className: cn("h-4", index === noOfLines - 1 && "max-w-[80%]")
344
+ },
345
+ index
346
+ )) });
347
+ }
348
+ );
349
+ var LG_BREAKPOINT = 1024;
350
+ function useIsMobile() {
351
+ const [isMobile, setIsMobile] = React2.useState(() => {
352
+ if (typeof window === "undefined") return false;
353
+ return window.innerWidth < LG_BREAKPOINT;
354
+ });
355
+ React2.useEffect(() => {
356
+ const mql = window.matchMedia(`(max-width: ${LG_BREAKPOINT - 1}px)`);
357
+ const handler = (e) => setIsMobile(e.matches);
358
+ setIsMobile(mql.matches);
359
+ mql.addEventListener("change", handler);
360
+ return () => mql.removeEventListener("change", handler);
361
+ }, []);
362
+ return isMobile;
363
+ }
364
+ var Tooltip = React2.forwardRef(
365
+ function Tooltip2(props, ref) {
366
+ const {
367
+ showArrow: showArrowProp,
368
+ onOpenChange,
369
+ variant,
370
+ selected,
371
+ children,
372
+ disabled,
373
+ disableOnMobile,
374
+ portalled = true,
375
+ content,
376
+ contentProps,
377
+ portalRef,
378
+ defaultOpen = false,
379
+ triggerProps,
380
+ closeDelay = 100,
381
+ openDelay = 100,
382
+ interactive,
383
+ positioning
384
+ } = props;
385
+ const [open, setOpen] = React2.useState(defaultOpen);
386
+ const timeoutRef = React2.useRef(null);
387
+ const isMobile = useIsMobile();
388
+ const handleOpenChange = React2.useCallback((nextOpen) => {
389
+ setOpen(nextOpen);
390
+ onOpenChange?.({ open: nextOpen });
391
+ }, [onOpenChange]);
392
+ const handleOpenChangeManual = React2.useCallback((nextOpen) => {
393
+ timeoutRef.current && window.clearTimeout(timeoutRef.current);
394
+ timeoutRef.current = window.setTimeout(() => {
395
+ setOpen(nextOpen);
396
+ onOpenChange?.({ open: nextOpen });
397
+ }, nextOpen ? openDelay : closeDelay);
398
+ }, [closeDelay, openDelay, onOpenChange]);
399
+ const handleClickAway = React2.useCallback(() => {
400
+ handleOpenChangeManual(false);
401
+ }, [handleOpenChangeManual]);
402
+ const triggerRef = useClickAway(handleClickAway);
403
+ const handleTriggerClick = React2.useCallback(() => {
404
+ handleOpenChangeManual(!open);
405
+ }, [handleOpenChangeManual, open]);
406
+ const handleContentClick = React2.useCallback((event) => {
407
+ event.stopPropagation();
408
+ if (interactive) {
409
+ const closestLink = event.target?.closest("a");
410
+ if (closestLink) {
411
+ handleOpenChangeManual(false);
412
+ }
413
+ }
414
+ }, [interactive, handleOpenChangeManual]);
415
+ React2.useEffect(() => {
416
+ return () => {
417
+ if (timeoutRef.current) {
418
+ clearTimeout(timeoutRef.current);
419
+ }
420
+ };
421
+ }, []);
422
+ if (disabled || disableOnMobile && isMobile) return children;
423
+ const defaultShowArrow = variant === "popover" ? false : true;
424
+ const showArrow = showArrowProp !== void 0 ? showArrowProp : defaultShowArrow;
425
+ const placement = positioning?.placement ?? "top";
426
+ const side = placement.split("-")[0];
427
+ const align = placement.includes("-") ? placement.split("-")[1] : void 0;
428
+ const sideOffset = positioning?.offset?.mainAxis ?? 4;
429
+ const isPopover = variant === "popover";
430
+ return /* @__PURE__ */ jsx(RadixTooltip.Provider, { delayDuration: openDelay, skipDelayDuration: 0, children: /* @__PURE__ */ jsxs(
431
+ RadixTooltip.Root,
432
+ {
433
+ open,
434
+ onOpenChange: handleOpenChange,
435
+ delayDuration: openDelay,
436
+ children: [
437
+ /* @__PURE__ */ jsx(
438
+ RadixTooltip.Trigger,
439
+ {
440
+ ref: open ? triggerRef : void 0,
441
+ asChild: true,
442
+ onClick: isMobile ? handleTriggerClick : void 0,
443
+ ...triggerProps,
444
+ children
445
+ }
446
+ ),
447
+ /* @__PURE__ */ jsx(RadixTooltip.Portal, { container: portalled ? portalRef?.current ?? void 0 : void 0, children: /* @__PURE__ */ jsxs(
448
+ RadixTooltip.Content,
449
+ {
450
+ ref,
451
+ side,
452
+ align,
453
+ sideOffset,
454
+ onClick: interactive ? handleContentClick : void 0,
455
+ className: cn(
456
+ "z-[9999] overflow-hidden rounded-lg px-3 py-2 text-sm",
457
+ "animate-in fade-in-0 zoom-in-95",
458
+ isPopover && "bg-[var(--color-popover-bg)] text-[var(--color-text-primary)]",
459
+ isPopover && "shadow-[var(--shadow-popover)] border border-[var(--color-border-divider)] max-w-sm",
460
+ !isPopover && "bg-[var(--color-tooltip-bg)] text-[var(--color-tooltip-fg)] max-w-xs",
461
+ contentProps?.className
462
+ ),
463
+ ...selected ? { "data-selected": true } : {},
464
+ ...contentProps,
465
+ children: [
466
+ showArrow && /* @__PURE__ */ jsx(
467
+ RadixTooltip.Arrow,
468
+ {
469
+ className: cn(
470
+ isPopover ? "fill-[var(--color-popover-bg)]" : "fill-[var(--color-tooltip-bg)]"
471
+ )
472
+ }
473
+ ),
474
+ content
475
+ ]
476
+ }
477
+ ) })
478
+ ]
479
+ }
480
+ ) });
481
+ }
482
+ );
483
+ function TruncatedTextTooltip({ label, children }) {
484
+ return /* @__PURE__ */ jsx(Tooltip, { content: label, positioning: { placement: "top" }, children });
485
+ }
486
+ var badgeVariants = cva(
487
+ "inline-flex items-center rounded-sm gap-1 font-medium w-fit max-w-full whitespace-nowrap select-text",
488
+ {
489
+ variants: {
490
+ variant: {
491
+ subtle: "",
492
+ solid: ""
493
+ },
494
+ size: {
495
+ sm: "text-xs p-1 h-[18px] min-h-[18px]",
496
+ md: "text-sm px-1 py-0.5 min-h-6",
497
+ lg: "text-sm px-2 py-1 min-h-7 font-semibold"
498
+ }
499
+ },
500
+ defaultVariants: {
501
+ variant: "subtle",
502
+ size: "md"
503
+ }
504
+ }
505
+ );
506
+ var COLOR_PALETTE_CLASSES = {
507
+ gray: "bg-badge-gray-bg text-badge-gray-fg",
508
+ green: "bg-badge-green-bg text-badge-green-fg",
509
+ red: "bg-badge-red-bg text-badge-red-fg",
510
+ purple: "bg-badge-purple-bg text-badge-purple-fg",
511
+ orange: "bg-badge-orange-bg text-badge-orange-fg",
512
+ blue: "bg-badge-blue-bg text-badge-blue-fg",
513
+ yellow: "bg-badge-yellow-bg text-badge-yellow-fg",
514
+ teal: "bg-badge-teal-bg text-badge-teal-fg",
515
+ cyan: "bg-badge-cyan-bg text-badge-cyan-fg",
516
+ pink: "bg-badge-pink-bg text-badge-pink-fg",
517
+ purple_alt: "bg-badge-purple-alt-bg text-badge-purple-alt-fg",
518
+ blue_alt: "bg-badge-blue-alt-bg text-badge-blue-alt-fg",
519
+ bright_gray: "bg-badge-bright-gray-bg text-badge-bright-gray-fg",
520
+ bright_green: "bg-badge-bright-green-bg text-badge-bright-green-fg",
521
+ bright_red: "bg-badge-bright-red-bg text-badge-bright-red-fg",
522
+ bright_blue: "bg-badge-bright-blue-bg text-badge-bright-blue-fg",
523
+ bright_yellow: "bg-badge-bright-yellow-bg text-badge-bright-yellow-fg",
524
+ bright_teal: "bg-badge-bright-teal-bg text-badge-bright-teal-fg",
525
+ bright_cyan: "bg-badge-bright-cyan-bg text-badge-bright-cyan-fg",
526
+ bright_orange: "bg-badge-bright-orange-bg text-badge-bright-orange-fg",
527
+ bright_purple: "bg-badge-bright-purple-bg text-badge-bright-purple-fg",
528
+ bright_pink: "bg-badge-bright-pink-bg text-badge-bright-pink-fg"
529
+ };
530
+ var Badge = React2__default.forwardRef(
531
+ function Badge2(props, ref) {
532
+ const {
533
+ loading,
534
+ startElement,
535
+ children,
536
+ truncated = false,
537
+ endElement,
538
+ variant,
539
+ size,
540
+ colorPalette = "gray",
541
+ className,
542
+ flexShrink: _flexShrink,
543
+ gap: _gap,
544
+ ml: _ml,
545
+ mr: _mr,
546
+ style: styleProp,
547
+ ...rest
548
+ } = props;
549
+ const shimStyle = { ...styleProp };
550
+ if (_flexShrink !== void 0) shimStyle.flexShrink = _flexShrink;
551
+ if (_gap !== void 0) shimStyle.gap = typeof _gap === "number" ? `${_gap * 4}px` : _gap;
552
+ if (_ml !== void 0) {
553
+ if (typeof _ml === "object") {
554
+ const obj = _ml;
555
+ shimStyle.marginLeft = `${(obj.base ?? obj.lg ?? 0) * 4}px`;
556
+ } else {
557
+ shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * 4}px` : _ml;
558
+ }
559
+ }
560
+ if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * 4}px` : _mr;
561
+ const badgeStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
562
+ const child = children ? /* @__PURE__ */ jsx("span", { className: "overflow-hidden text-ellipsis", children }) : null;
563
+ const childrenElement = truncated ? /* @__PURE__ */ jsx(TruncatedTextTooltip, { label: children, children: child }) : child;
564
+ const badgeElement = /* @__PURE__ */ jsxs(
565
+ "span",
566
+ {
567
+ ref,
568
+ className: cn(
569
+ badgeVariants({ variant, size }),
570
+ COLOR_PALETTE_CLASSES[colorPalette],
571
+ className
572
+ ),
573
+ style: badgeStyle,
574
+ ...rest,
575
+ children: [
576
+ startElement,
577
+ childrenElement,
578
+ endElement
579
+ ]
580
+ }
581
+ );
582
+ if (loading) {
583
+ return /* @__PURE__ */ jsx(Skeleton, { loading, asChild: true, children: badgeElement });
584
+ }
585
+ return badgeElement;
586
+ }
587
+ );
588
+
589
+ export { Badge };