@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
package/dist/textarea.cjs CHANGED
@@ -1,7 +1,6 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var classVarianceAuthority = require('class-variance-authority');
5
4
  var React = require('react');
6
5
  var clsx = require('clsx');
7
6
  var tailwindMerge = require('tailwind-merge');
@@ -15,46 +14,36 @@ var React__default = /*#__PURE__*/_interopDefault(React);
15
14
  function cn(...inputs) {
16
15
  return tailwindMerge.twMerge(clsx.clsx(inputs));
17
16
  }
18
- var textareaVariants = classVarianceAuthority.cva(
19
- [
20
- "w-full appearance-none outline-none transition-colors resize-y",
21
- "bg-[var(--color-input-bg)] text-[var(--color-input-fg)] border-[var(--color-input-border)]",
22
- "placeholder:text-[var(--color-input-placeholder,theme(colors.gray.400))]",
23
- "hover:border-[var(--color-input-border-hover,theme(colors.gray.400))]",
24
- "focus:border-[var(--color-input-border-focus,theme(colors.blue.500))]",
25
- "focus:placeholder:text-[var(--color-input-placeholder-focus,theme(colors.gray.300))]",
26
- "disabled:opacity-40 disabled:cursor-not-allowed",
27
- "read-only:opacity-70",
28
- "data-[invalid]:border-[var(--color-input-border-invalid,theme(colors.red.500))]"
29
- ].join(" "),
30
- {
31
- variants: {
32
- size: {
33
- xs: "px-2 py-1 text-xs rounded",
34
- sm: "px-3 py-2 text-sm rounded-md",
35
- md: "px-4 py-2 text-base rounded-md",
36
- lg: "px-4 py-3 text-lg rounded-lg",
37
- "2xl": "px-4 py-3 text-xl rounded-lg"
38
- },
39
- variant: {
40
- outline: "border border-solid",
41
- filled: "border-0 bg-[var(--color-input-filled-bg,theme(colors.gray.100))]",
42
- unstyled: "border-0 bg-transparent p-0"
43
- }
44
- },
45
- defaultVariants: {
46
- size: "md",
47
- variant: "outline"
48
- }
49
- }
50
- );
17
+ var TEXTAREA_BASE = [
18
+ "w-full appearance-none outline-none transition-colors resize-y",
19
+ "bg-[var(--color-input-bg)] text-[var(--color-input-fg)] border-[var(--color-input-border)]",
20
+ "placeholder:text-[var(--color-input-placeholder,theme(colors.gray.400))]",
21
+ "hover:border-[var(--color-input-border-hover,theme(colors.gray.400))]",
22
+ "focus:border-[var(--color-input-border-focus,theme(colors.blue.500))]",
23
+ "focus:placeholder:text-[var(--color-input-placeholder-focus,theme(colors.gray.300))]",
24
+ "disabled:opacity-40 disabled:cursor-not-allowed",
25
+ "read-only:opacity-70",
26
+ "data-[invalid]:border-[var(--color-input-border-invalid,theme(colors.red.500))]"
27
+ ].join(" ");
28
+ var TEXTAREA_SIZE_CLASSES = {
29
+ xs: "px-2 py-1 text-xs rounded",
30
+ sm: "px-3 py-2 text-sm rounded-md",
31
+ md: "px-4 py-2 text-base rounded-md",
32
+ lg: "px-4 py-3 text-lg rounded-lg",
33
+ "2xl": "px-4 py-3 text-xl rounded-lg"
34
+ };
35
+ var TEXTAREA_VARIANT_CLASSES = {
36
+ outline: "border border-solid",
37
+ filled: "border-0 bg-[var(--color-input-filled-bg,theme(colors.gray.100))]",
38
+ unstyled: "border-0 bg-transparent p-0"
39
+ };
51
40
  var Textarea = React__default.default.forwardRef(
52
- ({ size, variant, className, ...rest }, ref) => {
41
+ ({ size = "md", variant = "outline", className, ...rest }, ref) => {
53
42
  return /* @__PURE__ */ jsxRuntime.jsx(
54
43
  "textarea",
55
44
  {
56
45
  ref,
57
- className: cn(textareaVariants({ size, variant }), className),
46
+ className: cn(TEXTAREA_BASE, TEXTAREA_SIZE_CLASSES[size], TEXTAREA_VARIANT_CLASSES[variant], className),
58
47
  ...rest
59
48
  }
60
49
  );
package/dist/textarea.js CHANGED
@@ -1,5 +1,4 @@
1
1
  "use client";
2
- import { cva } from 'class-variance-authority';
3
2
  import React from 'react';
4
3
  import { clsx } from 'clsx';
5
4
  import { twMerge } from 'tailwind-merge';
@@ -9,46 +8,36 @@ import { jsx } from 'react/jsx-runtime';
9
8
  function cn(...inputs) {
10
9
  return twMerge(clsx(inputs));
11
10
  }
12
- var textareaVariants = cva(
13
- [
14
- "w-full appearance-none outline-none transition-colors resize-y",
15
- "bg-[var(--color-input-bg)] text-[var(--color-input-fg)] border-[var(--color-input-border)]",
16
- "placeholder:text-[var(--color-input-placeholder,theme(colors.gray.400))]",
17
- "hover:border-[var(--color-input-border-hover,theme(colors.gray.400))]",
18
- "focus:border-[var(--color-input-border-focus,theme(colors.blue.500))]",
19
- "focus:placeholder:text-[var(--color-input-placeholder-focus,theme(colors.gray.300))]",
20
- "disabled:opacity-40 disabled:cursor-not-allowed",
21
- "read-only:opacity-70",
22
- "data-[invalid]:border-[var(--color-input-border-invalid,theme(colors.red.500))]"
23
- ].join(" "),
24
- {
25
- variants: {
26
- size: {
27
- xs: "px-2 py-1 text-xs rounded",
28
- sm: "px-3 py-2 text-sm rounded-md",
29
- md: "px-4 py-2 text-base rounded-md",
30
- lg: "px-4 py-3 text-lg rounded-lg",
31
- "2xl": "px-4 py-3 text-xl rounded-lg"
32
- },
33
- variant: {
34
- outline: "border border-solid",
35
- filled: "border-0 bg-[var(--color-input-filled-bg,theme(colors.gray.100))]",
36
- unstyled: "border-0 bg-transparent p-0"
37
- }
38
- },
39
- defaultVariants: {
40
- size: "md",
41
- variant: "outline"
42
- }
43
- }
44
- );
11
+ var TEXTAREA_BASE = [
12
+ "w-full appearance-none outline-none transition-colors resize-y",
13
+ "bg-[var(--color-input-bg)] text-[var(--color-input-fg)] border-[var(--color-input-border)]",
14
+ "placeholder:text-[var(--color-input-placeholder,theme(colors.gray.400))]",
15
+ "hover:border-[var(--color-input-border-hover,theme(colors.gray.400))]",
16
+ "focus:border-[var(--color-input-border-focus,theme(colors.blue.500))]",
17
+ "focus:placeholder:text-[var(--color-input-placeholder-focus,theme(colors.gray.300))]",
18
+ "disabled:opacity-40 disabled:cursor-not-allowed",
19
+ "read-only:opacity-70",
20
+ "data-[invalid]:border-[var(--color-input-border-invalid,theme(colors.red.500))]"
21
+ ].join(" ");
22
+ var TEXTAREA_SIZE_CLASSES = {
23
+ xs: "px-2 py-1 text-xs rounded",
24
+ sm: "px-3 py-2 text-sm rounded-md",
25
+ md: "px-4 py-2 text-base rounded-md",
26
+ lg: "px-4 py-3 text-lg rounded-lg",
27
+ "2xl": "px-4 py-3 text-xl rounded-lg"
28
+ };
29
+ var TEXTAREA_VARIANT_CLASSES = {
30
+ outline: "border border-solid",
31
+ filled: "border-0 bg-[var(--color-input-filled-bg,theme(colors.gray.100))]",
32
+ unstyled: "border-0 bg-transparent p-0"
33
+ };
45
34
  var Textarea = React.forwardRef(
46
- ({ size, variant, className, ...rest }, ref) => {
35
+ ({ size = "md", variant = "outline", className, ...rest }, ref) => {
47
36
  return /* @__PURE__ */ jsx(
48
37
  "textarea",
49
38
  {
50
39
  ref,
51
- className: cn(textareaVariants({ size, variant }), className),
40
+ className: cn(TEXTAREA_BASE, TEXTAREA_SIZE_CLASSES[size], TEXTAREA_VARIANT_CLASSES[variant], className),
52
41
  ...rest
53
42
  }
54
43
  );
package/dist/tooltip.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var RadixTooltip = require('@radix-ui/react-tooltip');
4
+ var tooltip = require('@hanzogui/tooltip');
5
5
  var usehooks = require('@uidotdev/usehooks');
6
6
  var React = require('react');
7
7
  var clsx = require('clsx');
@@ -26,7 +26,6 @@ function _interopNamespace(e) {
26
26
  return Object.freeze(n);
27
27
  }
28
28
 
29
- var RadixTooltip__namespace = /*#__PURE__*/_interopNamespace(RadixTooltip);
30
29
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
30
 
32
31
  // src/tooltip.tsx
@@ -48,6 +47,10 @@ function useIsMobile() {
48
47
  }, []);
49
48
  return isMobile;
50
49
  }
50
+ function mapPlacement(p) {
51
+ if (!p) return void 0;
52
+ return p;
53
+ }
51
54
  var Tooltip = React__namespace.forwardRef(
52
55
  function Tooltip2(props, ref) {
53
56
  const {
@@ -58,10 +61,8 @@ var Tooltip = React__namespace.forwardRef(
58
61
  children,
59
62
  disabled,
60
63
  disableOnMobile,
61
- portalled = true,
62
64
  content,
63
65
  contentProps,
64
- portalRef,
65
66
  defaultOpen = false,
66
67
  triggerProps,
67
68
  closeDelay = 100,
@@ -109,36 +110,34 @@ var Tooltip = React__namespace.forwardRef(
109
110
  if (disabled || disableOnMobile && isMobile) return children;
110
111
  const defaultShowArrow = variant === "popover" ? false : true;
111
112
  const showArrow = showArrowProp !== void 0 ? showArrowProp : defaultShowArrow;
112
- const placement = positioning?.placement ?? "top";
113
- const side = placement.split("-")[0];
114
- const align = placement.includes("-") ? placement.split("-")[1] : void 0;
115
- const sideOffset = positioning?.offset?.mainAxis ?? 4;
116
113
  const isPopover = variant === "popover";
117
- return /* @__PURE__ */ jsxRuntime.jsx(RadixTooltip__namespace.Provider, { delayDuration: openDelay, skipDelayDuration: 0, children: /* @__PURE__ */ jsxRuntime.jsxs(
118
- RadixTooltip__namespace.Root,
114
+ const placement = mapPlacement(positioning?.placement) ?? "top";
115
+ const offset = positioning?.offset?.mainAxis ?? 4;
116
+ return /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipGroup, { delay: openDelay, children: /* @__PURE__ */ jsxRuntime.jsxs(
117
+ tooltip.Tooltip,
119
118
  {
120
119
  open,
121
120
  onOpenChange: handleOpenChange,
122
- delayDuration: openDelay,
121
+ delay: { open: openDelay, close: closeDelay },
122
+ placement,
123
+ offset,
124
+ unstyled: true,
123
125
  children: [
124
126
  /* @__PURE__ */ jsxRuntime.jsx(
125
- RadixTooltip__namespace.Trigger,
127
+ tooltip.Tooltip.Trigger,
126
128
  {
127
129
  ref: open ? triggerRef : void 0,
128
130
  asChild: true,
129
- onClick: isMobile ? handleTriggerClick : void 0,
131
+ ...isMobile ? { onPress: handleTriggerClick } : {},
130
132
  ...triggerProps,
131
133
  children
132
134
  }
133
135
  ),
134
- /* @__PURE__ */ jsxRuntime.jsx(RadixTooltip__namespace.Portal, { container: portalled ? portalRef?.current ?? void 0 : void 0, children: /* @__PURE__ */ jsxRuntime.jsxs(
135
- RadixTooltip__namespace.Content,
136
+ /* @__PURE__ */ jsxRuntime.jsxs(
137
+ tooltip.Tooltip.Content,
136
138
  {
137
139
  ref,
138
- side,
139
- align,
140
- sideOffset,
141
- onClick: interactive ? handleContentClick : void 0,
140
+ unstyled: true,
142
141
  className: cn(
143
142
  "z-[9999] overflow-hidden rounded-lg px-3 py-2 text-sm",
144
143
  "animate-in fade-in-0 zoom-in-95",
@@ -147,12 +146,14 @@ var Tooltip = React__namespace.forwardRef(
147
146
  !isPopover && "bg-[var(--color-tooltip-bg)] text-[var(--color-tooltip-fg)] max-w-xs",
148
147
  contentProps?.className
149
148
  ),
149
+ onClick: interactive ? handleContentClick : void 0,
150
150
  ...selected ? { "data-selected": true } : {},
151
151
  ...contentProps,
152
152
  children: [
153
153
  showArrow && /* @__PURE__ */ jsxRuntime.jsx(
154
- RadixTooltip__namespace.Arrow,
154
+ tooltip.Tooltip.Arrow,
155
155
  {
156
+ unstyled: true,
156
157
  className: cn(
157
158
  isPopover ? "fill-[var(--color-popover-bg)]" : "fill-[var(--color-tooltip-bg)]"
158
159
  )
@@ -161,7 +162,7 @@ var Tooltip = React__namespace.forwardRef(
161
162
  content
162
163
  ]
163
164
  }
164
- ) })
165
+ )
165
166
  ]
166
167
  }
167
168
  ) });
@@ -1,4 +1,3 @@
1
- import * as RadixTooltip from '@radix-ui/react-tooltip';
2
1
  import * as React from 'react';
3
2
 
4
3
  interface TooltipProps {
@@ -7,8 +6,8 @@ interface TooltipProps {
7
6
  portalled?: boolean;
8
7
  portalRef?: React.RefObject<HTMLElement>;
9
8
  content: React.ReactNode;
10
- contentProps?: React.ComponentPropsWithoutRef<typeof RadixTooltip.Content>;
11
- triggerProps?: React.ComponentPropsWithoutRef<typeof RadixTooltip.Trigger>;
9
+ contentProps?: React.HTMLAttributes<HTMLDivElement>;
10
+ triggerProps?: React.HTMLAttributes<HTMLButtonElement>;
12
11
  disabled?: boolean;
13
12
  disableOnMobile?: boolean;
14
13
  children?: React.ReactNode;
package/dist/tooltip.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import * as RadixTooltip from '@radix-ui/react-tooltip';
2
1
  import * as React from 'react';
3
2
 
4
3
  interface TooltipProps {
@@ -7,8 +6,8 @@ interface TooltipProps {
7
6
  portalled?: boolean;
8
7
  portalRef?: React.RefObject<HTMLElement>;
9
8
  content: React.ReactNode;
10
- contentProps?: React.ComponentPropsWithoutRef<typeof RadixTooltip.Content>;
11
- triggerProps?: React.ComponentPropsWithoutRef<typeof RadixTooltip.Trigger>;
9
+ contentProps?: React.HTMLAttributes<HTMLDivElement>;
10
+ triggerProps?: React.HTMLAttributes<HTMLButtonElement>;
12
11
  disabled?: boolean;
13
12
  disableOnMobile?: boolean;
14
13
  children?: React.ReactNode;
package/dist/tooltip.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import * as RadixTooltip from '@radix-ui/react-tooltip';
2
+ import { TooltipGroup, Tooltip as Tooltip$1 } from '@hanzogui/tooltip';
3
3
  import { useClickAway } from '@uidotdev/usehooks';
4
4
  import * as React from 'react';
5
5
  import { clsx } from 'clsx';
@@ -25,6 +25,10 @@ function useIsMobile() {
25
25
  }, []);
26
26
  return isMobile;
27
27
  }
28
+ function mapPlacement(p) {
29
+ if (!p) return void 0;
30
+ return p;
31
+ }
28
32
  var Tooltip = React.forwardRef(
29
33
  function Tooltip2(props, ref) {
30
34
  const {
@@ -35,10 +39,8 @@ var Tooltip = React.forwardRef(
35
39
  children,
36
40
  disabled,
37
41
  disableOnMobile,
38
- portalled = true,
39
42
  content,
40
43
  contentProps,
41
- portalRef,
42
44
  defaultOpen = false,
43
45
  triggerProps,
44
46
  closeDelay = 100,
@@ -86,36 +88,34 @@ var Tooltip = React.forwardRef(
86
88
  if (disabled || disableOnMobile && isMobile) return children;
87
89
  const defaultShowArrow = variant === "popover" ? false : true;
88
90
  const showArrow = showArrowProp !== void 0 ? showArrowProp : defaultShowArrow;
89
- const placement = positioning?.placement ?? "top";
90
- const side = placement.split("-")[0];
91
- const align = placement.includes("-") ? placement.split("-")[1] : void 0;
92
- const sideOffset = positioning?.offset?.mainAxis ?? 4;
93
91
  const isPopover = variant === "popover";
94
- return /* @__PURE__ */ jsx(RadixTooltip.Provider, { delayDuration: openDelay, skipDelayDuration: 0, children: /* @__PURE__ */ jsxs(
95
- RadixTooltip.Root,
92
+ const placement = mapPlacement(positioning?.placement) ?? "top";
93
+ const offset = positioning?.offset?.mainAxis ?? 4;
94
+ return /* @__PURE__ */ jsx(TooltipGroup, { delay: openDelay, children: /* @__PURE__ */ jsxs(
95
+ Tooltip$1,
96
96
  {
97
97
  open,
98
98
  onOpenChange: handleOpenChange,
99
- delayDuration: openDelay,
99
+ delay: { open: openDelay, close: closeDelay },
100
+ placement,
101
+ offset,
102
+ unstyled: true,
100
103
  children: [
101
104
  /* @__PURE__ */ jsx(
102
- RadixTooltip.Trigger,
105
+ Tooltip$1.Trigger,
103
106
  {
104
107
  ref: open ? triggerRef : void 0,
105
108
  asChild: true,
106
- onClick: isMobile ? handleTriggerClick : void 0,
109
+ ...isMobile ? { onPress: handleTriggerClick } : {},
107
110
  ...triggerProps,
108
111
  children
109
112
  }
110
113
  ),
111
- /* @__PURE__ */ jsx(RadixTooltip.Portal, { container: portalled ? portalRef?.current ?? void 0 : void 0, children: /* @__PURE__ */ jsxs(
112
- RadixTooltip.Content,
114
+ /* @__PURE__ */ jsxs(
115
+ Tooltip$1.Content,
113
116
  {
114
117
  ref,
115
- side,
116
- align,
117
- sideOffset,
118
- onClick: interactive ? handleContentClick : void 0,
118
+ unstyled: true,
119
119
  className: cn(
120
120
  "z-[9999] overflow-hidden rounded-lg px-3 py-2 text-sm",
121
121
  "animate-in fade-in-0 zoom-in-95",
@@ -124,12 +124,14 @@ var Tooltip = React.forwardRef(
124
124
  !isPopover && "bg-[var(--color-tooltip-bg)] text-[var(--color-tooltip-fg)] max-w-xs",
125
125
  contentProps?.className
126
126
  ),
127
+ onClick: interactive ? handleContentClick : void 0,
127
128
  ...selected ? { "data-selected": true } : {},
128
129
  ...contentProps,
129
130
  children: [
130
131
  showArrow && /* @__PURE__ */ jsx(
131
- RadixTooltip.Arrow,
132
+ Tooltip$1.Arrow,
132
133
  {
134
+ unstyled: true,
133
135
  className: cn(
134
136
  isPopover ? "fill-[var(--color-popover-bg)]" : "fill-[var(--color-tooltip-bg)]"
135
137
  )
@@ -138,7 +140,7 @@ var Tooltip = React.forwardRef(
138
140
  content
139
141
  ]
140
142
  }
141
- ) })
143
+ )
142
144
  ]
143
145
  }
144
146
  ) });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luxfi/ui",
3
- "version": "7.0.0",
3
+ "version": "7.2.0",
4
4
  "description": "Radix + Tailwind UI primitives for Lux apps. Drop-in replacements for Chakra compound components.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -254,6 +254,11 @@
254
254
  "dev": "tsup --watch"
255
255
  },
256
256
  "dependencies": {
257
+ "@hanzogui/core": "^3.0.6",
258
+ "@hanzogui/dialog": "^3.0.2",
259
+ "@hanzogui/popover": "^3.0.2",
260
+ "@hanzogui/text": "^3.0.2",
261
+ "@hanzogui/tooltip": "^3.0.2",
257
262
  "@radix-ui/react-accordion": "^1.2.12",
258
263
  "@radix-ui/react-avatar": "^1.1.10",
259
264
  "@radix-ui/react-checkbox": "^1.3.3",
@@ -261,17 +266,13 @@
261
266
  "@radix-ui/react-dialog": "^1.1.15",
262
267
  "@radix-ui/react-dropdown-menu": "^2.1.16",
263
268
  "@radix-ui/react-label": "^2.1.7",
264
- "@radix-ui/react-popover": "^1.1.15",
265
269
  "@radix-ui/react-progress": "^1.1.7",
266
270
  "@radix-ui/react-radio-group": "^1.3.8",
267
271
  "@radix-ui/react-select": "^2.2.6",
268
272
  "@radix-ui/react-slider": "^1.3.6",
269
- "@radix-ui/react-slot": "^1.2.3",
270
273
  "@radix-ui/react-switch": "^1.2.6",
271
274
  "@radix-ui/react-tabs": "^1.1.13",
272
- "@radix-ui/react-tooltip": "^1.2.8",
273
275
  "@uidotdev/usehooks": "^2.4.1",
274
- "class-variance-authority": "^0.7.1",
275
276
  "clsx": "^2.1.1",
276
277
  "es-toolkit": "^1.31.0",
277
278
  "react-icons": "^5.4.0",
@@ -279,15 +280,15 @@
279
280
  "tailwind-merge": "^3.0.0"
280
281
  },
281
282
  "peerDependencies": {
282
- "@hanzogui/core": "^3.0.2",
283
+ "@hanzogui/core": "^3.0.6",
283
284
  "react": "^18.0.0 || ^19.0.0",
284
285
  "react-dom": "^18.0.0 || ^19.0.0"
285
286
  },
286
287
  "devDependencies": {
287
- "@hanzogui/core": "^3.0.2",
288
+ "@hanzogui/core": "^3.0.6",
288
289
  "@types/react": "^19.0.0",
289
290
  "@types/react-dom": "^19.0.0",
290
291
  "tsup": "^8.5.0",
291
292
  "typescript": "^5.9.3"
292
293
  }
293
- }
294
+ }
package/src/alert.tsx CHANGED
@@ -1,4 +1,3 @@
1
- import { cva } from 'class-variance-authority';
2
1
  import * as React from 'react';
3
2
 
4
3
  import { cn } from './utils';
@@ -20,58 +19,28 @@ import { Skeleton } from './skeleton';
20
19
  type AlertStatus = 'info' | 'warning' | 'warning_table' | 'success' | 'error';
21
20
 
22
21
  /* ------------------------------------------------------------------ */
23
- /* CVA variants */
22
+ /* Class maps (replaced CVA) */
24
23
  /* ------------------------------------------------------------------ */
25
24
 
26
- const alertRoot = cva(
27
- // base
28
- 'w-full flex items-start relative rounded text-[var(--color-alert-fg)]',
29
- {
30
- variants: {
31
- status: {
32
- info: 'bg-[var(--color-alert-bg-info)]',
33
- warning: 'bg-[var(--color-alert-bg-warning)]',
34
- warning_table: 'bg-[var(--color-alert-bg-warning-table)]',
35
- success: 'bg-[var(--color-alert-bg-success)]',
36
- error: 'bg-[var(--color-alert-bg-error)]',
37
- },
38
- size: {
39
- sm: 'gap-2 px-2 py-2 text-xs',
40
- md: 'gap-2 px-3 py-2 text-base',
41
- },
42
- },
43
- defaultVariants: {
44
- status: 'info',
45
- size: 'md',
46
- },
47
- },
48
- );
25
+ const ALERT_BASE = 'w-full flex items-start relative rounded text-[var(--color-alert-fg)]';
49
26
 
50
- const alertContent = cva('flex flex-1', {
51
- variants: {
52
- inline: {
53
- 'true': 'inline-flex flex-row items-center',
54
- 'false': 'flex flex-col',
55
- },
56
- },
57
- defaultVariants: {
58
- inline: true,
59
- },
60
- });
27
+ const STATUS_CLASSES: Record<AlertStatus, string> = {
28
+ info: 'bg-[var(--color-alert-bg-info)]',
29
+ warning: 'bg-[var(--color-alert-bg-warning)]',
30
+ warning_table: 'bg-[var(--color-alert-bg-warning-table)]',
31
+ success: 'bg-[var(--color-alert-bg-success)]',
32
+ error: 'bg-[var(--color-alert-bg-error)]',
33
+ };
61
34
 
62
- const INDICATOR_BASE = 'inline-flex items-center justify-center shrink-0 w-5 h-5 text-[var(--color-alert-fg)] [&>svg]:w-full [&>svg]:h-full';
35
+ const SIZE_CLASSES: Record<string, string> = {
36
+ sm: 'gap-2 px-2 py-2 text-xs',
37
+ md: 'gap-2 px-3 py-2 text-base',
38
+ };
63
39
 
64
- const indicatorVariants = cva(INDICATOR_BASE, {
65
- variants: {
66
- size: {
67
- sm: 'w-5 h-5 my-0',
68
- md: 'w-5 h-5 my-[2px]',
69
- },
70
- },
71
- defaultVariants: {
72
- size: 'md',
73
- },
74
- });
40
+ const INDICATOR_SIZE_CLASSES: Record<string, string> = {
41
+ sm: 'w-5 h-5 my-0',
42
+ md: 'w-5 h-5 my-[2px]',
43
+ };
75
44
 
76
45
  /* ------------------------------------------------------------------ */
77
46
  /* Props */
@@ -153,7 +122,10 @@ export const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
153
122
  }
154
123
 
155
124
  return (
156
- <span className={ indicatorVariants({ size: resolvedSize }) }>
125
+ <span className={ cn(
126
+ 'inline-flex items-center justify-center shrink-0 text-[var(--color-alert-fg)] [&>svg]:w-full [&>svg]:h-full',
127
+ INDICATOR_SIZE_CLASSES[resolvedSize],
128
+ ) }>
157
129
  { icon || defaultIcon }
158
130
  </span>
159
131
  );
@@ -188,13 +160,13 @@ export const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
188
160
  <Skeleton loading={ loading }>
189
161
  <div
190
162
  ref={ ref }
191
- className={ cn(alertRoot({ status, size: resolvedSize }), className) }
163
+ className={ cn(ALERT_BASE, STATUS_CLASSES[status], SIZE_CLASSES[resolvedSize], className) }
192
164
  style={ alertStyle }
193
165
  { ...alertRest }
194
166
  >
195
167
  { iconElement }
196
168
  { children ? (
197
- <div className={ alertContent({ inline }) }>
169
+ <div className={ cn('flex flex-1', inline ? 'inline-flex flex-row items-center' : 'flex flex-col') }>
198
170
  { title && <div className="font-semibold">{ title }</div> }
199
171
  <div
200
172
  className={ cn('inline-flex flex-wrap', descClassName) }