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