@luxfi/ui 6.1.3 → 7.1.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 (241) hide show
  1. package/dist/accordion.cjs +213 -0
  2. package/dist/accordion.d.cts +74 -0
  3. package/dist/accordion.d.ts +74 -0
  4. package/dist/accordion.js +186 -0
  5. package/dist/alert.cjs +430 -0
  6. package/dist/alert.d.cts +30 -0
  7. package/dist/alert.d.ts +30 -0
  8. package/dist/alert.js +408 -0
  9. package/dist/avatar.cjs +149 -0
  10. package/dist/avatar.d.cts +25 -0
  11. package/dist/avatar.d.ts +25 -0
  12. package/dist/avatar.js +125 -0
  13. package/dist/badge.cjs +452 -0
  14. package/dist/badge.d.cts +19 -0
  15. package/dist/badge.d.ts +19 -0
  16. package/dist/badge.js +431 -0
  17. package/dist/bank.cjs +272 -0
  18. package/dist/bank.d.cts +76 -0
  19. package/dist/bank.d.ts +76 -0
  20. package/dist/bank.js +258 -0
  21. package/dist/button.cjs +578 -0
  22. package/dist/button.d.cts +55 -0
  23. package/dist/button.d.ts +55 -0
  24. package/dist/button.js +553 -0
  25. package/dist/checkbox.cjs +265 -0
  26. package/dist/checkbox.d.cts +31 -0
  27. package/dist/checkbox.d.ts +31 -0
  28. package/dist/checkbox.js +241 -0
  29. package/dist/close-button.cjs +92 -0
  30. package/dist/close-button.d.cts +9 -0
  31. package/dist/close-button.d.ts +9 -0
  32. package/dist/close-button.js +70 -0
  33. package/dist/collapsible.cjs +555 -0
  34. package/dist/collapsible.d.cts +23 -0
  35. package/dist/collapsible.d.ts +23 -0
  36. package/dist/collapsible.js +532 -0
  37. package/dist/color-mode.cjs +96 -0
  38. package/dist/color-mode.d.cts +25 -0
  39. package/dist/color-mode.d.ts +25 -0
  40. package/dist/color-mode.js +72 -0
  41. package/dist/dialog.cjs +295 -0
  42. package/dist/dialog.d.cts +65 -0
  43. package/dist/dialog.d.ts +65 -0
  44. package/dist/dialog.js +263 -0
  45. package/dist/drawer.cjs +231 -0
  46. package/dist/drawer.d.cts +36 -0
  47. package/dist/drawer.d.ts +36 -0
  48. package/dist/drawer.js +199 -0
  49. package/dist/empty-state.cjs +93 -0
  50. package/dist/empty-state.d.cts +13 -0
  51. package/dist/empty-state.d.ts +13 -0
  52. package/dist/empty-state.js +71 -0
  53. package/dist/expiration-selector.cjs +138 -0
  54. package/dist/expiration-selector.d.cts +16 -0
  55. package/dist/expiration-selector.d.ts +16 -0
  56. package/dist/expiration-selector.js +116 -0
  57. package/dist/field.cjs +183 -0
  58. package/dist/field.d.cts +24 -0
  59. package/dist/field.d.ts +24 -0
  60. package/dist/field.js +160 -0
  61. package/dist/greeks-display.cjs +114 -0
  62. package/dist/greeks-display.d.cts +14 -0
  63. package/dist/greeks-display.d.ts +14 -0
  64. package/dist/greeks-display.js +92 -0
  65. package/dist/heading.cjs +41 -0
  66. package/dist/heading.d.cts +10 -0
  67. package/dist/heading.d.ts +10 -0
  68. package/dist/heading.js +35 -0
  69. package/dist/icon-button.cjs +367 -0
  70. package/dist/icon-button.d.cts +33 -0
  71. package/dist/icon-button.d.ts +33 -0
  72. package/dist/icon-button.js +345 -0
  73. package/dist/image.cjs +425 -0
  74. package/dist/image.d.cts +57 -0
  75. package/dist/image.d.ts +57 -0
  76. package/dist/image.js +404 -0
  77. package/dist/index.cjs +7220 -0
  78. package/dist/index.d.cts +55 -0
  79. package/dist/index.d.ts +55 -0
  80. package/dist/index.js +7043 -0
  81. package/dist/input-group.cjs +155 -0
  82. package/dist/input-group.d.cts +17 -0
  83. package/dist/input-group.d.ts +17 -0
  84. package/dist/input-group.js +133 -0
  85. package/dist/input.cjs +65 -0
  86. package/dist/input.d.cts +11 -0
  87. package/dist/input.d.ts +11 -0
  88. package/dist/input.js +59 -0
  89. package/dist/link.cjs +483 -0
  90. package/dist/link.d.cts +37 -0
  91. package/dist/link.d.ts +37 -0
  92. package/dist/link.js +459 -0
  93. package/dist/menu.cjs +305 -0
  94. package/dist/menu.d.cts +84 -0
  95. package/dist/menu.d.ts +84 -0
  96. package/dist/menu.js +269 -0
  97. package/dist/option-chain.cjs +221 -0
  98. package/dist/option-chain.d.cts +37 -0
  99. package/dist/option-chain.d.ts +37 -0
  100. package/dist/option-chain.js +199 -0
  101. package/dist/option-position.cjs +164 -0
  102. package/dist/option-position.d.cts +29 -0
  103. package/dist/option-position.d.ts +29 -0
  104. package/dist/option-position.js +142 -0
  105. package/dist/pin-input.cjs +182 -0
  106. package/dist/pin-input.d.cts +25 -0
  107. package/dist/pin-input.d.ts +25 -0
  108. package/dist/pin-input.js +160 -0
  109. package/dist/pnl-diagram.cjs +453 -0
  110. package/dist/pnl-diagram.d.cts +11 -0
  111. package/dist/pnl-diagram.d.ts +11 -0
  112. package/dist/pnl-diagram.js +431 -0
  113. package/dist/popover.cjs +342 -0
  114. package/dist/popover.d.cts +73 -0
  115. package/dist/popover.d.ts +73 -0
  116. package/dist/popover.js +310 -0
  117. package/dist/progress-circle.cjs +152 -0
  118. package/dist/progress-circle.d.cts +47 -0
  119. package/dist/progress-circle.d.ts +47 -0
  120. package/dist/progress-circle.js +128 -0
  121. package/dist/progress.cjs +117 -0
  122. package/dist/progress.d.cts +28 -0
  123. package/dist/progress.d.ts +28 -0
  124. package/dist/progress.js +94 -0
  125. package/dist/provider.cjs +62 -0
  126. package/dist/provider.d.cts +7 -0
  127. package/dist/provider.d.ts +7 -0
  128. package/dist/provider.js +40 -0
  129. package/dist/radio.cjs +177 -0
  130. package/dist/radio.d.cts +53 -0
  131. package/dist/radio.d.ts +53 -0
  132. package/dist/radio.js +153 -0
  133. package/dist/rating.cjs +80 -0
  134. package/dist/rating.d.cts +14 -0
  135. package/dist/rating.d.ts +14 -0
  136. package/dist/rating.js +58 -0
  137. package/dist/select.cjs +644 -0
  138. package/dist/select.d.cts +130 -0
  139. package/dist/select.d.ts +130 -0
  140. package/dist/select.js +610 -0
  141. package/dist/separator.cjs +57 -0
  142. package/dist/separator.d.cts +13 -0
  143. package/dist/separator.d.ts +13 -0
  144. package/dist/separator.js +51 -0
  145. package/dist/skeleton.cjs +223 -0
  146. package/dist/skeleton.d.cts +60 -0
  147. package/dist/skeleton.d.ts +60 -0
  148. package/dist/skeleton.js +199 -0
  149. package/dist/slider.cjs +138 -0
  150. package/dist/slider.d.cts +24 -0
  151. package/dist/slider.d.ts +24 -0
  152. package/dist/slider.js +115 -0
  153. package/dist/strategy-builder.cjs +373 -0
  154. package/dist/strategy-builder.d.cts +26 -0
  155. package/dist/strategy-builder.d.ts +26 -0
  156. package/dist/strategy-builder.js +351 -0
  157. package/dist/switch.cjs +163 -0
  158. package/dist/switch.d.cts +27 -0
  159. package/dist/switch.d.ts +27 -0
  160. package/dist/switch.js +140 -0
  161. package/dist/table.cjs +897 -0
  162. package/dist/table.d.cts +107 -0
  163. package/dist/table.d.ts +107 -0
  164. package/dist/table.js +866 -0
  165. package/dist/tabs.cjs +240 -0
  166. package/dist/tabs.d.cts +78 -0
  167. package/dist/tabs.d.ts +78 -0
  168. package/dist/tabs.js +213 -0
  169. package/dist/tag.cjs +529 -0
  170. package/dist/tag.d.cts +21 -0
  171. package/dist/tag.d.ts +21 -0
  172. package/dist/tag.js +507 -0
  173. package/dist/textarea.cjs +65 -0
  174. package/dist/textarea.d.cts +11 -0
  175. package/dist/textarea.d.ts +11 -0
  176. package/dist/textarea.js +59 -0
  177. package/dist/toaster.cjs +99 -0
  178. package/dist/toaster.d.cts +29 -0
  179. package/dist/toaster.d.ts +29 -0
  180. package/dist/toaster.js +96 -0
  181. package/dist/tooltip.cjs +172 -0
  182. package/dist/tooltip.d.cts +38 -0
  183. package/dist/tooltip.d.ts +38 -0
  184. package/dist/tooltip.js +150 -0
  185. package/dist/utils.cjs +11 -0
  186. package/dist/utils.d.cts +5 -0
  187. package/dist/utils.d.ts +5 -0
  188. package/dist/utils.js +9 -0
  189. package/package.json +284 -89
  190. package/src/accordion.tsx +285 -0
  191. package/src/alert.tsx +221 -0
  192. package/src/avatar.tsx +174 -0
  193. package/src/badge.tsx +147 -0
  194. package/src/bank.tsx +325 -0
  195. package/src/button.tsx +477 -0
  196. package/src/checkbox.tsx +307 -0
  197. package/src/close-button.tsx +77 -0
  198. package/src/collapsible.tsx +126 -0
  199. package/src/color-mode.tsx +125 -0
  200. package/src/dialog.tsx +346 -0
  201. package/src/drawer.tsx +186 -0
  202. package/src/empty-state.tsx +97 -0
  203. package/src/expiration-selector.tsx +163 -0
  204. package/src/field.tsx +202 -0
  205. package/src/greeks-display.tsx +138 -0
  206. package/src/heading.tsx +44 -0
  207. package/src/icon-button.tsx +217 -0
  208. package/src/image.tsx +280 -0
  209. package/src/index.ts +267 -138
  210. package/src/input-group.tsx +159 -0
  211. package/src/input.tsx +60 -0
  212. package/src/link.tsx +326 -0
  213. package/src/menu.tsx +471 -0
  214. package/src/option-chain.tsx +261 -0
  215. package/src/option-position.tsx +200 -0
  216. package/src/pin-input.tsx +187 -0
  217. package/src/pnl-diagram.tsx +458 -0
  218. package/src/popover.tsx +386 -0
  219. package/src/progress-circle.tsx +180 -0
  220. package/src/progress.tsx +109 -0
  221. package/src/provider.tsx +12 -0
  222. package/src/radio.tsx +175 -0
  223. package/src/rating.tsx +79 -0
  224. package/src/select.tsx +696 -0
  225. package/src/separator.tsx +59 -0
  226. package/src/skeleton.tsx +254 -0
  227. package/src/slider.tsx +152 -0
  228. package/src/strategy-builder.tsx +466 -0
  229. package/src/switch.tsx +158 -0
  230. package/src/table.tsx +621 -0
  231. package/src/tabs.tsx +354 -0
  232. package/src/tag.tsx +159 -0
  233. package/src/textarea.tsx +60 -0
  234. package/src/toaster.tsx +117 -0
  235. package/src/tokens.css +438 -0
  236. package/src/tooltip.tsx +191 -0
  237. package/src/utils/cn.ts +7 -0
  238. package/src/utils.ts +6 -0
  239. package/tokens.css +438 -0
  240. package/LICENSE +0 -122
  241. package/README.md +0 -109
package/dist/avatar.js ADDED
@@ -0,0 +1,125 @@
1
+ "use client";
2
+ import * as RadixAvatar from '@radix-ui/react-avatar';
3
+ import * as React from 'react';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
+
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+ var SIZE_CLASSES = {
12
+ xs: "h-6 w-6 text-[10px]",
13
+ sm: "h-8 w-8 text-xs",
14
+ md: "h-10 w-10 text-sm",
15
+ lg: "h-12 w-12 text-base",
16
+ xl: "h-16 w-16 text-lg",
17
+ "2xl": "h-20 w-20 text-xl"
18
+ };
19
+ var VARIANT_CLASSES = {
20
+ solid: "bg-gray-500 text-white",
21
+ subtle: "bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-200",
22
+ outline: "border-2 border-gray-300 bg-transparent text-gray-700 dark:border-gray-600 dark:text-gray-200"
23
+ };
24
+ var DEFAULT_SIZE = "md";
25
+ var DEFAULT_VARIANT = "subtle";
26
+ var AvatarGroupContext = React.createContext({});
27
+ function useAvatarGroupContext() {
28
+ return React.useContext(AvatarGroupContext);
29
+ }
30
+ var Avatar = React.forwardRef(
31
+ function Avatar2(props, ref) {
32
+ const group = useAvatarGroupContext();
33
+ const {
34
+ name,
35
+ src,
36
+ srcSet,
37
+ loading,
38
+ icon,
39
+ fallback,
40
+ children,
41
+ className,
42
+ size: sizeProp,
43
+ variant: variantProp,
44
+ borderless,
45
+ ...rest
46
+ } = props;
47
+ const size = sizeProp ?? group.size ?? DEFAULT_SIZE;
48
+ const variant = variantProp ?? group.variant ?? DEFAULT_VARIANT;
49
+ const isBorderless = borderless ?? group.borderless ?? false;
50
+ return /* @__PURE__ */ jsxs(
51
+ RadixAvatar.Root,
52
+ {
53
+ ref,
54
+ className: cn(
55
+ "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full align-middle",
56
+ SIZE_CLASSES[size],
57
+ VARIANT_CLASSES[variant],
58
+ !isBorderless && "ring-2 ring-white dark:ring-gray-900",
59
+ className
60
+ ),
61
+ ...rest,
62
+ children: [
63
+ /* @__PURE__ */ jsx(AvatarFallback, { name, icon, children: fallback }),
64
+ /* @__PURE__ */ jsx(
65
+ RadixAvatar.Image,
66
+ {
67
+ className: "h-full w-full rounded-[inherit] object-cover",
68
+ src,
69
+ srcSet,
70
+ loading,
71
+ alt: name ?? ""
72
+ }
73
+ ),
74
+ children
75
+ ]
76
+ }
77
+ );
78
+ }
79
+ );
80
+ var AvatarFallback = React.forwardRef(
81
+ function AvatarFallback2(props, ref) {
82
+ const { name, icon, children, className, ...rest } = props;
83
+ return /* @__PURE__ */ jsxs(
84
+ RadixAvatar.Fallback,
85
+ {
86
+ ref,
87
+ className: cn(
88
+ "flex h-full w-full items-center justify-center font-medium",
89
+ className
90
+ ),
91
+ ...rest,
92
+ children: [
93
+ children,
94
+ name != null && children == null && /* @__PURE__ */ jsx(Fragment, { children: getInitials(name) }),
95
+ name == null && children == null && icon
96
+ ]
97
+ }
98
+ );
99
+ }
100
+ );
101
+ function getInitials(name) {
102
+ const names = name.trim().split(" ");
103
+ const firstName = names[0] != null ? names[0] : "";
104
+ const lastName = names.length > 1 ? names[names.length - 1] : "";
105
+ return firstName && lastName ? `${firstName.charAt(0)}${lastName.charAt(0)}` : firstName.charAt(0);
106
+ }
107
+ var AvatarGroup = React.forwardRef(
108
+ function AvatarGroup2(props, ref) {
109
+ const { size, variant, borderless, className, ...rest } = props;
110
+ const contextValue = React.useMemo(
111
+ () => ({ size, variant, borderless }),
112
+ [size, variant, borderless]
113
+ );
114
+ return /* @__PURE__ */ jsx(AvatarGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
115
+ "div",
116
+ {
117
+ ref,
118
+ className: cn("flex -space-x-3", className),
119
+ ...rest
120
+ }
121
+ ) });
122
+ }
123
+ );
124
+
125
+ export { Avatar, AvatarGroup };
package/dist/badge.cjs ADDED
@@ -0,0 +1,452 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React2 = require('react');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var tooltip = require('@hanzogui/tooltip');
9
+ var usehooks = require('@uidotdev/usehooks');
10
+
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
30
+
31
+ // src/badge.tsx
32
+ function cn(...inputs) {
33
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
34
+ }
35
+ var SHIM_PROPS = [
36
+ "w",
37
+ "h",
38
+ "minW",
39
+ "maxW",
40
+ "display",
41
+ "flexGrow",
42
+ "flexShrink",
43
+ "flexBasis",
44
+ "fontWeight",
45
+ "textStyle",
46
+ "borderRadius",
47
+ "alignSelf",
48
+ "alignItems",
49
+ "justifyContent",
50
+ "color",
51
+ "mt",
52
+ "mb",
53
+ "ml",
54
+ "mr",
55
+ "height",
56
+ "overflow",
57
+ "whiteSpace",
58
+ "textOverflow",
59
+ "textTransform",
60
+ "gap",
61
+ "gridTemplateColumns",
62
+ "minWidth",
63
+ "boxSize",
64
+ "py",
65
+ "px",
66
+ "p",
67
+ "hideBelow",
68
+ "fontSize",
69
+ "flexWrap",
70
+ "wordBreak",
71
+ "lineHeight",
72
+ "marginRight",
73
+ "position",
74
+ "background"
75
+ ];
76
+ var S = 4;
77
+ function dim(v) {
78
+ if (v == null) return void 0;
79
+ if (typeof v === "number") return `${v * S}px`;
80
+ if (typeof v === "string") return v;
81
+ if (typeof v === "object") {
82
+ const o = v;
83
+ return o.base ?? o.lg ?? o.xl ?? Object.values(o)[0];
84
+ }
85
+ return void 0;
86
+ }
87
+ function sp(v) {
88
+ if (v === void 0) return void 0;
89
+ return typeof v === "number" ? `${v * S}px` : v;
90
+ }
91
+ function shimToStyle(props) {
92
+ const s = {};
93
+ if (props.w !== void 0) s.width = dim(props.w);
94
+ if (props.h !== void 0) s.height = dim(props.h);
95
+ if (props.minW !== void 0) s.minWidth = dim(props.minW);
96
+ if (props.maxW !== void 0) s.maxWidth = dim(props.maxW);
97
+ if (props.display !== void 0) s.display = props.display;
98
+ if (props.flexGrow !== void 0) s.flexGrow = props.flexGrow;
99
+ if (props.flexShrink !== void 0) s.flexShrink = props.flexShrink;
100
+ if (props.flexBasis !== void 0) s.flexBasis = props.flexBasis;
101
+ if (props.fontWeight !== void 0) s.fontWeight = props.fontWeight;
102
+ if (props.borderRadius !== void 0) s.borderRadius = props.borderRadius;
103
+ if (props.alignSelf !== void 0) s.alignSelf = props.alignSelf;
104
+ if (props.alignItems !== void 0) s.alignItems = props.alignItems;
105
+ if (props.justifyContent !== void 0) s.justifyContent = props.justifyContent;
106
+ if (props.color !== void 0) s.color = props.color;
107
+ if (props.mt !== void 0) s.marginTop = sp(props.mt);
108
+ if (props.mb !== void 0) s.marginBottom = sp(props.mb);
109
+ if (props.ml !== void 0) s.marginLeft = sp(props.ml);
110
+ if (props.mr !== void 0) s.marginRight = sp(props.mr);
111
+ if (props.height !== void 0) s.height = props.height;
112
+ if (props.overflow !== void 0) s.overflow = props.overflow;
113
+ if (props.whiteSpace !== void 0) s.whiteSpace = props.whiteSpace;
114
+ if (props.textOverflow !== void 0) s.textOverflow = props.textOverflow;
115
+ if (props.textTransform !== void 0) s.textTransform = props.textTransform;
116
+ if (props.gap !== void 0) s.gap = sp(props.gap);
117
+ if (props.gridTemplateColumns !== void 0) s.gridTemplateColumns = props.gridTemplateColumns;
118
+ if (props.minWidth !== void 0) s.minWidth = props.minWidth;
119
+ if (props.boxSize !== void 0) {
120
+ const v = typeof props.boxSize === "number" ? `${props.boxSize * S}px` : props.boxSize;
121
+ s.width = v;
122
+ s.height = v;
123
+ }
124
+ if (props.py !== void 0) {
125
+ const v = sp(props.py);
126
+ s.paddingTop = v;
127
+ s.paddingBottom = v;
128
+ }
129
+ if (props.px !== void 0) {
130
+ const v = sp(props.px);
131
+ s.paddingLeft = v;
132
+ s.paddingRight = v;
133
+ }
134
+ if (props.p !== void 0) s.padding = sp(props.p);
135
+ if (props.fontSize !== void 0) s.fontSize = props.fontSize;
136
+ if (props.flexWrap !== void 0) s.flexWrap = props.flexWrap;
137
+ if (props.wordBreak !== void 0) s.wordBreak = props.wordBreak;
138
+ if (props.lineHeight !== void 0) s.lineHeight = props.lineHeight;
139
+ if (props.marginRight !== void 0) s.marginRight = props.marginRight;
140
+ if (props.position !== void 0) s.position = props.position;
141
+ if (props.background !== void 0) s.background = props.background;
142
+ return s;
143
+ }
144
+ function stripShims(props) {
145
+ const out = { ...props };
146
+ for (const k of SHIM_PROPS) delete out[k];
147
+ return out;
148
+ }
149
+ var SKELETON_CLASSES = [
150
+ "animate-skeleton-shimmer rounded-sm",
151
+ "bg-[linear-gradient(90deg,var(--color-skeleton-start)_0%,var(--color-skeleton-end)_50%,var(--color-skeleton-start)_100%)]",
152
+ "bg-[length:200%_100%]"
153
+ ].join(" ");
154
+ var HIDE_BELOW_MAP = { lg: "lg:hidden", md: "md:hidden", sm: "sm:hidden" };
155
+ var Skeleton = React2__namespace.forwardRef(
156
+ function Skeleton2(props, ref) {
157
+ const { loading = false, asChild, className, children, style: styleProp, as: Component = "div", ...allRest } = props;
158
+ const shimStyle = shimToStyle(props);
159
+ const mergedStyle = Object.keys(shimStyle).length > 0 || styleProp ? { ...shimStyle, ...styleProp } : void 0;
160
+ const hideBelowClass = props.hideBelow ? HIDE_BELOW_MAP[props.hideBelow] : void 0;
161
+ const cls = hideBelowClass ? cn(className, hideBelowClass) : className;
162
+ const htmlRest = stripShims(allRest);
163
+ if (!loading) {
164
+ if (asChild && React2__namespace.isValidElement(children)) return children;
165
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, { ref, className: cls, style: mergedStyle, ...htmlRest, children });
166
+ }
167
+ if (asChild && React2__namespace.isValidElement(children)) {
168
+ return /* @__PURE__ */ jsxRuntime.jsx(
169
+ Component,
170
+ {
171
+ ref,
172
+ "data-loading": true,
173
+ className: cn(SKELETON_CLASSES, "text-transparent [&_*]:invisible", cls),
174
+ style: mergedStyle,
175
+ ...htmlRest,
176
+ children
177
+ }
178
+ );
179
+ }
180
+ return /* @__PURE__ */ jsxRuntime.jsx(
181
+ Component,
182
+ {
183
+ ref,
184
+ "data-loading": true,
185
+ className: cn(SKELETON_CLASSES, children ? "text-transparent [&_*]:invisible" : "min-h-5", cls),
186
+ style: mergedStyle,
187
+ ...htmlRest,
188
+ children
189
+ }
190
+ );
191
+ }
192
+ );
193
+ React2__namespace.forwardRef(
194
+ function SkeletonCircle2(props, ref) {
195
+ const { size = 40, loading = true, className, ...rest } = props;
196
+ const dimension = typeof size === "number" ? `${size}px` : size;
197
+ return /* @__PURE__ */ jsxRuntime.jsx(
198
+ Skeleton,
199
+ {
200
+ ref,
201
+ loading,
202
+ className: cn("rounded-full shrink-0", className),
203
+ style: { width: dimension, height: dimension, ...rest.style },
204
+ ...rest
205
+ }
206
+ );
207
+ }
208
+ );
209
+ React2__namespace.forwardRef(
210
+ function SkeletonText2(props, ref) {
211
+ const { noOfLines = 3, loading = true, className, ...rest } = props;
212
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...rest, children: Array.from({ length: noOfLines }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
213
+ Skeleton,
214
+ {
215
+ loading,
216
+ className: cn("h-4", index === noOfLines - 1 && "max-w-[80%]")
217
+ },
218
+ index
219
+ )) });
220
+ }
221
+ );
222
+ var LG_BREAKPOINT = 1024;
223
+ function useIsMobile() {
224
+ const [isMobile, setIsMobile] = React2__namespace.useState(() => {
225
+ if (typeof window === "undefined") return false;
226
+ return window.innerWidth < LG_BREAKPOINT;
227
+ });
228
+ React2__namespace.useEffect(() => {
229
+ const mql = window.matchMedia(`(max-width: ${LG_BREAKPOINT - 1}px)`);
230
+ const handler = (e) => setIsMobile(e.matches);
231
+ setIsMobile(mql.matches);
232
+ mql.addEventListener("change", handler);
233
+ return () => mql.removeEventListener("change", handler);
234
+ }, []);
235
+ return isMobile;
236
+ }
237
+ function mapPlacement(p) {
238
+ if (!p) return void 0;
239
+ return p;
240
+ }
241
+ var Tooltip = React2__namespace.forwardRef(
242
+ function Tooltip2(props, ref) {
243
+ const {
244
+ showArrow: showArrowProp,
245
+ onOpenChange,
246
+ variant,
247
+ selected,
248
+ children,
249
+ disabled,
250
+ disableOnMobile,
251
+ content,
252
+ contentProps,
253
+ defaultOpen = false,
254
+ triggerProps,
255
+ closeDelay = 100,
256
+ openDelay = 100,
257
+ interactive,
258
+ positioning
259
+ } = props;
260
+ const [open, setOpen] = React2__namespace.useState(defaultOpen);
261
+ const timeoutRef = React2__namespace.useRef(null);
262
+ const isMobile = useIsMobile();
263
+ const handleOpenChange = React2__namespace.useCallback((nextOpen) => {
264
+ setOpen(nextOpen);
265
+ onOpenChange?.({ open: nextOpen });
266
+ }, [onOpenChange]);
267
+ const handleOpenChangeManual = React2__namespace.useCallback((nextOpen) => {
268
+ timeoutRef.current && window.clearTimeout(timeoutRef.current);
269
+ timeoutRef.current = window.setTimeout(() => {
270
+ setOpen(nextOpen);
271
+ onOpenChange?.({ open: nextOpen });
272
+ }, nextOpen ? openDelay : closeDelay);
273
+ }, [closeDelay, openDelay, onOpenChange]);
274
+ const handleClickAway = React2__namespace.useCallback(() => {
275
+ handleOpenChangeManual(false);
276
+ }, [handleOpenChangeManual]);
277
+ const triggerRef = usehooks.useClickAway(handleClickAway);
278
+ const handleTriggerClick = React2__namespace.useCallback(() => {
279
+ handleOpenChangeManual(!open);
280
+ }, [handleOpenChangeManual, open]);
281
+ const handleContentClick = React2__namespace.useCallback((event) => {
282
+ event.stopPropagation();
283
+ if (interactive) {
284
+ const closestLink = event.target?.closest("a");
285
+ if (closestLink) {
286
+ handleOpenChangeManual(false);
287
+ }
288
+ }
289
+ }, [interactive, handleOpenChangeManual]);
290
+ React2__namespace.useEffect(() => {
291
+ return () => {
292
+ if (timeoutRef.current) {
293
+ clearTimeout(timeoutRef.current);
294
+ }
295
+ };
296
+ }, []);
297
+ if (disabled || disableOnMobile && isMobile) return children;
298
+ const defaultShowArrow = variant === "popover" ? false : true;
299
+ const showArrow = showArrowProp !== void 0 ? showArrowProp : defaultShowArrow;
300
+ const isPopover = variant === "popover";
301
+ const placement = mapPlacement(positioning?.placement) ?? "top";
302
+ const offset = positioning?.offset?.mainAxis ?? 4;
303
+ return /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipGroup, { delay: openDelay, children: /* @__PURE__ */ jsxRuntime.jsxs(
304
+ tooltip.Tooltip,
305
+ {
306
+ open,
307
+ onOpenChange: handleOpenChange,
308
+ delay: { open: openDelay, close: closeDelay },
309
+ placement,
310
+ offset,
311
+ unstyled: true,
312
+ children: [
313
+ /* @__PURE__ */ jsxRuntime.jsx(
314
+ tooltip.Tooltip.Trigger,
315
+ {
316
+ ref: open ? triggerRef : void 0,
317
+ asChild: true,
318
+ ...isMobile ? { onPress: handleTriggerClick } : {},
319
+ ...triggerProps,
320
+ children
321
+ }
322
+ ),
323
+ /* @__PURE__ */ jsxRuntime.jsxs(
324
+ tooltip.Tooltip.Content,
325
+ {
326
+ ref,
327
+ unstyled: true,
328
+ className: cn(
329
+ "z-[9999] overflow-hidden rounded-lg px-3 py-2 text-sm",
330
+ "animate-in fade-in-0 zoom-in-95",
331
+ isPopover && "bg-[var(--color-popover-bg)] text-[var(--color-text-primary)]",
332
+ isPopover && "shadow-[var(--shadow-popover)] border border-[var(--color-border-divider)] max-w-sm",
333
+ !isPopover && "bg-[var(--color-tooltip-bg)] text-[var(--color-tooltip-fg)] max-w-xs",
334
+ contentProps?.className
335
+ ),
336
+ onClick: interactive ? handleContentClick : void 0,
337
+ ...selected ? { "data-selected": true } : {},
338
+ ...contentProps,
339
+ children: [
340
+ showArrow && /* @__PURE__ */ jsxRuntime.jsx(
341
+ tooltip.Tooltip.Arrow,
342
+ {
343
+ unstyled: true,
344
+ className: cn(
345
+ isPopover ? "fill-[var(--color-popover-bg)]" : "fill-[var(--color-tooltip-bg)]"
346
+ )
347
+ }
348
+ ),
349
+ content
350
+ ]
351
+ }
352
+ )
353
+ ]
354
+ }
355
+ ) });
356
+ }
357
+ );
358
+ function TruncatedTextTooltip({ label, children }) {
359
+ return /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { content: label, positioning: { placement: "top" }, children });
360
+ }
361
+ var BASE_CLASSES = "inline-flex items-center rounded-sm gap-1 font-medium w-fit max-w-full whitespace-nowrap select-text";
362
+ var SIZE_CLASSES = {
363
+ sm: "text-xs p-1 h-[18px] min-h-[18px]",
364
+ md: "text-sm px-1 py-0.5 min-h-6",
365
+ lg: "text-sm px-2 py-1 min-h-7 font-semibold"
366
+ };
367
+ var COLOR_PALETTE_CLASSES = {
368
+ gray: "bg-badge-gray-bg text-badge-gray-fg",
369
+ green: "bg-badge-green-bg text-badge-green-fg",
370
+ red: "bg-badge-red-bg text-badge-red-fg",
371
+ purple: "bg-badge-purple-bg text-badge-purple-fg",
372
+ orange: "bg-badge-orange-bg text-badge-orange-fg",
373
+ blue: "bg-badge-blue-bg text-badge-blue-fg",
374
+ yellow: "bg-badge-yellow-bg text-badge-yellow-fg",
375
+ teal: "bg-badge-teal-bg text-badge-teal-fg",
376
+ cyan: "bg-badge-cyan-bg text-badge-cyan-fg",
377
+ pink: "bg-badge-pink-bg text-badge-pink-fg",
378
+ purple_alt: "bg-badge-purple-alt-bg text-badge-purple-alt-fg",
379
+ blue_alt: "bg-badge-blue-alt-bg text-badge-blue-alt-fg",
380
+ bright_gray: "bg-badge-bright-gray-bg text-badge-bright-gray-fg",
381
+ bright_green: "bg-badge-bright-green-bg text-badge-bright-green-fg",
382
+ bright_red: "bg-badge-bright-red-bg text-badge-bright-red-fg",
383
+ bright_blue: "bg-badge-bright-blue-bg text-badge-bright-blue-fg",
384
+ bright_yellow: "bg-badge-bright-yellow-bg text-badge-bright-yellow-fg",
385
+ bright_teal: "bg-badge-bright-teal-bg text-badge-bright-teal-fg",
386
+ bright_cyan: "bg-badge-bright-cyan-bg text-badge-bright-cyan-fg",
387
+ bright_orange: "bg-badge-bright-orange-bg text-badge-bright-orange-fg",
388
+ bright_purple: "bg-badge-bright-purple-bg text-badge-bright-purple-fg",
389
+ bright_pink: "bg-badge-bright-pink-bg text-badge-bright-pink-fg"
390
+ };
391
+ var S2 = 4;
392
+ var Badge = React2__namespace.default.forwardRef(
393
+ function Badge2(props, ref) {
394
+ const {
395
+ loading,
396
+ startElement,
397
+ children,
398
+ truncated = false,
399
+ endElement,
400
+ variant: _variant,
401
+ size = "md",
402
+ colorPalette = "gray",
403
+ className,
404
+ flexShrink: _flexShrink,
405
+ gap: _gap,
406
+ ml: _ml,
407
+ mr: _mr,
408
+ style: styleProp,
409
+ ...rest
410
+ } = props;
411
+ const shimStyle = { ...styleProp };
412
+ if (_flexShrink !== void 0) shimStyle.flexShrink = _flexShrink;
413
+ if (_gap !== void 0) shimStyle.gap = typeof _gap === "number" ? `${_gap * S2}px` : _gap;
414
+ if (_ml !== void 0) {
415
+ if (typeof _ml === "object") {
416
+ const obj = _ml;
417
+ shimStyle.marginLeft = `${(obj.base ?? obj.lg ?? 0) * S2}px`;
418
+ } else {
419
+ shimStyle.marginLeft = typeof _ml === "number" ? `${_ml * S2}px` : _ml;
420
+ }
421
+ }
422
+ if (_mr !== void 0) shimStyle.marginRight = typeof _mr === "number" ? `${_mr * S2}px` : _mr;
423
+ const badgeStyle = Object.keys(shimStyle).length > 0 ? shimStyle : void 0;
424
+ const child = children ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "overflow-hidden text-ellipsis", children }) : null;
425
+ const childrenElement = truncated ? /* @__PURE__ */ jsxRuntime.jsx(TruncatedTextTooltip, { label: children, children: child }) : child;
426
+ const badgeElement = /* @__PURE__ */ jsxRuntime.jsxs(
427
+ "span",
428
+ {
429
+ ref,
430
+ className: cn(
431
+ BASE_CLASSES,
432
+ SIZE_CLASSES[size],
433
+ COLOR_PALETTE_CLASSES[colorPalette],
434
+ className
435
+ ),
436
+ style: badgeStyle,
437
+ ...rest,
438
+ children: [
439
+ startElement,
440
+ childrenElement,
441
+ endElement
442
+ ]
443
+ }
444
+ );
445
+ if (loading) {
446
+ return /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { loading, asChild: true, children: badgeElement });
447
+ }
448
+ return badgeElement;
449
+ }
450
+ );
451
+
452
+ exports.Badge = Badge;
@@ -0,0 +1,19 @@
1
+ import React__default from 'react';
2
+
3
+ type ColorPalette = 'gray' | 'green' | 'red' | 'purple' | 'orange' | 'blue' | 'yellow' | 'teal' | 'cyan' | 'pink' | 'purple_alt' | 'blue_alt' | 'bright_gray' | 'bright_green' | 'bright_red' | 'bright_blue' | 'bright_yellow' | 'bright_teal' | 'bright_cyan' | 'bright_orange' | 'bright_purple' | 'bright_pink';
4
+ interface BadgeProps extends Omit<React__default.HTMLAttributes<HTMLSpanElement>, 'color'> {
5
+ readonly loading?: boolean;
6
+ readonly startElement?: React__default.ReactNode;
7
+ readonly endElement?: React__default.ReactNode;
8
+ readonly truncated?: boolean;
9
+ readonly colorPalette?: ColorPalette;
10
+ readonly variant?: 'subtle' | 'solid';
11
+ readonly size?: 'sm' | 'md' | 'lg';
12
+ readonly flexShrink?: number;
13
+ readonly gap?: number | string;
14
+ readonly ml?: number | string | Record<string, number>;
15
+ readonly mr?: number | string;
16
+ }
17
+ declare const Badge: React__default.ForwardRefExoticComponent<BadgeProps & React__default.RefAttributes<HTMLDivElement>>;
18
+
19
+ export { Badge, type BadgeProps };
@@ -0,0 +1,19 @@
1
+ import React__default from 'react';
2
+
3
+ type ColorPalette = 'gray' | 'green' | 'red' | 'purple' | 'orange' | 'blue' | 'yellow' | 'teal' | 'cyan' | 'pink' | 'purple_alt' | 'blue_alt' | 'bright_gray' | 'bright_green' | 'bright_red' | 'bright_blue' | 'bright_yellow' | 'bright_teal' | 'bright_cyan' | 'bright_orange' | 'bright_purple' | 'bright_pink';
4
+ interface BadgeProps extends Omit<React__default.HTMLAttributes<HTMLSpanElement>, 'color'> {
5
+ readonly loading?: boolean;
6
+ readonly startElement?: React__default.ReactNode;
7
+ readonly endElement?: React__default.ReactNode;
8
+ readonly truncated?: boolean;
9
+ readonly colorPalette?: ColorPalette;
10
+ readonly variant?: 'subtle' | 'solid';
11
+ readonly size?: 'sm' | 'md' | 'lg';
12
+ readonly flexShrink?: number;
13
+ readonly gap?: number | string;
14
+ readonly ml?: number | string | Record<string, number>;
15
+ readonly mr?: number | string;
16
+ }
17
+ declare const Badge: React__default.ForwardRefExoticComponent<BadgeProps & React__default.RefAttributes<HTMLDivElement>>;
18
+
19
+ export { Badge, type BadgeProps };