@luxfi/ui 7.4.10 → 7.4.12

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 (137) hide show
  1. package/dist/accordion.cjs +107 -166
  2. package/dist/accordion.d.cts +18 -51
  3. package/dist/accordion.d.ts +18 -51
  4. package/dist/accordion.js +109 -166
  5. package/dist/alert.cjs +68 -46
  6. package/dist/alert.js +69 -46
  7. package/dist/avatar.cjs +49 -46
  8. package/dist/avatar.js +52 -48
  9. package/dist/badge.cjs +82 -49
  10. package/dist/badge.js +83 -50
  11. package/dist/checkbox.cjs +42 -75
  12. package/dist/checkbox.js +43 -76
  13. package/dist/chrome.cjs +196 -386
  14. package/dist/chrome.js +198 -386
  15. package/dist/close-button.cjs +3 -7
  16. package/dist/close-button.js +3 -7
  17. package/dist/collapsible.cjs +35 -26
  18. package/dist/collapsible.d.cts +2 -1
  19. package/dist/collapsible.d.ts +2 -1
  20. package/dist/collapsible.js +34 -24
  21. package/dist/dialog.cjs +3 -7
  22. package/dist/dialog.d.cts +1 -1
  23. package/dist/dialog.d.ts +1 -1
  24. package/dist/dialog.js +3 -7
  25. package/dist/drawer.cjs +95 -122
  26. package/dist/drawer.d.cts +43 -10
  27. package/dist/drawer.d.ts +43 -10
  28. package/dist/drawer.js +97 -122
  29. package/dist/empty-state.cjs +13 -13
  30. package/dist/empty-state.js +13 -13
  31. package/dist/expiration-selector.cjs +58 -63
  32. package/dist/expiration-selector.js +58 -63
  33. package/dist/field.cjs +60 -109
  34. package/dist/field.d.cts +0 -1
  35. package/dist/field.d.ts +0 -1
  36. package/dist/field.js +61 -109
  37. package/dist/greeks-display.cjs +48 -39
  38. package/dist/greeks-display.js +48 -39
  39. package/dist/heading.cjs +10 -17
  40. package/dist/heading.d.cts +0 -2
  41. package/dist/heading.d.ts +0 -2
  42. package/dist/heading.js +10 -17
  43. package/dist/icon-button.cjs +82 -82
  44. package/dist/icon-button.d.cts +16 -12
  45. package/dist/icon-button.d.ts +16 -12
  46. package/dist/icon-button.js +82 -82
  47. package/dist/index.cjs +1812 -2105
  48. package/dist/index.d.cts +1 -5
  49. package/dist/index.d.ts +1 -5
  50. package/dist/index.js +1814 -2100
  51. package/dist/input-group.cjs +11 -12
  52. package/dist/input-group.js +11 -12
  53. package/dist/input.cjs +27 -27
  54. package/dist/input.d.cts +21 -1
  55. package/dist/input.d.ts +21 -1
  56. package/dist/input.js +25 -28
  57. package/dist/menu.cjs +160 -271
  58. package/dist/menu.d.cts +41 -57
  59. package/dist/menu.d.ts +41 -57
  60. package/dist/menu.js +161 -251
  61. package/dist/option-chain.cjs +89 -67
  62. package/dist/option-chain.js +89 -67
  63. package/dist/option-position.cjs +88 -85
  64. package/dist/option-position.js +88 -85
  65. package/dist/pnl-diagram.cjs +20 -20
  66. package/dist/pnl-diagram.js +20 -20
  67. package/dist/popover.cjs +4 -8
  68. package/dist/popover.js +4 -8
  69. package/dist/progress.cjs +15 -22
  70. package/dist/progress.d.cts +6 -6
  71. package/dist/progress.d.ts +6 -6
  72. package/dist/progress.js +15 -22
  73. package/dist/radio.cjs +35 -67
  74. package/dist/radio.d.cts +18 -18
  75. package/dist/radio.d.ts +18 -18
  76. package/dist/radio.js +36 -68
  77. package/dist/select.cjs +40 -39
  78. package/dist/select.d.cts +35 -4
  79. package/dist/select.d.ts +35 -4
  80. package/dist/select.js +40 -38
  81. package/dist/separator.cjs +8 -33
  82. package/dist/separator.js +8 -33
  83. package/dist/slider.cjs +33 -49
  84. package/dist/slider.js +34 -50
  85. package/dist/switch.cjs +48 -55
  86. package/dist/switch.js +49 -56
  87. package/dist/tabs.cjs +108 -197
  88. package/dist/tabs.d.cts +16 -60
  89. package/dist/tabs.d.ts +16 -60
  90. package/dist/tabs.js +109 -196
  91. package/dist/tag.cjs +112 -69
  92. package/dist/tag.js +113 -69
  93. package/dist/textarea.cjs +56 -27
  94. package/dist/textarea.js +57 -28
  95. package/dist/toaster.cjs +97 -79
  96. package/dist/toaster.d.cts +7 -8
  97. package/dist/toaster.d.ts +7 -8
  98. package/dist/toaster.js +78 -80
  99. package/dist/tooltip.cjs +28 -17
  100. package/dist/tooltip.js +30 -18
  101. package/package.json +2 -16
  102. package/src/accordion.tsx +173 -227
  103. package/src/alert.tsx +78 -45
  104. package/src/avatar.tsx +54 -37
  105. package/src/badge.tsx +65 -44
  106. package/src/checkbox.tsx +70 -89
  107. package/src/close-button.tsx +3 -8
  108. package/src/collapsible.tsx +55 -52
  109. package/src/drawer.tsx +123 -115
  110. package/src/empty-state.tsx +21 -17
  111. package/src/expiration-selector.tsx +84 -66
  112. package/src/field.tsx +68 -124
  113. package/src/greeks-display.tsx +59 -51
  114. package/src/heading.tsx +22 -26
  115. package/src/icon-button.tsx +134 -141
  116. package/src/ink.tsx +37 -0
  117. package/src/input-group.tsx +59 -36
  118. package/src/input.tsx +41 -32
  119. package/src/menu.tsx +224 -397
  120. package/src/option-chain.tsx +154 -104
  121. package/src/option-position.tsx +136 -114
  122. package/src/pin-input.tsx +37 -29
  123. package/src/pnl-diagram.tsx +36 -28
  124. package/src/popover.tsx +1 -1
  125. package/src/progress.tsx +17 -21
  126. package/src/radio.tsx +56 -75
  127. package/src/select.tsx +80 -59
  128. package/src/separator.tsx +13 -34
  129. package/src/slider.tsx +43 -44
  130. package/src/strategy-builder.tsx +245 -156
  131. package/src/switch.tsx +63 -64
  132. package/src/tabs.tsx +166 -296
  133. package/src/tag.tsx +89 -51
  134. package/src/textarea.tsx +19 -29
  135. package/src/toaster.tsx +118 -86
  136. package/src/tooltip.tsx +21 -13
  137. package/tokens.css +79 -0
package/dist/badge.cjs CHANGED
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
+ var gui = require('@hanzo/gui');
4
5
  var React3 = require('react');
5
6
  var clsx = require('clsx');
6
7
  var tailwindMerge = require('tailwind-merge');
7
8
  var jsxRuntime = require('react/jsx-runtime');
8
- var gui = require('@hanzo/gui');
9
9
  var usehooks = require('@uidotdev/usehooks');
10
10
 
11
11
  function _interopNamespace(e) {
@@ -215,6 +215,14 @@ React3__namespace.forwardRef(
215
215
  )) });
216
216
  }
217
217
  );
218
+ var ink = (children, Wrap = gui.Text, props = {}) => {
219
+ let hasText = false;
220
+ React3.Children.forEach(children, (child) => {
221
+ if (typeof child === "string" || typeof child === "number") hasText = true;
222
+ });
223
+ if (!hasText) return children;
224
+ return React3.Children.map(children, (child) => typeof child === "string" || typeof child === "number" ? React3.createElement(Wrap, props, child) : child);
225
+ };
218
226
  var TOUCH_PX = 1024;
219
227
  function useBelow(px) {
220
228
  const [below, setBelow] = React3__namespace.useState(false);
@@ -319,14 +327,21 @@ var Tooltip = React3__namespace.forwardRef(
319
327
  {
320
328
  ref,
321
329
  unstyled: true,
322
- className: cn(
323
- "z-[9999] overflow-hidden rounded-lg px-3 py-2 text-sm",
324
- "animate-in fade-in-0 zoom-in-95",
325
- isPopover && "bg-[var(--color-popover-bg)] text-[var(--color-text-primary)]",
326
- isPopover && "shadow-[var(--shadow-popover)] border border-[var(--color-border-divider)] max-w-sm",
327
- !isPopover && "bg-[var(--color-tooltip-bg)] text-[var(--color-tooltip-fg)] max-w-xs",
328
- contentProps?.className
329
- ),
330
+ zIndex: 9999,
331
+ overflow: "hidden",
332
+ borderRadius: 8,
333
+ paddingHorizontal: 12,
334
+ paddingVertical: 8,
335
+ maxWidth: isPopover ? 384 : 320,
336
+ backgroundColor: isPopover ? "var(--color-popover-bg)" : "var(--color-tooltip-bg)",
337
+ transition: "quick",
338
+ enterStyle: { opacity: 0, scale: 0.95 },
339
+ exitStyle: { opacity: 0, scale: 0.95 },
340
+ ...isPopover ? {
341
+ borderWidth: 1,
342
+ borderColor: "var(--color-border-divider)",
343
+ shadowColor: "var(--shadow-popover)"
344
+ } : {},
330
345
  onClick: interactive ? handleContentClick : void 0,
331
346
  ...selected ? { "data-selected": true } : {},
332
347
  ...contentProps,
@@ -335,12 +350,13 @@ var Tooltip = React3__namespace.forwardRef(
335
350
  gui.Tooltip.Arrow,
336
351
  {
337
352
  unstyled: true,
338
- className: cn(
339
- isPopover ? "fill-[var(--color-popover-bg)]" : "fill-[var(--color-tooltip-bg)]"
340
- )
353
+ backgroundColor: isPopover ? "var(--color-popover-bg)" : "var(--color-tooltip-bg)"
341
354
  }
342
355
  ),
343
- content
356
+ ink(content, void 0, {
357
+ fontSize: 14,
358
+ color: isPopover ? "var(--color-text-primary)" : "var(--color-tooltip-fg)"
359
+ })
344
360
  ]
345
361
  }
346
362
  )
@@ -352,35 +368,39 @@ var Tooltip = React3__namespace.forwardRef(
352
368
  function TruncatedTextTooltip({ label, children }) {
353
369
  return /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { content: label, positioning: { placement: "top" }, children });
354
370
  }
355
- var BASE_CLASSES = "inline-flex items-center rounded-sm gap-1 font-medium w-fit max-w-full whitespace-nowrap select-text";
356
- var SIZE_CLASSES = {
357
- sm: "text-xs p-1 h-[18px] min-h-[18px]",
358
- md: "text-sm px-1 py-0.5 min-h-6",
359
- lg: "text-sm px-2 py-1 min-h-7 font-semibold"
371
+ var SIZE = {
372
+ sm: { padding: 4, height: 18, minHeight: 18 },
373
+ md: { paddingHorizontal: 4, paddingVertical: 2, minHeight: 24 },
374
+ lg: { paddingHorizontal: 8, paddingVertical: 4, minHeight: 28 }
375
+ };
376
+ var SIZE_TEXT = {
377
+ sm: { fontSize: 12, fontWeight: "500" },
378
+ md: { fontSize: 14, fontWeight: "500" },
379
+ lg: { fontSize: 14, fontWeight: "600" }
360
380
  };
361
- var COLOR_PALETTE_CLASSES = {
362
- gray: "bg-badge-gray-bg text-badge-gray-fg",
363
- green: "bg-badge-green-bg text-badge-green-fg",
364
- red: "bg-badge-red-bg text-badge-red-fg",
365
- purple: "bg-badge-purple-bg text-badge-purple-fg",
366
- orange: "bg-badge-orange-bg text-badge-orange-fg",
367
- blue: "bg-badge-blue-bg text-badge-blue-fg",
368
- yellow: "bg-badge-yellow-bg text-badge-yellow-fg",
369
- teal: "bg-badge-teal-bg text-badge-teal-fg",
370
- cyan: "bg-badge-cyan-bg text-badge-cyan-fg",
371
- pink: "bg-badge-pink-bg text-badge-pink-fg",
372
- purple_alt: "bg-badge-purple-alt-bg text-badge-purple-alt-fg",
373
- blue_alt: "bg-badge-blue-alt-bg text-badge-blue-alt-fg",
374
- bright_gray: "bg-badge-bright-gray-bg text-badge-bright-gray-fg",
375
- bright_green: "bg-badge-bright-green-bg text-badge-bright-green-fg",
376
- bright_red: "bg-badge-bright-red-bg text-badge-bright-red-fg",
377
- bright_blue: "bg-badge-bright-blue-bg text-badge-bright-blue-fg",
378
- bright_yellow: "bg-badge-bright-yellow-bg text-badge-bright-yellow-fg",
379
- bright_teal: "bg-badge-bright-teal-bg text-badge-bright-teal-fg",
380
- bright_cyan: "bg-badge-bright-cyan-bg text-badge-bright-cyan-fg",
381
- bright_orange: "bg-badge-bright-orange-bg text-badge-bright-orange-fg",
382
- bright_purple: "bg-badge-bright-purple-bg text-badge-bright-purple-fg",
383
- bright_pink: "bg-badge-bright-pink-bg text-badge-bright-pink-fg"
381
+ var COLOR_PALETTE = {
382
+ gray: { bg: "var(--color-badge-gray-bg)", fg: "var(--color-badge-gray-fg)" },
383
+ green: { bg: "var(--color-badge-green-bg)", fg: "var(--color-badge-green-fg)" },
384
+ red: { bg: "var(--color-badge-red-bg)", fg: "var(--color-badge-red-fg)" },
385
+ purple: { bg: "var(--color-badge-purple-bg)", fg: "var(--color-badge-purple-fg)" },
386
+ orange: { bg: "var(--color-badge-orange-bg)", fg: "var(--color-badge-orange-fg)" },
387
+ blue: { bg: "var(--color-badge-blue-bg)", fg: "var(--color-badge-blue-fg)" },
388
+ yellow: { bg: "var(--color-badge-yellow-bg)", fg: "var(--color-badge-yellow-fg)" },
389
+ teal: { bg: "var(--color-badge-teal-bg)", fg: "var(--color-badge-teal-fg)" },
390
+ cyan: { bg: "var(--color-badge-cyan-bg)", fg: "var(--color-badge-cyan-fg)" },
391
+ pink: { bg: "var(--color-badge-pink-bg)", fg: "var(--color-badge-pink-fg)" },
392
+ purple_alt: { bg: "var(--color-badge-purple-alt-bg)", fg: "var(--color-badge-purple-alt-fg)" },
393
+ blue_alt: { bg: "var(--color-badge-blue-alt-bg)", fg: "var(--color-badge-blue-alt-fg)" },
394
+ bright_gray: { bg: "var(--color-badge-bright-gray-bg)", fg: "var(--color-badge-bright-gray-fg)" },
395
+ bright_green: { bg: "var(--color-badge-bright-green-bg)", fg: "var(--color-badge-bright-green-fg)" },
396
+ bright_red: { bg: "var(--color-badge-bright-red-bg)", fg: "var(--color-badge-bright-red-fg)" },
397
+ bright_blue: { bg: "var(--color-badge-bright-blue-bg)", fg: "var(--color-badge-bright-blue-fg)" },
398
+ bright_yellow: { bg: "var(--color-badge-bright-yellow-bg)", fg: "var(--color-badge-bright-yellow-fg)" },
399
+ bright_teal: { bg: "var(--color-badge-bright-teal-bg)", fg: "var(--color-badge-bright-teal-fg)" },
400
+ bright_cyan: { bg: "var(--color-badge-bright-cyan-bg)", fg: "var(--color-badge-bright-cyan-fg)" },
401
+ bright_orange: { bg: "var(--color-badge-bright-orange-bg)", fg: "var(--color-badge-bright-orange-fg)" },
402
+ bright_purple: { bg: "var(--color-badge-bright-purple-bg)", fg: "var(--color-badge-bright-purple-fg)" },
403
+ bright_pink: { bg: "var(--color-badge-bright-pink-bg)", fg: "var(--color-badge-bright-pink-fg)" }
384
404
  };
385
405
  var S2 = 4;
386
406
  var Badge = React3__namespace.default.forwardRef(
@@ -415,18 +435,31 @@ var Badge = React3__namespace.default.forwardRef(
415
435
  }
416
436
  if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * S2}px` : _mr;
417
437
  const badgeStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
418
- const child = children ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "overflow-hidden text-ellipsis", children }) : null;
438
+ const palette = COLOR_PALETTE[colorPalette];
439
+ const child = children ? (
440
+ // `ellipsis` is gui Text's own built-in variant for single-line
441
+ // truncation — it expands to the same overflow/text-overflow/
442
+ // white-space/max-width rule Tailwind's `text-ellipsis` did, but
443
+ // through the component's own variants (guaranteed to compile),
444
+ // rather than naming each longhand as a separate style prop.
445
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { ellipsis: true, ...SIZE_TEXT[size], color: palette.fg, children })
446
+ ) : null;
419
447
  const childrenElement = truncated ? /* @__PURE__ */ jsxRuntime.jsx(TruncatedTextTooltip, { label: children, children: child }) : child;
420
448
  const badgeElement = /* @__PURE__ */ jsxRuntime.jsxs(
421
- "span",
449
+ gui.XStack,
422
450
  {
423
451
  ref,
424
- className: cn(
425
- BASE_CLASSES,
426
- SIZE_CLASSES[size],
427
- COLOR_PALETTE_CLASSES[colorPalette],
428
- className
429
- ),
452
+ render: /* @__PURE__ */ jsxRuntime.jsx("span", {}),
453
+ display: "inline-flex",
454
+ alignItems: "center",
455
+ alignSelf: "flex-start",
456
+ borderRadius: 2,
457
+ gap: 4,
458
+ maxWidth: "100%",
459
+ userSelect: "text",
460
+ ...SIZE[size],
461
+ backgroundColor: palette.bg,
462
+ className,
430
463
  style: badgeStyle,
431
464
  ...rest,
432
465
  children: [
package/dist/badge.js CHANGED
@@ -1,10 +1,10 @@
1
1
  "use client";
2
+ import { TooltipGroup, Tooltip as Tooltip$1, Text, XStack } from '@hanzo/gui';
2
3
  import * as React3 from 'react';
3
- import React3__default from 'react';
4
+ import React3__default, { Children, createElement } from 'react';
4
5
  import { clsx } from 'clsx';
5
6
  import { twMerge } from 'tailwind-merge';
6
7
  import { jsx, jsxs } from 'react/jsx-runtime';
7
- import { TooltipGroup, Tooltip as Tooltip$1 } from '@hanzo/gui';
8
8
  import { useClickAway } from '@uidotdev/usehooks';
9
9
 
10
10
  // src/badge.tsx
@@ -194,6 +194,14 @@ React3.forwardRef(
194
194
  )) });
195
195
  }
196
196
  );
197
+ var ink = (children, Wrap = Text, props = {}) => {
198
+ let hasText = false;
199
+ Children.forEach(children, (child) => {
200
+ if (typeof child === "string" || typeof child === "number") hasText = true;
201
+ });
202
+ if (!hasText) return children;
203
+ return Children.map(children, (child) => typeof child === "string" || typeof child === "number" ? createElement(Wrap, props, child) : child);
204
+ };
197
205
  var TOUCH_PX = 1024;
198
206
  function useBelow(px) {
199
207
  const [below, setBelow] = React3.useState(false);
@@ -298,14 +306,21 @@ var Tooltip = React3.forwardRef(
298
306
  {
299
307
  ref,
300
308
  unstyled: true,
301
- className: cn(
302
- "z-[9999] overflow-hidden rounded-lg px-3 py-2 text-sm",
303
- "animate-in fade-in-0 zoom-in-95",
304
- isPopover && "bg-[var(--color-popover-bg)] text-[var(--color-text-primary)]",
305
- isPopover && "shadow-[var(--shadow-popover)] border border-[var(--color-border-divider)] max-w-sm",
306
- !isPopover && "bg-[var(--color-tooltip-bg)] text-[var(--color-tooltip-fg)] max-w-xs",
307
- contentProps?.className
308
- ),
309
+ zIndex: 9999,
310
+ overflow: "hidden",
311
+ borderRadius: 8,
312
+ paddingHorizontal: 12,
313
+ paddingVertical: 8,
314
+ maxWidth: isPopover ? 384 : 320,
315
+ backgroundColor: isPopover ? "var(--color-popover-bg)" : "var(--color-tooltip-bg)",
316
+ transition: "quick",
317
+ enterStyle: { opacity: 0, scale: 0.95 },
318
+ exitStyle: { opacity: 0, scale: 0.95 },
319
+ ...isPopover ? {
320
+ borderWidth: 1,
321
+ borderColor: "var(--color-border-divider)",
322
+ shadowColor: "var(--shadow-popover)"
323
+ } : {},
309
324
  onClick: interactive ? handleContentClick : void 0,
310
325
  ...selected ? { "data-selected": true } : {},
311
326
  ...contentProps,
@@ -314,12 +329,13 @@ var Tooltip = React3.forwardRef(
314
329
  Tooltip$1.Arrow,
315
330
  {
316
331
  unstyled: true,
317
- className: cn(
318
- isPopover ? "fill-[var(--color-popover-bg)]" : "fill-[var(--color-tooltip-bg)]"
319
- )
332
+ backgroundColor: isPopover ? "var(--color-popover-bg)" : "var(--color-tooltip-bg)"
320
333
  }
321
334
  ),
322
- content
335
+ ink(content, void 0, {
336
+ fontSize: 14,
337
+ color: isPopover ? "var(--color-text-primary)" : "var(--color-tooltip-fg)"
338
+ })
323
339
  ]
324
340
  }
325
341
  )
@@ -331,35 +347,39 @@ var Tooltip = React3.forwardRef(
331
347
  function TruncatedTextTooltip({ label, children }) {
332
348
  return /* @__PURE__ */ jsx(Tooltip, { content: label, positioning: { placement: "top" }, children });
333
349
  }
334
- var BASE_CLASSES = "inline-flex items-center rounded-sm gap-1 font-medium w-fit max-w-full whitespace-nowrap select-text";
335
- var SIZE_CLASSES = {
336
- sm: "text-xs p-1 h-[18px] min-h-[18px]",
337
- md: "text-sm px-1 py-0.5 min-h-6",
338
- lg: "text-sm px-2 py-1 min-h-7 font-semibold"
350
+ var SIZE = {
351
+ sm: { padding: 4, height: 18, minHeight: 18 },
352
+ md: { paddingHorizontal: 4, paddingVertical: 2, minHeight: 24 },
353
+ lg: { paddingHorizontal: 8, paddingVertical: 4, minHeight: 28 }
354
+ };
355
+ var SIZE_TEXT = {
356
+ sm: { fontSize: 12, fontWeight: "500" },
357
+ md: { fontSize: 14, fontWeight: "500" },
358
+ lg: { fontSize: 14, fontWeight: "600" }
339
359
  };
340
- var COLOR_PALETTE_CLASSES = {
341
- gray: "bg-badge-gray-bg text-badge-gray-fg",
342
- green: "bg-badge-green-bg text-badge-green-fg",
343
- red: "bg-badge-red-bg text-badge-red-fg",
344
- purple: "bg-badge-purple-bg text-badge-purple-fg",
345
- orange: "bg-badge-orange-bg text-badge-orange-fg",
346
- blue: "bg-badge-blue-bg text-badge-blue-fg",
347
- yellow: "bg-badge-yellow-bg text-badge-yellow-fg",
348
- teal: "bg-badge-teal-bg text-badge-teal-fg",
349
- cyan: "bg-badge-cyan-bg text-badge-cyan-fg",
350
- pink: "bg-badge-pink-bg text-badge-pink-fg",
351
- purple_alt: "bg-badge-purple-alt-bg text-badge-purple-alt-fg",
352
- blue_alt: "bg-badge-blue-alt-bg text-badge-blue-alt-fg",
353
- bright_gray: "bg-badge-bright-gray-bg text-badge-bright-gray-fg",
354
- bright_green: "bg-badge-bright-green-bg text-badge-bright-green-fg",
355
- bright_red: "bg-badge-bright-red-bg text-badge-bright-red-fg",
356
- bright_blue: "bg-badge-bright-blue-bg text-badge-bright-blue-fg",
357
- bright_yellow: "bg-badge-bright-yellow-bg text-badge-bright-yellow-fg",
358
- bright_teal: "bg-badge-bright-teal-bg text-badge-bright-teal-fg",
359
- bright_cyan: "bg-badge-bright-cyan-bg text-badge-bright-cyan-fg",
360
- bright_orange: "bg-badge-bright-orange-bg text-badge-bright-orange-fg",
361
- bright_purple: "bg-badge-bright-purple-bg text-badge-bright-purple-fg",
362
- bright_pink: "bg-badge-bright-pink-bg text-badge-bright-pink-fg"
360
+ var COLOR_PALETTE = {
361
+ gray: { bg: "var(--color-badge-gray-bg)", fg: "var(--color-badge-gray-fg)" },
362
+ green: { bg: "var(--color-badge-green-bg)", fg: "var(--color-badge-green-fg)" },
363
+ red: { bg: "var(--color-badge-red-bg)", fg: "var(--color-badge-red-fg)" },
364
+ purple: { bg: "var(--color-badge-purple-bg)", fg: "var(--color-badge-purple-fg)" },
365
+ orange: { bg: "var(--color-badge-orange-bg)", fg: "var(--color-badge-orange-fg)" },
366
+ blue: { bg: "var(--color-badge-blue-bg)", fg: "var(--color-badge-blue-fg)" },
367
+ yellow: { bg: "var(--color-badge-yellow-bg)", fg: "var(--color-badge-yellow-fg)" },
368
+ teal: { bg: "var(--color-badge-teal-bg)", fg: "var(--color-badge-teal-fg)" },
369
+ cyan: { bg: "var(--color-badge-cyan-bg)", fg: "var(--color-badge-cyan-fg)" },
370
+ pink: { bg: "var(--color-badge-pink-bg)", fg: "var(--color-badge-pink-fg)" },
371
+ purple_alt: { bg: "var(--color-badge-purple-alt-bg)", fg: "var(--color-badge-purple-alt-fg)" },
372
+ blue_alt: { bg: "var(--color-badge-blue-alt-bg)", fg: "var(--color-badge-blue-alt-fg)" },
373
+ bright_gray: { bg: "var(--color-badge-bright-gray-bg)", fg: "var(--color-badge-bright-gray-fg)" },
374
+ bright_green: { bg: "var(--color-badge-bright-green-bg)", fg: "var(--color-badge-bright-green-fg)" },
375
+ bright_red: { bg: "var(--color-badge-bright-red-bg)", fg: "var(--color-badge-bright-red-fg)" },
376
+ bright_blue: { bg: "var(--color-badge-bright-blue-bg)", fg: "var(--color-badge-bright-blue-fg)" },
377
+ bright_yellow: { bg: "var(--color-badge-bright-yellow-bg)", fg: "var(--color-badge-bright-yellow-fg)" },
378
+ bright_teal: { bg: "var(--color-badge-bright-teal-bg)", fg: "var(--color-badge-bright-teal-fg)" },
379
+ bright_cyan: { bg: "var(--color-badge-bright-cyan-bg)", fg: "var(--color-badge-bright-cyan-fg)" },
380
+ bright_orange: { bg: "var(--color-badge-bright-orange-bg)", fg: "var(--color-badge-bright-orange-fg)" },
381
+ bright_purple: { bg: "var(--color-badge-bright-purple-bg)", fg: "var(--color-badge-bright-purple-fg)" },
382
+ bright_pink: { bg: "var(--color-badge-bright-pink-bg)", fg: "var(--color-badge-bright-pink-fg)" }
363
383
  };
364
384
  var S2 = 4;
365
385
  var Badge = React3__default.forwardRef(
@@ -394,18 +414,31 @@ var Badge = React3__default.forwardRef(
394
414
  }
395
415
  if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * S2}px` : _mr;
396
416
  const badgeStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
397
- const child = children ? /* @__PURE__ */ jsx("span", { className: "overflow-hidden text-ellipsis", children }) : null;
417
+ const palette = COLOR_PALETTE[colorPalette];
418
+ const child = children ? (
419
+ // `ellipsis` is gui Text's own built-in variant for single-line
420
+ // truncation — it expands to the same overflow/text-overflow/
421
+ // white-space/max-width rule Tailwind's `text-ellipsis` did, but
422
+ // through the component's own variants (guaranteed to compile),
423
+ // rather than naming each longhand as a separate style prop.
424
+ /* @__PURE__ */ jsx(Text, { ellipsis: true, ...SIZE_TEXT[size], color: palette.fg, children })
425
+ ) : null;
398
426
  const childrenElement = truncated ? /* @__PURE__ */ jsx(TruncatedTextTooltip, { label: children, children: child }) : child;
399
427
  const badgeElement = /* @__PURE__ */ jsxs(
400
- "span",
428
+ XStack,
401
429
  {
402
430
  ref,
403
- className: cn(
404
- BASE_CLASSES,
405
- SIZE_CLASSES[size],
406
- COLOR_PALETTE_CLASSES[colorPalette],
407
- className
408
- ),
431
+ render: /* @__PURE__ */ jsx("span", {}),
432
+ display: "inline-flex",
433
+ alignItems: "center",
434
+ alignSelf: "flex-start",
435
+ borderRadius: 2,
436
+ gap: 4,
437
+ maxWidth: "100%",
438
+ userSelect: "text",
439
+ ...SIZE[size],
440
+ backgroundColor: palette.bg,
441
+ className,
409
442
  style: badgeStyle,
410
443
  ...rest,
411
444
  children: [
package/dist/checkbox.cjs CHANGED
@@ -3,8 +3,6 @@
3
3
 
4
4
  var gui = require('@hanzo/gui');
5
5
  var React = require('react');
6
- var clsx = require('clsx');
7
- var tailwindMerge = require('tailwind-merge');
8
6
  var jsxRuntime = require('react/jsx-runtime');
9
7
 
10
8
  function _interopNamespace(e) {
@@ -28,9 +26,6 @@ function _interopNamespace(e) {
28
26
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
27
 
30
28
  // src/checkbox.tsx
31
- function cn(...inputs) {
32
- return tailwindMerge.twMerge(clsx.clsx(inputs));
33
- }
34
29
  var NOOP = () => {
35
30
  };
36
31
  var CheckboxGroupContext = React__namespace.createContext(null);
@@ -46,7 +41,6 @@ var CheckboxGroupBase = React__namespace.forwardRef(
46
41
  onValueChange,
47
42
  orientation = "vertical",
48
43
  name: _name,
49
- className,
50
44
  ...rest
51
45
  } = props;
52
46
  const [uncontrolledValue, setUncontrolledValue] = React__namespace.useState(defaultValue ?? []);
@@ -69,15 +63,13 @@ var CheckboxGroupBase = React__namespace.forwardRef(
69
63
  }, [isControlled, controlledValue]);
70
64
  const ctx = React__namespace.useMemo(() => ({ value, toggle }), [value, toggle]);
71
65
  return /* @__PURE__ */ jsxRuntime.jsx(CheckboxGroupContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsx(
72
- "div",
66
+ gui.View,
73
67
  {
74
68
  ref,
75
69
  role: "group",
76
- className: cn(
77
- "flex",
78
- orientation === "vertical" ? "flex-col gap-3" : "flex-row gap-8",
79
- className
80
- ),
70
+ display: "flex",
71
+ flexDirection: orientation === "vertical" ? "column" : "row",
72
+ gap: orientation === "vertical" ? 12 : 32,
81
73
  ...rest,
82
74
  children
83
75
  }
@@ -85,46 +77,22 @@ var CheckboxGroupBase = React__namespace.forwardRef(
85
77
  }
86
78
  );
87
79
  var CheckboxGroup2 = CheckboxGroupBase;
88
- var SIZE_CLASSES = {
89
- sm: {
90
- root: "gap-1.5",
91
- control: "h-3.5 w-3.5 rounded-sm",
92
- label: "text-xs",
93
- icon: "h-3 w-3"
94
- },
95
- md: {
96
- root: "gap-2",
97
- control: "h-4 w-4 rounded",
98
- label: "text-sm",
99
- icon: "h-3.5 w-3.5"
100
- }
80
+ var SIZE = {
81
+ sm: { rootGap: 6, control: 14, radius: 2, label: 12, icon: 12 },
82
+ md: { rootGap: 8, control: 16, radius: 4, label: 14, icon: 14 }
101
83
  };
102
- var CheckIcon = ({ className }) => /* @__PURE__ */ jsxRuntime.jsx(
103
- "svg",
104
- {
105
- className,
106
- viewBox: "0 0 12 10",
107
- fill: "none",
108
- xmlns: "http://www.w3.org/2000/svg",
109
- children: /* @__PURE__ */ jsxRuntime.jsx(
110
- "path",
111
- {
112
- d: "M10.59 0.59L4 7.17L1.41 4.59L0 6L4 10L12 2L10.59 0.59Z",
113
- fill: "currentColor"
114
- }
115
- )
116
- }
117
- );
118
- var IndeterminateIcon = ({ className }) => /* @__PURE__ */ jsxRuntime.jsx(
119
- "svg",
84
+ var INK = "var(--color-text-primary)";
85
+ var ON_INK = "var(--color-bg-body)";
86
+ var RESTING_BORDER = "var(--color-input-border)";
87
+ var OUTLINE = "var(--color-gray-500)";
88
+ var CheckIcon = ({ size, color }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 12 10", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx(
89
+ "path",
120
90
  {
121
- className,
122
- viewBox: "0 0 12 2",
123
- fill: "none",
124
- xmlns: "http://www.w3.org/2000/svg",
125
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M0 0H12V2H0V0Z", fill: "currentColor" })
91
+ d: "M10.59 0.59L4 7.17L1.41 4.59L0 6L4 10L12 2L10.59 0.59Z",
92
+ fill: color
126
93
  }
127
- );
94
+ ) });
95
+ var IndeterminateIcon = ({ size, color }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 12 2", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M0 0H12V2H0V0Z", fill: color }) });
128
96
  var CheckboxBase = React__namespace.forwardRef(
129
97
  function Checkbox(props, ref) {
130
98
  const {
@@ -142,7 +110,6 @@ var CheckboxBase = React__namespace.forwardRef(
142
110
  size = "md",
143
111
  name,
144
112
  required,
145
- className,
146
113
  ...rest
147
114
  } = props;
148
115
  const group = useCheckboxGroupContext();
@@ -195,18 +162,19 @@ var CheckboxBase = React__namespace.forwardRef(
195
162
  },
196
163
  [readOnly, isControlled, isInGroup, group, value, onCheckedChange, onChange]
197
164
  );
198
- const sizeClasses = SIZE_CLASSES[size];
165
+ const s = SIZE[size];
166
+ const isChecked = checkedState !== false;
199
167
  return /* @__PURE__ */ jsxRuntime.jsxs(
200
- "label",
168
+ gui.Label,
201
169
  {
202
170
  ref: rootRef,
203
- className: cn(
204
- "inline-flex items-center cursor-pointer select-none",
205
- sizeClasses.root,
206
- disabled && "opacity-50 cursor-not-allowed",
207
- readOnly && "cursor-default",
208
- className
209
- ),
171
+ unstyled: true,
172
+ flexDirection: "row",
173
+ alignItems: "center",
174
+ gap: s.rootGap,
175
+ cursor: disabled ? "not-allowed" : readOnly ? "default" : "pointer",
176
+ userSelect: "none",
177
+ opacity: disabled ? 0.5 : 1,
210
178
  onChange,
211
179
  "data-disabled": disabled || void 0,
212
180
  "data-readonly": readOnly || void 0,
@@ -222,26 +190,25 @@ var CheckboxBase = React__namespace.forwardRef(
222
190
  name,
223
191
  value,
224
192
  required,
225
- className: cn(
226
- "inline-flex items-center justify-center shrink-0",
227
- "border-2 border-current/30",
228
- "data-[state=checked]:bg-gray-800 data-[state=checked]:text-white",
229
- "dark:data-[state=checked]:bg-white dark:data-[state=checked]:text-black",
230
- "data-[state=indeterminate]:bg-gray-800 data-[state=indeterminate]:text-white",
231
- "dark:data-[state=indeterminate]:bg-white dark:data-[state=indeterminate]:text-black",
232
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500",
233
- "transition-colors duration-150",
234
- sizeClasses.control
235
- ),
236
- children: icon ?? /* @__PURE__ */ jsxRuntime.jsx(gui.Checkbox.Indicator, { className: cn("flex items-center justify-center", sizeClasses.icon), children: checkedState === "indeterminate" ? /* @__PURE__ */ jsxRuntime.jsx(IndeterminateIcon, { className: sizeClasses.icon }) : /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { className: sizeClasses.icon }) })
193
+ flexShrink: 0,
194
+ alignItems: "center",
195
+ justifyContent: "center",
196
+ width: s.control,
197
+ height: s.control,
198
+ borderRadius: s.radius,
199
+ borderWidth: 2,
200
+ borderColor: isChecked ? INK : RESTING_BORDER,
201
+ backgroundColor: isChecked ? INK : "transparent",
202
+ transition: "quicker",
203
+ focusStyle: { outlineWidth: 2, outlineStyle: "solid", outlineColor: OUTLINE, outlineOffset: 2 },
204
+ children: icon ?? /* @__PURE__ */ jsxRuntime.jsx(gui.Checkbox.Indicator, { alignItems: "center", justifyContent: "center", width: s.icon, height: s.icon, children: checkedState === "indeterminate" ? /* @__PURE__ */ jsxRuntime.jsx(IndeterminateIcon, { size: s.icon, color: ON_INK }) : /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { size: s.icon, color: ON_INK }) })
237
205
  }
238
206
  ),
239
- /* @__PURE__ */ jsxRuntime.jsx(
207
+ /* @__PURE__ */ jsxRuntime.jsx(gui.VisuallyHidden, { children: /* @__PURE__ */ jsxRuntime.jsx(
240
208
  "input",
241
209
  {
242
210
  ref: setHiddenInputRef,
243
211
  type: "checkbox",
244
- className: "sr-only",
245
212
  checked: checkedState === true,
246
213
  disabled,
247
214
  readOnly,
@@ -252,8 +219,8 @@ var CheckboxBase = React__namespace.forwardRef(
252
219
  onChange: NOOP,
253
220
  ...inputProps
254
221
  }
255
- ),
256
- children != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(sizeClasses.label), children })
222
+ ) }),
223
+ children != null && /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: s.label, children })
257
224
  ]
258
225
  }
259
226
  );