@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,9 +25,6 @@ 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
  function fmt(n, decimals = 2) {
33
29
  if (n === void 0 || n === null) return "-";
34
30
  return n.toFixed(decimals);
@@ -43,20 +39,55 @@ function fmtPct(n) {
43
39
  if (n === void 0 || n === null) return "-";
44
40
  return `${(n * 100).toFixed(1)}%`;
45
41
  }
42
+ var justify = (align) => align === "right" ? "flex-end" : align === "left" ? "flex-start" : "center";
46
43
  function QuoteCell({ value, highlight, align = "right", onClick, className }) {
47
44
  return /* @__PURE__ */ jsxRuntime.jsx(
48
- "td",
45
+ gui.View,
49
46
  {
50
- className: cn(
51
- "px-1.5 py-1 font-mono tabular-nums text-xs whitespace-nowrap",
52
- align === "right" ? "text-right" : "text-left",
53
- highlight && "text-zinc-100",
54
- !highlight && "text-zinc-400",
55
- onClick && "cursor-pointer hover:bg-zinc-700/50 transition-colors",
56
- className
57
- ),
47
+ unstyled: true,
48
+ render: /* @__PURE__ */ jsxRuntime.jsx("td", {}),
58
49
  onClick,
59
- children: value
50
+ paddingHorizontal: 6,
51
+ paddingVertical: 4,
52
+ cursor: onClick ? "pointer" : void 0,
53
+ transition: "quick",
54
+ hoverStyle: onClick ? { backgroundColor: "var(--color-popover-item-hover)" } : void 0,
55
+ style: { display: "flex", alignItems: "center", justifyContent: justify(align) },
56
+ className,
57
+ children: /* @__PURE__ */ jsxRuntime.jsx(
58
+ gui.Text,
59
+ {
60
+ fontSize: 12,
61
+ style: { fontFamily: "monospace", whiteSpace: "nowrap" },
62
+ fontVariant: ["tabular-nums"],
63
+ color: highlight ? "var(--color-text-primary)" : "var(--color-text-secondary)",
64
+ children: value
65
+ }
66
+ )
67
+ }
68
+ );
69
+ }
70
+ function HeadCell({ children, colSpan, align = "center", size = "column", color }) {
71
+ return /* @__PURE__ */ jsxRuntime.jsx(
72
+ gui.View,
73
+ {
74
+ unstyled: true,
75
+ render: colSpan ? /* @__PURE__ */ jsxRuntime.jsx("th", { colSpan }) : /* @__PURE__ */ jsxRuntime.jsx("th", {}),
76
+ paddingHorizontal: size === "group" ? 8 : 6,
77
+ paddingVertical: size === "group" ? 6 : 4,
78
+ style: { display: "flex", alignItems: "center", justifyContent: justify(align) },
79
+ children: children != null && /* @__PURE__ */ jsxRuntime.jsx(
80
+ gui.Text,
81
+ {
82
+ fontSize: 10,
83
+ fontWeight: size === "group" ? "600" : "500",
84
+ textTransform: "uppercase",
85
+ letterSpacing: 0.5,
86
+ style: { whiteSpace: "nowrap" },
87
+ color: color ?? "var(--color-text-secondary)",
88
+ children
89
+ }
90
+ )
60
91
  }
61
92
  );
62
93
  }
@@ -87,71 +118,51 @@ var OptionChain = React__namespace.forwardRef(
87
118
  [onSelectContract]
88
119
  );
89
120
  return /* @__PURE__ */ jsxRuntime.jsx(
90
- "div",
121
+ gui.View,
91
122
  {
92
123
  ref,
93
- className: cn("w-full overflow-x-auto", className),
124
+ unstyled: true,
125
+ width: "100%",
126
+ overflowX: "auto",
127
+ className,
94
128
  ...rest,
95
- children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full border-collapse text-xs", children: [
96
- /* @__PURE__ */ jsxRuntime.jsxs("thead", { children: [
97
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-zinc-800", children: [
98
- /* @__PURE__ */ jsxRuntime.jsx(
99
- "th",
100
- {
101
- colSpan: CALL_HEADERS.length,
102
- className: "px-2 py-1.5 text-center text-[10px] font-semibold uppercase tracking-wider text-emerald-400",
103
- children: "Calls"
104
- }
105
- ),
106
- /* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-2 py-1.5 text-center text-[10px] font-semibold uppercase tracking-wider text-zinc-500", children: "Strike" }),
107
- /* @__PURE__ */ jsxRuntime.jsx(
108
- "th",
109
- {
110
- colSpan: PUT_HEADERS.length,
111
- className: "px-2 py-1.5 text-center text-[10px] font-semibold uppercase tracking-wider text-red-400",
112
- children: "Puts"
113
- }
114
- )
129
+ children: /* @__PURE__ */ jsxRuntime.jsxs(gui.View, { unstyled: true, render: /* @__PURE__ */ jsxRuntime.jsx("table", {}), width: "100%", style: { borderCollapse: "collapse" }, children: [
130
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.View, { unstyled: true, render: /* @__PURE__ */ jsxRuntime.jsx("thead", {}), children: [
131
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.View, { unstyled: true, render: /* @__PURE__ */ jsxRuntime.jsx("tr", {}), borderBottomWidth: 1, borderColor: "var(--color-border-divider)", children: [
132
+ /* @__PURE__ */ jsxRuntime.jsx(HeadCell, { colSpan: CALL_HEADERS.length, size: "group", color: "var(--color-status-good)", children: "Calls" }),
133
+ /* @__PURE__ */ jsxRuntime.jsx(HeadCell, { size: "group", children: "Strike" }),
134
+ /* @__PURE__ */ jsxRuntime.jsx(HeadCell, { colSpan: PUT_HEADERS.length, size: "group", color: "var(--color-status-bad)", children: "Puts" })
115
135
  ] }),
116
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-zinc-800/60", children: [
117
- CALL_HEADERS.map((h) => /* @__PURE__ */ jsxRuntime.jsx(
118
- "th",
119
- {
120
- className: "px-1.5 py-1 text-right text-[10px] font-medium uppercase tracking-wider text-zinc-500",
121
- children: h
122
- },
123
- `call-${h}`
124
- )),
125
- /* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-2 py-1 text-center text-[10px] font-medium uppercase tracking-wider text-zinc-500" }),
136
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.View, { unstyled: true, render: /* @__PURE__ */ jsxRuntime.jsx("tr", {}), borderBottomWidth: 1, borderColor: "var(--color-popover-item-hover)", children: [
137
+ CALL_HEADERS.map((h) => /* @__PURE__ */ jsxRuntime.jsx(HeadCell, { align: "right", children: h }, `call-${h}`)),
138
+ /* @__PURE__ */ jsxRuntime.jsx(HeadCell, {}),
126
139
  PUT_HEADERS.map((h) => /* @__PURE__ */ jsxRuntime.jsx(
127
- "th",
140
+ HeadCell,
128
141
  {
129
- className: cn(
130
- "px-1.5 py-1 text-[10px] font-medium uppercase tracking-wider text-zinc-500",
131
- h === "Bid" || h === "Ask" || h === "Last" ? "text-left" : "text-right"
132
- ),
142
+ align: h === "Bid" || h === "Ask" || h === "Last" ? "left" : "right",
133
143
  children: h
134
144
  },
135
145
  `put-${h}`
136
146
  ))
137
147
  ] })
138
148
  ] }),
139
- /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: strikes.map((row) => {
149
+ /* @__PURE__ */ jsxRuntime.jsx(gui.View, { unstyled: true, render: /* @__PURE__ */ jsxRuntime.jsx("tbody", {}), children: strikes.map((row) => {
140
150
  const isATM = Math.abs(row.strike - spotPrice) <= (strikes.length > 1 ? Math.abs((strikes[1]?.strike ?? 0) - (strikes[0]?.strike ?? 0)) / 2 : 0.5);
141
151
  const callITM = row.strike < spotPrice;
142
152
  const putITM = row.strike > spotPrice;
143
153
  const c = row.call;
144
154
  const p = row.put;
155
+ const rowBg = isATM ? "var(--secondary)" : callITM ? "color-mix(in srgb, var(--color-status-good) 12%, transparent)" : putITM ? "color-mix(in srgb, var(--color-status-bad) 12%, transparent)" : "transparent";
145
156
  return /* @__PURE__ */ jsxRuntime.jsxs(
146
- "tr",
157
+ gui.View,
147
158
  {
148
- className: cn(
149
- "border-b border-zinc-800/30 transition-colors",
150
- isATM && "bg-zinc-800/60",
151
- !isATM && callITM && "bg-emerald-950/20",
152
- !isATM && putITM && "bg-red-950/20",
153
- !isATM && !callITM && !putITM && "hover:bg-zinc-800/30"
154
- ),
159
+ unstyled: true,
160
+ render: /* @__PURE__ */ jsxRuntime.jsx("tr", {}),
161
+ borderBottomWidth: 1,
162
+ borderColor: "color-mix(in srgb, var(--color-border-divider) 50%, transparent)",
163
+ transition: "quick",
164
+ backgroundColor: rowBg,
165
+ hoverStyle: isATM || callITM || putITM ? void 0 : { backgroundColor: "var(--color-popover-item-hover)" },
155
166
  children: [
156
167
  /* @__PURE__ */ jsxRuntime.jsx(
157
168
  QuoteCell,
@@ -175,13 +186,24 @@ var OptionChain = React__namespace.forwardRef(
175
186
  /* @__PURE__ */ jsxRuntime.jsx(QuoteCell, { value: fmtPct(c?.iv) }),
176
187
  /* @__PURE__ */ jsxRuntime.jsx(QuoteCell, { value: fmt(c?.delta, 3) }),
177
188
  /* @__PURE__ */ jsxRuntime.jsx(
178
- "td",
189
+ gui.View,
179
190
  {
180
- className: cn(
181
- "px-2 py-1 text-center font-mono tabular-nums text-xs font-semibold",
182
- isATM ? "text-[var(--foreground)] bg-[var(--secondary)]" : "text-[var(--muted-foreground)]"
183
- ),
184
- children: fmt(row.strike)
191
+ unstyled: true,
192
+ render: /* @__PURE__ */ jsxRuntime.jsx("td", {}),
193
+ paddingHorizontal: 8,
194
+ paddingVertical: 4,
195
+ style: { display: "flex", alignItems: "center", justifyContent: "center" },
196
+ children: /* @__PURE__ */ jsxRuntime.jsx(
197
+ gui.Text,
198
+ {
199
+ fontSize: 12,
200
+ fontWeight: "600",
201
+ style: { fontFamily: "monospace" },
202
+ fontVariant: ["tabular-nums"],
203
+ color: isATM ? "var(--foreground)" : "var(--muted-foreground)",
204
+ children: fmt(row.strike)
205
+ }
206
+ )
185
207
  }
186
208
  ),
187
209
  /* @__PURE__ */ jsxRuntime.jsx(QuoteCell, { value: fmt(p?.delta, 3), align: "right" }),
@@ -1,12 +1,8 @@
1
1
  "use client";
2
+ import { View, Text } 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
  function fmt(n, decimals = 2) {
11
7
  if (n === void 0 || n === null) return "-";
12
8
  return n.toFixed(decimals);
@@ -21,20 +17,55 @@ function fmtPct(n) {
21
17
  if (n === void 0 || n === null) return "-";
22
18
  return `${(n * 100).toFixed(1)}%`;
23
19
  }
20
+ var justify = (align) => align === "right" ? "flex-end" : align === "left" ? "flex-start" : "center";
24
21
  function QuoteCell({ value, highlight, align = "right", onClick, className }) {
25
22
  return /* @__PURE__ */ jsx(
26
- "td",
23
+ View,
27
24
  {
28
- className: cn(
29
- "px-1.5 py-1 font-mono tabular-nums text-xs whitespace-nowrap",
30
- align === "right" ? "text-right" : "text-left",
31
- highlight && "text-zinc-100",
32
- !highlight && "text-zinc-400",
33
- onClick && "cursor-pointer hover:bg-zinc-700/50 transition-colors",
34
- className
35
- ),
25
+ unstyled: true,
26
+ render: /* @__PURE__ */ jsx("td", {}),
36
27
  onClick,
37
- children: value
28
+ paddingHorizontal: 6,
29
+ paddingVertical: 4,
30
+ cursor: onClick ? "pointer" : void 0,
31
+ transition: "quick",
32
+ hoverStyle: onClick ? { backgroundColor: "var(--color-popover-item-hover)" } : void 0,
33
+ style: { display: "flex", alignItems: "center", justifyContent: justify(align) },
34
+ className,
35
+ children: /* @__PURE__ */ jsx(
36
+ Text,
37
+ {
38
+ fontSize: 12,
39
+ style: { fontFamily: "monospace", whiteSpace: "nowrap" },
40
+ fontVariant: ["tabular-nums"],
41
+ color: highlight ? "var(--color-text-primary)" : "var(--color-text-secondary)",
42
+ children: value
43
+ }
44
+ )
45
+ }
46
+ );
47
+ }
48
+ function HeadCell({ children, colSpan, align = "center", size = "column", color }) {
49
+ return /* @__PURE__ */ jsx(
50
+ View,
51
+ {
52
+ unstyled: true,
53
+ render: colSpan ? /* @__PURE__ */ jsx("th", { colSpan }) : /* @__PURE__ */ jsx("th", {}),
54
+ paddingHorizontal: size === "group" ? 8 : 6,
55
+ paddingVertical: size === "group" ? 6 : 4,
56
+ style: { display: "flex", alignItems: "center", justifyContent: justify(align) },
57
+ children: children != null && /* @__PURE__ */ jsx(
58
+ Text,
59
+ {
60
+ fontSize: 10,
61
+ fontWeight: size === "group" ? "600" : "500",
62
+ textTransform: "uppercase",
63
+ letterSpacing: 0.5,
64
+ style: { whiteSpace: "nowrap" },
65
+ color: color ?? "var(--color-text-secondary)",
66
+ children
67
+ }
68
+ )
38
69
  }
39
70
  );
40
71
  }
@@ -65,71 +96,51 @@ var OptionChain = React.forwardRef(
65
96
  [onSelectContract]
66
97
  );
67
98
  return /* @__PURE__ */ jsx(
68
- "div",
99
+ View,
69
100
  {
70
101
  ref,
71
- className: cn("w-full overflow-x-auto", className),
102
+ unstyled: true,
103
+ width: "100%",
104
+ overflowX: "auto",
105
+ className,
72
106
  ...rest,
73
- children: /* @__PURE__ */ jsxs("table", { className: "w-full border-collapse text-xs", children: [
74
- /* @__PURE__ */ jsxs("thead", { children: [
75
- /* @__PURE__ */ jsxs("tr", { className: "border-b border-zinc-800", children: [
76
- /* @__PURE__ */ jsx(
77
- "th",
78
- {
79
- colSpan: CALL_HEADERS.length,
80
- className: "px-2 py-1.5 text-center text-[10px] font-semibold uppercase tracking-wider text-emerald-400",
81
- children: "Calls"
82
- }
83
- ),
84
- /* @__PURE__ */ jsx("th", { className: "px-2 py-1.5 text-center text-[10px] font-semibold uppercase tracking-wider text-zinc-500", children: "Strike" }),
85
- /* @__PURE__ */ jsx(
86
- "th",
87
- {
88
- colSpan: PUT_HEADERS.length,
89
- className: "px-2 py-1.5 text-center text-[10px] font-semibold uppercase tracking-wider text-red-400",
90
- children: "Puts"
91
- }
92
- )
107
+ children: /* @__PURE__ */ jsxs(View, { unstyled: true, render: /* @__PURE__ */ jsx("table", {}), width: "100%", style: { borderCollapse: "collapse" }, children: [
108
+ /* @__PURE__ */ jsxs(View, { unstyled: true, render: /* @__PURE__ */ jsx("thead", {}), children: [
109
+ /* @__PURE__ */ jsxs(View, { unstyled: true, render: /* @__PURE__ */ jsx("tr", {}), borderBottomWidth: 1, borderColor: "var(--color-border-divider)", children: [
110
+ /* @__PURE__ */ jsx(HeadCell, { colSpan: CALL_HEADERS.length, size: "group", color: "var(--color-status-good)", children: "Calls" }),
111
+ /* @__PURE__ */ jsx(HeadCell, { size: "group", children: "Strike" }),
112
+ /* @__PURE__ */ jsx(HeadCell, { colSpan: PUT_HEADERS.length, size: "group", color: "var(--color-status-bad)", children: "Puts" })
93
113
  ] }),
94
- /* @__PURE__ */ jsxs("tr", { className: "border-b border-zinc-800/60", children: [
95
- CALL_HEADERS.map((h) => /* @__PURE__ */ jsx(
96
- "th",
97
- {
98
- className: "px-1.5 py-1 text-right text-[10px] font-medium uppercase tracking-wider text-zinc-500",
99
- children: h
100
- },
101
- `call-${h}`
102
- )),
103
- /* @__PURE__ */ jsx("th", { className: "px-2 py-1 text-center text-[10px] font-medium uppercase tracking-wider text-zinc-500" }),
114
+ /* @__PURE__ */ jsxs(View, { unstyled: true, render: /* @__PURE__ */ jsx("tr", {}), borderBottomWidth: 1, borderColor: "var(--color-popover-item-hover)", children: [
115
+ CALL_HEADERS.map((h) => /* @__PURE__ */ jsx(HeadCell, { align: "right", children: h }, `call-${h}`)),
116
+ /* @__PURE__ */ jsx(HeadCell, {}),
104
117
  PUT_HEADERS.map((h) => /* @__PURE__ */ jsx(
105
- "th",
118
+ HeadCell,
106
119
  {
107
- className: cn(
108
- "px-1.5 py-1 text-[10px] font-medium uppercase tracking-wider text-zinc-500",
109
- h === "Bid" || h === "Ask" || h === "Last" ? "text-left" : "text-right"
110
- ),
120
+ align: h === "Bid" || h === "Ask" || h === "Last" ? "left" : "right",
111
121
  children: h
112
122
  },
113
123
  `put-${h}`
114
124
  ))
115
125
  ] })
116
126
  ] }),
117
- /* @__PURE__ */ jsx("tbody", { children: strikes.map((row) => {
127
+ /* @__PURE__ */ jsx(View, { unstyled: true, render: /* @__PURE__ */ jsx("tbody", {}), children: strikes.map((row) => {
118
128
  const isATM = Math.abs(row.strike - spotPrice) <= (strikes.length > 1 ? Math.abs((strikes[1]?.strike ?? 0) - (strikes[0]?.strike ?? 0)) / 2 : 0.5);
119
129
  const callITM = row.strike < spotPrice;
120
130
  const putITM = row.strike > spotPrice;
121
131
  const c = row.call;
122
132
  const p = row.put;
133
+ const rowBg = isATM ? "var(--secondary)" : callITM ? "color-mix(in srgb, var(--color-status-good) 12%, transparent)" : putITM ? "color-mix(in srgb, var(--color-status-bad) 12%, transparent)" : "transparent";
123
134
  return /* @__PURE__ */ jsxs(
124
- "tr",
135
+ View,
125
136
  {
126
- className: cn(
127
- "border-b border-zinc-800/30 transition-colors",
128
- isATM && "bg-zinc-800/60",
129
- !isATM && callITM && "bg-emerald-950/20",
130
- !isATM && putITM && "bg-red-950/20",
131
- !isATM && !callITM && !putITM && "hover:bg-zinc-800/30"
132
- ),
137
+ unstyled: true,
138
+ render: /* @__PURE__ */ jsx("tr", {}),
139
+ borderBottomWidth: 1,
140
+ borderColor: "color-mix(in srgb, var(--color-border-divider) 50%, transparent)",
141
+ transition: "quick",
142
+ backgroundColor: rowBg,
143
+ hoverStyle: isATM || callITM || putITM ? void 0 : { backgroundColor: "var(--color-popover-item-hover)" },
133
144
  children: [
134
145
  /* @__PURE__ */ jsx(
135
146
  QuoteCell,
@@ -153,13 +164,24 @@ var OptionChain = React.forwardRef(
153
164
  /* @__PURE__ */ jsx(QuoteCell, { value: fmtPct(c?.iv) }),
154
165
  /* @__PURE__ */ jsx(QuoteCell, { value: fmt(c?.delta, 3) }),
155
166
  /* @__PURE__ */ jsx(
156
- "td",
167
+ View,
157
168
  {
158
- className: cn(
159
- "px-2 py-1 text-center font-mono tabular-nums text-xs font-semibold",
160
- isATM ? "text-[var(--foreground)] bg-[var(--secondary)]" : "text-[var(--muted-foreground)]"
161
- ),
162
- children: fmt(row.strike)
169
+ unstyled: true,
170
+ render: /* @__PURE__ */ jsx("td", {}),
171
+ paddingHorizontal: 8,
172
+ paddingVertical: 4,
173
+ style: { display: "flex", alignItems: "center", justifyContent: "center" },
174
+ children: /* @__PURE__ */ jsx(
175
+ Text,
176
+ {
177
+ fontSize: 12,
178
+ fontWeight: "600",
179
+ style: { fontFamily: "monospace" },
180
+ fontVariant: ["tabular-nums"],
181
+ color: isATM ? "var(--foreground)" : "var(--muted-foreground)",
182
+ children: fmt(row.strike)
183
+ }
184
+ )
163
185
  }
164
186
  ),
165
187
  /* @__PURE__ */ jsx(QuoteCell, { value: fmt(p?.delta, 3), align: "right" }),