@luxfi/ui 7.0.0 → 7.2.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 (70) hide show
  1. package/dist/alert.cjs +184 -335
  2. package/dist/alert.js +184 -335
  3. package/dist/badge.cjs +162 -321
  4. package/dist/badge.d.cts +3 -7
  5. package/dist/badge.d.ts +3 -7
  6. package/dist/badge.js +162 -320
  7. package/dist/bank.d.cts +1 -1
  8. package/dist/bank.d.ts +1 -1
  9. package/dist/button.cjs +373 -484
  10. package/dist/button.d.cts +10 -7
  11. package/dist/button.d.ts +10 -7
  12. package/dist/button.js +373 -484
  13. package/dist/close-button.cjs +37 -18
  14. package/dist/close-button.d.cts +1 -1
  15. package/dist/close-button.d.ts +1 -1
  16. package/dist/close-button.js +37 -18
  17. package/dist/collapsible.cjs +125 -272
  18. package/dist/collapsible.js +125 -272
  19. package/dist/dialog.cjs +60 -44
  20. package/dist/dialog.d.cts +7 -8
  21. package/dist/dialog.d.ts +7 -8
  22. package/dist/dialog.js +60 -43
  23. package/dist/drawer.cjs +37 -13
  24. package/dist/drawer.js +37 -13
  25. package/dist/heading.cjs +3 -8
  26. package/dist/heading.js +3 -8
  27. package/dist/icon-button.cjs +213 -337
  28. package/dist/icon-button.d.cts +4 -4
  29. package/dist/icon-button.d.ts +4 -4
  30. package/dist/icon-button.js +213 -338
  31. package/dist/image.cjs +125 -272
  32. package/dist/image.js +125 -272
  33. package/dist/index.cjs +695 -858
  34. package/dist/index.d.cts +0 -3
  35. package/dist/index.d.ts +0 -3
  36. package/dist/index.js +695 -856
  37. package/dist/input.cjs +25 -36
  38. package/dist/input.js +25 -36
  39. package/dist/link.cjs +125 -272
  40. package/dist/link.js +125 -272
  41. package/dist/popover.cjs +55 -40
  42. package/dist/popover.js +55 -39
  43. package/dist/select.cjs +125 -272
  44. package/dist/select.js +125 -272
  45. package/dist/skeleton.cjs +125 -272
  46. package/dist/skeleton.js +125 -272
  47. package/dist/table.cjs +127 -274
  48. package/dist/table.js +127 -274
  49. package/dist/tag.cjs +199 -341
  50. package/dist/tag.js +199 -340
  51. package/dist/textarea.cjs +25 -36
  52. package/dist/textarea.js +25 -36
  53. package/dist/tooltip.cjs +22 -21
  54. package/dist/tooltip.d.cts +2 -3
  55. package/dist/tooltip.d.ts +2 -3
  56. package/dist/tooltip.js +22 -20
  57. package/package.json +9 -8
  58. package/src/alert.tsx +23 -51
  59. package/src/badge.tsx +20 -31
  60. package/src/button.tsx +304 -238
  61. package/src/close-button.tsx +48 -22
  62. package/src/dialog.tsx +37 -47
  63. package/src/heading.tsx +8 -19
  64. package/src/icon-button.tsx +129 -104
  65. package/src/input.tsx +27 -36
  66. package/src/popover.tsx +30 -44
  67. package/src/skeleton.tsx +96 -144
  68. package/src/tag.tsx +17 -35
  69. package/src/textarea.tsx +27 -36
  70. package/src/tooltip.tsx +54 -47
package/dist/index.js CHANGED
@@ -5,19 +5,19 @@ import * as AccordionPrimitive from '@radix-ui/react-accordion';
5
5
  import * as React29 from 'react';
6
6
  import React29__default from 'react';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
- import { cva } from 'class-variance-authority';
8
+ import { styled, View, Text } from '@hanzogui/core';
9
9
  import * as RadixAvatar from '@radix-ui/react-avatar';
10
- import * as RadixTooltip from '@radix-ui/react-tooltip';
10
+ import { TooltipGroup, Tooltip as Tooltip$1 } from '@hanzogui/tooltip';
11
11
  import { useClickAway, useDebounce } from '@uidotdev/usehooks';
12
- import { Slot } from '@radix-ui/react-slot';
13
12
  import * as RadixCheckbox from '@radix-ui/react-checkbox';
14
13
  import * as Collapsible from '@radix-ui/react-collapsible';
14
+ import { Dialog } from '@hanzogui/dialog';
15
15
  import * as RadixDialog from '@radix-ui/react-dialog';
16
16
  import * as LabelPrimitive from '@radix-ui/react-label';
17
17
  import { debounce, throttle } from 'es-toolkit';
18
18
  import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
19
19
  import { LuCheck, LuChevronRight } from 'react-icons/lu';
20
- import * as RadixPopover from '@radix-ui/react-popover';
20
+ import { Popover } from '@hanzogui/popover';
21
21
  import * as RadixProgress from '@radix-ui/react-progress';
22
22
  import * as RadixRadioGroup from '@radix-ui/react-radio-group';
23
23
  import * as RadixSelect from '@radix-ui/react-select';
@@ -25,7 +25,6 @@ import * as RadixSlider from '@radix-ui/react-slider';
25
25
  import * as RadixSwitch from '@radix-ui/react-switch';
26
26
  import * as RadixTabs from '@radix-ui/react-tabs';
27
27
  import { toast, Toaster as Toaster$1 } from 'sonner';
28
- import { styled, View, Text } from '@hanzogui/core';
29
28
 
30
29
  // src/utils.ts
31
30
  function cn(...inputs) {
@@ -205,24 +204,47 @@ function useAccordion(items) {
205
204
  }, [value, onValueChange, scrollToItemFromUrl]);
206
205
  }
207
206
  var CLOSE_ICON_PATH = "M9.44 8.035a.791.791 0 0 0 1.12 0l3.802-3.803a.791.791 0 0 1 1.119 0l.287.287a.79.79 0 0 1 0 1.119L11.965 9.44a.79.79 0 0 0 0 1.118l3.803 3.803a.791.791 0 0 1 0 1.119l-.287.287a.791.791 0 0 1-1.119 0l-3.803-3.803a.79.79 0 0 0-1.118 0l-3.803 3.803a.79.79 0 0 1-1.119 0l-.287-.287a.791.791 0 0 1 0-1.119l3.803-3.803a.791.791 0 0 0 0-1.118L4.232 5.638a.791.791 0 0 1 0-1.119l.287-.287a.791.791 0 0 1 1.119 0L9.44 8.035Z";
207
+ var CloseButtonFrame = styled(View, {
208
+ name: "LuxCloseButton",
209
+ render: /* @__PURE__ */ jsx("button", { type: "button", "aria-label": "Close" }),
210
+ role: "button",
211
+ cursor: "pointer",
212
+ display: "inline-flex",
213
+ alignItems: "center",
214
+ justifyContent: "center",
215
+ width: 20,
216
+ height: 20,
217
+ minWidth: 0,
218
+ flexShrink: 1,
219
+ padding: 0,
220
+ borderRadius: 4,
221
+ borderWidth: 0,
222
+ overflow: "hidden",
223
+ backgroundColor: "transparent",
224
+ hoverStyle: {
225
+ backgroundColor: "transparent"
226
+ },
227
+ variants: {
228
+ disabled: {
229
+ true: {
230
+ opacity: 0.4,
231
+ pointerEvents: "none"
232
+ }
233
+ }
234
+ }
235
+ });
236
+ var CLOSE_BUTTON_CLASSES = [
237
+ "text-[var(--closeButton-fg,currentColor)]",
238
+ "hover:text-[var(--hover-color,currentColor)]",
239
+ "disabled:opacity-40"
240
+ ].join(" ");
208
241
  var CloseButton = React29.forwardRef(function CloseButton2(props, ref) {
209
242
  const { variant: _variant, size: _size, className, children, ...rest } = props;
210
243
  return /* @__PURE__ */ jsx(
211
- "button",
244
+ CloseButtonFrame,
212
245
  {
213
- type: "button",
214
- "aria-label": "Close",
215
246
  ref,
216
- className: cn(
217
- "inline-flex items-center justify-center",
218
- "size-5 min-w-0 shrink-0 p-0",
219
- "rounded-sm border-0 overflow-hidden",
220
- "bg-transparent text-[var(--closeButton-fg,currentColor)]",
221
- "hover:bg-transparent hover:text-[var(--hover-color,currentColor)]",
222
- "disabled:opacity-40",
223
- "cursor-pointer",
224
- className
225
- ),
247
+ className: [CLOSE_BUTTON_CLASSES, className].filter(Boolean).join(" "),
226
248
  ...rest,
227
249
  children: children ?? /* @__PURE__ */ jsx(
228
250
  "svg",
@@ -243,272 +265,137 @@ var CloseButton = React29.forwardRef(function CloseButton2(props, ref) {
243
265
  }
244
266
  );
245
267
  });
246
- var SPACING_SCALE = 4;
247
- function toStylePx(value) {
248
- if (value === void 0) return void 0;
249
- if (typeof value === "string") return value;
250
- return `${value * SPACING_SCALE}px`;
268
+ var SHIM_PROPS = [
269
+ "w",
270
+ "h",
271
+ "minW",
272
+ "maxW",
273
+ "display",
274
+ "flexGrow",
275
+ "flexShrink",
276
+ "flexBasis",
277
+ "fontWeight",
278
+ "textStyle",
279
+ "borderRadius",
280
+ "alignSelf",
281
+ "alignItems",
282
+ "justifyContent",
283
+ "color",
284
+ "mt",
285
+ "mb",
286
+ "ml",
287
+ "mr",
288
+ "height",
289
+ "overflow",
290
+ "whiteSpace",
291
+ "textOverflow",
292
+ "textTransform",
293
+ "gap",
294
+ "gridTemplateColumns",
295
+ "minWidth",
296
+ "boxSize",
297
+ "py",
298
+ "px",
299
+ "p",
300
+ "hideBelow",
301
+ "fontSize",
302
+ "flexWrap",
303
+ "wordBreak",
304
+ "lineHeight",
305
+ "marginRight",
306
+ "position",
307
+ "background"
308
+ ];
309
+ var S = 4;
310
+ function dim(v) {
311
+ if (v == null) return void 0;
312
+ if (typeof v === "number") return `${v * S}px`;
313
+ if (typeof v === "string") return v;
314
+ if (typeof v === "object") {
315
+ const o = v;
316
+ return o.base ?? o.lg ?? o.xl ?? Object.values(o)[0];
317
+ }
318
+ return void 0;
251
319
  }
252
- function extractSkeletonStyleProps(props) {
253
- const style = {};
254
- const rest = {};
255
- function resolveDimension(value) {
256
- if (value === void 0 || value === null) return void 0;
257
- if (typeof value === "number") return `${value * SPACING_SCALE}px`;
258
- if (typeof value === "string") return value;
259
- if (typeof value === "object") {
260
- const obj = value;
261
- return obj.base ?? obj.lg ?? obj.xl ?? Object.values(obj)[0];
262
- }
263
- return void 0;
320
+ function sp(v) {
321
+ if (v === void 0) return void 0;
322
+ return typeof v === "number" ? `${v * S}px` : v;
323
+ }
324
+ function shimToStyle(props) {
325
+ const s = {};
326
+ if (props.w !== void 0) s.width = dim(props.w);
327
+ if (props.h !== void 0) s.height = dim(props.h);
328
+ if (props.minW !== void 0) s.minWidth = dim(props.minW);
329
+ if (props.maxW !== void 0) s.maxWidth = dim(props.maxW);
330
+ if (props.display !== void 0) s.display = props.display;
331
+ if (props.flexGrow !== void 0) s.flexGrow = props.flexGrow;
332
+ if (props.flexShrink !== void 0) s.flexShrink = props.flexShrink;
333
+ if (props.flexBasis !== void 0) s.flexBasis = props.flexBasis;
334
+ if (props.fontWeight !== void 0) s.fontWeight = props.fontWeight;
335
+ if (props.borderRadius !== void 0) s.borderRadius = props.borderRadius;
336
+ if (props.alignSelf !== void 0) s.alignSelf = props.alignSelf;
337
+ if (props.alignItems !== void 0) s.alignItems = props.alignItems;
338
+ if (props.justifyContent !== void 0) s.justifyContent = props.justifyContent;
339
+ if (props.color !== void 0) s.color = props.color;
340
+ if (props.mt !== void 0) s.marginTop = sp(props.mt);
341
+ if (props.mb !== void 0) s.marginBottom = sp(props.mb);
342
+ if (props.ml !== void 0) s.marginLeft = sp(props.ml);
343
+ if (props.mr !== void 0) s.marginRight = sp(props.mr);
344
+ if (props.height !== void 0) s.height = props.height;
345
+ if (props.overflow !== void 0) s.overflow = props.overflow;
346
+ if (props.whiteSpace !== void 0) s.whiteSpace = props.whiteSpace;
347
+ if (props.textOverflow !== void 0) s.textOverflow = props.textOverflow;
348
+ if (props.textTransform !== void 0) s.textTransform = props.textTransform;
349
+ if (props.gap !== void 0) s.gap = sp(props.gap);
350
+ if (props.gridTemplateColumns !== void 0) s.gridTemplateColumns = props.gridTemplateColumns;
351
+ if (props.minWidth !== void 0) s.minWidth = props.minWidth;
352
+ if (props.boxSize !== void 0) {
353
+ const v = typeof props.boxSize === "number" ? `${props.boxSize * S}px` : props.boxSize;
354
+ s.width = v;
355
+ s.height = v;
264
356
  }
265
- for (const [key, value] of Object.entries(props)) {
266
- if (value === void 0) continue;
267
- switch (key) {
268
- case "w": {
269
- const v = resolveDimension(value);
270
- if (v) style.width = v;
271
- break;
272
- }
273
- case "h": {
274
- const v = resolveDimension(value);
275
- if (v) style.height = v;
276
- break;
277
- }
278
- case "minW": {
279
- const v = resolveDimension(value);
280
- if (v) style.minWidth = v;
281
- break;
282
- }
283
- case "maxW": {
284
- const v = resolveDimension(value);
285
- if (v) style.maxWidth = v;
286
- break;
287
- }
288
- case "height":
289
- style.height = value;
290
- break;
291
- case "display":
292
- style.display = value;
293
- break;
294
- case "flexGrow":
295
- style.flexGrow = value;
296
- break;
297
- case "flexShrink":
298
- style.flexShrink = value;
299
- break;
300
- case "flexBasis":
301
- style.flexBasis = value;
302
- break;
303
- case "fontWeight":
304
- style.fontWeight = value;
305
- break;
306
- case "borderRadius":
307
- style.borderRadius = value;
308
- break;
309
- case "alignSelf":
310
- style.alignSelf = value;
311
- break;
312
- case "alignItems":
313
- style.alignItems = value;
314
- break;
315
- case "justifyContent":
316
- style.justifyContent = value;
317
- break;
318
- case "color":
319
- style.color = value;
320
- break;
321
- case "mt":
322
- style.marginTop = toStylePx(value);
323
- break;
324
- case "mb":
325
- style.marginBottom = toStylePx(value);
326
- break;
327
- case "ml":
328
- style.marginLeft = toStylePx(value);
329
- break;
330
- case "mr":
331
- style.marginRight = toStylePx(value);
332
- break;
333
- case "overflow":
334
- style.overflow = value;
335
- break;
336
- case "whiteSpace":
337
- style.whiteSpace = value;
338
- break;
339
- case "textOverflow":
340
- style.textOverflow = value;
341
- break;
342
- case "textTransform":
343
- style.textTransform = value;
344
- break;
345
- case "gap":
346
- style.gap = typeof value === "number" ? `${value * SPACING_SCALE}px` : value;
347
- break;
348
- case "gridTemplateColumns":
349
- style.gridTemplateColumns = value;
350
- break;
351
- case "minWidth":
352
- style.minWidth = value;
353
- break;
354
- case "boxSize": {
355
- const s = typeof value === "number" ? `${value * SPACING_SCALE}px` : value;
356
- style.width = s;
357
- style.height = s;
358
- break;
359
- }
360
- case "py": {
361
- const v = toStylePx(value);
362
- style.paddingTop = v;
363
- style.paddingBottom = v;
364
- break;
365
- }
366
- case "px": {
367
- const v = toStylePx(value);
368
- style.paddingLeft = v;
369
- style.paddingRight = v;
370
- break;
371
- }
372
- case "p": {
373
- const v = toStylePx(value);
374
- style.padding = v;
375
- break;
376
- }
377
- case "hideBelow":
378
- break;
379
- // handled via className
380
- case "textStyle":
381
- break;
382
- // drop textStyle, not directly applicable
383
- case "fontSize":
384
- style.fontSize = value;
385
- break;
386
- case "flexWrap":
387
- style.flexWrap = value;
388
- break;
389
- case "wordBreak":
390
- style.wordBreak = value;
391
- break;
392
- case "lineHeight":
393
- style.lineHeight = value;
394
- break;
395
- case "marginRight":
396
- style.marginRight = value;
397
- break;
398
- case "position":
399
- style.position = value;
400
- break;
401
- case "background":
402
- style.background = value;
403
- break;
404
- default:
405
- rest[key] = value;
406
- break;
407
- }
357
+ if (props.py !== void 0) {
358
+ const v = sp(props.py);
359
+ s.paddingTop = v;
360
+ s.paddingBottom = v;
408
361
  }
409
- return { style, rest };
362
+ if (props.px !== void 0) {
363
+ const v = sp(props.px);
364
+ s.paddingLeft = v;
365
+ s.paddingRight = v;
366
+ }
367
+ if (props.p !== void 0) s.padding = sp(props.p);
368
+ if (props.fontSize !== void 0) s.fontSize = props.fontSize;
369
+ if (props.flexWrap !== void 0) s.flexWrap = props.flexWrap;
370
+ if (props.wordBreak !== void 0) s.wordBreak = props.wordBreak;
371
+ if (props.lineHeight !== void 0) s.lineHeight = props.lineHeight;
372
+ if (props.marginRight !== void 0) s.marginRight = props.marginRight;
373
+ if (props.position !== void 0) s.position = props.position;
374
+ if (props.background !== void 0) s.background = props.background;
375
+ return s;
376
+ }
377
+ function stripShims(props) {
378
+ const out = { ...props };
379
+ for (const k of SHIM_PROPS) delete out[k];
380
+ return out;
410
381
  }
382
+ var SKELETON_CLASSES = [
383
+ "animate-skeleton-shimmer rounded-sm",
384
+ "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
385
+ "bg-[length:200%_100%]"
386
+ ].join(" ");
387
+ var HIDE_BELOW_MAP = { lg: "lg:hidden", md: "md:hidden", sm: "sm:hidden" };
411
388
  var Skeleton = React29.forwardRef(
412
389
  function Skeleton2(props, ref) {
413
- const {
414
- loading = false,
415
- asChild,
416
- className,
417
- children,
418
- style: styleProp,
419
- // Destructure style-prop shims so they don't leak into DOM
420
- w: _w,
421
- h: _h,
422
- minW: _minW,
423
- maxW: _maxW,
424
- display: _display,
425
- flexGrow: _flexGrow,
426
- flexShrink: _flexShrink,
427
- flexBasis: _flexBasis,
428
- fontWeight: _fontWeight,
429
- textStyle: _textStyle,
430
- borderRadius: _borderRadius,
431
- alignSelf: _alignSelf,
432
- alignItems: _alignItems,
433
- justifyContent: _justifyContent,
434
- color: _color,
435
- mt: _mt,
436
- mb: _mb,
437
- ml: _ml,
438
- mr: _mr,
439
- height: _height,
440
- overflow: _overflow,
441
- whiteSpace: _whiteSpace,
442
- textOverflow: _textOverflow,
443
- textTransform: _textTransform,
444
- gap: _gap,
445
- gridTemplateColumns: _gridTemplateColumns,
446
- minWidth: _minWidth,
447
- boxSize: _boxSize,
448
- py: _py,
449
- px: _px,
450
- p: _p,
451
- hideBelow: _hideBelow,
452
- fontSize: _fontSize,
453
- flexWrap: _flexWrap,
454
- wordBreak: _wordBreak,
455
- lineHeight: _lineHeight,
456
- marginRight: _marginRight,
457
- position: _position,
458
- background: _background,
459
- as: Component = "div",
460
- ...htmlRest
461
- } = props;
462
- const { style: shimStyle } = extractSkeletonStyleProps({
463
- w: _w,
464
- h: _h,
465
- minW: _minW,
466
- maxW: _maxW,
467
- display: _display,
468
- flexGrow: _flexGrow,
469
- flexShrink: _flexShrink,
470
- flexBasis: _flexBasis,
471
- fontWeight: _fontWeight,
472
- textStyle: _textStyle,
473
- borderRadius: _borderRadius,
474
- alignSelf: _alignSelf,
475
- alignItems: _alignItems,
476
- justifyContent: _justifyContent,
477
- color: _color,
478
- mt: _mt,
479
- mb: _mb,
480
- ml: _ml,
481
- mr: _mr,
482
- height: _height,
483
- overflow: _overflow,
484
- whiteSpace: _whiteSpace,
485
- textOverflow: _textOverflow,
486
- textTransform: _textTransform,
487
- gap: _gap,
488
- gridTemplateColumns: _gridTemplateColumns,
489
- minWidth: _minWidth,
490
- boxSize: _boxSize,
491
- py: _py,
492
- px: _px,
493
- p: _p,
494
- hideBelow: _hideBelow,
495
- fontSize: _fontSize,
496
- flexWrap: _flexWrap,
497
- wordBreak: _wordBreak,
498
- lineHeight: _lineHeight,
499
- marginRight: _marginRight,
500
- position: _position,
501
- background: _background
502
- });
390
+ const { loading = false, asChild, className, children, style: styleProp, as: Component = "div", ...allRest } = props;
391
+ const shimStyle = shimToStyle(props);
503
392
  const mergedStyle = Object.keys(shimStyle).length > 0 || styleProp ? { ...shimStyle, ...styleProp } : void 0;
504
- const HIDE_BELOW_MAP = { lg: "lg:hidden", md: "md:hidden", sm: "sm:hidden" };
505
- const hideBelowClass = _hideBelow ? HIDE_BELOW_MAP[_hideBelow] : void 0;
506
- const finalClassName = hideBelowClass ? cn(className, hideBelowClass) : className;
393
+ const hideBelowClass = props.hideBelow ? HIDE_BELOW_MAP[props.hideBelow] : void 0;
394
+ const cls = hideBelowClass ? cn(className, hideBelowClass) : className;
395
+ const htmlRest = stripShims(allRest);
507
396
  if (!loading) {
508
- if (asChild && React29.isValidElement(children)) {
509
- return children;
510
- }
511
- return /* @__PURE__ */ jsx(Component, { ref, className: finalClassName, style: mergedStyle, ...htmlRest, children });
397
+ if (asChild && React29.isValidElement(children)) return children;
398
+ return /* @__PURE__ */ jsx(Component, { ref, className: cls, style: mergedStyle, ...htmlRest, children });
512
399
  }
513
400
  if (asChild && React29.isValidElement(children)) {
514
401
  return /* @__PURE__ */ jsx(
@@ -516,13 +403,7 @@ var Skeleton = React29.forwardRef(
516
403
  {
517
404
  ref,
518
405
  "data-loading": true,
519
- className: cn(
520
- "animate-skeleton-shimmer rounded-sm",
521
- "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
522
- "bg-[length:200%_100%]",
523
- "text-transparent [&_*]:invisible",
524
- finalClassName
525
- ),
406
+ className: cn(SKELETON_CLASSES, "text-transparent [&_*]:invisible", cls),
526
407
  style: mergedStyle,
527
408
  ...htmlRest,
528
409
  children
@@ -534,13 +415,7 @@ var Skeleton = React29.forwardRef(
534
415
  {
535
416
  ref,
536
417
  "data-loading": true,
537
- className: cn(
538
- "animate-skeleton-shimmer rounded-sm",
539
- "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
540
- "bg-[length:200%_100%]",
541
- children ? "text-transparent [&_*]:invisible" : "min-h-5",
542
- finalClassName
543
- ),
418
+ className: cn(SKELETON_CLASSES, children ? "text-transparent [&_*]:invisible" : "min-h-5", cls),
544
419
  style: mergedStyle,
545
420
  ...htmlRest,
546
421
  children
@@ -578,52 +453,22 @@ var SkeletonText = React29.forwardRef(
578
453
  }
579
454
  );
580
455
  var IndicatorIcon2 = ({ className }) => /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 20 20", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm.75-11.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM9.25 10a.75.75 0 011.5 0v3a.75.75 0 01-1.5 0v-3z" }) });
581
- var alertRoot = cva(
582
- // base
583
- "w-full flex items-start relative rounded text-[var(--color-alert-fg)]",
584
- {
585
- variants: {
586
- status: {
587
- info: "bg-[var(--color-alert-bg-info)]",
588
- warning: "bg-[var(--color-alert-bg-warning)]",
589
- warning_table: "bg-[var(--color-alert-bg-warning-table)]",
590
- success: "bg-[var(--color-alert-bg-success)]",
591
- error: "bg-[var(--color-alert-bg-error)]"
592
- },
593
- size: {
594
- sm: "gap-2 px-2 py-2 text-xs",
595
- md: "gap-2 px-3 py-2 text-base"
596
- }
597
- },
598
- defaultVariants: {
599
- status: "info",
600
- size: "md"
601
- }
602
- }
603
- );
604
- var alertContent = cva("flex flex-1", {
605
- variants: {
606
- inline: {
607
- "true": "inline-flex flex-row items-center",
608
- "false": "flex flex-col"
609
- }
610
- },
611
- defaultVariants: {
612
- inline: true
613
- }
614
- });
615
- var INDICATOR_BASE = "inline-flex items-center justify-center shrink-0 w-5 h-5 text-[var(--color-alert-fg)] [&>svg]:w-full [&>svg]:h-full";
616
- var indicatorVariants = cva(INDICATOR_BASE, {
617
- variants: {
618
- size: {
619
- sm: "w-5 h-5 my-0",
620
- md: "w-5 h-5 my-[2px]"
621
- }
622
- },
623
- defaultVariants: {
624
- size: "md"
625
- }
626
- });
456
+ var ALERT_BASE = "w-full flex items-start relative rounded text-[var(--color-alert-fg)]";
457
+ var STATUS_CLASSES = {
458
+ info: "bg-[var(--color-alert-bg-info)]",
459
+ warning: "bg-[var(--color-alert-bg-warning)]",
460
+ warning_table: "bg-[var(--color-alert-bg-warning-table)]",
461
+ success: "bg-[var(--color-alert-bg-success)]",
462
+ error: "bg-[var(--color-alert-bg-error)]"
463
+ };
464
+ var SIZE_CLASSES = {
465
+ sm: "gap-2 px-2 py-2 text-xs",
466
+ md: "gap-2 px-3 py-2 text-base"
467
+ };
468
+ var INDICATOR_SIZE_CLASSES = {
469
+ sm: "w-5 h-5 my-0",
470
+ md: "w-5 h-5 my-[2px]"
471
+ };
627
472
  var Alert = React29.forwardRef(
628
473
  function Alert2(props, ref) {
629
474
  const {
@@ -659,7 +504,10 @@ var Alert = React29.forwardRef(
659
504
  if (!showIcon && icon === void 0) {
660
505
  return null;
661
506
  }
662
- return /* @__PURE__ */ jsx("span", { className: indicatorVariants({ size: resolvedSize }), children: icon || defaultIcon });
507
+ return /* @__PURE__ */ jsx("span", { className: cn(
508
+ "inline-flex items-center justify-center shrink-0 text-[var(--color-alert-fg)] [&>svg]:w-full [&>svg]:h-full",
509
+ INDICATOR_SIZE_CLASSES[resolvedSize]
510
+ ), children: icon || defaultIcon });
663
511
  })();
664
512
  const handleClose = React29.useCallback(() => {
665
513
  setIsOpen(false);
@@ -692,12 +540,12 @@ var Alert = React29.forwardRef(
692
540
  "div",
693
541
  {
694
542
  ref,
695
- className: cn(alertRoot({ status, size: resolvedSize }), className),
543
+ className: cn(ALERT_BASE, STATUS_CLASSES[status], SIZE_CLASSES[resolvedSize], className),
696
544
  style: alertStyle,
697
545
  ...alertRest,
698
546
  children: [
699
547
  iconElement,
700
- children ? /* @__PURE__ */ jsxs("div", { className: alertContent({ inline }), children: [
548
+ children ? /* @__PURE__ */ jsxs("div", { className: cn("flex flex-1", inline ? "inline-flex flex-row items-center" : "flex flex-col"), children: [
701
549
  title && /* @__PURE__ */ jsx("div", { className: "font-semibold", children: title }),
702
550
  /* @__PURE__ */ jsx(
703
551
  "div",
@@ -722,7 +570,7 @@ var Alert = React29.forwardRef(
722
570
  ) });
723
571
  }
724
572
  );
725
- var SIZE_CLASSES = {
573
+ var SIZE_CLASSES2 = {
726
574
  xs: "h-6 w-6 text-[10px]",
727
575
  sm: "h-8 w-8 text-xs",
728
576
  md: "h-10 w-10 text-sm",
@@ -767,7 +615,7 @@ var Avatar = React29.forwardRef(
767
615
  ref,
768
616
  className: cn(
769
617
  "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full align-middle",
770
- SIZE_CLASSES[size],
618
+ SIZE_CLASSES2[size],
771
619
  VARIANT_CLASSES[variant],
772
620
  !isBorderless && "ring-2 ring-white dark:ring-gray-900",
773
621
  className
@@ -850,6 +698,10 @@ function useIsMobile() {
850
698
  }, []);
851
699
  return isMobile;
852
700
  }
701
+ function mapPlacement(p) {
702
+ if (!p) return void 0;
703
+ return p;
704
+ }
853
705
  var Tooltip = React29.forwardRef(
854
706
  function Tooltip2(props, ref) {
855
707
  const {
@@ -860,10 +712,8 @@ var Tooltip = React29.forwardRef(
860
712
  children,
861
713
  disabled,
862
714
  disableOnMobile,
863
- portalled = true,
864
715
  content,
865
716
  contentProps,
866
- portalRef,
867
717
  defaultOpen = false,
868
718
  triggerProps,
869
719
  closeDelay = 100,
@@ -911,36 +761,34 @@ var Tooltip = React29.forwardRef(
911
761
  if (disabled || disableOnMobile && isMobile) return children;
912
762
  const defaultShowArrow = variant === "popover" ? false : true;
913
763
  const showArrow = showArrowProp !== void 0 ? showArrowProp : defaultShowArrow;
914
- const placement = positioning?.placement ?? "top";
915
- const side = placement.split("-")[0];
916
- const align = placement.includes("-") ? placement.split("-")[1] : void 0;
917
- const sideOffset = positioning?.offset?.mainAxis ?? 4;
918
764
  const isPopover = variant === "popover";
919
- return /* @__PURE__ */ jsx(RadixTooltip.Provider, { delayDuration: openDelay, skipDelayDuration: 0, children: /* @__PURE__ */ jsxs(
920
- RadixTooltip.Root,
765
+ const placement = mapPlacement(positioning?.placement) ?? "top";
766
+ const offset = positioning?.offset?.mainAxis ?? 4;
767
+ return /* @__PURE__ */ jsx(TooltipGroup, { delay: openDelay, children: /* @__PURE__ */ jsxs(
768
+ Tooltip$1,
921
769
  {
922
770
  open,
923
771
  onOpenChange: handleOpenChange,
924
- delayDuration: openDelay,
772
+ delay: { open: openDelay, close: closeDelay },
773
+ placement,
774
+ offset,
775
+ unstyled: true,
925
776
  children: [
926
777
  /* @__PURE__ */ jsx(
927
- RadixTooltip.Trigger,
778
+ Tooltip$1.Trigger,
928
779
  {
929
780
  ref: open ? triggerRef : void 0,
930
781
  asChild: true,
931
- onClick: isMobile ? handleTriggerClick : void 0,
782
+ ...isMobile ? { onPress: handleTriggerClick } : {},
932
783
  ...triggerProps,
933
784
  children
934
785
  }
935
786
  ),
936
- /* @__PURE__ */ jsx(RadixTooltip.Portal, { container: portalled ? portalRef?.current ?? void 0 : void 0, children: /* @__PURE__ */ jsxs(
937
- RadixTooltip.Content,
787
+ /* @__PURE__ */ jsxs(
788
+ Tooltip$1.Content,
938
789
  {
939
790
  ref,
940
- side,
941
- align,
942
- sideOffset,
943
- onClick: interactive ? handleContentClick : void 0,
791
+ unstyled: true,
944
792
  className: cn(
945
793
  "z-[9999] overflow-hidden rounded-lg px-3 py-2 text-sm",
946
794
  "animate-in fade-in-0 zoom-in-95",
@@ -949,12 +797,14 @@ var Tooltip = React29.forwardRef(
949
797
  !isPopover && "bg-[var(--color-tooltip-bg)] text-[var(--color-tooltip-fg)] max-w-xs",
950
798
  contentProps?.className
951
799
  ),
800
+ onClick: interactive ? handleContentClick : void 0,
952
801
  ...selected ? { "data-selected": true } : {},
953
802
  ...contentProps,
954
803
  children: [
955
804
  showArrow && /* @__PURE__ */ jsx(
956
- RadixTooltip.Arrow,
805
+ Tooltip$1.Arrow,
957
806
  {
807
+ unstyled: true,
958
808
  className: cn(
959
809
  isPopover ? "fill-[var(--color-popover-bg)]" : "fill-[var(--color-tooltip-bg)]"
960
810
  )
@@ -963,7 +813,7 @@ var Tooltip = React29.forwardRef(
963
813
  content
964
814
  ]
965
815
  }
966
- ) })
816
+ )
967
817
  ]
968
818
  }
969
819
  ) });
@@ -972,26 +822,12 @@ var Tooltip = React29.forwardRef(
972
822
  function TruncatedTextTooltip({ label, children }) {
973
823
  return /* @__PURE__ */ jsx(Tooltip, { content: label, positioning: { placement: "top" }, children });
974
824
  }
975
- var badgeVariants = cva(
976
- "inline-flex items-center rounded-sm gap-1 font-medium w-fit max-w-full whitespace-nowrap select-text",
977
- {
978
- variants: {
979
- variant: {
980
- subtle: "",
981
- solid: ""
982
- },
983
- size: {
984
- sm: "text-xs p-1 h-[18px] min-h-[18px]",
985
- md: "text-sm px-1 py-0.5 min-h-6",
986
- lg: "text-sm px-2 py-1 min-h-7 font-semibold"
987
- }
988
- },
989
- defaultVariants: {
990
- variant: "subtle",
991
- size: "md"
992
- }
993
- }
994
- );
825
+ var BASE_CLASSES = "inline-flex items-center rounded-sm gap-1 font-medium w-fit max-w-full whitespace-nowrap select-text";
826
+ var SIZE_CLASSES3 = {
827
+ sm: "text-xs p-1 h-[18px] min-h-[18px]",
828
+ md: "text-sm px-1 py-0.5 min-h-6",
829
+ lg: "text-sm px-2 py-1 min-h-7 font-semibold"
830
+ };
995
831
  var COLOR_PALETTE_CLASSES = {
996
832
  gray: "bg-badge-gray-bg text-badge-gray-fg",
997
833
  green: "bg-badge-green-bg text-badge-green-fg",
@@ -1016,6 +852,7 @@ var COLOR_PALETTE_CLASSES = {
1016
852
  bright_purple: "bg-badge-bright-purple-bg text-badge-bright-purple-fg",
1017
853
  bright_pink: "bg-badge-bright-pink-bg text-badge-bright-pink-fg"
1018
854
  };
855
+ var S2 = 4;
1019
856
  var Badge = React29__default.forwardRef(
1020
857
  function Badge2(props, ref) {
1021
858
  const {
@@ -1024,8 +861,8 @@ var Badge = React29__default.forwardRef(
1024
861
  children,
1025
862
  truncated = false,
1026
863
  endElement,
1027
- variant,
1028
- size,
864
+ variant: _variant,
865
+ size = "md",
1029
866
  colorPalette = "gray",
1030
867
  className,
1031
868
  flexShrink: _flexShrink,
@@ -1037,16 +874,16 @@ var Badge = React29__default.forwardRef(
1037
874
  } = props;
1038
875
  const shimStyle = { ...styleProp };
1039
876
  if (_flexShrink !== void 0) shimStyle.flexShrink = _flexShrink;
1040
- if (_gap !== void 0) shimStyle.gap = typeof _gap === "number" ? `${_gap * 4}px` : _gap;
877
+ if (_gap !== void 0) shimStyle.gap = typeof _gap === "number" ? `${_gap * S2}px` : _gap;
1041
878
  if (_ml !== void 0) {
1042
879
  if (typeof _ml === "object") {
1043
880
  const obj = _ml;
1044
- shimStyle.marginLeft = `${(obj.base ?? obj.lg ?? 0) * 4}px`;
881
+ shimStyle.marginLeft = `${(obj.base ?? obj.lg ?? 0) * S2}px`;
1045
882
  } else {
1046
- shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * 4}px` : _ml;
883
+ shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * S2}px` : _ml;
1047
884
  }
1048
885
  }
1049
- if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * 4}px` : _mr;
886
+ if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * S2}px` : _mr;
1050
887
  const badgeStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
1051
888
  const child = children ? /* @__PURE__ */ jsx("span", { className: "overflow-hidden text-ellipsis", children }) : null;
1052
889
  const childrenElement = truncated ? /* @__PURE__ */ jsx(TruncatedTextTooltip, { label: children, children: child }) : child;
@@ -1055,7 +892,8 @@ var Badge = React29__default.forwardRef(
1055
892
  {
1056
893
  ref,
1057
894
  className: cn(
1058
- badgeVariants({ variant, size }),
895
+ BASE_CLASSES,
896
+ SIZE_CLASSES3[size],
1059
897
  COLOR_PALETTE_CLASSES[colorPalette],
1060
898
  className
1061
899
  ),
@@ -1074,171 +912,202 @@ var Badge = React29__default.forwardRef(
1074
912
  return badgeElement;
1075
913
  }
1076
914
  );
1077
- var buttonVariants = cva(
1078
- // base styles (shared across all variants)
1079
- [
1080
- "inline-flex items-center justify-center",
1081
- "gap-0 font-semibold overflow-hidden rounded-md",
1082
- "cursor-pointer select-none whitespace-nowrap",
1083
- "transition-colors duration-150",
1084
- "disabled:opacity-[0.2] disabled:cursor-not-allowed"
1085
- ],
1086
- {
1087
- variants: {
1088
- variant: {
1089
- // --- Solid ---
1090
- solid: [
1091
- "bg-[var(--color-button-solid-bg)] text-[var(--color-button-solid-text)]",
1092
- "hover:bg-[var(--color-hover)]",
1093
- "data-[expanded]:bg-[var(--color-hover)]"
1094
- ],
1095
- // --- Solid Danger ---
1096
- solid_danger: [
1097
- "bg-red-600 text-[var(--color-button-solid-text)]",
1098
- "hover:bg-red-500",
1099
- "data-[expanded]:bg-red-500"
1100
- ],
1101
- // --- Outline ---
1102
- outline: [
1103
- "border-2 border-solid bg-transparent",
1104
- "text-[var(--color-button-outline-fg)] border-[var(--color-button-outline-fg)]",
1105
- "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]"
1106
- ],
1107
- // --- Outline Danger ---
1108
- outline_danger: [
1109
- "border-2 border-solid bg-transparent",
1110
- "text-red-600 border-red-600",
1111
- "hover:bg-transparent hover:text-red-500 hover:border-red-500"
1112
- ],
1113
- // --- Dropdown ---
1114
- dropdown: [
1115
- "border-2 border-solid bg-transparent",
1116
- "text-[var(--color-button-dropdown-fg)] border-[var(--color-button-dropdown-border)]",
1117
- "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
1118
- "data-[expanded]:bg-transparent data-[expanded]:text-[var(--color-hover)] data-[expanded]:border-[var(--color-hover)]",
1119
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)] data-[selected]:border-transparent",
1120
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)]",
1121
- "data-[selected]:hover:text-[var(--color-hover)] data-[selected]:hover:border-transparent",
1122
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]"
1123
- ],
1124
- // --- Header ---
1125
- header: [
1126
- "bg-transparent border-2 border-solid",
1127
- "text-[var(--color-button-header-fg)] border-[var(--color-button-header-border)]",
1128
- "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
1129
- // selected
1130
- "data-[selected]:bg-[var(--color-button-header-bg-selected)]",
1131
- "data-[selected]:text-[var(--color-button-header-fg-selected)] data-[selected]:border-transparent data-[selected]:border-0",
1132
- "data-[selected]:hover:bg-[var(--color-button-header-bg-selected)] data-[selected]:hover:text-[var(--color-hover)]",
1133
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
1134
- // selected + highlighted
1135
- "data-[selected]:data-[highlighted]:bg-[var(--color-button-header-bg-highlighted)]",
1136
- "data-[selected]:data-[highlighted]:text-[var(--color-button-header-fg-highlighted)]",
1137
- "data-[selected]:data-[highlighted]:border-transparent data-[selected]:data-[highlighted]:border-0",
1138
- "data-[selected]:data-[highlighted]:hover:bg-[var(--color-button-header-bg-highlighted)]",
1139
- "data-[selected]:data-[highlighted]:hover:text-[var(--color-hover)]",
1140
- "data-[selected]:data-[highlighted]:data-[expanded]:text-[var(--color-hover)]"
1141
- ],
1142
- // --- Hero ---
1143
- hero: [
1144
- "bg-[var(--color-button-hero-bg)] text-[var(--color-button-hero-fg)]",
1145
- "hover:bg-[var(--color-button-hero-bg-hover)] hover:text-[var(--color-button-hero-fg-hover)]",
1146
- "data-[selected]:bg-[var(--color-button-hero-bg-selected)] data-[selected]:text-[var(--color-button-hero-fg-selected)]",
1147
- "data-[selected]:hover:bg-[var(--color-button-hero-bg-selected)] data-[selected]:hover:text-[var(--color-hover)]",
1148
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]"
1149
- ],
1150
- // --- Segmented ---
1151
- segmented: [
1152
- "bg-transparent border-2 border-solid rounded-none",
1153
- "text-[var(--color-button-segmented-fg)] border-[var(--color-selected-control-bg)]",
1154
- "hover:text-[var(--color-hover)]",
1155
- // selected
1156
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
1157
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-selected-control-text)]",
1158
- // border collapse: hide right border except when selected; first/last get rounded
1159
- "[&:not(:last-child)]:border-r-0 data-[selected]:[&:not(:last-child)]:border-r-2",
1160
- "data-[selected]+*:border-l-0",
1161
- "first:rounded-l-md last:rounded-r-md"
1162
- ],
1163
- // --- Plain ---
1164
- plain: [
1165
- "bg-transparent text-inherit border-none",
1166
- "hover:bg-transparent"
1167
- ],
1168
- // --- Subtle ---
1169
- subtle: [
1170
- "bg-[var(--color-button-subtle-bg)] text-[var(--color-button-subtle-fg)]",
1171
- "hover:bg-[var(--color-button-subtle-bg)] hover:text-[var(--color-hover)]",
1172
- "disabled:bg-[var(--color-button-subtle-bg)] disabled:text-[var(--color-button-subtle-fg)]"
1173
- ],
1174
- // --- Link ---
1175
- link: [
1176
- "bg-transparent text-[var(--color-link-primary)] border-none font-normal",
1177
- "px-0 h-auto",
1178
- "hover:bg-transparent hover:text-[var(--color-link-primary-hover)]",
1179
- "disabled:text-[var(--color-text-secondary)]"
1180
- ],
1181
- // --- Icon Secondary ---
1182
- icon_secondary: [
1183
- "bg-transparent text-[var(--color-icon-secondary)] border-none",
1184
- "hover:text-[var(--color-hover)]",
1185
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
1186
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-hover)]",
1187
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
1188
- "data-[expanded]:text-[var(--color-hover)]"
1189
- ],
1190
- // --- Icon Background ---
1191
- icon_background: [
1192
- "bg-[var(--color-button-icon-background-bg)] text-[var(--color-icon-secondary)] border-none",
1193
- "hover:text-[var(--color-hover)]",
1194
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
1195
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-hover)]",
1196
- "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
1197
- "data-[expanded]:text-[var(--color-hover)]"
1198
- ],
1199
- // --- Pagination ---
1200
- pagination: [
1201
- "border-2 border-solid bg-transparent",
1202
- "text-[var(--color-button-pagination-fg)] border-[var(--color-button-pagination-border)]",
1203
- "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
1204
- "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)] data-[selected]:border-transparent",
1205
- "data-[selected]:hover:bg-[var(--color-selected-control-bg)]",
1206
- "data-[selected]:hover:text-[var(--color-selected-control-text)] data-[selected]:hover:border-transparent"
1207
- ]
1208
- },
1209
- size: {
1210
- "2xs": "px-2 h-5 min-w-5 text-xs rounded-sm gap-1",
1211
- xs: "px-2 h-6 min-w-6 text-sm rounded-sm gap-1",
1212
- sm: "px-3 h-8 min-w-8 text-sm rounded-md gap-1",
1213
- md: "px-3 h-10 min-w-10 text-base rounded-md gap-2"
1214
- }
1215
- },
1216
- defaultVariants: {
1217
- variant: "solid",
1218
- size: "md"
1219
- }
1220
- }
1221
- );
915
+ var SpinnerFrame = styled(View, {
916
+ name: "ButtonSpinner",
917
+ render: /* @__PURE__ */ jsx("span", {}),
918
+ width: 16,
919
+ height: 16,
920
+ borderRadius: 1e3,
921
+ borderWidth: 2,
922
+ borderColor: "currentColor",
923
+ borderBottomColor: "transparent",
924
+ borderLeftColor: "transparent"
925
+ });
1222
926
  function Spinner({ className }) {
1223
927
  return /* @__PURE__ */ jsx(
1224
- "span",
928
+ SpinnerFrame,
1225
929
  {
1226
- className: cn(
1227
- "inline-block h-4 w-4 animate-spin rounded-full",
1228
- "border-2 border-current border-b-transparent border-l-transparent",
1229
- className
1230
- ),
1231
930
  role: "status",
1232
- "aria-label": "Loading"
931
+ "aria-label": "Loading",
932
+ className: [
933
+ "animate-spin",
934
+ className
935
+ ].filter(Boolean).join(" ")
1233
936
  }
1234
937
  );
1235
938
  }
939
+ var ButtonFrame = styled(View, {
940
+ name: "LuxButton",
941
+ render: /* @__PURE__ */ jsx("button", { type: "button" }),
942
+ role: "button",
943
+ tabIndex: 0,
944
+ cursor: "pointer",
945
+ userSelect: "none",
946
+ display: "inline-flex",
947
+ alignItems: "center",
948
+ justifyContent: "center",
949
+ gap: 0,
950
+ overflow: "hidden",
951
+ borderRadius: 6,
952
+ // Whitespace nowrap via className since hanzogui doesn't have a direct token
953
+ // Transition via className
954
+ variants: {
955
+ size: {
956
+ "2xs": { paddingHorizontal: 8, height: 20, minWidth: 20, fontSize: 12, borderRadius: 4, gap: 4 },
957
+ xs: { paddingHorizontal: 8, height: 24, minWidth: 24, fontSize: 14, borderRadius: 4, gap: 4 },
958
+ sm: { paddingHorizontal: 12, height: 32, minWidth: 32, fontSize: 14, borderRadius: 6, gap: 4 },
959
+ md: { paddingHorizontal: 12, height: 40, minWidth: 40, fontSize: 16, borderRadius: 6, gap: 8 }
960
+ },
961
+ disabled: {
962
+ true: {
963
+ opacity: 0.2,
964
+ cursor: "not-allowed",
965
+ pointerEvents: "none"
966
+ }
967
+ }
968
+ },
969
+ defaultVariants: {
970
+ size: "md"
971
+ }
972
+ });
973
+ var VARIANT_CLASSES2 = {
974
+ solid: [
975
+ "bg-[var(--color-button-solid-bg)] text-[var(--color-button-solid-text)]",
976
+ "hover:bg-[var(--color-hover)]",
977
+ "data-[expanded]:bg-[var(--color-hover)]"
978
+ ].join(" "),
979
+ solid_danger: [
980
+ "bg-red-600 text-[var(--color-button-solid-text)]",
981
+ "hover:bg-red-500",
982
+ "data-[expanded]:bg-red-500"
983
+ ].join(" "),
984
+ outline: [
985
+ "border-2 border-solid bg-transparent",
986
+ "text-[var(--color-button-outline-fg)] border-[var(--color-button-outline-fg)]",
987
+ "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]"
988
+ ].join(" "),
989
+ outline_danger: [
990
+ "border-2 border-solid bg-transparent",
991
+ "text-red-600 border-red-600",
992
+ "hover:bg-transparent hover:text-red-500 hover:border-red-500"
993
+ ].join(" "),
994
+ dropdown: [
995
+ "border-2 border-solid bg-transparent",
996
+ "text-[var(--color-button-dropdown-fg)] border-[var(--color-button-dropdown-border)]",
997
+ "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
998
+ "data-[expanded]:bg-transparent data-[expanded]:text-[var(--color-hover)] data-[expanded]:border-[var(--color-hover)]",
999
+ "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)] data-[selected]:border-transparent",
1000
+ "data-[selected]:hover:bg-[var(--color-selected-control-bg)]",
1001
+ "data-[selected]:hover:text-[var(--color-hover)] data-[selected]:hover:border-transparent",
1002
+ "data-[selected]:data-[expanded]:text-[var(--color-hover)]"
1003
+ ].join(" "),
1004
+ header: [
1005
+ "bg-transparent border-2 border-solid",
1006
+ "text-[var(--color-button-header-fg)] border-[var(--color-button-header-border)]",
1007
+ "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
1008
+ "data-[selected]:bg-[var(--color-button-header-bg-selected)]",
1009
+ "data-[selected]:text-[var(--color-button-header-fg-selected)] data-[selected]:border-transparent data-[selected]:border-0",
1010
+ "data-[selected]:hover:bg-[var(--color-button-header-bg-selected)] data-[selected]:hover:text-[var(--color-hover)]",
1011
+ "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
1012
+ "data-[selected]:data-[highlighted]:bg-[var(--color-button-header-bg-highlighted)]",
1013
+ "data-[selected]:data-[highlighted]:text-[var(--color-button-header-fg-highlighted)]",
1014
+ "data-[selected]:data-[highlighted]:border-transparent data-[selected]:data-[highlighted]:border-0",
1015
+ "data-[selected]:data-[highlighted]:hover:bg-[var(--color-button-header-bg-highlighted)]",
1016
+ "data-[selected]:data-[highlighted]:hover:text-[var(--color-hover)]",
1017
+ "data-[selected]:data-[highlighted]:data-[expanded]:text-[var(--color-hover)]"
1018
+ ].join(" "),
1019
+ hero: [
1020
+ "bg-[var(--color-button-hero-bg)] text-[var(--color-button-hero-fg)]",
1021
+ "hover:bg-[var(--color-button-hero-bg-hover)] hover:text-[var(--color-button-hero-fg-hover)]",
1022
+ "data-[selected]:bg-[var(--color-button-hero-bg-selected)] data-[selected]:text-[var(--color-button-hero-fg-selected)]",
1023
+ "data-[selected]:hover:bg-[var(--color-button-hero-bg-selected)] data-[selected]:hover:text-[var(--color-hover)]",
1024
+ "data-[selected]:data-[expanded]:text-[var(--color-hover)]"
1025
+ ].join(" "),
1026
+ segmented: [
1027
+ "bg-transparent border-2 border-solid rounded-none",
1028
+ "text-[var(--color-button-segmented-fg)] border-[var(--color-selected-control-bg)]",
1029
+ "hover:text-[var(--color-hover)]",
1030
+ "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
1031
+ "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-selected-control-text)]",
1032
+ "[&:not(:last-child)]:border-r-0 data-[selected]:[&:not(:last-child)]:border-r-2",
1033
+ "data-[selected]+*:border-l-0",
1034
+ "first:rounded-l-md last:rounded-r-md"
1035
+ ].join(" "),
1036
+ plain: "bg-transparent text-inherit border-none hover:bg-transparent",
1037
+ subtle: [
1038
+ "bg-[var(--color-button-subtle-bg)] text-[var(--color-button-subtle-fg)]",
1039
+ "hover:bg-[var(--color-button-subtle-bg)] hover:text-[var(--color-hover)]",
1040
+ "disabled:bg-[var(--color-button-subtle-bg)] disabled:text-[var(--color-button-subtle-fg)]"
1041
+ ].join(" "),
1042
+ link: [
1043
+ "bg-transparent text-[var(--color-link-primary)] border-none font-normal",
1044
+ "px-0 h-auto",
1045
+ "hover:bg-transparent hover:text-[var(--color-link-primary-hover)]",
1046
+ "disabled:text-[var(--color-text-secondary)]"
1047
+ ].join(" "),
1048
+ icon_secondary: [
1049
+ "bg-transparent text-[var(--color-icon-secondary)] border-none",
1050
+ "hover:text-[var(--color-hover)]",
1051
+ "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
1052
+ "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-hover)]",
1053
+ "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
1054
+ "data-[expanded]:text-[var(--color-hover)]"
1055
+ ].join(" "),
1056
+ icon_background: [
1057
+ "bg-[var(--color-button-icon-background-bg)] text-[var(--color-icon-secondary)] border-none",
1058
+ "hover:text-[var(--color-hover)]",
1059
+ "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)]",
1060
+ "data-[selected]:hover:bg-[var(--color-selected-control-bg)] data-[selected]:hover:text-[var(--color-hover)]",
1061
+ "data-[selected]:data-[expanded]:text-[var(--color-hover)]",
1062
+ "data-[expanded]:text-[var(--color-hover)]"
1063
+ ].join(" "),
1064
+ pagination: [
1065
+ "border-2 border-solid bg-transparent",
1066
+ "text-[var(--color-button-pagination-fg)] border-[var(--color-button-pagination-border)]",
1067
+ "hover:bg-transparent hover:text-[var(--color-hover)] hover:border-[var(--color-hover)]",
1068
+ "data-[selected]:bg-[var(--color-selected-control-bg)] data-[selected]:text-[var(--color-selected-control-text)] data-[selected]:border-transparent",
1069
+ "data-[selected]:hover:bg-[var(--color-selected-control-bg)]",
1070
+ "data-[selected]:hover:text-[var(--color-selected-control-text)] data-[selected]:hover:border-transparent"
1071
+ ].join(" ")
1072
+ };
1073
+ var BASE_CLASSES2 = "font-semibold whitespace-nowrap transition-colors duration-150";
1074
+ var SP = 4;
1075
+ function buildShimStyle(props) {
1076
+ const s = { ...props.style };
1077
+ if (props.mt !== void 0) s.marginTop = typeof props.mt === "number" ? `${props.mt * SP}px` : props.mt;
1078
+ if (props.ml !== void 0) s.marginLeft = typeof props.ml === "number" ? `${props.ml * SP}px` : props.ml;
1079
+ if (props.mr !== void 0) s.marginRight = typeof props.mr === "number" ? `${props.mr * SP}px` : props.mr;
1080
+ if (props.px !== void 0) {
1081
+ const v = typeof props.px === "number" ? `${props.px * SP}px` : props.px;
1082
+ s.paddingLeft = v;
1083
+ s.paddingRight = v;
1084
+ }
1085
+ if (props.py !== void 0) {
1086
+ const v = typeof props.py === "number" ? `${props.py * SP}px` : props.py;
1087
+ s.paddingTop = v;
1088
+ s.paddingBottom = v;
1089
+ }
1090
+ if (props.fontWeight !== void 0) s.fontWeight = props.fontWeight;
1091
+ if (props.gap !== void 0) s.gap = typeof props.gap === "number" ? `${props.gap * SP}px` : props.gap;
1092
+ if (props.flexShrink !== void 0) s.flexShrink = props.flexShrink;
1093
+ if (props.columnGap !== void 0) s.columnGap = typeof props.columnGap === "number" ? `${props.columnGap * SP}px` : props.columnGap;
1094
+ if (props.gridColumn !== void 0) s.gridColumn = typeof props.gridColumn === "number" ? String(props.gridColumn) : props.gridColumn;
1095
+ if (props.gridRow) s.gridRow = props.gridRow;
1096
+ if (props.justifySelf) s.justifySelf = props.justifySelf;
1097
+ if (props.alignSelf) s.alignSelf = props.alignSelf;
1098
+ if (props.h) s.height = props.h;
1099
+ if (props.w) s.width = props.w;
1100
+ if (props.display) s.display = props.display;
1101
+ if (props.borderBottomRightRadius !== void 0) s.borderBottomRightRadius = typeof props.borderBottomRightRadius === "number" ? `${props.borderBottomRightRadius}px` : props.borderBottomRightRadius;
1102
+ if (props.borderTopRightRadius !== void 0) s.borderTopRightRadius = typeof props.borderTopRightRadius === "number" ? `${props.borderTopRightRadius}px` : props.borderTopRightRadius;
1103
+ return Object.keys(s).length > 0 ? s : void 0;
1104
+ }
1236
1105
  var Button = React29.forwardRef(
1237
1106
  function Button2(props, ref) {
1238
1107
  const {
1239
1108
  className,
1240
- variant,
1241
- size,
1109
+ variant = "solid",
1110
+ size = "md",
1242
1111
  asChild = false,
1243
1112
  loading = false,
1244
1113
  loadingText,
@@ -1250,57 +1119,48 @@ var Button = React29.forwardRef(
1250
1119
  children,
1251
1120
  style: styleProp,
1252
1121
  // Strip Chakra style props
1253
- mt: _mt,
1254
- ml: _ml,
1255
- mr: _mr,
1256
- px: _px,
1257
- py: _py,
1258
- fontWeight: _fontWeight,
1259
- gap: _gap,
1260
- flexShrink: _flexShrink,
1261
- columnGap: _columnGap,
1262
- gridColumn: _gridColumn,
1263
- gridRow: _gridRow,
1264
- justifySelf: _justifySelf,
1265
- alignSelf: _alignSelf,
1122
+ mt,
1123
+ ml,
1124
+ mr,
1125
+ px,
1126
+ py,
1127
+ fontWeight,
1128
+ gap,
1129
+ flexShrink,
1130
+ columnGap,
1131
+ gridColumn,
1132
+ gridRow,
1133
+ justifySelf,
1134
+ alignSelf,
1266
1135
  textStyle: _textStyle,
1267
- h: _h,
1268
- w: _w,
1269
- display: _display,
1270
- borderBottomRightRadius: _bbrr,
1271
- borderTopRightRadius: _btrr,
1136
+ h,
1137
+ w,
1138
+ display,
1139
+ borderBottomRightRadius,
1140
+ borderTopRightRadius,
1272
1141
  ...rest
1273
1142
  } = props;
1274
- const SP = 4;
1275
- const shimStyle = { ...styleProp };
1276
- if (_mt !== void 0) shimStyle.marginTop = typeof _mt === "number" ? `${_mt * SP}px` : _mt;
1277
- if (_ml !== void 0) shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * SP}px` : _ml;
1278
- if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * SP}px` : _mr;
1279
- if (_px !== void 0) {
1280
- const v = typeof _px === "number" ? `${_px * SP}px` : _px;
1281
- shimStyle.paddingLeft = v;
1282
- shimStyle.paddingRight = v;
1283
- }
1284
- if (_py !== void 0) {
1285
- const v = typeof _py === "number" ? `${_py * SP}px` : _py;
1286
- shimStyle.paddingTop = v;
1287
- shimStyle.paddingBottom = v;
1288
- }
1289
- if (_fontWeight !== void 0) shimStyle.fontWeight = _fontWeight;
1290
- if (_gap !== void 0) shimStyle.gap = typeof _gap === "number" ? `${_gap * SP}px` : _gap;
1291
- if (_flexShrink !== void 0) shimStyle.flexShrink = _flexShrink;
1292
- if (_columnGap !== void 0) shimStyle.columnGap = typeof _columnGap === "number" ? `${_columnGap * SP}px` : _columnGap;
1293
- if (_gridColumn !== void 0) shimStyle.gridColumn = typeof _gridColumn === "number" ? String(_gridColumn) : _gridColumn;
1294
- if (_gridRow) shimStyle.gridRow = _gridRow;
1295
- if (_justifySelf) shimStyle.justifySelf = _justifySelf;
1296
- if (_alignSelf) shimStyle.alignSelf = _alignSelf;
1297
- if (_h) shimStyle.height = _h;
1298
- if (_w) shimStyle.width = _w;
1299
- if (_display) shimStyle.display = _display;
1300
- if (_bbrr !== void 0) shimStyle.borderBottomRightRadius = typeof _bbrr === "number" ? `${_bbrr}px` : _bbrr;
1301
- if (_btrr !== void 0) shimStyle.borderTopRightRadius = typeof _btrr === "number" ? `${_btrr}px` : _btrr;
1302
- const mergedStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
1303
- const Comp = asChild ? Slot : "button";
1143
+ const mergedStyle = buildShimStyle({
1144
+ style: styleProp,
1145
+ mt,
1146
+ ml,
1147
+ mr,
1148
+ px,
1149
+ py,
1150
+ fontWeight,
1151
+ gap,
1152
+ flexShrink,
1153
+ columnGap,
1154
+ gridColumn,
1155
+ gridRow,
1156
+ justifySelf,
1157
+ alignSelf,
1158
+ h,
1159
+ w,
1160
+ display,
1161
+ borderBottomRightRadius,
1162
+ borderTopRightRadius
1163
+ });
1304
1164
  const dataAttrs = {};
1305
1165
  if (expanded) dataAttrs["data-expanded"] = true;
1306
1166
  if (selected) dataAttrs["data-selected"] = true;
@@ -1309,15 +1169,19 @@ var Button = React29.forwardRef(
1309
1169
  const isDisabled = !loadingSkeleton && (loading || disabled);
1310
1170
  const inner = loading ? /* @__PURE__ */ jsxs(Fragment, { children: [
1311
1171
  /* @__PURE__ */ jsx(Spinner, {}),
1312
- loadingText != null && /* @__PURE__ */ jsx("span", { className: "ml-2", children: loadingText })
1172
+ loadingText != null && /* @__PURE__ */ jsx("span", { style: { marginLeft: 8 }, children: loadingText })
1313
1173
  ] }) : children;
1174
+ const variantClass = VARIANT_CLASSES2[variant] ?? VARIANT_CLASSES2.solid;
1175
+ const combinedClassName = [BASE_CLASSES2, variantClass, className].filter(Boolean).join(" ");
1314
1176
  const button = /* @__PURE__ */ jsx(
1315
- Comp,
1177
+ ButtonFrame,
1316
1178
  {
1317
1179
  ref,
1318
- className: cn(buttonVariants({ variant, size }), className),
1319
- style: mergedStyle,
1180
+ size,
1320
1181
  disabled: isDisabled || void 0,
1182
+ asChild: asChild || void 0,
1183
+ className: combinedClassName,
1184
+ style: mergedStyle,
1321
1185
  ...dataAttrs,
1322
1186
  ...rest,
1323
1187
  children: inner
@@ -1329,6 +1193,17 @@ var Button = React29.forwardRef(
1329
1193
  return button;
1330
1194
  }
1331
1195
  );
1196
+ var SIZE_CLASSES4 = {
1197
+ "2xs": "px-2 h-5 min-w-5 text-xs rounded-sm gap-1",
1198
+ xs: "px-2 h-6 min-w-6 text-sm rounded-sm gap-1",
1199
+ sm: "px-3 h-8 min-w-8 text-sm rounded-md gap-1",
1200
+ md: "px-3 h-10 min-w-10 text-base rounded-md gap-2"
1201
+ };
1202
+ function buttonVariants(opts) {
1203
+ const v = opts?.variant ?? "solid";
1204
+ const s = opts?.size ?? "md";
1205
+ return [BASE_CLASSES2, VARIANT_CLASSES2[v] ?? "", SIZE_CLASSES4[s] ?? ""].filter(Boolean).join(" ");
1206
+ }
1332
1207
  var ButtonGroup = React29.forwardRef(
1333
1208
  function ButtonGroup2(props, ref) {
1334
1209
  const { className, ...rest } = props;
@@ -1336,7 +1211,7 @@ var ButtonGroup = React29.forwardRef(
1336
1211
  "div",
1337
1212
  {
1338
1213
  ref,
1339
- className: cn("inline-flex", className),
1214
+ className: ["inline-flex", className].filter(Boolean).join(" "),
1340
1215
  role: "group",
1341
1216
  ...rest
1342
1217
  }
@@ -1377,11 +1252,11 @@ var ButtonGroupRadio = React29.forwardRef(
1377
1252
  "div",
1378
1253
  {
1379
1254
  ref,
1380
- className: cn(
1255
+ className: [
1381
1256
  "inline-flex gap-0",
1382
- equalWidth && "grid",
1257
+ equalWidth ? "grid" : "",
1383
1258
  className
1384
- ),
1259
+ ].filter(Boolean).join(" "),
1385
1260
  style: equalWidth ? { gridTemplateColumns: `repeat(${childrenLength}, 1fr)` } : void 0,
1386
1261
  role: "group",
1387
1262
  ...rest,
@@ -1444,7 +1319,7 @@ var CheckboxGroupBase = React29.forwardRef(
1444
1319
  }
1445
1320
  );
1446
1321
  var CheckboxGroup2 = CheckboxGroupBase;
1447
- var SIZE_CLASSES2 = {
1322
+ var SIZE_CLASSES5 = {
1448
1323
  sm: {
1449
1324
  root: "gap-1.5",
1450
1325
  control: "h-3.5 w-3.5 rounded-sm",
@@ -1554,7 +1429,7 @@ var CheckboxBase = React29.forwardRef(
1554
1429
  },
1555
1430
  [readOnly, isControlled, isInGroup, group, value, onCheckedChange, onChange]
1556
1431
  );
1557
- const sizeClasses2 = SIZE_CLASSES2[size];
1432
+ const sizeClasses2 = SIZE_CLASSES5[size];
1558
1433
  return /* @__PURE__ */ jsxs(
1559
1434
  "label",
1560
1435
  {
@@ -1630,7 +1505,7 @@ function stripUtmParams(url) {
1630
1505
  return url;
1631
1506
  }
1632
1507
  }
1633
- var VARIANT_CLASSES2 = {
1508
+ var VARIANT_CLASSES3 = {
1634
1509
  primary: cn(
1635
1510
  "text-[var(--color-link-primary)]",
1636
1511
  "hover:no-underline hover:text-[var(--color-link-primary-hover)]",
@@ -1670,7 +1545,7 @@ var VARIANT_CLASSES2 = {
1670
1545
  "data-[hover]:no-underline"
1671
1546
  )
1672
1547
  };
1673
- var BASE_CLASSES = "inline-flex items-center gap-0 cursor-pointer data-[disabled]:cursor-not-allowed";
1548
+ var BASE_CLASSES3 = "inline-flex items-center gap-0 cursor-pointer data-[disabled]:cursor-not-allowed";
1674
1549
  var LinkExternalIcon = ({ color }) => /* @__PURE__ */ jsx(
1675
1550
  ArrowIcon,
1676
1551
  {
@@ -1739,7 +1614,7 @@ var Link = React29__default.forwardRef(
1739
1614
  if (_minW !== void 0) shimStyle.minWidth = typeof _minW === "number" ? `${_minW * SPACING}px` : _minW;
1740
1615
  if (_justifyContent) shimStyle.justifyContent = _justifyContent;
1741
1616
  if (_position) shimStyle.position = _position;
1742
- const linkClasses = cn(BASE_CLASSES, VARIANT_CLASSES2[variant], className);
1617
+ const linkClasses = cn(BASE_CLASSES3, VARIANT_CLASSES3[variant], className);
1743
1618
  const linkStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
1744
1619
  if (external) {
1745
1620
  const processedHref = typeof href === "string" ? stripUtmParams(href) : href;
@@ -1828,8 +1703,8 @@ var LinkOverlay = React29__default.forwardRef(
1828
1703
  ...rest
1829
1704
  } = props;
1830
1705
  const overlayClasses = cn(
1831
- BASE_CLASSES,
1832
- VARIANT_CLASSES2[variant],
1706
+ BASE_CLASSES3,
1707
+ VARIANT_CLASSES3[variant],
1833
1708
  // Static positioning with a ::before pseudo-element that covers the LinkBox
1834
1709
  "static",
1835
1710
  'before:absolute before:inset-0 before:z-0 before:content-[""]',
@@ -2027,9 +1902,9 @@ function BackToButton({ onClick }) {
2027
1902
  }
2028
1903
  );
2029
1904
  }
2030
- var DialogContext = React29.createContext({ size: "md" });
2031
- function useDialogContext() {
2032
- return React29.useContext(DialogContext);
1905
+ var DialogSizeContext = React29.createContext({ size: "md" });
1906
+ function useDialogSizeContext() {
1907
+ return React29.useContext(DialogSizeContext);
2033
1908
  }
2034
1909
  var CONTENT_SIZE_MAP = {
2035
1910
  sm: "max-w-[400px]",
@@ -2059,7 +1934,7 @@ var DialogRoot = ({
2059
1934
  onOpenChange,
2060
1935
  size = "md",
2061
1936
  modal = true
2062
- // motionPreset is intentionally unused kept for API compat
1937
+ // motionPreset is intentionally unused -- kept for API compat
2063
1938
  }) => {
2064
1939
  const handleOpenChange = React29.useCallback(
2065
1940
  (nextOpen) => {
@@ -2068,8 +1943,8 @@ var DialogRoot = ({
2068
1943
  [onOpenChange]
2069
1944
  );
2070
1945
  const ctx = React29.useMemo(() => ({ size }), [size]);
2071
- return /* @__PURE__ */ jsx(DialogContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
2072
- RadixDialog.Root,
1946
+ return /* @__PURE__ */ jsx(DialogSizeContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
1947
+ Dialog,
2073
1948
  {
2074
1949
  open,
2075
1950
  defaultOpen,
@@ -2082,8 +1957,8 @@ var DialogRoot = ({
2082
1957
  var DialogContent = React29.forwardRef(function DialogContent2(props, ref) {
2083
1958
  const {
2084
1959
  children,
2085
- portalled = true,
2086
- portalRef,
1960
+ portalled: _portalled = true,
1961
+ portalRef: _portalRef,
2087
1962
  backdrop = true,
2088
1963
  className,
2089
1964
  paddingTop: _paddingTop,
@@ -2094,21 +1969,12 @@ var DialogContent = React29.forwardRef(function DialogContent2(props, ref) {
2094
1969
  ...styleProp,
2095
1970
  ..._paddingTop !== void 0 ? { paddingTop: typeof _paddingTop === "number" ? `${_paddingTop * 4}px` : _paddingTop } : {}
2096
1971
  };
2097
- const { size } = useDialogContext();
2098
- let portalProps;
2099
- if (!portalled) {
2100
- portalProps = { container: void 0 };
2101
- } else if (portalRef) {
2102
- portalProps = { container: portalRef.current };
2103
- } else {
2104
- portalProps = {};
2105
- }
2106
- const Wrapper = portalled ? RadixDialog.Portal : React29.Fragment;
2107
- const wrapperProps = portalled ? portalProps : {};
2108
- return /* @__PURE__ */ jsxs(Wrapper, { ...wrapperProps, children: [
1972
+ const { size } = useDialogSizeContext();
1973
+ return /* @__PURE__ */ jsxs(Dialog.Portal, { children: [
2109
1974
  backdrop && /* @__PURE__ */ jsx(
2110
- RadixDialog.Overlay,
1975
+ Dialog.Overlay,
2111
1976
  {
1977
+ unstyled: true,
2112
1978
  className: "fixed inset-0 z-[1400] bg-black/80"
2113
1979
  }
2114
1980
  ),
@@ -2121,9 +1987,10 @@ var DialogContent = React29.forwardRef(function DialogContent2(props, ref) {
2121
1987
  "overflow-hidden"
2122
1988
  ),
2123
1989
  children: /* @__PURE__ */ jsx(
2124
- RadixDialog.Content,
1990
+ Dialog.Content,
2125
1991
  {
2126
1992
  ref,
1993
+ unstyled: true,
2127
1994
  className: cn(
2128
1995
  // Base content styles
2129
1996
  "relative flex flex-col w-full p-6 outline-none text-base",
@@ -2146,7 +2013,7 @@ var DialogContent = React29.forwardRef(function DialogContent2(props, ref) {
2146
2013
  });
2147
2014
  var DialogCloseTrigger = React29.forwardRef(function DialogCloseTrigger2(props, ref) {
2148
2015
  const { className, ...rest } = props;
2149
- return /* @__PURE__ */ jsx(RadixDialog.Close, { asChild: true, children: /* @__PURE__ */ jsx(CloseButton, { ref, className, ...rest, children: props.children }) });
2016
+ return /* @__PURE__ */ jsx(Dialog.Close, { asChild: true, children: /* @__PURE__ */ jsx(CloseButton, { ref, className, ...rest, children: props.children }) });
2150
2017
  });
2151
2018
  var DialogHeader = React29.forwardRef(function DialogHeader2(props, ref) {
2152
2019
  const { startElement: startElementProp, onBackToClick, className, children, ...rest } = props;
@@ -2163,8 +2030,9 @@ var DialogHeader = React29.forwardRef(function DialogHeader2(props, ref) {
2163
2030
  children: [
2164
2031
  startElement,
2165
2032
  /* @__PURE__ */ jsx(
2166
- RadixDialog.Title,
2033
+ Dialog.Title,
2167
2034
  {
2035
+ unstyled: true,
2168
2036
  className: cn(
2169
2037
  "text-base lg:text-lg font-medium",
2170
2038
  "whitespace-nowrap overflow-hidden text-ellipsis"
@@ -2204,11 +2072,11 @@ var DialogFooter = React29.forwardRef(function DialogFooter2({ className, ...pro
2204
2072
  }
2205
2073
  );
2206
2074
  });
2207
- var DialogBackdrop = RadixDialog.Overlay;
2208
- var DialogTitle = RadixDialog.Title;
2209
- var DialogDescription = RadixDialog.Description;
2210
- var DialogTrigger = RadixDialog.Trigger;
2211
- var DialogActionTrigger = RadixDialog.Close;
2075
+ var DialogBackdrop = Dialog.Overlay;
2076
+ var DialogTitle = Dialog.Title;
2077
+ var DialogDescription = Dialog.Description;
2078
+ var DialogTrigger = Dialog.Trigger;
2079
+ var DialogActionTrigger = Dialog.Close;
2212
2080
  var DrawerPlacementContext = React29.createContext("right");
2213
2081
  var DrawerSizeContext = React29.createContext("md");
2214
2082
  var DrawerRoot = (props) => {
@@ -2257,7 +2125,7 @@ var PLACEMENT_CLASSES = {
2257
2125
  "data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom"
2258
2126
  ].join(" ")
2259
2127
  };
2260
- var SIZE_CLASSES3 = {
2128
+ var SIZE_CLASSES6 = {
2261
2129
  right: { xs: "w-60", sm: "w-80", md: "w-96", lg: "w-[480px]", xl: "w-[640px]", full: "w-screen" },
2262
2130
  left: { xs: "w-60", sm: "w-80", md: "w-96", lg: "w-[480px]", xl: "w-[640px]", full: "w-screen" },
2263
2131
  top: { xs: "h-40", sm: "h-60", md: "h-80", lg: "h-96", xl: "h-[480px]", full: "h-screen" },
@@ -2286,7 +2154,7 @@ var DrawerContent = React29.forwardRef(
2286
2154
  className: cn(
2287
2155
  "fixed z-50 flex flex-col bg-[var(--color-drawer-bg)] shadow-[var(--shadow-drawer)] duration-300",
2288
2156
  PLACEMENT_CLASSES[placement] ?? PLACEMENT_CLASSES.right,
2289
- SIZE_CLASSES3[placement]?.[size] ?? SIZE_CLASSES3.right?.md,
2157
+ SIZE_CLASSES6[placement]?.[size] ?? SIZE_CLASSES6.right?.md,
2290
2158
  className
2291
2159
  ),
2292
2160
  ...rest,
@@ -2538,92 +2406,100 @@ var Field = React29.forwardRef(
2538
2406
  );
2539
2407
  }
2540
2408
  );
2541
- var LEVEL_TAG = {
2542
- "1": "h1",
2543
- "2": "h2",
2544
- "3": "h3"
2545
- };
2409
+ var LEVEL_TAG = { "1": "h1", "2": "h2", "3": "h3" };
2546
2410
  var LEVEL_CLASSES = {
2547
2411
  "1": "text-[18px] leading-[24px] font-medium lg:text-[32px] lg:leading-[40px] lg:tracking-[-0.5px]",
2548
2412
  "2": "text-[16px] leading-[24px] font-medium lg:text-[24px] lg:leading-[32px]",
2549
2413
  "3": "text-[14px] leading-[20px] font-semibold lg:text-[18px] lg:leading-[24px] lg:font-medium"
2550
2414
  };
2551
- var BASE_CLASSES2 = "font-heading text-heading";
2415
+ var BASE_CLASSES4 = "font-heading text-heading";
2552
2416
  var Heading = React29__default.forwardRef(
2553
2417
  function Heading2({ level, className, mb, size: _size, style: styleProp, ...rest }, ref) {
2554
2418
  const Tag3 = level ? LEVEL_TAG[level] : "h2";
2555
2419
  const levelClasses = level ? LEVEL_CLASSES[level] : void 0;
2556
- const shimStyle = { ...styleProp };
2557
- if (mb !== void 0) shimStyle.marginBottom = typeof mb === "number" ? `${mb * 4}px` : mb;
2420
+ const mergedStyle = mb !== void 0 ? { ...styleProp, marginBottom: typeof mb === "number" ? `${mb * 4}px` : mb } : styleProp;
2558
2421
  return /* @__PURE__ */ jsx(
2559
2422
  Tag3,
2560
2423
  {
2561
2424
  ref,
2562
- className: cn(BASE_CLASSES2, levelClasses, className),
2563
- style: Object.keys(shimStyle).length > 0 ? shimStyle : void 0,
2425
+ className: cn(BASE_CLASSES4, levelClasses, className),
2426
+ style: mergedStyle,
2564
2427
  ...rest
2565
2428
  }
2566
2429
  );
2567
2430
  }
2568
2431
  );
2569
- var iconButtonVariants = cva(
2570
- // base
2571
- [
2572
- "inline-flex items-center justify-center",
2573
- "p-0 min-w-auto shrink-0",
2574
- "cursor-pointer border-0 bg-transparent",
2575
- "disabled:opacity-[var(--opacity-control-disabled,0.4)] disabled:cursor-not-allowed"
2576
- ],
2577
- {
2578
- variants: {
2579
- variant: {
2580
- plain: "bg-transparent text-inherit border-none hover:bg-transparent",
2581
- icon_secondary: [
2582
- "bg-transparent text-icon-secondary border-none",
2583
- "hover:text-hover",
2584
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
2585
- "data-[selected]:hover:text-hover",
2586
- "data-[expanded]:text-hover"
2587
- ],
2588
- icon_background: [
2589
- "bg-[var(--color-button-icon-background-bg)] text-icon-secondary border-none",
2590
- "hover:text-hover",
2591
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
2592
- "data-[selected]:hover:text-hover",
2593
- "data-[expanded]:text-hover"
2594
- ],
2595
- link: [
2596
- "bg-transparent text-link-primary border-none font-normal px-0 h-auto",
2597
- "hover:bg-transparent hover:text-link-primary-hover",
2598
- "disabled:text-text-secondary"
2599
- ],
2600
- dropdown: [
2601
- "border-2 border-solid bg-transparent",
2602
- "text-[var(--color-button-dropdown-fg)] border-[var(--color-button-dropdown-border)]",
2603
- "hover:bg-transparent hover:text-hover hover:border-hover",
2604
- "data-[expanded]:bg-transparent data-[expanded]:text-hover data-[expanded]:border-hover",
2605
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent",
2606
- "data-[selected]:hover:text-hover"
2607
- ],
2608
- pagination: [
2609
- "border-2 border-solid bg-transparent",
2610
- "text-[var(--color-button-pagination-fg)] border-[var(--color-button-pagination-border)]",
2611
- "hover:bg-transparent hover:text-hover hover:border-hover",
2612
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent"
2613
- ]
2614
- },
2615
- size: {
2616
- "2xs": "size-5 rounded-sm [&_svg]:size-5",
2617
- "2xs_alt": "size-5 rounded-sm [&_svg]:size-3",
2618
- md: "size-8 rounded-[var(--radius-base,8px)] [&_svg]:size-5"
2619
- }
2432
+ var IconButtonFrame = styled(View, {
2433
+ name: "LuxIconButton",
2434
+ render: /* @__PURE__ */ jsx("button", { type: "button" }),
2435
+ role: "button",
2436
+ cursor: "pointer",
2437
+ display: "inline-flex",
2438
+ alignItems: "center",
2439
+ justifyContent: "center",
2440
+ padding: 0,
2441
+ minWidth: "auto",
2442
+ flexShrink: 1,
2443
+ backgroundColor: "transparent",
2444
+ borderWidth: 0,
2445
+ variants: {
2446
+ size: {
2447
+ "2xs": { width: 20, height: 20, borderRadius: 4 },
2448
+ "2xs_alt": { width: 20, height: 20, borderRadius: 4 },
2449
+ md: { width: 32, height: 32, borderRadius: "var(--radius-base, 8px)" }
2620
2450
  },
2621
- defaultVariants: {
2622
- variant: "plain"
2451
+ disabled: {
2452
+ true: {
2453
+ opacity: 0.4,
2454
+ cursor: "not-allowed",
2455
+ pointerEvents: "none"
2456
+ }
2623
2457
  }
2624
2458
  }
2625
- );
2626
- var IconButton = React29__default.forwardRef(
2459
+ });
2460
+ var VARIANT_CLASSES4 = {
2461
+ plain: "bg-transparent text-inherit border-none hover:bg-transparent",
2462
+ icon_secondary: [
2463
+ "bg-transparent text-icon-secondary border-none",
2464
+ "hover:text-hover",
2465
+ "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
2466
+ "data-[selected]:hover:text-hover",
2467
+ "data-[expanded]:text-hover"
2468
+ ].join(" "),
2469
+ icon_background: [
2470
+ "bg-[var(--color-button-icon-background-bg)] text-icon-secondary border-none",
2471
+ "hover:text-hover",
2472
+ "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
2473
+ "data-[selected]:hover:text-hover",
2474
+ "data-[expanded]:text-hover"
2475
+ ].join(" "),
2476
+ link: [
2477
+ "bg-transparent text-link-primary border-none font-normal px-0 h-auto",
2478
+ "hover:bg-transparent hover:text-link-primary-hover",
2479
+ "disabled:text-text-secondary"
2480
+ ].join(" "),
2481
+ dropdown: [
2482
+ "border-2 border-solid bg-transparent",
2483
+ "text-[var(--color-button-dropdown-fg)] border-[var(--color-button-dropdown-border)]",
2484
+ "hover:bg-transparent hover:text-hover hover:border-hover",
2485
+ "data-[expanded]:bg-transparent data-[expanded]:text-hover data-[expanded]:border-hover",
2486
+ "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent",
2487
+ "data-[selected]:hover:text-hover"
2488
+ ].join(" "),
2489
+ pagination: [
2490
+ "border-2 border-solid bg-transparent",
2491
+ "text-[var(--color-button-pagination-fg)] border-[var(--color-button-pagination-border)]",
2492
+ "hover:bg-transparent hover:text-hover hover:border-hover",
2493
+ "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent"
2494
+ ].join(" ")
2495
+ };
2496
+ var ICON_SIZE_CLASSES = {
2497
+ "2xs": "[&_svg]:size-5",
2498
+ "2xs_alt": "[&_svg]:size-3",
2499
+ md: "[&_svg]:size-5"
2500
+ };
2501
+ var SP2 = 4;
2502
+ var IconButton = React29.forwardRef(
2627
2503
  function IconButton2(props, ref) {
2628
2504
  const {
2629
2505
  size,
@@ -2636,7 +2512,7 @@ var IconButton = React29__default.forwardRef(
2636
2512
  disabled,
2637
2513
  className,
2638
2514
  children,
2639
- as: Comp = "button",
2515
+ as: _as,
2640
2516
  style: styleProp,
2641
2517
  // Strip Chakra style props
2642
2518
  boxSize: _boxSize,
@@ -2649,37 +2525,47 @@ var IconButton = React29__default.forwardRef(
2649
2525
  _expanded,
2650
2526
  ...rest
2651
2527
  } = props;
2652
- const SP = 4;
2653
2528
  const shimStyle = { ...styleProp };
2654
2529
  if (_boxSize !== void 0) {
2655
- const bs = typeof _boxSize === "number" ? `${_boxSize * SP}px` : _boxSize;
2530
+ const bs = typeof _boxSize === "number" ? `${_boxSize * SP2}px` : _boxSize;
2656
2531
  shimStyle.width = bs;
2657
2532
  shimStyle.height = bs;
2658
2533
  }
2659
2534
  if (_color) shimStyle.color = _color;
2660
2535
  if (_px !== void 0) {
2661
- const v = typeof _px === "number" ? `${_px * SP}px` : _px;
2536
+ const v = typeof _px === "number" ? `${_px * SP2}px` : _px;
2662
2537
  shimStyle.paddingLeft = v;
2663
2538
  shimStyle.paddingRight = v;
2664
2539
  }
2665
2540
  if (_borderRadius) shimStyle.borderRadius = _borderRadius;
2666
- if (_ml !== void 0) shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * SP}px` : _ml;
2667
- if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * SP}px` : _mr;
2668
- const mergedBtnStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
2541
+ if (_ml !== void 0) shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * SP2}px` : _ml;
2542
+ if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * SP2}px` : _mr;
2543
+ const mergedStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
2544
+ const variantClass = VARIANT_CLASSES4[variant] ?? VARIANT_CLASSES4.plain;
2545
+ const iconSizeClass = size ? ICON_SIZE_CLASSES[size] ?? "" : "";
2546
+ const combinedClassName = [variantClass, iconSizeClass, className].filter(Boolean).join(" ");
2669
2547
  const button = /* @__PURE__ */ jsx(
2670
- Comp,
2548
+ IconButtonFrame,
2671
2549
  {
2672
2550
  ref,
2673
- type: Comp === "button" ? "button" : void 0,
2674
- disabled: !loadingSkeleton && (loading || disabled),
2675
- className: cn(iconButtonVariants({ variant, size }), className),
2676
- style: mergedBtnStyle,
2551
+ size,
2552
+ disabled: !loadingSkeleton && (loading || disabled) || void 0,
2553
+ render: _as ? React29.createElement(_as) : void 0,
2554
+ className: combinedClassName,
2555
+ style: mergedStyle,
2677
2556
  ...expanded ? { "data-expanded": true } : {},
2678
2557
  ...selected ? { "data-selected": true } : {},
2679
2558
  ...highlighted ? { "data-highlighted": true } : {},
2680
2559
  ...loadingSkeleton ? { "data-loading-skeleton": true } : {},
2681
2560
  ...rest,
2682
- children: loading ? /* @__PURE__ */ jsx("span", { className: "inline-block size-5 animate-spin rounded-full border-2 border-current border-b-transparent border-l-transparent" }) : children
2561
+ children: loading ? /* @__PURE__ */ jsx(
2562
+ "span",
2563
+ {
2564
+ className: "inline-block size-5 animate-spin rounded-full border-2 border-current border-b-transparent border-l-transparent",
2565
+ role: "status",
2566
+ "aria-label": "Loading"
2567
+ }
2568
+ ) : children
2683
2569
  }
2684
2570
  );
2685
2571
  if (loadingSkeleton) {
@@ -2892,46 +2778,36 @@ var Image2 = React29__default.forwardRef(
2892
2778
  ] });
2893
2779
  }
2894
2780
  );
2895
- var inputVariants = cva(
2896
- [
2897
- "w-full appearance-none outline-none transition-colors",
2898
- "bg-[var(--color-input-bg)] text-[var(--color-input-fg)] border-[var(--color-input-border)]",
2899
- "placeholder:text-[var(--color-input-placeholder,theme(colors.gray.400))]",
2900
- "hover:border-[var(--color-input-border-hover,theme(colors.gray.400))]",
2901
- "focus:border-[var(--color-input-border-focus,theme(colors.blue.500))]",
2902
- "focus:placeholder:text-[var(--color-input-placeholder-focus,theme(colors.gray.300))]",
2903
- "disabled:opacity-40 disabled:cursor-not-allowed",
2904
- "read-only:opacity-70",
2905
- "data-[invalid]:border-[var(--color-input-border-invalid,theme(colors.red.500))]"
2906
- ].join(" "),
2907
- {
2908
- variants: {
2909
- size: {
2910
- xs: "h-6 px-2 text-xs rounded",
2911
- sm: "h-8 px-3 text-sm rounded-md",
2912
- md: "h-10 px-4 text-base rounded-md",
2913
- lg: "h-12 px-4 text-lg rounded-lg",
2914
- "2xl": "h-14 px-4 text-xl rounded-lg"
2915
- },
2916
- variant: {
2917
- outline: "border border-solid",
2918
- filled: "border-0 bg-[var(--color-input-filled-bg,theme(colors.gray.100))]",
2919
- unstyled: "border-0 bg-transparent p-0 h-auto"
2920
- }
2921
- },
2922
- defaultVariants: {
2923
- size: "md",
2924
- variant: "outline"
2925
- }
2926
- }
2927
- );
2781
+ var INPUT_BASE = [
2782
+ "w-full appearance-none outline-none transition-colors",
2783
+ "bg-[var(--color-input-bg)] text-[var(--color-input-fg)] border-[var(--color-input-border)]",
2784
+ "placeholder:text-[var(--color-input-placeholder,theme(colors.gray.400))]",
2785
+ "hover:border-[var(--color-input-border-hover,theme(colors.gray.400))]",
2786
+ "focus:border-[var(--color-input-border-focus,theme(colors.blue.500))]",
2787
+ "focus:placeholder:text-[var(--color-input-placeholder-focus,theme(colors.gray.300))]",
2788
+ "disabled:opacity-40 disabled:cursor-not-allowed",
2789
+ "read-only:opacity-70",
2790
+ "data-[invalid]:border-[var(--color-input-border-invalid,theme(colors.red.500))]"
2791
+ ].join(" ");
2792
+ var INPUT_SIZE_CLASSES = {
2793
+ xs: "h-6 px-2 text-xs rounded",
2794
+ sm: "h-8 px-3 text-sm rounded-md",
2795
+ md: "h-10 px-4 text-base rounded-md",
2796
+ lg: "h-12 px-4 text-lg rounded-lg",
2797
+ "2xl": "h-14 px-4 text-xl rounded-lg"
2798
+ };
2799
+ var INPUT_VARIANT_CLASSES = {
2800
+ outline: "border border-solid",
2801
+ filled: "border-0 bg-[var(--color-input-filled-bg,theme(colors.gray.100))]",
2802
+ unstyled: "border-0 bg-transparent p-0 h-auto"
2803
+ };
2928
2804
  var Input = React29__default.forwardRef(
2929
- ({ size, variant, className, ...rest }, ref) => {
2805
+ ({ size = "md", variant = "outline", className, ...rest }, ref) => {
2930
2806
  return /* @__PURE__ */ jsx(
2931
2807
  "input",
2932
2808
  {
2933
2809
  ref,
2934
- className: cn(inputVariants({ size, variant }), className),
2810
+ className: cn(INPUT_BASE, INPUT_SIZE_CLASSES[size], INPUT_VARIANT_CLASSES[variant], className),
2935
2811
  ...rest
2936
2812
  }
2937
2813
  );
@@ -3314,7 +3190,7 @@ var MenuTriggerItem = React29.forwardRef(function MenuTriggerItem2(props, ref) {
3314
3190
  }
3315
3191
  ) });
3316
3192
  });
3317
- var INPUT_BASE = [
3193
+ var INPUT_BASE2 = [
3318
3194
  "w-10 h-10",
3319
3195
  "text-center text-sm font-medium",
3320
3196
  "border-2 rounded-md",
@@ -3445,7 +3321,7 @@ var PinInput = React29.forwardRef(
3445
3321
  "aria-invalid": invalid || void 0,
3446
3322
  value: values[index] || "",
3447
3323
  className: cn(
3448
- INPUT_BASE,
3324
+ INPUT_BASE2,
3449
3325
  values[index] && INPUT_FILLED,
3450
3326
  invalid && INPUT_INVALID,
3451
3327
  attached && index > 0 && "-ml-0.5"
@@ -3495,8 +3371,7 @@ var PopoverRoot = (props) => {
3495
3371
  positioning,
3496
3372
  autoFocus = false,
3497
3373
  closeOnInteractOutside = true,
3498
- modal = false,
3499
- // lazyMount and unmountOnExit are handled via forceMount on Portal/Content
3374
+ // lazyMount and unmountOnExit are handled via keepChildrenMounted
3500
3375
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3501
3376
  lazyMount: _lazyMount,
3502
3377
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -3532,23 +3407,27 @@ var PopoverRoot = (props) => {
3532
3407
  const handleOpenChange = React29.useCallback((isOpen) => {
3533
3408
  onOpenChange?.({ open: isOpen });
3534
3409
  }, [onOpenChange]);
3410
+ const placement = mergedPositioning.placement ?? "bottom-start";
3411
+ const offset = mergedPositioning.offset?.mainAxis ?? 4;
3535
3412
  return /* @__PURE__ */ jsx(PositioningContext2.Provider, { value: positioningValue, children: /* @__PURE__ */ jsx(
3536
- RadixPopover.Root,
3413
+ Popover,
3537
3414
  {
3538
3415
  open,
3539
3416
  defaultOpen,
3540
3417
  onOpenChange: handleOpenChange,
3541
- modal,
3418
+ placement,
3419
+ offset,
3420
+ disableFocus: !autoFocus,
3542
3421
  children
3543
3422
  }
3544
3423
  ) });
3545
3424
  };
3546
3425
  var PopoverTrigger = React29.forwardRef(function PopoverTrigger2(props, ref) {
3547
3426
  const { asChild = true, ...rest } = props;
3548
- return /* @__PURE__ */ jsx(RadixPopover.Trigger, { asChild, ref, ...rest });
3427
+ return /* @__PURE__ */ jsx(Popover.Trigger, { asChild: asChild ? "except-style" : void 0, ref, ...rest });
3549
3428
  });
3550
3429
  var PopoverContent = React29.forwardRef(function PopoverContent2(props, ref) {
3551
- const { portalled = true, portalRef, className, w, minW, maxW, paddingTop, style: styleProp, ...rest } = props;
3430
+ const { portalled = true, portalRef: _portalRef, className, w, minW, maxW, paddingTop, style: styleProp, ...rest } = props;
3552
3431
  const resolvedW = typeof w === "object" ? w.base ?? w.lg : w;
3553
3432
  const contentStyle = {
3554
3433
  ...styleProp,
@@ -3557,20 +3436,11 @@ var PopoverContent = React29.forwardRef(function PopoverContent2(props, ref) {
3557
3436
  ...maxW ? { maxWidth: maxW } : {},
3558
3437
  ...paddingTop !== void 0 ? { paddingTop: typeof paddingTop === "number" ? `${paddingTop * 4}px` : paddingTop } : {}
3559
3438
  };
3560
- const positioning = React29.useContext(PositioningContext2);
3561
- const preventFocus = React29.useCallback((e) => e.preventDefault(), []);
3562
- const preventInteract = React29.useCallback((e) => e.preventDefault(), []);
3563
- const content = /* @__PURE__ */ jsx(
3564
- RadixPopover.Content,
3439
+ return /* @__PURE__ */ jsx(
3440
+ Popover.Content,
3565
3441
  {
3566
3442
  ref,
3567
- side: positioning.side,
3568
- align: positioning.align,
3569
- sideOffset: positioning.sideOffset,
3570
- alignOffset: positioning.alignOffset,
3571
- collisionPadding: positioning.collisionPadding,
3572
- onOpenAutoFocus: positioning.autoFocus ? void 0 : preventFocus,
3573
- onInteractOutside: positioning.closeOnInteractOutside ? void 0 : preventInteract,
3443
+ unstyled: true,
3574
3444
  className: cn(
3575
3445
  "z-50 rounded-lg border border-[var(--color-popover-border,var(--color-border-divider))]",
3576
3446
  "bg-[var(--color-popover-bg,var(--color-dialog-bg))]",
@@ -3586,17 +3456,14 @@ var PopoverContent = React29.forwardRef(function PopoverContent2(props, ref) {
3586
3456
  ...rest
3587
3457
  }
3588
3458
  );
3589
- if (!portalled) {
3590
- return content;
3591
- }
3592
- return /* @__PURE__ */ jsx(RadixPopover.Portal, { container: portalRef?.current ?? void 0, children: content });
3593
3459
  });
3594
3460
  var PopoverArrow = React29.forwardRef(function PopoverArrow2(props, ref) {
3595
3461
  const { className, ...rest } = props;
3596
3462
  return /* @__PURE__ */ jsx(
3597
- RadixPopover.Arrow,
3463
+ Popover.Arrow,
3598
3464
  {
3599
3465
  ref,
3466
+ unstyled: true,
3600
3467
  className: cn("fill-[var(--color-popover-bg,var(--color-dialog-bg))]", className),
3601
3468
  ...rest
3602
3469
  }
@@ -3605,8 +3472,9 @@ var PopoverArrow = React29.forwardRef(function PopoverArrow2(props, ref) {
3605
3472
  var PopoverCloseTrigger = React29.forwardRef(function PopoverCloseTrigger2(props, ref) {
3606
3473
  const { className, ...rest } = props;
3607
3474
  return /* @__PURE__ */ jsx(
3608
- RadixPopover.Close,
3475
+ Popover.Close,
3609
3476
  {
3477
+ unstyled: true,
3610
3478
  className: cn("absolute top-1 right-1", className),
3611
3479
  ...rest,
3612
3480
  asChild: true,
@@ -3620,7 +3488,7 @@ var PopoverCloseTriggerWrapper = React29.forwardRef(function PopoverCloseTrigger
3620
3488
  if (disabled) {
3621
3489
  return children;
3622
3490
  }
3623
- return /* @__PURE__ */ jsx(RadixPopover.Close, { ref, ...rest, asChild: true, children });
3491
+ return /* @__PURE__ */ jsx(Popover.Close, { ref, ...rest, asChild: true, children });
3624
3492
  });
3625
3493
  var PopoverBody = React29.forwardRef(function PopoverBody2(props, ref) {
3626
3494
  const {
@@ -3704,7 +3572,7 @@ var PopoverDescription = React29.forwardRef(function PopoverDescription2(props,
3704
3572
  }
3705
3573
  );
3706
3574
  });
3707
- var SIZE_CLASSES4 = {
3575
+ var SIZE_CLASSES7 = {
3708
3576
  sm: "h-1",
3709
3577
  md: "h-2",
3710
3578
  lg: "h-3",
@@ -3762,7 +3630,7 @@ var Progress = React29.forwardRef(
3762
3630
  className: cn(
3763
3631
  "w-full overflow-hidden rounded-full",
3764
3632
  "bg-[var(--color-progress-track)]",
3765
- SIZE_CLASSES4[size],
3633
+ SIZE_CLASSES7[size],
3766
3634
  trackProps?.className
3767
3635
  ),
3768
3636
  style: trackStyle,
@@ -3901,7 +3769,7 @@ var ProgressCircleValueText = React29.forwardRef(function ProgressCircleValueTex
3901
3769
  }
3902
3770
  );
3903
3771
  });
3904
- var SIZE_CLASSES5 = {
3772
+ var SIZE_CLASSES8 = {
3905
3773
  xs: {
3906
3774
  root: "gap-1.5",
3907
3775
  control: "h-3 w-3",
@@ -3982,7 +3850,7 @@ var RadioBase = React29.forwardRef(
3982
3850
  function Radio(props, ref) {
3983
3851
  const { children, inputProps, rootRef, value, disabled, className, ...rest } = props;
3984
3852
  const size = React29.useContext(RadioSizeContext);
3985
- const sizeClasses2 = SIZE_CLASSES5[size];
3853
+ const sizeClasses2 = SIZE_CLASSES8[size];
3986
3854
  return /* @__PURE__ */ jsxs(
3987
3855
  "label",
3988
3856
  {
@@ -4497,7 +4365,7 @@ var SelectAsync = React29.forwardRef((props, ref) => {
4497
4365
  }
4498
4366
  );
4499
4367
  });
4500
- var VARIANT_CLASSES3 = {
4368
+ var VARIANT_CLASSES5 = {
4501
4369
  solid: "border-solid",
4502
4370
  dashed: "border-dashed",
4503
4371
  dotted: "border-dotted"
@@ -4526,7 +4394,7 @@ var Separator2 = React29__default.forwardRef(
4526
4394
  className: cn(
4527
4395
  "border-[var(--color-border-divider)]",
4528
4396
  "border-0",
4529
- VARIANT_CLASSES3[variant],
4397
+ VARIANT_CLASSES5[variant],
4530
4398
  isVertical ? VERTICAL_SIZE_CLASSES[size] : HORIZONTAL_SIZE_CLASSES[size],
4531
4399
  isVertical ? "self-stretch h-auto w-0" : "w-full",
4532
4400
  className
@@ -4640,7 +4508,7 @@ function SliderMarks(props) {
4640
4508
  }
4641
4509
  var NOOP3 = () => {
4642
4510
  };
4643
- var SIZE_CLASSES6 = {
4511
+ var SIZE_CLASSES9 = {
4644
4512
  sm: {
4645
4513
  root: "h-4 w-7",
4646
4514
  thumb: "h-3 w-3 data-[state=checked]:translate-x-3",
@@ -4690,7 +4558,7 @@ var SwitchBase = React29.forwardRef(
4690
4558
  },
4691
4559
  [isControlled, onCheckedChange]
4692
4560
  );
4693
- const sizeClasses2 = SIZE_CLASSES6[size];
4561
+ const sizeClasses2 = SIZE_CLASSES9[size];
4694
4562
  const isRtl = direction === "rtl";
4695
4563
  return /* @__PURE__ */ jsxs(
4696
4564
  "label",
@@ -4766,11 +4634,11 @@ var SwitchBase = React29.forwardRef(
4766
4634
  );
4767
4635
  var Switch2 = SwitchBase;
4768
4636
  var ArrowIcon3 = ({ className }) => /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx("path", { d: "M5 12h14M12 5l7 7-7 7", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) });
4769
- var SPACING_SCALE2 = 4;
4637
+ var SPACING_SCALE = 4;
4770
4638
  function toPixels(value) {
4771
4639
  if (value === void 0) return void 0;
4772
4640
  if (typeof value === "string") return value;
4773
- return `${value * SPACING_SCALE2}px`;
4641
+ return `${value * SPACING_SCALE}px`;
4774
4642
  }
4775
4643
  function extractStyles(props) {
4776
4644
  const style = {};
@@ -5375,39 +5243,18 @@ var nbsp = String.fromCharCode(160);
5375
5243
  function TruncatedTextTooltip2({ label, children }) {
5376
5244
  return /* @__PURE__ */ jsx(Tooltip, { content: label, positioning: { placement: "top" }, children });
5377
5245
  }
5378
- var tagVariants = cva(
5379
- [
5380
- "inline-flex items-center align-top max-w-full select-text rounded-sm",
5381
- "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500"
5382
- ].join(" "),
5383
- {
5384
- variants: {
5385
- variant: {
5386
- subtle: "bg-[var(--color-tag-subtle-bg)] text-[var(--color-tag-subtle-fg)]",
5387
- clickable: [
5388
- "cursor-pointer",
5389
- "bg-[var(--color-tag-clickable-bg)] text-[var(--color-tag-clickable-fg)]",
5390
- "hover:opacity-76"
5391
- ].join(" "),
5392
- filter: "bg-[var(--color-tag-filter-bg)]",
5393
- select: [
5394
- "cursor-pointer",
5395
- "bg-[var(--color-tag-select-bg)] text-[var(--color-tag-select-fg)]",
5396
- "hover:text-[var(--color-hover)] hover:opacity-76"
5397
- ].join(" ")
5398
- },
5399
- size: {
5400
- sm: "px-1 py-0.5 min-h-5 gap-1 text-xs",
5401
- md: "px-1 py-0.5 min-h-6 gap-1 text-sm",
5402
- lg: "px-1.5 py-1.5 min-h-8 min-w-8 gap-1 text-sm"
5403
- }
5404
- },
5405
- defaultVariants: {
5406
- variant: "subtle",
5407
- size: "md"
5408
- }
5409
- }
5410
- );
5246
+ var TAG_BASE = "inline-flex items-center align-top max-w-full select-text rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500";
5247
+ var TAG_VARIANT_CLASSES = {
5248
+ subtle: "bg-[var(--color-tag-subtle-bg)] text-[var(--color-tag-subtle-fg)]",
5249
+ clickable: "cursor-pointer bg-[var(--color-tag-clickable-bg)] text-[var(--color-tag-clickable-fg)] hover:opacity-76",
5250
+ filter: "bg-[var(--color-tag-filter-bg)]",
5251
+ select: "cursor-pointer bg-[var(--color-tag-select-bg)] text-[var(--color-tag-select-fg)] hover:text-[var(--color-hover)] hover:opacity-76"
5252
+ };
5253
+ var TAG_SIZE_CLASSES = {
5254
+ sm: "px-1 py-0.5 min-h-5 gap-1 text-xs",
5255
+ md: "px-1 py-0.5 min-h-6 gap-1 text-sm",
5256
+ lg: "px-1.5 py-1.5 min-h-8 min-w-8 gap-1 text-sm"
5257
+ };
5411
5258
  var TAG_SELECTED_CLASSES = [
5412
5259
  "bg-[var(--color-tag-select-selected-bg)]",
5413
5260
  "text-[var(--color-tag-select-selected-fg)]",
@@ -5449,7 +5296,9 @@ var Tag = React29.forwardRef(
5449
5296
  {
5450
5297
  ref,
5451
5298
  className: cn(
5452
- tagVariants({ variant, size }),
5299
+ TAG_BASE,
5300
+ TAG_VARIANT_CLASSES[variant ?? "subtle"],
5301
+ TAG_SIZE_CLASSES[size ?? "md"],
5453
5302
  selected && !loading && TAG_SELECTED_CLASSES,
5454
5303
  disabled && TAG_DISABLED_CLASSES,
5455
5304
  className
@@ -5477,46 +5326,36 @@ var Tag = React29.forwardRef(
5477
5326
  ) });
5478
5327
  }
5479
5328
  );
5480
- var textareaVariants = cva(
5481
- [
5482
- "w-full appearance-none outline-none transition-colors resize-y",
5483
- "bg-[var(--color-input-bg)] text-[var(--color-input-fg)] border-[var(--color-input-border)]",
5484
- "placeholder:text-[var(--color-input-placeholder,theme(colors.gray.400))]",
5485
- "hover:border-[var(--color-input-border-hover,theme(colors.gray.400))]",
5486
- "focus:border-[var(--color-input-border-focus,theme(colors.blue.500))]",
5487
- "focus:placeholder:text-[var(--color-input-placeholder-focus,theme(colors.gray.300))]",
5488
- "disabled:opacity-40 disabled:cursor-not-allowed",
5489
- "read-only:opacity-70",
5490
- "data-[invalid]:border-[var(--color-input-border-invalid,theme(colors.red.500))]"
5491
- ].join(" "),
5492
- {
5493
- variants: {
5494
- size: {
5495
- xs: "px-2 py-1 text-xs rounded",
5496
- sm: "px-3 py-2 text-sm rounded-md",
5497
- md: "px-4 py-2 text-base rounded-md",
5498
- lg: "px-4 py-3 text-lg rounded-lg",
5499
- "2xl": "px-4 py-3 text-xl rounded-lg"
5500
- },
5501
- variant: {
5502
- outline: "border border-solid",
5503
- filled: "border-0 bg-[var(--color-input-filled-bg,theme(colors.gray.100))]",
5504
- unstyled: "border-0 bg-transparent p-0"
5505
- }
5506
- },
5507
- defaultVariants: {
5508
- size: "md",
5509
- variant: "outline"
5510
- }
5511
- }
5512
- );
5329
+ var TEXTAREA_BASE = [
5330
+ "w-full appearance-none outline-none transition-colors resize-y",
5331
+ "bg-[var(--color-input-bg)] text-[var(--color-input-fg)] border-[var(--color-input-border)]",
5332
+ "placeholder:text-[var(--color-input-placeholder,theme(colors.gray.400))]",
5333
+ "hover:border-[var(--color-input-border-hover,theme(colors.gray.400))]",
5334
+ "focus:border-[var(--color-input-border-focus,theme(colors.blue.500))]",
5335
+ "focus:placeholder:text-[var(--color-input-placeholder-focus,theme(colors.gray.300))]",
5336
+ "disabled:opacity-40 disabled:cursor-not-allowed",
5337
+ "read-only:opacity-70",
5338
+ "data-[invalid]:border-[var(--color-input-border-invalid,theme(colors.red.500))]"
5339
+ ].join(" ");
5340
+ var TEXTAREA_SIZE_CLASSES = {
5341
+ xs: "px-2 py-1 text-xs rounded",
5342
+ sm: "px-3 py-2 text-sm rounded-md",
5343
+ md: "px-4 py-2 text-base rounded-md",
5344
+ lg: "px-4 py-3 text-lg rounded-lg",
5345
+ "2xl": "px-4 py-3 text-xl rounded-lg"
5346
+ };
5347
+ var TEXTAREA_VARIANT_CLASSES = {
5348
+ outline: "border border-solid",
5349
+ filled: "border-0 bg-[var(--color-input-filled-bg,theme(colors.gray.100))]",
5350
+ unstyled: "border-0 bg-transparent p-0"
5351
+ };
5513
5352
  var Textarea = React29__default.forwardRef(
5514
- ({ size, variant, className, ...rest }, ref) => {
5353
+ ({ size = "md", variant = "outline", className, ...rest }, ref) => {
5515
5354
  return /* @__PURE__ */ jsx(
5516
5355
  "textarea",
5517
5356
  {
5518
5357
  ref,
5519
- className: cn(textareaVariants({ size, variant }), className),
5358
+ className: cn(TEXTAREA_BASE, TEXTAREA_SIZE_CLASSES[size], TEXTAREA_VARIANT_CLASSES[variant], className),
5520
5359
  ...rest
5521
5360
  }
5522
5361
  );
@@ -5613,7 +5452,7 @@ var Toaster = () => {
5613
5452
  }
5614
5453
  );
5615
5454
  };
5616
- function Provider2(props) {
5455
+ function Provider(props) {
5617
5456
  return /* @__PURE__ */ jsx(ColorModeProvider, { ...props });
5618
5457
  }
5619
5458
  function fmt(n, decimals = 2) {
@@ -7134,4 +6973,4 @@ var BankPage = styled(View, {
7134
6973
  padding: 16
7135
6974
  });
7136
6975
 
7137
- export { AccordionItem, AccordionItemContent, AccordionItemTrigger, AccordionRoot, Alert, Avatar, AvatarGroup, Badge, BankAlert, BankAlertText, BankButton, BankButtonText, BankCard, BankDivider, BankField, BankHeading, BankInput, BankPage, BankPinBox, BankText, Button, ButtonGroup, ButtonGroupRadio, Checkbox2 as Checkbox, CheckboxGroup2 as CheckboxGroup, CloseButton, CollapsibleDetails, CollapsibleList, ColorModeProvider, DialogActionTrigger, DialogBackdrop, DialogBody, DialogCloseTrigger, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogRoot, DialogTitle, DialogTrigger, DrawerActionTrigger, DrawerBody, DrawerCloseTrigger, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerRoot, DrawerTitle, DrawerTrigger, EmptyState, ExpirationSelector, Field, GreeksDisplay, Heading, IconButton, Image2 as Image, Input, InputGroup, Link, LinkBox, LinkExternalIcon, LinkOverlay, MenuArrow, MenuCheckboxItem, MenuContent, MenuItem, MenuItemGroup, MenuItemText, MenuRadioItem, MenuRadioItemGroup, MenuRoot, MenuSeparator, MenuTrigger, MenuTriggerItem, OptionChain, OptionPositionCard, PinInput, PnlDiagram, PopoverArrow, PopoverBody, PopoverCloseTrigger, PopoverCloseTriggerWrapper, PopoverContent, PopoverDescription, PopoverFooter, PopoverHeader, PopoverRoot, PopoverTitle, PopoverTrigger, Progress, ProgressCircleRing, ProgressCircleRoot, ProgressCircleValueText, Provider2 as Provider, Radio2 as Radio, RadioGroup3 as RadioGroup, Rating, Select, SelectAsync, SelectClearTrigger, SelectContent, SelectControl, SelectItem, SelectItemGroup, SelectItemText, SelectLabel, SelectRoot, SelectValueText, Separator2 as Separator, Skeleton, SkeletonCircle, SkeletonText, Slider, StrategyBuilder, Switch2 as Switch, TableBody, TableCaption, TableCell, TableColumnHeader, TableColumnHeaderSortable, TableFooter, TableHeader, TableHeaderSticky, TableRoot, TableRow, TableScrollWrapper, TabsContent, TabsCounter, TabsList, TabsRoot, TabsTrigger, Tag, Textarea, Toaster, Tooltip, bankColors, buttonVariants, cn, createListCollection, toaster, useAccordion, useColorMode, useColorModeValue };
6976
+ export { AccordionItem, AccordionItemContent, AccordionItemTrigger, AccordionRoot, Alert, Avatar, AvatarGroup, Badge, BankAlert, BankAlertText, BankButton, BankButtonText, BankCard, BankDivider, BankField, BankHeading, BankInput, BankPage, BankPinBox, BankText, Button, ButtonGroup, ButtonGroupRadio, Checkbox2 as Checkbox, CheckboxGroup2 as CheckboxGroup, CloseButton, CollapsibleDetails, CollapsibleList, ColorModeProvider, DialogActionTrigger, DialogBackdrop, DialogBody, DialogCloseTrigger, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogRoot, DialogTitle, DialogTrigger, DrawerActionTrigger, DrawerBody, DrawerCloseTrigger, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerRoot, DrawerTitle, DrawerTrigger, EmptyState, ExpirationSelector, Field, GreeksDisplay, Heading, IconButton, Image2 as Image, Input, InputGroup, Link, LinkBox, LinkExternalIcon, LinkOverlay, MenuArrow, MenuCheckboxItem, MenuContent, MenuItem, MenuItemGroup, MenuItemText, MenuRadioItem, MenuRadioItemGroup, MenuRoot, MenuSeparator, MenuTrigger, MenuTriggerItem, OptionChain, OptionPositionCard, PinInput, PnlDiagram, PopoverArrow, PopoverBody, PopoverCloseTrigger, PopoverCloseTriggerWrapper, PopoverContent, PopoverDescription, PopoverFooter, PopoverHeader, PopoverRoot, PopoverTitle, PopoverTrigger, Progress, ProgressCircleRing, ProgressCircleRoot, ProgressCircleValueText, Provider, Radio2 as Radio, RadioGroup3 as RadioGroup, Rating, Select, SelectAsync, SelectClearTrigger, SelectContent, SelectControl, SelectItem, SelectItemGroup, SelectItemText, SelectLabel, SelectRoot, SelectValueText, Separator2 as Separator, Skeleton, SkeletonCircle, SkeletonText, Slider, StrategyBuilder, Switch2 as Switch, TableBody, TableCaption, TableCell, TableColumnHeader, TableColumnHeaderSortable, TableFooter, TableHeader, TableHeaderSticky, TableRoot, TableRow, TableScrollWrapper, TabsContent, TabsCounter, TabsList, TabsRoot, TabsTrigger, Tag, Textarea, Toaster, Tooltip, bankColors, buttonVariants, cn, createListCollection, toaster, useAccordion, useColorMode, useColorModeValue };