@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
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var classVarianceAuthority = require('class-variance-authority');
4
+ var core = require('@hanzogui/core');
5
5
  var React = require('react');
6
6
  var clsx = require('clsx');
7
7
  var tailwindMerge = require('tailwind-merge');
@@ -31,272 +31,137 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
31
  function cn(...inputs) {
32
32
  return tailwindMerge.twMerge(clsx.clsx(inputs));
33
33
  }
34
- var SPACING_SCALE = 4;
35
- function toStylePx(value) {
36
- if (value === void 0) return void 0;
37
- if (typeof value === "string") return value;
38
- return `${value * SPACING_SCALE}px`;
34
+ var SHIM_PROPS = [
35
+ "w",
36
+ "h",
37
+ "minW",
38
+ "maxW",
39
+ "display",
40
+ "flexGrow",
41
+ "flexShrink",
42
+ "flexBasis",
43
+ "fontWeight",
44
+ "textStyle",
45
+ "borderRadius",
46
+ "alignSelf",
47
+ "alignItems",
48
+ "justifyContent",
49
+ "color",
50
+ "mt",
51
+ "mb",
52
+ "ml",
53
+ "mr",
54
+ "height",
55
+ "overflow",
56
+ "whiteSpace",
57
+ "textOverflow",
58
+ "textTransform",
59
+ "gap",
60
+ "gridTemplateColumns",
61
+ "minWidth",
62
+ "boxSize",
63
+ "py",
64
+ "px",
65
+ "p",
66
+ "hideBelow",
67
+ "fontSize",
68
+ "flexWrap",
69
+ "wordBreak",
70
+ "lineHeight",
71
+ "marginRight",
72
+ "position",
73
+ "background"
74
+ ];
75
+ var S = 4;
76
+ function dim(v) {
77
+ if (v == null) return void 0;
78
+ if (typeof v === "number") return `${v * S}px`;
79
+ if (typeof v === "string") return v;
80
+ if (typeof v === "object") {
81
+ const o = v;
82
+ return o.base ?? o.lg ?? o.xl ?? Object.values(o)[0];
83
+ }
84
+ return void 0;
39
85
  }
40
- function extractSkeletonStyleProps(props) {
41
- const style = {};
42
- const rest = {};
43
- function resolveDimension(value) {
44
- if (value === void 0 || value === null) return void 0;
45
- if (typeof value === "number") return `${value * SPACING_SCALE}px`;
46
- if (typeof value === "string") return value;
47
- if (typeof value === "object") {
48
- const obj = value;
49
- return obj.base ?? obj.lg ?? obj.xl ?? Object.values(obj)[0];
50
- }
51
- return void 0;
86
+ function sp(v) {
87
+ if (v === void 0) return void 0;
88
+ return typeof v === "number" ? `${v * S}px` : v;
89
+ }
90
+ function shimToStyle(props) {
91
+ const s = {};
92
+ if (props.w !== void 0) s.width = dim(props.w);
93
+ if (props.h !== void 0) s.height = dim(props.h);
94
+ if (props.minW !== void 0) s.minWidth = dim(props.minW);
95
+ if (props.maxW !== void 0) s.maxWidth = dim(props.maxW);
96
+ if (props.display !== void 0) s.display = props.display;
97
+ if (props.flexGrow !== void 0) s.flexGrow = props.flexGrow;
98
+ if (props.flexShrink !== void 0) s.flexShrink = props.flexShrink;
99
+ if (props.flexBasis !== void 0) s.flexBasis = props.flexBasis;
100
+ if (props.fontWeight !== void 0) s.fontWeight = props.fontWeight;
101
+ if (props.borderRadius !== void 0) s.borderRadius = props.borderRadius;
102
+ if (props.alignSelf !== void 0) s.alignSelf = props.alignSelf;
103
+ if (props.alignItems !== void 0) s.alignItems = props.alignItems;
104
+ if (props.justifyContent !== void 0) s.justifyContent = props.justifyContent;
105
+ if (props.color !== void 0) s.color = props.color;
106
+ if (props.mt !== void 0) s.marginTop = sp(props.mt);
107
+ if (props.mb !== void 0) s.marginBottom = sp(props.mb);
108
+ if (props.ml !== void 0) s.marginLeft = sp(props.ml);
109
+ if (props.mr !== void 0) s.marginRight = sp(props.mr);
110
+ if (props.height !== void 0) s.height = props.height;
111
+ if (props.overflow !== void 0) s.overflow = props.overflow;
112
+ if (props.whiteSpace !== void 0) s.whiteSpace = props.whiteSpace;
113
+ if (props.textOverflow !== void 0) s.textOverflow = props.textOverflow;
114
+ if (props.textTransform !== void 0) s.textTransform = props.textTransform;
115
+ if (props.gap !== void 0) s.gap = sp(props.gap);
116
+ if (props.gridTemplateColumns !== void 0) s.gridTemplateColumns = props.gridTemplateColumns;
117
+ if (props.minWidth !== void 0) s.minWidth = props.minWidth;
118
+ if (props.boxSize !== void 0) {
119
+ const v = typeof props.boxSize === "number" ? `${props.boxSize * S}px` : props.boxSize;
120
+ s.width = v;
121
+ s.height = v;
52
122
  }
53
- for (const [key, value] of Object.entries(props)) {
54
- if (value === void 0) continue;
55
- switch (key) {
56
- case "w": {
57
- const v = resolveDimension(value);
58
- if (v) style.width = v;
59
- break;
60
- }
61
- case "h": {
62
- const v = resolveDimension(value);
63
- if (v) style.height = v;
64
- break;
65
- }
66
- case "minW": {
67
- const v = resolveDimension(value);
68
- if (v) style.minWidth = v;
69
- break;
70
- }
71
- case "maxW": {
72
- const v = resolveDimension(value);
73
- if (v) style.maxWidth = v;
74
- break;
75
- }
76
- case "height":
77
- style.height = value;
78
- break;
79
- case "display":
80
- style.display = value;
81
- break;
82
- case "flexGrow":
83
- style.flexGrow = value;
84
- break;
85
- case "flexShrink":
86
- style.flexShrink = value;
87
- break;
88
- case "flexBasis":
89
- style.flexBasis = value;
90
- break;
91
- case "fontWeight":
92
- style.fontWeight = value;
93
- break;
94
- case "borderRadius":
95
- style.borderRadius = value;
96
- break;
97
- case "alignSelf":
98
- style.alignSelf = value;
99
- break;
100
- case "alignItems":
101
- style.alignItems = value;
102
- break;
103
- case "justifyContent":
104
- style.justifyContent = value;
105
- break;
106
- case "color":
107
- style.color = value;
108
- break;
109
- case "mt":
110
- style.marginTop = toStylePx(value);
111
- break;
112
- case "mb":
113
- style.marginBottom = toStylePx(value);
114
- break;
115
- case "ml":
116
- style.marginLeft = toStylePx(value);
117
- break;
118
- case "mr":
119
- style.marginRight = toStylePx(value);
120
- break;
121
- case "overflow":
122
- style.overflow = value;
123
- break;
124
- case "whiteSpace":
125
- style.whiteSpace = value;
126
- break;
127
- case "textOverflow":
128
- style.textOverflow = value;
129
- break;
130
- case "textTransform":
131
- style.textTransform = value;
132
- break;
133
- case "gap":
134
- style.gap = typeof value === "number" ? `${value * SPACING_SCALE}px` : value;
135
- break;
136
- case "gridTemplateColumns":
137
- style.gridTemplateColumns = value;
138
- break;
139
- case "minWidth":
140
- style.minWidth = value;
141
- break;
142
- case "boxSize": {
143
- const s = typeof value === "number" ? `${value * SPACING_SCALE}px` : value;
144
- style.width = s;
145
- style.height = s;
146
- break;
147
- }
148
- case "py": {
149
- const v = toStylePx(value);
150
- style.paddingTop = v;
151
- style.paddingBottom = v;
152
- break;
153
- }
154
- case "px": {
155
- const v = toStylePx(value);
156
- style.paddingLeft = v;
157
- style.paddingRight = v;
158
- break;
159
- }
160
- case "p": {
161
- const v = toStylePx(value);
162
- style.padding = v;
163
- break;
164
- }
165
- case "hideBelow":
166
- break;
167
- // handled via className
168
- case "textStyle":
169
- break;
170
- // drop textStyle, not directly applicable
171
- case "fontSize":
172
- style.fontSize = value;
173
- break;
174
- case "flexWrap":
175
- style.flexWrap = value;
176
- break;
177
- case "wordBreak":
178
- style.wordBreak = value;
179
- break;
180
- case "lineHeight":
181
- style.lineHeight = value;
182
- break;
183
- case "marginRight":
184
- style.marginRight = value;
185
- break;
186
- case "position":
187
- style.position = value;
188
- break;
189
- case "background":
190
- style.background = value;
191
- break;
192
- default:
193
- rest[key] = value;
194
- break;
195
- }
123
+ if (props.py !== void 0) {
124
+ const v = sp(props.py);
125
+ s.paddingTop = v;
126
+ s.paddingBottom = v;
127
+ }
128
+ if (props.px !== void 0) {
129
+ const v = sp(props.px);
130
+ s.paddingLeft = v;
131
+ s.paddingRight = v;
196
132
  }
197
- return { style, rest };
133
+ if (props.p !== void 0) s.padding = sp(props.p);
134
+ if (props.fontSize !== void 0) s.fontSize = props.fontSize;
135
+ if (props.flexWrap !== void 0) s.flexWrap = props.flexWrap;
136
+ if (props.wordBreak !== void 0) s.wordBreak = props.wordBreak;
137
+ if (props.lineHeight !== void 0) s.lineHeight = props.lineHeight;
138
+ if (props.marginRight !== void 0) s.marginRight = props.marginRight;
139
+ if (props.position !== void 0) s.position = props.position;
140
+ if (props.background !== void 0) s.background = props.background;
141
+ return s;
198
142
  }
143
+ function stripShims(props) {
144
+ const out = { ...props };
145
+ for (const k of SHIM_PROPS) delete out[k];
146
+ return out;
147
+ }
148
+ var SKELETON_CLASSES = [
149
+ "animate-skeleton-shimmer rounded-sm",
150
+ "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
151
+ "bg-[length:200%_100%]"
152
+ ].join(" ");
153
+ var HIDE_BELOW_MAP = { lg: "lg:hidden", md: "md:hidden", sm: "sm:hidden" };
199
154
  var Skeleton = React__namespace.forwardRef(
200
155
  function Skeleton2(props, ref) {
201
- const {
202
- loading = false,
203
- asChild,
204
- className,
205
- children,
206
- style: styleProp,
207
- // Destructure style-prop shims so they don't leak into DOM
208
- w: _w,
209
- h: _h,
210
- minW: _minW,
211
- maxW: _maxW,
212
- display: _display,
213
- flexGrow: _flexGrow,
214
- flexShrink: _flexShrink,
215
- flexBasis: _flexBasis,
216
- fontWeight: _fontWeight,
217
- textStyle: _textStyle,
218
- borderRadius: _borderRadius,
219
- alignSelf: _alignSelf,
220
- alignItems: _alignItems,
221
- justifyContent: _justifyContent,
222
- color: _color,
223
- mt: _mt,
224
- mb: _mb,
225
- ml: _ml,
226
- mr: _mr,
227
- height: _height,
228
- overflow: _overflow,
229
- whiteSpace: _whiteSpace,
230
- textOverflow: _textOverflow,
231
- textTransform: _textTransform,
232
- gap: _gap,
233
- gridTemplateColumns: _gridTemplateColumns,
234
- minWidth: _minWidth,
235
- boxSize: _boxSize,
236
- py: _py,
237
- px: _px,
238
- p: _p,
239
- hideBelow: _hideBelow,
240
- fontSize: _fontSize,
241
- flexWrap: _flexWrap,
242
- wordBreak: _wordBreak,
243
- lineHeight: _lineHeight,
244
- marginRight: _marginRight,
245
- position: _position,
246
- background: _background,
247
- as: Component = "div",
248
- ...htmlRest
249
- } = props;
250
- const { style: shimStyle } = extractSkeletonStyleProps({
251
- w: _w,
252
- h: _h,
253
- minW: _minW,
254
- maxW: _maxW,
255
- display: _display,
256
- flexGrow: _flexGrow,
257
- flexShrink: _flexShrink,
258
- flexBasis: _flexBasis,
259
- fontWeight: _fontWeight,
260
- textStyle: _textStyle,
261
- borderRadius: _borderRadius,
262
- alignSelf: _alignSelf,
263
- alignItems: _alignItems,
264
- justifyContent: _justifyContent,
265
- color: _color,
266
- mt: _mt,
267
- mb: _mb,
268
- ml: _ml,
269
- mr: _mr,
270
- height: _height,
271
- overflow: _overflow,
272
- whiteSpace: _whiteSpace,
273
- textOverflow: _textOverflow,
274
- textTransform: _textTransform,
275
- gap: _gap,
276
- gridTemplateColumns: _gridTemplateColumns,
277
- minWidth: _minWidth,
278
- boxSize: _boxSize,
279
- py: _py,
280
- px: _px,
281
- p: _p,
282
- hideBelow: _hideBelow,
283
- fontSize: _fontSize,
284
- flexWrap: _flexWrap,
285
- wordBreak: _wordBreak,
286
- lineHeight: _lineHeight,
287
- marginRight: _marginRight,
288
- position: _position,
289
- background: _background
290
- });
156
+ const { loading = false, asChild, className, children, style: styleProp, as: Component = "div", ...allRest } = props;
157
+ const shimStyle = shimToStyle(props);
291
158
  const mergedStyle = Object.keys(shimStyle).length > 0 || styleProp ? { ...shimStyle, ...styleProp } : void 0;
292
- const HIDE_BELOW_MAP = { lg: "lg:hidden", md: "md:hidden", sm: "sm:hidden" };
293
- const hideBelowClass = _hideBelow ? HIDE_BELOW_MAP[_hideBelow] : void 0;
294
- const finalClassName = hideBelowClass ? cn(className, hideBelowClass) : className;
159
+ const hideBelowClass = props.hideBelow ? HIDE_BELOW_MAP[props.hideBelow] : void 0;
160
+ const cls = hideBelowClass ? cn(className, hideBelowClass) : className;
161
+ const htmlRest = stripShims(allRest);
295
162
  if (!loading) {
296
- if (asChild && React__namespace.isValidElement(children)) {
297
- return children;
298
- }
299
- return /* @__PURE__ */ jsxRuntime.jsx(Component, { ref, className: finalClassName, style: mergedStyle, ...htmlRest, children });
163
+ if (asChild && React__namespace.isValidElement(children)) return children;
164
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, { ref, className: cls, style: mergedStyle, ...htmlRest, children });
300
165
  }
301
166
  if (asChild && React__namespace.isValidElement(children)) {
302
167
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -304,13 +169,7 @@ var Skeleton = React__namespace.forwardRef(
304
169
  {
305
170
  ref,
306
171
  "data-loading": true,
307
- className: cn(
308
- "animate-skeleton-shimmer rounded-sm",
309
- "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
310
- "bg-[length:200%_100%]",
311
- "text-transparent [&_*]:invisible",
312
- finalClassName
313
- ),
172
+ className: cn(SKELETON_CLASSES, "text-transparent [&_*]:invisible", cls),
314
173
  style: mergedStyle,
315
174
  ...htmlRest,
316
175
  children
@@ -322,13 +181,7 @@ var Skeleton = React__namespace.forwardRef(
322
181
  {
323
182
  ref,
324
183
  "data-loading": true,
325
- className: cn(
326
- "animate-skeleton-shimmer rounded-sm",
327
- "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
328
- "bg-[length:200%_100%]",
329
- children ? "text-transparent [&_*]:invisible" : "min-h-5",
330
- finalClassName
331
- ),
184
+ className: cn(SKELETON_CLASSES, children ? "text-transparent [&_*]:invisible" : "min-h-5", cls),
332
185
  style: mergedStyle,
333
186
  ...htmlRest,
334
187
  children
@@ -365,64 +218,77 @@ React__namespace.forwardRef(
365
218
  )) });
366
219
  }
367
220
  );
368
- var iconButtonVariants = classVarianceAuthority.cva(
369
- // base
370
- [
371
- "inline-flex items-center justify-center",
372
- "p-0 min-w-auto shrink-0",
373
- "cursor-pointer border-0 bg-transparent",
374
- "disabled:opacity-[var(--opacity-control-disabled,0.4)] disabled:cursor-not-allowed"
375
- ],
376
- {
377
- variants: {
378
- variant: {
379
- plain: "bg-transparent text-inherit border-none hover:bg-transparent",
380
- icon_secondary: [
381
- "bg-transparent text-icon-secondary border-none",
382
- "hover:text-hover",
383
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
384
- "data-[selected]:hover:text-hover",
385
- "data-[expanded]:text-hover"
386
- ],
387
- icon_background: [
388
- "bg-[var(--color-button-icon-background-bg)] text-icon-secondary border-none",
389
- "hover:text-hover",
390
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
391
- "data-[selected]:hover:text-hover",
392
- "data-[expanded]:text-hover"
393
- ],
394
- link: [
395
- "bg-transparent text-link-primary border-none font-normal px-0 h-auto",
396
- "hover:bg-transparent hover:text-link-primary-hover",
397
- "disabled:text-text-secondary"
398
- ],
399
- dropdown: [
400
- "border-2 border-solid bg-transparent",
401
- "text-[var(--color-button-dropdown-fg)] border-[var(--color-button-dropdown-border)]",
402
- "hover:bg-transparent hover:text-hover hover:border-hover",
403
- "data-[expanded]:bg-transparent data-[expanded]:text-hover data-[expanded]:border-hover",
404
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent",
405
- "data-[selected]:hover:text-hover"
406
- ],
407
- pagination: [
408
- "border-2 border-solid bg-transparent",
409
- "text-[var(--color-button-pagination-fg)] border-[var(--color-button-pagination-border)]",
410
- "hover:bg-transparent hover:text-hover hover:border-hover",
411
- "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent"
412
- ]
413
- },
414
- size: {
415
- "2xs": "size-5 rounded-sm [&_svg]:size-5",
416
- "2xs_alt": "size-5 rounded-sm [&_svg]:size-3",
417
- md: "size-8 rounded-[var(--radius-base,8px)] [&_svg]:size-5"
418
- }
221
+ var IconButtonFrame = core.styled(core.View, {
222
+ name: "LuxIconButton",
223
+ render: /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button" }),
224
+ role: "button",
225
+ cursor: "pointer",
226
+ display: "inline-flex",
227
+ alignItems: "center",
228
+ justifyContent: "center",
229
+ padding: 0,
230
+ minWidth: "auto",
231
+ flexShrink: 1,
232
+ backgroundColor: "transparent",
233
+ borderWidth: 0,
234
+ variants: {
235
+ size: {
236
+ "2xs": { width: 20, height: 20, borderRadius: 4 },
237
+ "2xs_alt": { width: 20, height: 20, borderRadius: 4 },
238
+ md: { width: 32, height: 32, borderRadius: "var(--radius-base, 8px)" }
419
239
  },
420
- defaultVariants: {
421
- variant: "plain"
240
+ disabled: {
241
+ true: {
242
+ opacity: 0.4,
243
+ cursor: "not-allowed",
244
+ pointerEvents: "none"
245
+ }
422
246
  }
423
247
  }
424
- );
425
- var IconButton = React__namespace.default.forwardRef(
248
+ });
249
+ var VARIANT_CLASSES = {
250
+ plain: "bg-transparent text-inherit border-none hover:bg-transparent",
251
+ icon_secondary: [
252
+ "bg-transparent text-icon-secondary border-none",
253
+ "hover:text-hover",
254
+ "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
255
+ "data-[selected]:hover:text-hover",
256
+ "data-[expanded]:text-hover"
257
+ ].join(" "),
258
+ icon_background: [
259
+ "bg-[var(--color-button-icon-background-bg)] text-icon-secondary border-none",
260
+ "hover:text-hover",
261
+ "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text",
262
+ "data-[selected]:hover:text-hover",
263
+ "data-[expanded]:text-hover"
264
+ ].join(" "),
265
+ link: [
266
+ "bg-transparent text-link-primary border-none font-normal px-0 h-auto",
267
+ "hover:bg-transparent hover:text-link-primary-hover",
268
+ "disabled:text-text-secondary"
269
+ ].join(" "),
270
+ dropdown: [
271
+ "border-2 border-solid bg-transparent",
272
+ "text-[var(--color-button-dropdown-fg)] border-[var(--color-button-dropdown-border)]",
273
+ "hover:bg-transparent hover:text-hover hover:border-hover",
274
+ "data-[expanded]:bg-transparent data-[expanded]:text-hover data-[expanded]:border-hover",
275
+ "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent",
276
+ "data-[selected]:hover:text-hover"
277
+ ].join(" "),
278
+ pagination: [
279
+ "border-2 border-solid bg-transparent",
280
+ "text-[var(--color-button-pagination-fg)] border-[var(--color-button-pagination-border)]",
281
+ "hover:bg-transparent hover:text-hover hover:border-hover",
282
+ "data-[selected]:bg-selected-control-bg data-[selected]:text-selected-control-text data-[selected]:border-transparent"
283
+ ].join(" ")
284
+ };
285
+ var ICON_SIZE_CLASSES = {
286
+ "2xs": "[&_svg]:size-5",
287
+ "2xs_alt": "[&_svg]:size-3",
288
+ md: "[&_svg]:size-5"
289
+ };
290
+ var SP = 4;
291
+ var IconButton = React__namespace.forwardRef(
426
292
  function IconButton2(props, ref) {
427
293
  const {
428
294
  size,
@@ -435,7 +301,7 @@ var IconButton = React__namespace.default.forwardRef(
435
301
  disabled,
436
302
  className,
437
303
  children,
438
- as: Comp = "button",
304
+ as: _as,
439
305
  style: styleProp,
440
306
  // Strip Chakra style props
441
307
  boxSize: _boxSize,
@@ -448,7 +314,6 @@ var IconButton = React__namespace.default.forwardRef(
448
314
  _expanded,
449
315
  ...rest
450
316
  } = props;
451
- const SP = 4;
452
317
  const shimStyle = { ...styleProp };
453
318
  if (_boxSize !== void 0) {
454
319
  const bs = typeof _boxSize === "number" ? `${_boxSize * SP}px` : _boxSize;
@@ -464,21 +329,32 @@ var IconButton = React__namespace.default.forwardRef(
464
329
  if (_borderRadius) shimStyle.borderRadius = _borderRadius;
465
330
  if (_ml !== void 0) shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * SP}px` : _ml;
466
331
  if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * SP}px` : _mr;
467
- const mergedBtnStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
332
+ const mergedStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
333
+ const variantClass = VARIANT_CLASSES[variant] ?? VARIANT_CLASSES.plain;
334
+ const iconSizeClass = size ? ICON_SIZE_CLASSES[size] ?? "" : "";
335
+ const combinedClassName = [variantClass, iconSizeClass, className].filter(Boolean).join(" ");
468
336
  const button = /* @__PURE__ */ jsxRuntime.jsx(
469
- Comp,
337
+ IconButtonFrame,
470
338
  {
471
339
  ref,
472
- type: Comp === "button" ? "button" : void 0,
473
- disabled: !loadingSkeleton && (loading || disabled),
474
- className: cn(iconButtonVariants({ variant, size }), className),
475
- style: mergedBtnStyle,
340
+ size,
341
+ disabled: !loadingSkeleton && (loading || disabled) || void 0,
342
+ render: _as ? React__namespace.createElement(_as) : void 0,
343
+ className: combinedClassName,
344
+ style: mergedStyle,
476
345
  ...expanded ? { "data-expanded": true } : {},
477
346
  ...selected ? { "data-selected": true } : {},
478
347
  ...highlighted ? { "data-highlighted": true } : {},
479
348
  ...loadingSkeleton ? { "data-loading-skeleton": true } : {},
480
349
  ...rest,
481
- children: loading ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block size-5 animate-spin rounded-full border-2 border-current border-b-transparent border-l-transparent" }) : children
350
+ children: loading ? /* @__PURE__ */ jsxRuntime.jsx(
351
+ "span",
352
+ {
353
+ className: "inline-block size-5 animate-spin rounded-full border-2 border-current border-b-transparent border-l-transparent",
354
+ role: "status",
355
+ "aria-label": "Loading"
356
+ }
357
+ ) : children
482
358
  }
483
359
  );
484
360
  if (loadingSkeleton) {
@@ -1,8 +1,8 @@
1
- import React__default from 'react';
1
+ import * as React from 'react';
2
2
 
3
3
  type Variant = 'plain' | 'icon_secondary' | 'icon_background' | 'link' | 'dropdown' | 'pagination';
4
4
  type Size = '2xs' | '2xs_alt' | 'md';
5
- interface IconButtonProps extends React__default.ButtonHTMLAttributes<HTMLButtonElement> {
5
+ interface IconButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'> {
6
6
  /** Visual variant */
7
7
  variant?: Variant;
8
8
  /** Icon-button size */
@@ -18,7 +18,7 @@ interface IconButtonProps extends React__default.ButtonHTMLAttributes<HTMLButton
18
18
  /** Maps to data-highlighted */
19
19
  highlighted?: boolean;
20
20
  /** Polymorphic element type (e.g. "div") */
21
- as?: React__default.ElementType;
21
+ as?: React.ElementType;
22
22
  boxSize?: number | string;
23
23
  color?: string;
24
24
  px?: string | number;
@@ -28,6 +28,6 @@ interface IconButtonProps extends React__default.ButtonHTMLAttributes<HTMLButton
28
28
  _hover?: Record<string, string>;
29
29
  _expanded?: Record<string, string>;
30
30
  }
31
- declare const IconButton: React__default.ForwardRefExoticComponent<IconButtonProps & React__default.RefAttributes<HTMLButtonElement>>;
31
+ declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
32
32
 
33
33
  export { IconButton, type IconButtonProps };
@@ -1,8 +1,8 @@
1
- import React__default from 'react';
1
+ import * as React from 'react';
2
2
 
3
3
  type Variant = 'plain' | 'icon_secondary' | 'icon_background' | 'link' | 'dropdown' | 'pagination';
4
4
  type Size = '2xs' | '2xs_alt' | 'md';
5
- interface IconButtonProps extends React__default.ButtonHTMLAttributes<HTMLButtonElement> {
5
+ interface IconButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'> {
6
6
  /** Visual variant */
7
7
  variant?: Variant;
8
8
  /** Icon-button size */
@@ -18,7 +18,7 @@ interface IconButtonProps extends React__default.ButtonHTMLAttributes<HTMLButton
18
18
  /** Maps to data-highlighted */
19
19
  highlighted?: boolean;
20
20
  /** Polymorphic element type (e.g. "div") */
21
- as?: React__default.ElementType;
21
+ as?: React.ElementType;
22
22
  boxSize?: number | string;
23
23
  color?: string;
24
24
  px?: string | number;
@@ -28,6 +28,6 @@ interface IconButtonProps extends React__default.ButtonHTMLAttributes<HTMLButton
28
28
  _hover?: Record<string, string>;
29
29
  _expanded?: Record<string, string>;
30
30
  }
31
- declare const IconButton: React__default.ForwardRefExoticComponent<IconButtonProps & React__default.RefAttributes<HTMLButtonElement>>;
31
+ declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
32
32
 
33
33
  export { IconButton, type IconButtonProps };