@luxfi/ui 1.0.1

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 (124) hide show
  1. package/dist/accordion.cjs +213 -0
  2. package/dist/accordion.js +186 -0
  3. package/dist/alert.cjs +553 -0
  4. package/dist/alert.js +531 -0
  5. package/dist/avatar.cjs +149 -0
  6. package/dist/avatar.js +125 -0
  7. package/dist/badge.cjs +611 -0
  8. package/dist/badge.js +589 -0
  9. package/dist/button.cjs +689 -0
  10. package/dist/button.js +664 -0
  11. package/dist/checkbox.cjs +265 -0
  12. package/dist/checkbox.js +241 -0
  13. package/dist/close-button.cjs +73 -0
  14. package/dist/close-button.js +51 -0
  15. package/dist/collapsible.cjs +711 -0
  16. package/dist/collapsible.js +685 -0
  17. package/dist/color-mode.cjs +36 -0
  18. package/dist/color-mode.js +32 -0
  19. package/dist/dialog.cjs +279 -0
  20. package/dist/dialog.js +246 -0
  21. package/dist/drawer.cjs +207 -0
  22. package/dist/drawer.js +175 -0
  23. package/dist/empty-state.cjs +93 -0
  24. package/dist/empty-state.js +71 -0
  25. package/dist/field.cjs +183 -0
  26. package/dist/field.js +160 -0
  27. package/dist/heading.cjs +46 -0
  28. package/dist/heading.js +40 -0
  29. package/dist/icon-button.cjs +491 -0
  30. package/dist/icon-button.js +470 -0
  31. package/dist/image.cjs +572 -0
  32. package/dist/image.js +551 -0
  33. package/dist/index.cjs +5749 -0
  34. package/dist/index.js +5586 -0
  35. package/dist/input-group.cjs +155 -0
  36. package/dist/input-group.js +133 -0
  37. package/dist/input.cjs +65 -0
  38. package/dist/input.js +59 -0
  39. package/dist/link.cjs +639 -0
  40. package/dist/link.js +612 -0
  41. package/dist/menu.cjs +305 -0
  42. package/dist/menu.js +269 -0
  43. package/dist/pin-input.cjs +182 -0
  44. package/dist/pin-input.js +160 -0
  45. package/dist/popover.cjs +327 -0
  46. package/dist/popover.js +294 -0
  47. package/dist/progress-circle.cjs +152 -0
  48. package/dist/progress-circle.js +128 -0
  49. package/dist/progress.cjs +117 -0
  50. package/dist/progress.js +94 -0
  51. package/dist/provider.cjs +22 -0
  52. package/dist/provider.js +20 -0
  53. package/dist/radio.cjs +177 -0
  54. package/dist/radio.js +153 -0
  55. package/dist/rating.cjs +80 -0
  56. package/dist/rating.js +58 -0
  57. package/dist/select.cjs +791 -0
  58. package/dist/select.js +757 -0
  59. package/dist/separator.cjs +57 -0
  60. package/dist/separator.js +51 -0
  61. package/dist/skeleton.cjs +370 -0
  62. package/dist/skeleton.js +346 -0
  63. package/dist/slider.cjs +138 -0
  64. package/dist/slider.js +115 -0
  65. package/dist/switch.cjs +163 -0
  66. package/dist/switch.js +140 -0
  67. package/dist/table.cjs +1053 -0
  68. package/dist/table.js +1019 -0
  69. package/dist/tabs.cjs +240 -0
  70. package/dist/tabs.js +213 -0
  71. package/dist/tag.cjs +651 -0
  72. package/dist/tag.js +628 -0
  73. package/dist/textarea.cjs +65 -0
  74. package/dist/textarea.js +59 -0
  75. package/dist/toaster.cjs +99 -0
  76. package/dist/toaster.js +96 -0
  77. package/dist/tooltip.cjs +171 -0
  78. package/dist/tooltip.js +148 -0
  79. package/dist/utils.cjs +11 -0
  80. package/dist/utils.js +9 -0
  81. package/package.json +296 -0
  82. package/src/accordion.tsx +285 -0
  83. package/src/alert.tsx +221 -0
  84. package/src/avatar.tsx +174 -0
  85. package/src/badge.tsx +158 -0
  86. package/src/button.tsx +411 -0
  87. package/src/checkbox.tsx +307 -0
  88. package/src/close-button.tsx +51 -0
  89. package/src/collapsible.tsx +126 -0
  90. package/src/color-mode.tsx +37 -0
  91. package/src/dialog.tsx +356 -0
  92. package/src/drawer.tsx +186 -0
  93. package/src/empty-state.tsx +97 -0
  94. package/src/field.tsx +202 -0
  95. package/src/heading.tsx +55 -0
  96. package/src/icon-button.tsx +192 -0
  97. package/src/image.tsx +280 -0
  98. package/src/index.ts +192 -0
  99. package/src/input-group.tsx +159 -0
  100. package/src/input.tsx +60 -0
  101. package/src/link.tsx +333 -0
  102. package/src/menu.tsx +471 -0
  103. package/src/pin-input.tsx +187 -0
  104. package/src/popover.tsx +400 -0
  105. package/src/progress-circle.tsx +180 -0
  106. package/src/progress.tsx +109 -0
  107. package/src/provider.tsx +12 -0
  108. package/src/radio.tsx +175 -0
  109. package/src/rating.tsx +79 -0
  110. package/src/select.tsx +696 -0
  111. package/src/separator.tsx +59 -0
  112. package/src/skeleton.tsx +302 -0
  113. package/src/slider.tsx +152 -0
  114. package/src/switch.tsx +158 -0
  115. package/src/table.tsx +621 -0
  116. package/src/tabs.tsx +354 -0
  117. package/src/tag.tsx +159 -0
  118. package/src/textarea.tsx +60 -0
  119. package/src/toaster.tsx +117 -0
  120. package/src/tokens.css +438 -0
  121. package/src/tooltip.tsx +184 -0
  122. package/src/utils/cn.ts +7 -0
  123. package/src/utils.ts +6 -0
  124. package/tokens.css +438 -0
package/dist/field.cjs ADDED
@@ -0,0 +1,183 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var LabelPrimitive = require('@radix-ui/react-label');
5
+ var React = require('react');
6
+ var clsx = require('clsx');
7
+ var tailwindMerge = require('tailwind-merge');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
29
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
30
+
31
+ // src/field.tsx
32
+ function cn(...inputs) {
33
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
34
+ }
35
+ var space = String.fromCharCode(32);
36
+ function getComponentDisplayName(type) {
37
+ if (typeof type === "string") return void 0;
38
+ if ("displayName" in type) return type.displayName;
39
+ return void 0;
40
+ }
41
+ var Field = React__namespace.forwardRef(
42
+ function Field2(props, ref) {
43
+ const {
44
+ label,
45
+ children,
46
+ helperText,
47
+ errorText,
48
+ optionalText,
49
+ size,
50
+ required,
51
+ disabled,
52
+ readOnly,
53
+ invalid,
54
+ floating,
55
+ id,
56
+ className,
57
+ style
58
+ } = props;
59
+ if (floating && label) {
60
+ const injectedProps2 = {
61
+ className: "peer",
62
+ placeholder: " ",
63
+ size,
64
+ floating,
65
+ disabled,
66
+ readOnly
67
+ };
68
+ const labelElement = /* @__PURE__ */ jsxRuntime.jsxs(
69
+ LabelPrimitive__namespace.Root,
70
+ {
71
+ className: cn(
72
+ "absolute left-3 top-1/2 -translate-y-1/2",
73
+ "text-[var(--color-input-placeholder,theme(colors.gray.400))]",
74
+ "pointer-events-none select-none",
75
+ "origin-top-left transition-all duration-150",
76
+ "peer-focus:top-1 peer-focus:translate-y-0 peer-focus:scale-75",
77
+ "peer-[:not(:placeholder-shown)]:top-1 peer-[:not(:placeholder-shown)]:translate-y-0 peer-[:not(:placeholder-shown)]:scale-75"
78
+ ),
79
+ htmlFor: id,
80
+ children: [
81
+ label,
82
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-[var(--color-fg-error,theme(colors.red.500))]", "aria-hidden": "true", children: "*" }),
83
+ !required && optionalText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-[var(--color-text-secondary,theme(colors.gray.400))] text-sm", children: optionalText }),
84
+ errorText && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-0.5 text-[var(--color-fg-error,theme(colors.red.500))] text-sm", children: [
85
+ "-",
86
+ space,
87
+ errorText
88
+ ] })
89
+ ]
90
+ }
91
+ );
92
+ const helperTextElement = helperText ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-xs text-[var(--color-text-secondary,theme(colors.gray.400))]", children: helperText }) : null;
93
+ const child2 = React__namespace.Children.only(children);
94
+ const isInputGroup = getComponentDisplayName(child2.type) === "InputGroup";
95
+ if (isInputGroup) {
96
+ const inputElement2 = React__namespace.cloneElement(
97
+ React__namespace.Children.only(child2.props.children),
98
+ injectedProps2
99
+ );
100
+ const groupInputElement = React__namespace.cloneElement(
101
+ child2,
102
+ {},
103
+ inputElement2,
104
+ labelElement
105
+ );
106
+ return /* @__PURE__ */ jsxRuntime.jsxs(
107
+ "div",
108
+ {
109
+ ref,
110
+ id,
111
+ className: cn("relative w-full", className),
112
+ style,
113
+ "data-disabled": disabled || void 0,
114
+ "data-readonly": readOnly || void 0,
115
+ "data-invalid": invalid || void 0,
116
+ children: [
117
+ groupInputElement,
118
+ helperTextElement
119
+ ]
120
+ }
121
+ );
122
+ }
123
+ const inputElement = React__namespace.cloneElement(child2, injectedProps2);
124
+ return /* @__PURE__ */ jsxRuntime.jsxs(
125
+ "div",
126
+ {
127
+ ref,
128
+ id,
129
+ className: cn("relative w-full", className),
130
+ style,
131
+ "data-disabled": disabled || void 0,
132
+ "data-readonly": readOnly || void 0,
133
+ "data-invalid": invalid || void 0,
134
+ children: [
135
+ inputElement,
136
+ labelElement,
137
+ helperTextElement
138
+ ]
139
+ }
140
+ );
141
+ }
142
+ const injectedProps = {
143
+ size
144
+ };
145
+ const child = React__namespace.Children.only(children);
146
+ const clonedChild = React__namespace.cloneElement(child, injectedProps);
147
+ return /* @__PURE__ */ jsxRuntime.jsxs(
148
+ "div",
149
+ {
150
+ ref,
151
+ id,
152
+ className: cn("flex flex-col gap-1", className),
153
+ style,
154
+ "data-disabled": disabled || void 0,
155
+ "data-readonly": readOnly || void 0,
156
+ "data-invalid": invalid || void 0,
157
+ children: [
158
+ label && /* @__PURE__ */ jsxRuntime.jsxs(
159
+ LabelPrimitive__namespace.Root,
160
+ {
161
+ className: cn(
162
+ "text-sm font-medium text-[var(--color-field-label,theme(colors.gray.700))]",
163
+ "dark:text-[var(--color-field-label,theme(colors.gray.300))]",
164
+ disabled && "opacity-40"
165
+ ),
166
+ htmlFor: id,
167
+ children: [
168
+ label,
169
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-[var(--color-fg-error,theme(colors.red.500))]", "aria-hidden": "true", children: "*" }),
170
+ !required && optionalText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-[var(--color-text-secondary,theme(colors.gray.400))] text-sm font-normal", children: optionalText })
171
+ ]
172
+ }
173
+ ),
174
+ clonedChild,
175
+ helperText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-[var(--color-text-secondary,theme(colors.gray.400))]", children: helperText }),
176
+ errorText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-[var(--color-fg-error,theme(colors.red.500))]", children: errorText })
177
+ ]
178
+ }
179
+ );
180
+ }
181
+ );
182
+
183
+ exports.Field = Field;
package/dist/field.js ADDED
@@ -0,0 +1,160 @@
1
+ "use client";
2
+ import * as LabelPrimitive from '@radix-ui/react-label';
3
+ import * as React from 'react';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ // src/field.tsx
9
+ function cn(...inputs) {
10
+ return twMerge(clsx(inputs));
11
+ }
12
+ var space = String.fromCharCode(32);
13
+ function getComponentDisplayName(type) {
14
+ if (typeof type === "string") return void 0;
15
+ if ("displayName" in type) return type.displayName;
16
+ return void 0;
17
+ }
18
+ var Field = React.forwardRef(
19
+ function Field2(props, ref) {
20
+ const {
21
+ label,
22
+ children,
23
+ helperText,
24
+ errorText,
25
+ optionalText,
26
+ size,
27
+ required,
28
+ disabled,
29
+ readOnly,
30
+ invalid,
31
+ floating,
32
+ id,
33
+ className,
34
+ style
35
+ } = props;
36
+ if (floating && label) {
37
+ const injectedProps2 = {
38
+ className: "peer",
39
+ placeholder: " ",
40
+ size,
41
+ floating,
42
+ disabled,
43
+ readOnly
44
+ };
45
+ const labelElement = /* @__PURE__ */ jsxs(
46
+ LabelPrimitive.Root,
47
+ {
48
+ className: cn(
49
+ "absolute left-3 top-1/2 -translate-y-1/2",
50
+ "text-[var(--color-input-placeholder,theme(colors.gray.400))]",
51
+ "pointer-events-none select-none",
52
+ "origin-top-left transition-all duration-150",
53
+ "peer-focus:top-1 peer-focus:translate-y-0 peer-focus:scale-75",
54
+ "peer-[:not(:placeholder-shown)]:top-1 peer-[:not(:placeholder-shown)]:translate-y-0 peer-[:not(:placeholder-shown)]:scale-75"
55
+ ),
56
+ htmlFor: id,
57
+ children: [
58
+ label,
59
+ required && /* @__PURE__ */ jsx("span", { className: "ml-0.5 text-[var(--color-fg-error,theme(colors.red.500))]", "aria-hidden": "true", children: "*" }),
60
+ !required && optionalText && /* @__PURE__ */ jsx("span", { className: "ml-1 text-[var(--color-text-secondary,theme(colors.gray.400))] text-sm", children: optionalText }),
61
+ errorText && /* @__PURE__ */ jsxs("span", { className: "ml-0.5 text-[var(--color-fg-error,theme(colors.red.500))] text-sm", children: [
62
+ "-",
63
+ space,
64
+ errorText
65
+ ] })
66
+ ]
67
+ }
68
+ );
69
+ const helperTextElement = helperText ? /* @__PURE__ */ jsx("p", { className: "mt-1.5 text-xs text-[var(--color-text-secondary,theme(colors.gray.400))]", children: helperText }) : null;
70
+ const child2 = React.Children.only(children);
71
+ const isInputGroup = getComponentDisplayName(child2.type) === "InputGroup";
72
+ if (isInputGroup) {
73
+ const inputElement2 = React.cloneElement(
74
+ React.Children.only(child2.props.children),
75
+ injectedProps2
76
+ );
77
+ const groupInputElement = React.cloneElement(
78
+ child2,
79
+ {},
80
+ inputElement2,
81
+ labelElement
82
+ );
83
+ return /* @__PURE__ */ jsxs(
84
+ "div",
85
+ {
86
+ ref,
87
+ id,
88
+ className: cn("relative w-full", className),
89
+ style,
90
+ "data-disabled": disabled || void 0,
91
+ "data-readonly": readOnly || void 0,
92
+ "data-invalid": invalid || void 0,
93
+ children: [
94
+ groupInputElement,
95
+ helperTextElement
96
+ ]
97
+ }
98
+ );
99
+ }
100
+ const inputElement = React.cloneElement(child2, injectedProps2);
101
+ return /* @__PURE__ */ jsxs(
102
+ "div",
103
+ {
104
+ ref,
105
+ id,
106
+ className: cn("relative w-full", className),
107
+ style,
108
+ "data-disabled": disabled || void 0,
109
+ "data-readonly": readOnly || void 0,
110
+ "data-invalid": invalid || void 0,
111
+ children: [
112
+ inputElement,
113
+ labelElement,
114
+ helperTextElement
115
+ ]
116
+ }
117
+ );
118
+ }
119
+ const injectedProps = {
120
+ size
121
+ };
122
+ const child = React.Children.only(children);
123
+ const clonedChild = React.cloneElement(child, injectedProps);
124
+ return /* @__PURE__ */ jsxs(
125
+ "div",
126
+ {
127
+ ref,
128
+ id,
129
+ className: cn("flex flex-col gap-1", className),
130
+ style,
131
+ "data-disabled": disabled || void 0,
132
+ "data-readonly": readOnly || void 0,
133
+ "data-invalid": invalid || void 0,
134
+ children: [
135
+ label && /* @__PURE__ */ jsxs(
136
+ LabelPrimitive.Root,
137
+ {
138
+ className: cn(
139
+ "text-sm font-medium text-[var(--color-field-label,theme(colors.gray.700))]",
140
+ "dark:text-[var(--color-field-label,theme(colors.gray.300))]",
141
+ disabled && "opacity-40"
142
+ ),
143
+ htmlFor: id,
144
+ children: [
145
+ label,
146
+ required && /* @__PURE__ */ jsx("span", { className: "ml-0.5 text-[var(--color-fg-error,theme(colors.red.500))]", "aria-hidden": "true", children: "*" }),
147
+ !required && optionalText && /* @__PURE__ */ jsx("span", { className: "ml-1 text-[var(--color-text-secondary,theme(colors.gray.400))] text-sm font-normal", children: optionalText })
148
+ ]
149
+ }
150
+ ),
151
+ clonedChild,
152
+ helperText && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--color-text-secondary,theme(colors.gray.400))]", children: helperText }),
153
+ errorText && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--color-fg-error,theme(colors.red.500))]", children: errorText })
154
+ ]
155
+ }
156
+ );
157
+ }
158
+ );
159
+
160
+ export { Field };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React = require('react');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var React__default = /*#__PURE__*/_interopDefault(React);
12
+
13
+ // src/heading.tsx
14
+ function cn(...inputs) {
15
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
16
+ }
17
+ var LEVEL_TAG = {
18
+ "1": "h1",
19
+ "2": "h2",
20
+ "3": "h3"
21
+ };
22
+ var LEVEL_CLASSES = {
23
+ "1": "text-[18px] leading-[24px] font-medium lg:text-[32px] lg:leading-[40px] lg:tracking-[-0.5px]",
24
+ "2": "text-[16px] leading-[24px] font-medium lg:text-[24px] lg:leading-[32px]",
25
+ "3": "text-[14px] leading-[20px] font-semibold lg:text-[18px] lg:leading-[24px] lg:font-medium"
26
+ };
27
+ var BASE_CLASSES = "font-heading text-heading";
28
+ var Heading = React__default.default.forwardRef(
29
+ function Heading2({ level, className, mb, size: _size, style: styleProp, ...rest }, ref) {
30
+ const Tag = level ? LEVEL_TAG[level] : "h2";
31
+ const levelClasses = level ? LEVEL_CLASSES[level] : void 0;
32
+ const shimStyle = { ...styleProp };
33
+ if (mb !== void 0) shimStyle.marginBottom = typeof mb === "number" ? `${mb * 4}px` : mb;
34
+ return /* @__PURE__ */ jsxRuntime.jsx(
35
+ Tag,
36
+ {
37
+ ref,
38
+ className: cn(BASE_CLASSES, levelClasses, className),
39
+ style: Object.keys(shimStyle).length > 0 ? shimStyle : void 0,
40
+ ...rest
41
+ }
42
+ );
43
+ }
44
+ );
45
+
46
+ exports.Heading = Heading;
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import React from 'react';
3
+ import { clsx } from 'clsx';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ // src/heading.tsx
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+ var LEVEL_TAG = {
12
+ "1": "h1",
13
+ "2": "h2",
14
+ "3": "h3"
15
+ };
16
+ var LEVEL_CLASSES = {
17
+ "1": "text-[18px] leading-[24px] font-medium lg:text-[32px] lg:leading-[40px] lg:tracking-[-0.5px]",
18
+ "2": "text-[16px] leading-[24px] font-medium lg:text-[24px] lg:leading-[32px]",
19
+ "3": "text-[14px] leading-[20px] font-semibold lg:text-[18px] lg:leading-[24px] lg:font-medium"
20
+ };
21
+ var BASE_CLASSES = "font-heading text-heading";
22
+ var Heading = React.forwardRef(
23
+ function Heading2({ level, className, mb, size: _size, style: styleProp, ...rest }, ref) {
24
+ const Tag = level ? LEVEL_TAG[level] : "h2";
25
+ const levelClasses = level ? LEVEL_CLASSES[level] : void 0;
26
+ const shimStyle = { ...styleProp };
27
+ if (mb !== void 0) shimStyle.marginBottom = typeof mb === "number" ? `${mb * 4}px` : mb;
28
+ return /* @__PURE__ */ jsx(
29
+ Tag,
30
+ {
31
+ ref,
32
+ className: cn(BASE_CLASSES, levelClasses, className),
33
+ style: Object.keys(shimStyle).length > 0 ? shimStyle : void 0,
34
+ ...rest
35
+ }
36
+ );
37
+ }
38
+ );
39
+
40
+ export { Heading };