@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
@@ -1,9 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
+ var gui = require('@hanzo/gui');
4
5
  var React = require('react');
5
- var clsx = require('clsx');
6
- var tailwindMerge = require('tailwind-merge');
7
6
  var jsxRuntime = require('react/jsx-runtime');
8
7
 
9
8
  function _interopNamespace(e) {
@@ -26,44 +25,55 @@ function _interopNamespace(e) {
26
25
 
27
26
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
27
 
29
- function cn(...inputs) {
30
- return tailwindMerge.twMerge(clsx.clsx(inputs));
31
- }
32
28
  var GREEKS = [
33
- { key: "delta", label: "Delta", symbol: "\u0394", color: "text-[var(--foreground)]", barColor: "bg-[var(--foreground)]", decimals: 4, maxMagnitude: 1 },
34
- { key: "gamma", label: "Gamma", symbol: "\u0393", color: "text-[var(--chart-1)]", barColor: "bg-[var(--chart-1)]", decimals: 4, maxMagnitude: 0.1 },
35
- { key: "theta", label: "Theta", symbol: "\u0398", color: "text-[var(--chart-4)]", barColor: "bg-[var(--chart-4)]", decimals: 4, maxMagnitude: 1 },
36
- { key: "vega", label: "Vega", symbol: "\u03BD", color: "text-[var(--chart-2)]", barColor: "bg-[var(--chart-2)]", decimals: 4, maxMagnitude: 1 },
37
- { key: "rho", label: "Rho", symbol: "\u03C1", color: "text-[var(--chart-3)]", barColor: "bg-[var(--chart-3)]", decimals: 4, maxMagnitude: 1 },
38
- { key: "iv", label: "IV", symbol: "\u03C3", color: "text-[var(--chart-5)]", barColor: "bg-[var(--chart-5)]", decimals: 1, maxMagnitude: 100 }
29
+ { key: "delta", label: "Delta", symbol: "\u0394", color: "var(--foreground)", barColor: "var(--foreground)", decimals: 4, maxMagnitude: 1 },
30
+ { key: "gamma", label: "Gamma", symbol: "\u0393", color: "var(--chart-1)", barColor: "var(--chart-1)", decimals: 4, maxMagnitude: 0.1 },
31
+ { key: "theta", label: "Theta", symbol: "\u0398", color: "var(--chart-4)", barColor: "var(--chart-4)", decimals: 4, maxMagnitude: 1 },
32
+ { key: "vega", label: "Vega", symbol: "\u03BD", color: "var(--chart-2)", barColor: "var(--chart-2)", decimals: 4, maxMagnitude: 1 },
33
+ { key: "rho", label: "Rho", symbol: "\u03C1", color: "var(--chart-3)", barColor: "var(--chart-3)", decimals: 4, maxMagnitude: 1 },
34
+ { key: "iv", label: "IV", symbol: "\u03C3", color: "var(--chart-5)", barColor: "var(--chart-5)", decimals: 1, maxMagnitude: 100 }
39
35
  ];
40
36
  function GreekItem({ def, value, compact }) {
41
37
  const magnitude = Math.min(Math.abs(value) / def.maxMagnitude, 1);
42
38
  const displayValue = def.key === "iv" ? `${(value * 100).toFixed(def.decimals)}%` : value.toFixed(def.decimals);
43
- return /* @__PURE__ */ jsxRuntime.jsxs(
44
- "div",
45
- {
46
- className: cn(
47
- "flex items-center gap-1.5",
48
- compact ? "min-w-0" : "min-w-[100px]"
49
- ),
50
- children: [
51
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-[10px] font-semibold shrink-0", def.color), children: def.symbol }),
52
- !compact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-zinc-500 shrink-0 w-[34px]", children: def.label }),
53
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
54
- "font-mono tabular-nums text-xs text-zinc-200 shrink-0",
55
- value < 0 && "text-red-400"
56
- ), children: displayValue }),
57
- !compact && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 h-1 rounded-full bg-zinc-800 min-w-[24px] max-w-[48px] overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
58
- "div",
39
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { alignItems: "center", gap: 6, minWidth: compact ? 0 : 100, children: [
40
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 10, fontWeight: "600", flexShrink: 0, color: def.color, children: def.symbol }),
41
+ !compact && /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 10, flexShrink: 0, width: 34, color: "var(--color-text-secondary)", children: def.label }),
42
+ /* @__PURE__ */ jsxRuntime.jsx(
43
+ gui.Text,
44
+ {
45
+ fontSize: 12,
46
+ flexShrink: 0,
47
+ style: { fontFamily: "monospace" },
48
+ fontVariant: ["tabular-nums"],
49
+ color: value < 0 ? "var(--color-status-bad)" : "var(--color-text-primary)",
50
+ children: displayValue
51
+ }
52
+ ),
53
+ !compact && /* @__PURE__ */ jsxRuntime.jsx(
54
+ gui.View,
55
+ {
56
+ flex: 1,
57
+ height: 4,
58
+ borderRadius: 9999,
59
+ minWidth: 24,
60
+ maxWidth: 48,
61
+ overflow: "hidden",
62
+ backgroundColor: "var(--color-progress-track)",
63
+ children: /* @__PURE__ */ jsxRuntime.jsx(
64
+ gui.View,
59
65
  {
60
- className: cn("h-full rounded-full transition-all", def.barColor),
61
- style: { width: `${magnitude * 100}%`, opacity: 0.7 }
66
+ height: "100%",
67
+ borderRadius: 9999,
68
+ transition: "quick",
69
+ width: `${magnitude * 100}%`,
70
+ opacity: 0.7,
71
+ backgroundColor: def.barColor
62
72
  }
63
- ) })
64
- ]
65
- }
66
- );
73
+ )
74
+ }
75
+ )
76
+ ] });
67
77
  }
68
78
  var GreeksDisplay = React__namespace.forwardRef(
69
79
  function GreeksDisplay2(props, ref) {
@@ -88,14 +98,13 @@ var GreeksDisplay = React__namespace.forwardRef(
88
98
  };
89
99
  const activeGreeks = GREEKS.filter((g) => values[g.key] !== void 0);
90
100
  return /* @__PURE__ */ jsxRuntime.jsx(
91
- "div",
101
+ gui.XStack,
92
102
  {
93
103
  ref,
94
- className: cn(
95
- "flex flex-wrap items-center",
96
- compact ? "gap-3" : "gap-4",
97
- className
98
- ),
104
+ flexWrap: "wrap",
105
+ alignItems: "center",
106
+ gap: compact ? 12 : 16,
107
+ className,
99
108
  ...rest,
100
109
  children: activeGreeks.map((g) => /* @__PURE__ */ jsxRuntime.jsx(
101
110
  GreekItem,
@@ -1,47 +1,57 @@
1
1
  "use client";
2
+ import { XStack, Text, View } from '@hanzo/gui';
2
3
  import * as React from 'react';
3
- import { clsx } from 'clsx';
4
- import { twMerge } from 'tailwind-merge';
5
4
  import { jsx, jsxs } from 'react/jsx-runtime';
6
5
 
7
- function cn(...inputs) {
8
- return twMerge(clsx(inputs));
9
- }
10
6
  var GREEKS = [
11
- { key: "delta", label: "Delta", symbol: "\u0394", color: "text-[var(--foreground)]", barColor: "bg-[var(--foreground)]", decimals: 4, maxMagnitude: 1 },
12
- { key: "gamma", label: "Gamma", symbol: "\u0393", color: "text-[var(--chart-1)]", barColor: "bg-[var(--chart-1)]", decimals: 4, maxMagnitude: 0.1 },
13
- { key: "theta", label: "Theta", symbol: "\u0398", color: "text-[var(--chart-4)]", barColor: "bg-[var(--chart-4)]", decimals: 4, maxMagnitude: 1 },
14
- { key: "vega", label: "Vega", symbol: "\u03BD", color: "text-[var(--chart-2)]", barColor: "bg-[var(--chart-2)]", decimals: 4, maxMagnitude: 1 },
15
- { key: "rho", label: "Rho", symbol: "\u03C1", color: "text-[var(--chart-3)]", barColor: "bg-[var(--chart-3)]", decimals: 4, maxMagnitude: 1 },
16
- { key: "iv", label: "IV", symbol: "\u03C3", color: "text-[var(--chart-5)]", barColor: "bg-[var(--chart-5)]", decimals: 1, maxMagnitude: 100 }
7
+ { key: "delta", label: "Delta", symbol: "\u0394", color: "var(--foreground)", barColor: "var(--foreground)", decimals: 4, maxMagnitude: 1 },
8
+ { key: "gamma", label: "Gamma", symbol: "\u0393", color: "var(--chart-1)", barColor: "var(--chart-1)", decimals: 4, maxMagnitude: 0.1 },
9
+ { key: "theta", label: "Theta", symbol: "\u0398", color: "var(--chart-4)", barColor: "var(--chart-4)", decimals: 4, maxMagnitude: 1 },
10
+ { key: "vega", label: "Vega", symbol: "\u03BD", color: "var(--chart-2)", barColor: "var(--chart-2)", decimals: 4, maxMagnitude: 1 },
11
+ { key: "rho", label: "Rho", symbol: "\u03C1", color: "var(--chart-3)", barColor: "var(--chart-3)", decimals: 4, maxMagnitude: 1 },
12
+ { key: "iv", label: "IV", symbol: "\u03C3", color: "var(--chart-5)", barColor: "var(--chart-5)", decimals: 1, maxMagnitude: 100 }
17
13
  ];
18
14
  function GreekItem({ def, value, compact }) {
19
15
  const magnitude = Math.min(Math.abs(value) / def.maxMagnitude, 1);
20
16
  const displayValue = def.key === "iv" ? `${(value * 100).toFixed(def.decimals)}%` : value.toFixed(def.decimals);
21
- return /* @__PURE__ */ jsxs(
22
- "div",
23
- {
24
- className: cn(
25
- "flex items-center gap-1.5",
26
- compact ? "min-w-0" : "min-w-[100px]"
27
- ),
28
- children: [
29
- /* @__PURE__ */ jsx("span", { className: cn("text-[10px] font-semibold shrink-0", def.color), children: def.symbol }),
30
- !compact && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-zinc-500 shrink-0 w-[34px]", children: def.label }),
31
- /* @__PURE__ */ jsx("span", { className: cn(
32
- "font-mono tabular-nums text-xs text-zinc-200 shrink-0",
33
- value < 0 && "text-red-400"
34
- ), children: displayValue }),
35
- !compact && /* @__PURE__ */ jsx("div", { className: "flex-1 h-1 rounded-full bg-zinc-800 min-w-[24px] max-w-[48px] overflow-hidden", children: /* @__PURE__ */ jsx(
36
- "div",
17
+ return /* @__PURE__ */ jsxs(XStack, { alignItems: "center", gap: 6, minWidth: compact ? 0 : 100, children: [
18
+ /* @__PURE__ */ jsx(Text, { fontSize: 10, fontWeight: "600", flexShrink: 0, color: def.color, children: def.symbol }),
19
+ !compact && /* @__PURE__ */ jsx(Text, { fontSize: 10, flexShrink: 0, width: 34, color: "var(--color-text-secondary)", children: def.label }),
20
+ /* @__PURE__ */ jsx(
21
+ Text,
22
+ {
23
+ fontSize: 12,
24
+ flexShrink: 0,
25
+ style: { fontFamily: "monospace" },
26
+ fontVariant: ["tabular-nums"],
27
+ color: value < 0 ? "var(--color-status-bad)" : "var(--color-text-primary)",
28
+ children: displayValue
29
+ }
30
+ ),
31
+ !compact && /* @__PURE__ */ jsx(
32
+ View,
33
+ {
34
+ flex: 1,
35
+ height: 4,
36
+ borderRadius: 9999,
37
+ minWidth: 24,
38
+ maxWidth: 48,
39
+ overflow: "hidden",
40
+ backgroundColor: "var(--color-progress-track)",
41
+ children: /* @__PURE__ */ jsx(
42
+ View,
37
43
  {
38
- className: cn("h-full rounded-full transition-all", def.barColor),
39
- style: { width: `${magnitude * 100}%`, opacity: 0.7 }
44
+ height: "100%",
45
+ borderRadius: 9999,
46
+ transition: "quick",
47
+ width: `${magnitude * 100}%`,
48
+ opacity: 0.7,
49
+ backgroundColor: def.barColor
40
50
  }
41
- ) })
42
- ]
43
- }
44
- );
51
+ )
52
+ }
53
+ )
54
+ ] });
45
55
  }
46
56
  var GreeksDisplay = React.forwardRef(
47
57
  function GreeksDisplay2(props, ref) {
@@ -66,14 +76,13 @@ var GreeksDisplay = React.forwardRef(
66
76
  };
67
77
  const activeGreeks = GREEKS.filter((g) => values[g.key] !== void 0);
68
78
  return /* @__PURE__ */ jsx(
69
- "div",
79
+ XStack,
70
80
  {
71
81
  ref,
72
- className: cn(
73
- "flex flex-wrap items-center",
74
- compact ? "gap-3" : "gap-4",
75
- className
76
- ),
82
+ flexWrap: "wrap",
83
+ alignItems: "center",
84
+ gap: compact ? 12 : 16,
85
+ className,
77
86
  ...rest,
78
87
  children: activeGreeks.map((g) => /* @__PURE__ */ jsx(
79
88
  GreekItem,
package/dist/heading.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 _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -12,28 +10,23 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
10
  var React__default = /*#__PURE__*/_interopDefault(React);
13
11
 
14
12
  // src/heading.tsx
15
- function cn(...inputs) {
16
- return tailwindMerge.twMerge(clsx.clsx(inputs));
17
- }
18
- var LEVEL_TAG = { "1": gui.H1, "2": gui.H2, "3": gui.H3 };
19
- var LEVEL_CLASSES = {
20
- "1": "text-[18px] leading-[24px] font-medium lg:text-[32px] lg:leading-[40px] lg:tracking-[-0.5px]",
21
- "2": "text-[16px] leading-[24px] font-medium lg:text-[24px] lg:leading-[32px]",
22
- "3": "text-[14px] leading-[20px] font-semibold lg:text-[18px] lg:leading-[24px] lg:font-medium"
13
+ var TAG = { "1": gui.H1, "2": gui.H2, "3": gui.H3 };
14
+ var RAMP = {
15
+ "1": { fontSize: 18, lineHeight: 24, fontWeight: "500", $lg: { fontSize: 32, lineHeight: 40, letterSpacing: -0.5 } },
16
+ "2": { fontSize: 16, lineHeight: 24, fontWeight: "500", $lg: { fontSize: 24, lineHeight: 32 } },
17
+ "3": { fontSize: 14, lineHeight: 20, fontWeight: "600", $lg: { fontSize: 18, lineHeight: 24, fontWeight: "500" } }
23
18
  };
24
- var BASE_CLASSES = "font-heading text-heading";
25
19
  var Heading = React__default.default.forwardRef(
26
- function Heading2({ level, className, mb, size: _size, style: styleProp, ...rest }, ref) {
27
- const Tag = level ? LEVEL_TAG[level] : gui.H2;
28
- const levelClasses = level ? LEVEL_CLASSES[level] : void 0;
29
- const mergedStyle = mb !== void 0 ? { ...styleProp, marginBottom: typeof mb === "number" ? `${mb * 4}px` : mb } : styleProp;
20
+ function Heading2({ level, ...rest }, ref) {
21
+ const Tag = level ? TAG[level] : gui.H2;
30
22
  return /* @__PURE__ */ jsxRuntime.jsx(
31
23
  Tag,
32
24
  {
33
25
  ref,
34
26
  unstyled: true,
35
- className: cn(BASE_CLASSES, levelClasses, className),
36
- style: mergedStyle,
27
+ fontFamily: "$heading",
28
+ color: "var(--color-heading)",
29
+ ...level ? RAMP[level] : null,
37
30
  ...rest
38
31
  }
39
32
  );
@@ -2,8 +2,6 @@ import React__default from 'react';
2
2
 
3
3
  interface HeadingProps extends React__default.ComponentPropsWithoutRef<'h1'> {
4
4
  level?: '1' | '2' | '3';
5
- mb?: number | string;
6
- size?: string;
7
5
  }
8
6
  declare const Heading: React__default.ForwardRefExoticComponent<HeadingProps & React__default.RefAttributes<HTMLHeadingElement>>;
9
7
 
package/dist/heading.d.ts CHANGED
@@ -2,8 +2,6 @@ import React__default from 'react';
2
2
 
3
3
  interface HeadingProps extends React__default.ComponentPropsWithoutRef<'h1'> {
4
4
  level?: '1' | '2' | '3';
5
- mb?: number | string;
6
- size?: string;
7
5
  }
8
6
  declare const Heading: React__default.ForwardRefExoticComponent<HeadingProps & React__default.RefAttributes<HTMLHeadingElement>>;
9
7
 
package/dist/heading.js CHANGED
@@ -1,33 +1,26 @@
1
1
  "use client";
2
2
  import { H3, H2, H1 } from '@hanzo/gui';
3
3
  import React from 'react';
4
- import { clsx } from 'clsx';
5
- import { twMerge } from 'tailwind-merge';
6
4
  import { jsx } from 'react/jsx-runtime';
7
5
 
8
6
  // src/heading.tsx
9
- function cn(...inputs) {
10
- return twMerge(clsx(inputs));
11
- }
12
- var LEVEL_TAG = { "1": H1, "2": H2, "3": H3 };
13
- var LEVEL_CLASSES = {
14
- "1": "text-[18px] leading-[24px] font-medium lg:text-[32px] lg:leading-[40px] lg:tracking-[-0.5px]",
15
- "2": "text-[16px] leading-[24px] font-medium lg:text-[24px] lg:leading-[32px]",
16
- "3": "text-[14px] leading-[20px] font-semibold lg:text-[18px] lg:leading-[24px] lg:font-medium"
7
+ var TAG = { "1": H1, "2": H2, "3": H3 };
8
+ var RAMP = {
9
+ "1": { fontSize: 18, lineHeight: 24, fontWeight: "500", $lg: { fontSize: 32, lineHeight: 40, letterSpacing: -0.5 } },
10
+ "2": { fontSize: 16, lineHeight: 24, fontWeight: "500", $lg: { fontSize: 24, lineHeight: 32 } },
11
+ "3": { fontSize: 14, lineHeight: 20, fontWeight: "600", $lg: { fontSize: 18, lineHeight: 24, fontWeight: "500" } }
17
12
  };
18
- var BASE_CLASSES = "font-heading text-heading";
19
13
  var Heading = React.forwardRef(
20
- function Heading2({ level, className, mb, size: _size, style: styleProp, ...rest }, ref) {
21
- const Tag = level ? LEVEL_TAG[level] : H2;
22
- const levelClasses = level ? LEVEL_CLASSES[level] : void 0;
23
- const mergedStyle = mb !== void 0 ? { ...styleProp, marginBottom: typeof mb === "number" ? `${mb * 4}px` : mb } : styleProp;
14
+ function Heading2({ level, ...rest }, ref) {
15
+ const Tag = level ? TAG[level] : H2;
24
16
  return /* @__PURE__ */ jsx(
25
17
  Tag,
26
18
  {
27
19
  ref,
28
20
  unstyled: true,
29
- className: cn(BASE_CLASSES, levelClasses, className),
30
- style: mergedStyle,
21
+ fontFamily: "$heading",
22
+ color: "var(--color-heading)",
23
+ ...level ? RAMP[level] : null,
31
24
  ...rest
32
25
  }
33
26
  );
@@ -231,59 +231,74 @@ var IconButtonFrame = gui.styled(gui.View, {
231
231
  size: {
232
232
  "2xs": { width: 20, height: 20, borderRadius: 4 },
233
233
  "2xs_alt": { width: 20, height: 20, borderRadius: 4 },
234
- md: { width: 32, height: 32, borderRadius: "var(--radius-base, 8px)" }
234
+ md: { width: 32, height: 32, borderRadius: 8 }
235
235
  },
236
236
  disabled: {
237
- true: {
238
- opacity: 0.4,
239
- cursor: "not-allowed",
240
- pointerEvents: "none"
241
- }
237
+ true: { opacity: 0.4, cursor: "not-allowed", pointerEvents: "none" }
242
238
  }
243
239
  }
244
240
  });
245
- var VARIANT_CLASSES = {
246
- plain: "bg-transparent text-inherit border-none hover:bg-transparent",
247
- icon_secondary: [
248
- "bg-transparent text-icon-secondary border-none",
249
- "hover:text-hover",
250
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
251
- "data-[selected]:hover:text-hover",
252
- "data-[expanded]:text-hover"
253
- ].join(" "),
254
- icon_background: [
255
- "bg-[var(--color-button-icon-background-bg)] text-icon-secondary border-none",
256
- "hover:text-hover",
257
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
258
- "data-[selected]:hover:text-hover",
259
- "data-[expanded]:text-hover"
260
- ].join(" "),
261
- link: [
262
- "bg-transparent text-link-primary border-none font-normal px-0 h-auto",
263
- "hover:bg-transparent hover:text-link-primary-hover",
264
- "disabled:text-text-secondary"
265
- ].join(" "),
266
- dropdown: [
267
- "border-2 border-solid bg-transparent",
268
- "text-[var(--color-button-dropdown-fg)] border-[var(--color-button-dropdown-border)]",
269
- "hover:bg-transparent hover:text-hover hover:border-hover",
270
- "data-[expanded]:bg-transparent data-[expanded]:text-hover data-[expanded]:border-hover",
271
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent",
272
- "data-[selected]:hover:text-hover"
273
- ].join(" "),
274
- pagination: [
275
- "border-2 border-solid bg-transparent",
276
- "text-[var(--color-button-pagination-fg)] border-[var(--color-button-pagination-border)]",
277
- "hover:bg-transparent hover:text-hover hover:border-hover",
278
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent"
279
- ].join(" ")
280
- };
281
- var ICON_SIZE_CLASSES = {
282
- "2xs": "[&_svg]:size-5",
283
- "2xs_alt": "[&_svg]:size-3",
284
- md: "[&_svg]:size-5"
241
+ var HOVER = "var(--color-hover)";
242
+ var SELECTED_BG = "var(--color-selected-control-bg)";
243
+ var SELECTED_FG = "var(--color-selected-control-text)";
244
+ var VARIANT = {
245
+ plain: {
246
+ rest: { backgroundColor: "transparent", hoverStyle: { backgroundColor: "transparent" } }
247
+ },
248
+ icon_secondary: {
249
+ rest: {
250
+ backgroundColor: "transparent",
251
+ color: "var(--color-icon-secondary)",
252
+ hoverStyle: { color: HOVER }
253
+ },
254
+ selected: { backgroundColor: SELECTED_BG, color: SELECTED_FG, hoverStyle: { color: HOVER } },
255
+ expanded: { color: HOVER }
256
+ },
257
+ icon_background: {
258
+ rest: {
259
+ backgroundColor: "var(--color-button-icon-background-bg)",
260
+ color: "var(--color-icon-secondary)",
261
+ hoverStyle: { color: HOVER }
262
+ },
263
+ selected: { backgroundColor: SELECTED_BG, color: SELECTED_FG, hoverStyle: { color: HOVER } },
264
+ expanded: { color: HOVER }
265
+ },
266
+ link: {
267
+ rest: {
268
+ backgroundColor: "transparent",
269
+ color: "var(--color-link-primary)",
270
+ fontWeight: "400",
271
+ paddingHorizontal: 0,
272
+ height: "auto",
273
+ hoverStyle: { backgroundColor: "transparent", color: "var(--color-link-primary-hover)" },
274
+ disabledStyle: { color: "var(--color-text-secondary)" }
275
+ }
276
+ },
277
+ dropdown: {
278
+ rest: {
279
+ borderWidth: 2,
280
+ borderStyle: "solid",
281
+ backgroundColor: "transparent",
282
+ color: "var(--color-button-dropdown-fg)",
283
+ borderColor: "var(--color-button-dropdown-border)",
284
+ hoverStyle: { backgroundColor: "transparent", color: HOVER, borderColor: HOVER }
285
+ },
286
+ selected: { backgroundColor: SELECTED_BG, color: SELECTED_FG, borderColor: "transparent", hoverStyle: { color: HOVER } },
287
+ expanded: { backgroundColor: "transparent", color: HOVER, borderColor: HOVER }
288
+ },
289
+ pagination: {
290
+ rest: {
291
+ borderWidth: 2,
292
+ borderStyle: "solid",
293
+ backgroundColor: "transparent",
294
+ color: "var(--color-button-pagination-fg)",
295
+ borderColor: "var(--color-button-pagination-border)",
296
+ hoverStyle: { backgroundColor: "transparent", color: HOVER, borderColor: HOVER }
297
+ },
298
+ selected: { backgroundColor: SELECTED_BG, color: SELECTED_FG, borderColor: "transparent" }
299
+ }
285
300
  };
286
- var SP = 4;
301
+ var ICON_SIZE = { "2xs": 20, "2xs_alt": 12, md: 20 };
287
302
  var IconButton = React__namespace.forwardRef(
288
303
  function IconButton2(props, ref) {
289
304
  const {
@@ -297,58 +312,43 @@ var IconButton = React__namespace.forwardRef(
297
312
  disabled,
298
313
  className,
299
314
  children,
300
- as: _as,
315
+ as: asProp,
301
316
  style: styleProp,
302
- // Strip Chakra style props
303
- boxSize: _boxSize,
304
- color: _color,
305
- px: _px,
306
- borderRadius: _borderRadius,
307
- ml: _ml,
308
- mr: _mr,
309
- _hover,
310
- _expanded,
311
317
  ...rest
312
318
  } = props;
313
- const shimStyle = { ...styleProp };
314
- if (_boxSize !== void 0) {
315
- const bs = typeof _boxSize === "number" ? `${_boxSize * SP}px` : _boxSize;
316
- shimStyle.width = bs;
317
- shimStyle.height = bs;
318
- }
319
- if (_color) shimStyle.color = _color;
320
- if (_px !== void 0) {
321
- const v = typeof _px === "number" ? `${_px * SP}px` : _px;
322
- shimStyle.paddingLeft = v;
323
- shimStyle.paddingRight = v;
324
- }
325
- if (_borderRadius) shimStyle.borderRadius = _borderRadius;
326
- if (_ml !== void 0) shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * SP}px` : _ml;
327
- if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * SP}px` : _mr;
328
- const mergedStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
329
- const variantClass = VARIANT_CLASSES[variant] ?? VARIANT_CLASSES.plain;
330
- const iconSizeClass = size ? ICON_SIZE_CLASSES[size] ?? "" : "";
331
- const combinedClassName = [variantClass, iconSizeClass, className].filter(Boolean).join(" ");
319
+ const look = VARIANT[variant] ?? VARIANT.plain;
320
+ const iconSize = size ? ICON_SIZE[size] : void 0;
332
321
  const button = /* @__PURE__ */ jsxRuntime.jsx(
333
322
  IconButtonFrame,
334
323
  {
335
324
  ref,
336
325
  size,
337
326
  disabled: !loadingSkeleton && (loading || disabled) || void 0,
338
- render: _as ? React__namespace.createElement(_as) : void 0,
339
- className: combinedClassName,
340
- style: mergedStyle,
327
+ render: asProp ? React__namespace.createElement(asProp) : void 0,
328
+ className: ["lux-icon", className].filter(Boolean).join(" "),
329
+ style: { ...styleProp, ...iconSize ? { "--icon-size": `${iconSize}px` } : null },
330
+ ...look.rest,
331
+ ...selected ? look.selected : null,
332
+ ...expanded ? look.expanded : null,
341
333
  ...expanded ? { "data-expanded": true } : {},
342
334
  ...selected ? { "data-selected": true } : {},
343
335
  ...highlighted ? { "data-highlighted": true } : {},
344
336
  ...loadingSkeleton ? { "data-loading-skeleton": true } : {},
345
337
  ...rest,
346
338
  children: loading ? /* @__PURE__ */ jsxRuntime.jsx(
347
- "span",
339
+ gui.View,
348
340
  {
349
- className: "inline-block size-5 animate-spin rounded-full border-2 border-current border-b-transparent border-l-transparent",
341
+ className: "lux-spin",
342
+ render: /* @__PURE__ */ jsxRuntime.jsx("span", {}),
350
343
  role: "status",
351
- "aria-label": "Loading"
344
+ "aria-label": "Loading",
345
+ width: 20,
346
+ height: 20,
347
+ borderRadius: 1e3,
348
+ borderWidth: 2,
349
+ borderColor: "currentColor",
350
+ borderBottomColor: "transparent",
351
+ borderLeftColor: "transparent"
352
352
  }
353
353
  ) : children
354
354
  }
@@ -1,6 +1,18 @@
1
1
  import * as React from 'react';
2
2
 
3
- type Variant = 'plain' | 'icon_secondary' | 'icon_background' | 'link' | 'dropdown' | 'pagination';
3
+ type Style = Record<string, unknown>;
4
+ /**
5
+ * Resting look, and the looks that replace it while selected or expanded.
6
+ * Merged in that order, so a key set in two of them resolves to the later —
7
+ * which is why `selected` and `expanded` are objects rather than `hoverStyle`
8
+ * entries that would fight the resting value.
9
+ */
10
+ declare const VARIANT: Record<string, {
11
+ rest: Style;
12
+ selected?: Style;
13
+ expanded?: Style;
14
+ }>;
15
+ type Variant = keyof typeof VARIANT;
4
16
  type Size = '2xs' | '2xs_alt' | 'md';
5
17
  interface IconButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'> {
6
18
  /** Visual variant */
@@ -11,22 +23,14 @@ interface IconButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElem
11
23
  loading?: boolean;
12
24
  /** Render a skeleton placeholder instead of the button */
13
25
  loadingSkeleton?: boolean;
14
- /** Maps to data-expanded for popover trigger styling */
26
+ /** Also emitted as data-expanded for consumer styling */
15
27
  expanded?: boolean;
16
- /** Maps to data-selected for toggle styling */
28
+ /** Also emitted as data-selected for consumer styling */
17
29
  selected?: boolean;
18
- /** Maps to data-highlighted */
30
+ /** Also emitted as data-highlighted */
19
31
  highlighted?: boolean;
20
32
  /** Polymorphic element type (e.g. "div") */
21
33
  as?: React.ElementType;
22
- boxSize?: number | string;
23
- color?: string;
24
- px?: string | number;
25
- borderRadius?: string;
26
- ml?: number | string;
27
- mr?: number | string;
28
- _hover?: Record<string, string>;
29
- _expanded?: Record<string, string>;
30
34
  }
31
35
  declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
32
36
 
@@ -1,6 +1,18 @@
1
1
  import * as React from 'react';
2
2
 
3
- type Variant = 'plain' | 'icon_secondary' | 'icon_background' | 'link' | 'dropdown' | 'pagination';
3
+ type Style = Record<string, unknown>;
4
+ /**
5
+ * Resting look, and the looks that replace it while selected or expanded.
6
+ * Merged in that order, so a key set in two of them resolves to the later —
7
+ * which is why `selected` and `expanded` are objects rather than `hoverStyle`
8
+ * entries that would fight the resting value.
9
+ */
10
+ declare const VARIANT: Record<string, {
11
+ rest: Style;
12
+ selected?: Style;
13
+ expanded?: Style;
14
+ }>;
15
+ type Variant = keyof typeof VARIANT;
4
16
  type Size = '2xs' | '2xs_alt' | 'md';
5
17
  interface IconButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'> {
6
18
  /** Visual variant */
@@ -11,22 +23,14 @@ interface IconButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElem
11
23
  loading?: boolean;
12
24
  /** Render a skeleton placeholder instead of the button */
13
25
  loadingSkeleton?: boolean;
14
- /** Maps to data-expanded for popover trigger styling */
26
+ /** Also emitted as data-expanded for consumer styling */
15
27
  expanded?: boolean;
16
- /** Maps to data-selected for toggle styling */
28
+ /** Also emitted as data-selected for consumer styling */
17
29
  selected?: boolean;
18
- /** Maps to data-highlighted */
30
+ /** Also emitted as data-highlighted */
19
31
  highlighted?: boolean;
20
32
  /** Polymorphic element type (e.g. "div") */
21
33
  as?: React.ElementType;
22
- boxSize?: number | string;
23
- color?: string;
24
- px?: string | number;
25
- borderRadius?: string;
26
- ml?: number | string;
27
- mr?: number | string;
28
- _hover?: Record<string, string>;
29
- _expanded?: Record<string, string>;
30
34
  }
31
35
  declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
32
36