@pos-360/horizon 0.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.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/animated-icons.d.mts +54 -0
- package/dist/animated-icons.d.ts +54 -0
- package/dist/animated-icons.js +28 -0
- package/dist/animated-icons.js.map +1 -0
- package/dist/animated-icons.mjs +3 -0
- package/dist/animated-icons.mjs.map +1 -0
- package/dist/chunk-2B2BWI5A.mjs +324 -0
- package/dist/chunk-2B2BWI5A.mjs.map +1 -0
- package/dist/chunk-6YAK6HNR.mjs +471 -0
- package/dist/chunk-6YAK6HNR.mjs.map +1 -0
- package/dist/chunk-7LVVOCBV.mjs +977 -0
- package/dist/chunk-7LVVOCBV.mjs.map +1 -0
- package/dist/chunk-AA25LTS4.js +4 -0
- package/dist/chunk-AA25LTS4.js.map +1 -0
- package/dist/chunk-J6RXKZE5.js +1080 -0
- package/dist/chunk-J6RXKZE5.js.map +1 -0
- package/dist/chunk-R5HAFV6M.js +350 -0
- package/dist/chunk-R5HAFV6M.js.map +1 -0
- package/dist/chunk-Y6G4VKJ3.mjs +3 -0
- package/dist/chunk-Y6G4VKJ3.mjs.map +1 -0
- package/dist/chunk-ZD6CMWPW.js +476 -0
- package/dist/chunk-ZD6CMWPW.js.map +1 -0
- package/dist/enhanced.d.mts +81 -0
- package/dist/enhanced.d.ts +81 -0
- package/dist/enhanced.js +24 -0
- package/dist/enhanced.js.map +1 -0
- package/dist/enhanced.mjs +3 -0
- package/dist/enhanced.mjs.map +1 -0
- package/dist/hooks.d.mts +2 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.js +6 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hooks.mjs +3 -0
- package/dist/hooks.mjs.map +1 -0
- package/dist/index.d.mts +25 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +351 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +6 -0
- package/dist/index.mjs.map +1 -0
- package/dist/primitives.d.mts +168 -0
- package/dist/primitives.d.ts +168 -0
- package/dist/primitives.js +308 -0
- package/dist/primitives.js.map +1 -0
- package/dist/primitives.mjs +3 -0
- package/dist/primitives.mjs.map +1 -0
- package/dist/tailwind.d.mts +104 -0
- package/dist/tailwind.d.ts +104 -0
- package/dist/tailwind.js +75 -0
- package/dist/tailwind.js.map +1 -0
- package/dist/tailwind.mjs +73 -0
- package/dist/tailwind.mjs.map +1 -0
- package/package.json +103 -0
- package/tailwind.config.js +105 -0
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var framerMotion = require('framer-motion');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var lucideReact = require('lucide-react');
|
|
7
|
+
|
|
8
|
+
var AnimatedButton = ({
|
|
9
|
+
label,
|
|
10
|
+
variant = "primary",
|
|
11
|
+
buttonContainerClassName,
|
|
12
|
+
buttonTextClassName,
|
|
13
|
+
onClick
|
|
14
|
+
}) => {
|
|
15
|
+
const handleOnClick = () => {
|
|
16
|
+
onClick?.();
|
|
17
|
+
};
|
|
18
|
+
const baseButtonClass = "text-xs tracking-wider font-medium";
|
|
19
|
+
const variantButtonClass = `${variant === "outlined" ? "border border-1 bg-white" : "bg-[#0F62FE]"}`;
|
|
20
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
21
|
+
framerMotion.motion.button,
|
|
22
|
+
{
|
|
23
|
+
whileHover: {
|
|
24
|
+
scale: variant === "primary" ? 1.025 : 1,
|
|
25
|
+
boxShadow: variant === "primary" ? "0 0 4px rgba(15, 96, 254, 0.4), 0 0 16px rgba(15, 96, 254, 0.2)" : ""
|
|
26
|
+
},
|
|
27
|
+
whileTap: { scale: variant === "primary" ? 0.98 : 1 },
|
|
28
|
+
onClick: handleOnClick,
|
|
29
|
+
className: `w-fit p-2 px-4 ${variantButtonClass} ${buttonContainerClassName}`,
|
|
30
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${baseButtonClass} ${buttonTextClassName}`, children: label.toUpperCase() })
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
var Input = react.forwardRef(
|
|
35
|
+
({
|
|
36
|
+
label,
|
|
37
|
+
placeholder,
|
|
38
|
+
value,
|
|
39
|
+
onChange,
|
|
40
|
+
onNumberChange,
|
|
41
|
+
onSelectChange,
|
|
42
|
+
onFocus,
|
|
43
|
+
onBlur,
|
|
44
|
+
type = "text",
|
|
45
|
+
disabled = false,
|
|
46
|
+
required = false,
|
|
47
|
+
error,
|
|
48
|
+
helperText,
|
|
49
|
+
leadingIcon,
|
|
50
|
+
trailingIcon,
|
|
51
|
+
leadingDecorator,
|
|
52
|
+
trailingDecorator,
|
|
53
|
+
onLeadingClick,
|
|
54
|
+
onTrailingClick,
|
|
55
|
+
size = "md",
|
|
56
|
+
variant = "default",
|
|
57
|
+
className = "",
|
|
58
|
+
min,
|
|
59
|
+
max,
|
|
60
|
+
step = 1,
|
|
61
|
+
precision = 0,
|
|
62
|
+
allowNegative = true,
|
|
63
|
+
showControls = false,
|
|
64
|
+
options = [],
|
|
65
|
+
autoComplete,
|
|
66
|
+
readOnly = false,
|
|
67
|
+
tabIndex = 0,
|
|
68
|
+
tooltip,
|
|
69
|
+
...props
|
|
70
|
+
}, ref) => {
|
|
71
|
+
const [showTooltip, setShowTooltip] = react.useState(false);
|
|
72
|
+
const isNumberType = type === "number";
|
|
73
|
+
const isSelectType = type === "select";
|
|
74
|
+
const isMobileType = type === "mobile";
|
|
75
|
+
const [inputValue, setInputValue] = react.useState(
|
|
76
|
+
value !== void 0 ? value.toString() : ""
|
|
77
|
+
);
|
|
78
|
+
react.useEffect(() => {
|
|
79
|
+
if (value !== void 0) {
|
|
80
|
+
setInputValue(value.toString());
|
|
81
|
+
}
|
|
82
|
+
}, [value]);
|
|
83
|
+
const formatNumber = (num) => {
|
|
84
|
+
if (precision > 0) {
|
|
85
|
+
return parseFloat(num.toFixed(precision));
|
|
86
|
+
}
|
|
87
|
+
return Math.round(num);
|
|
88
|
+
};
|
|
89
|
+
const isValidNumber = (str) => {
|
|
90
|
+
if (str === "" || str === "-") return true;
|
|
91
|
+
const num = parseFloat(str);
|
|
92
|
+
if (isNaN(num)) return false;
|
|
93
|
+
if (!allowNegative && num < 0) return false;
|
|
94
|
+
if (min !== void 0 && num < min) return false;
|
|
95
|
+
if (max !== void 0 && num > max) return false;
|
|
96
|
+
return true;
|
|
97
|
+
};
|
|
98
|
+
const handleInputChange = (e) => {
|
|
99
|
+
if (isMobileType) {
|
|
100
|
+
const digits = (e.target.value || "").replace(/\D/g, "").slice(0, 10);
|
|
101
|
+
onChange?.({
|
|
102
|
+
target: { value: digits }
|
|
103
|
+
});
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (isNumberType && onNumberChange) {
|
|
107
|
+
const newValue = e.target.value;
|
|
108
|
+
if (newValue === "" || allowNegative && newValue === "-") {
|
|
109
|
+
setInputValue(newValue);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (isValidNumber(newValue)) {
|
|
113
|
+
setInputValue(newValue);
|
|
114
|
+
const numValue = parseFloat(newValue);
|
|
115
|
+
if (!isNaN(numValue)) {
|
|
116
|
+
onNumberChange(formatNumber(numValue));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
onChange?.(e);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const handleSelectChange = (e) => {
|
|
124
|
+
onSelectChange?.(e.target.value);
|
|
125
|
+
};
|
|
126
|
+
const handleIncrement = () => {
|
|
127
|
+
if (disabled || !isNumberType) return;
|
|
128
|
+
const currentNum = parseFloat(inputValue) || 0;
|
|
129
|
+
const newValue = currentNum + step;
|
|
130
|
+
const constrainedValue = max !== void 0 ? Math.min(newValue, max) : newValue;
|
|
131
|
+
const finalValue = formatNumber(constrainedValue);
|
|
132
|
+
setInputValue(finalValue.toString());
|
|
133
|
+
onNumberChange?.(finalValue);
|
|
134
|
+
};
|
|
135
|
+
const handleDecrement = () => {
|
|
136
|
+
if (disabled || !isNumberType) return;
|
|
137
|
+
const currentNum = parseFloat(inputValue) || 0;
|
|
138
|
+
const newValue = currentNum - step;
|
|
139
|
+
const constrainedValue = min !== void 0 ? Math.max(newValue, min) : newValue;
|
|
140
|
+
const finalValue = formatNumber(constrainedValue);
|
|
141
|
+
setInputValue(finalValue.toString());
|
|
142
|
+
onNumberChange?.(finalValue);
|
|
143
|
+
};
|
|
144
|
+
const handleBlur = (e) => {
|
|
145
|
+
if (isNumberType && onNumberChange) {
|
|
146
|
+
if (inputValue !== "" && inputValue !== "-") {
|
|
147
|
+
const numValue = parseFloat(inputValue);
|
|
148
|
+
if (!isNaN(numValue)) {
|
|
149
|
+
const cleanValue = formatNumber(numValue);
|
|
150
|
+
setInputValue(cleanValue.toString());
|
|
151
|
+
onNumberChange(cleanValue);
|
|
152
|
+
}
|
|
153
|
+
} else if (inputValue === "" || inputValue === "-") {
|
|
154
|
+
setInputValue("");
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
onBlur?.(e);
|
|
158
|
+
};
|
|
159
|
+
const baseInputStyles = "w-full transition-colors focus:outline-none min-h-[52px]";
|
|
160
|
+
const sizeStyles = {
|
|
161
|
+
sm: "px-3 py-2 text-sm",
|
|
162
|
+
md: "px-4 py-3 text-base",
|
|
163
|
+
lg: "px-5 py-4 text-lg"
|
|
164
|
+
};
|
|
165
|
+
const controlSizeStyles = {
|
|
166
|
+
sm: "w-6 h-5",
|
|
167
|
+
md: "w-8 h-6",
|
|
168
|
+
lg: "w-10 h-8"
|
|
169
|
+
};
|
|
170
|
+
const iconSizeStyles = {
|
|
171
|
+
sm: 12,
|
|
172
|
+
md: 16,
|
|
173
|
+
lg: 20
|
|
174
|
+
};
|
|
175
|
+
const variantStyles = {
|
|
176
|
+
default: "border bg-white/60 dark:bg-neutral-800/60 backdrop-blur-sm transition-colors duration-300 rounded-lg",
|
|
177
|
+
filled: "border-0 bg-neutral-50/60 dark:bg-neutral-700/60 backdrop-blur-sm transition-colors duration-300 rounded-lg"
|
|
178
|
+
};
|
|
179
|
+
const stateStyles = error ? "border-rose-500/50 dark:border-rose-400/50 focus:border-rose-600/70 dark:focus:border-rose-500/70 focus:ring-1 focus:ring-rose-500/50 dark:focus:ring-rose-400/50" : "border-neutral-300/50 dark:border-neutral-600/50 focus:border-blue-500/70 dark:focus:border-blue-400/70 focus:ring-1 focus:ring-blue-500/50 dark:focus:ring-blue-400/50";
|
|
180
|
+
const disabledStyles = disabled ? "bg-neutral-100/60 dark:bg-neutral-700/60 text-neutral-500 dark:text-neutral-400 cursor-not-allowed" : "text-neutral-900 dark:text-neutral-100";
|
|
181
|
+
const hasControls = isNumberType && showControls;
|
|
182
|
+
const hasLeadingContent = leadingIcon || leadingDecorator;
|
|
183
|
+
const hasTrailingContent = trailingIcon || trailingDecorator || hasControls;
|
|
184
|
+
const inputClasses = `
|
|
185
|
+
${baseInputStyles}
|
|
186
|
+
${sizeStyles[size]}
|
|
187
|
+
${variantStyles[variant]}
|
|
188
|
+
${stateStyles}
|
|
189
|
+
${disabledStyles}
|
|
190
|
+
${hasLeadingContent || isMobileType ? "pl-10" : ""}
|
|
191
|
+
${hasTrailingContent ? hasControls ? "pr-20" : "pr-10" : ""}
|
|
192
|
+
${className}
|
|
193
|
+
`.trim().replace(/\s+/g, " ");
|
|
194
|
+
const selectClasses = `
|
|
195
|
+
${baseInputStyles}
|
|
196
|
+
${sizeStyles[size]}
|
|
197
|
+
${variantStyles[variant]}
|
|
198
|
+
${stateStyles}
|
|
199
|
+
${disabledStyles}
|
|
200
|
+
${hasLeadingContent ? "pl-10" : ""}
|
|
201
|
+
${hasTrailingContent ? "pr-10" : ""}
|
|
202
|
+
${className}
|
|
203
|
+
appearance-none cursor-pointer
|
|
204
|
+
`.trim().replace(/\s+/g, " ");
|
|
205
|
+
const canDecrement = !disabled && (min === void 0 || (parseFloat(inputValue) || 0) > min);
|
|
206
|
+
const canIncrement = !disabled && (max === void 0 || (parseFloat(inputValue) || 0) < max);
|
|
207
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", children: [
|
|
208
|
+
label && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mb-2", children: [
|
|
209
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-sm font-medium text-neutral-700 dark:text-neutral-300 transition-colors duration-300 flex items-center", children: [
|
|
210
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs sm:text-sm", children: label }),
|
|
211
|
+
required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-rose-500 ml-1", children: "*" }),
|
|
212
|
+
tooltip && /* @__PURE__ */ jsxRuntime.jsx(
|
|
213
|
+
"button",
|
|
214
|
+
{
|
|
215
|
+
type: "button",
|
|
216
|
+
className: "ml-2 text-neutral-400 dark:text-neutral-500 hover:text-neutral-600 dark:hover:text-neutral-300 transition-colors duration-300",
|
|
217
|
+
onMouseEnter: () => setShowTooltip(true),
|
|
218
|
+
onMouseLeave: () => setShowTooltip(false),
|
|
219
|
+
onFocus: () => setShowTooltip(true),
|
|
220
|
+
onBlur: () => setShowTooltip(false),
|
|
221
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "w-4 h-4" })
|
|
222
|
+
}
|
|
223
|
+
)
|
|
224
|
+
] }),
|
|
225
|
+
tooltip && showTooltip && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute z-[9999] pointer-events-none left-0 bottom-full mt-2", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-neutral-900/80 dark:bg-neutral-100/80 backdrop-blur-md text-white dark:text-neutral-900 text-sm rounded-xl p-3 shadow-lg w-80 transition-colors duration-300", children: tooltip.content }) })
|
|
226
|
+
] }),
|
|
227
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
|
|
228
|
+
hasLeadingContent && /* @__PURE__ */ jsxRuntime.jsx(
|
|
229
|
+
"div",
|
|
230
|
+
{
|
|
231
|
+
className: `absolute inset-y-0 left-0 pl-3 flex items-center ${onLeadingClick ? "cursor-pointer" : "pointer-events-none"}`,
|
|
232
|
+
onClick: onLeadingClick,
|
|
233
|
+
children: leadingDecorator ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-400", children: leadingDecorator }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-400", children: leadingIcon })
|
|
234
|
+
}
|
|
235
|
+
),
|
|
236
|
+
isMobileType && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center z-10 pointer-events-none border-r pr-3 border-neutral-300/50 dark:border-neutral-600/50", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-500 dark:text-neutral-300", children: "+1" }) }),
|
|
237
|
+
isSelectType ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
238
|
+
"select",
|
|
239
|
+
{
|
|
240
|
+
ref,
|
|
241
|
+
value,
|
|
242
|
+
onChange: handleSelectChange,
|
|
243
|
+
onFocus,
|
|
244
|
+
onBlur,
|
|
245
|
+
disabled,
|
|
246
|
+
required,
|
|
247
|
+
className: selectClasses,
|
|
248
|
+
...props,
|
|
249
|
+
children: [
|
|
250
|
+
placeholder && /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, children: placeholder }),
|
|
251
|
+
options.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
252
|
+
"option",
|
|
253
|
+
{
|
|
254
|
+
value: option.value,
|
|
255
|
+
disabled: option.disabled,
|
|
256
|
+
children: option.label
|
|
257
|
+
},
|
|
258
|
+
option.value
|
|
259
|
+
))
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
263
|
+
"input",
|
|
264
|
+
{
|
|
265
|
+
ref,
|
|
266
|
+
type: isMobileType ? "tel" : isNumberType ? "text" : type,
|
|
267
|
+
inputMode: isMobileType ? "numeric" : isNumberType ? "numeric" : void 0,
|
|
268
|
+
value: isNumberType && onNumberChange ? inputValue : value,
|
|
269
|
+
onChange: handleInputChange,
|
|
270
|
+
onFocus,
|
|
271
|
+
onBlur: isNumberType && onNumberChange ? handleBlur : onBlur,
|
|
272
|
+
placeholder,
|
|
273
|
+
disabled,
|
|
274
|
+
required,
|
|
275
|
+
autoComplete: isMobileType ? autoComplete ?? "tel" : autoComplete,
|
|
276
|
+
className: inputClasses,
|
|
277
|
+
readOnly,
|
|
278
|
+
tabIndex,
|
|
279
|
+
...props
|
|
280
|
+
}
|
|
281
|
+
),
|
|
282
|
+
hasControls && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-y-0 right-0 flex items-center pr-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex", children: [
|
|
283
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
284
|
+
"button",
|
|
285
|
+
{
|
|
286
|
+
type: "button",
|
|
287
|
+
onClick: handleDecrement,
|
|
288
|
+
disabled: !canDecrement,
|
|
289
|
+
className: `
|
|
290
|
+
${controlSizeStyles[size]}
|
|
291
|
+
flex items-center justify-center
|
|
292
|
+
text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100
|
|
293
|
+
disabled:text-neutral-300 disabled:cursor-not-allowed
|
|
294
|
+
transition-colors
|
|
295
|
+
border-r border-neutral-300
|
|
296
|
+
`,
|
|
297
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { size: iconSizeStyles[size] })
|
|
298
|
+
}
|
|
299
|
+
),
|
|
300
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
301
|
+
"button",
|
|
302
|
+
{
|
|
303
|
+
type: "button",
|
|
304
|
+
onClick: handleIncrement,
|
|
305
|
+
disabled: !canIncrement,
|
|
306
|
+
className: `
|
|
307
|
+
${controlSizeStyles[size]}
|
|
308
|
+
flex items-center justify-center
|
|
309
|
+
text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100
|
|
310
|
+
disabled:text-neutral-300 disabled:cursor-not-allowed
|
|
311
|
+
transition-colors
|
|
312
|
+
`,
|
|
313
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { size: iconSizeStyles[size] })
|
|
314
|
+
}
|
|
315
|
+
)
|
|
316
|
+
] }) }),
|
|
317
|
+
isSelectType && !trailingIcon && !trailingDecorator && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
318
|
+
lucideReact.ChevronDown,
|
|
319
|
+
{
|
|
320
|
+
size: iconSizeStyles[size],
|
|
321
|
+
className: "text-neutral-400"
|
|
322
|
+
}
|
|
323
|
+
) }),
|
|
324
|
+
(trailingIcon || trailingDecorator) && !hasControls && /* @__PURE__ */ jsxRuntime.jsx(
|
|
325
|
+
"div",
|
|
326
|
+
{
|
|
327
|
+
className: `absolute top-1/2 -translate-y-1/3 right-0 pr-3 flex items-center ${onTrailingClick ? "cursor-pointer" : ""}`,
|
|
328
|
+
onClick: onTrailingClick,
|
|
329
|
+
onMouseEnter: tooltip ? () => setShowTooltip(true) : void 0,
|
|
330
|
+
onMouseLeave: tooltip ? () => setShowTooltip(false) : void 0,
|
|
331
|
+
onFocus: tooltip ? () => setShowTooltip(true) : void 0,
|
|
332
|
+
onBlur: tooltip ? () => setShowTooltip(false) : void 0,
|
|
333
|
+
children: trailingDecorator ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-400", children: trailingDecorator }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-400", children: trailingIcon })
|
|
334
|
+
}
|
|
335
|
+
)
|
|
336
|
+
] }),
|
|
337
|
+
(error || helperText) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2", children: [
|
|
338
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-rose-600 dark:text-rose-400 transition-colors duration-300", children: error }),
|
|
339
|
+
helperText && !error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-neutral-500 dark:text-neutral-400 transition-colors duration-300", children: helperText })
|
|
340
|
+
] })
|
|
341
|
+
] });
|
|
342
|
+
}
|
|
343
|
+
);
|
|
344
|
+
Input.displayName = "Input";
|
|
345
|
+
var TextButton = ({
|
|
346
|
+
children,
|
|
347
|
+
onClick,
|
|
348
|
+
disabled = false,
|
|
349
|
+
leadingDecorator,
|
|
350
|
+
trailingDecorator,
|
|
351
|
+
variant = "primary",
|
|
352
|
+
size = "md",
|
|
353
|
+
className = "",
|
|
354
|
+
type = "button",
|
|
355
|
+
...buttonProps
|
|
356
|
+
}) => {
|
|
357
|
+
const baseStyles = `group inline-flex justify-center items-center gap-2 font-medium uppercase tracking-wide transition-all duration-200 ${disabled ? "cursor-not-allowed" : "cursor-pointer"}`;
|
|
358
|
+
const variantStyles = {
|
|
359
|
+
primary: "text-blue-600 hover:text-blue-700 focus:ring-blue-500",
|
|
360
|
+
secondary: "text-neutral-600 hover:text-neutral-700 focus:ring-neutral-500",
|
|
361
|
+
danger: "text-rose-600 hover:text-rose-700 focus:ring-rose-500",
|
|
362
|
+
success: "text-green-600 hover:text-green-700 focus:ring-green-500",
|
|
363
|
+
disabled: "text-neutral-400 cursor-not-allowed"
|
|
364
|
+
};
|
|
365
|
+
const sizeStyles = {
|
|
366
|
+
sm: "text-xs px-2 py-1",
|
|
367
|
+
md: "text-sm px-3 py-2",
|
|
368
|
+
lg: "text-base px-4 py-3"
|
|
369
|
+
};
|
|
370
|
+
const disabledStyles = disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer";
|
|
371
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
372
|
+
"button",
|
|
373
|
+
{
|
|
374
|
+
type,
|
|
375
|
+
className: `${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${disabledStyles} ${className}`,
|
|
376
|
+
onClick,
|
|
377
|
+
disabled,
|
|
378
|
+
...buttonProps,
|
|
379
|
+
children: [
|
|
380
|
+
leadingDecorator && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "animate-in slide-in-from-left-1 duration-200", children: leadingDecorator }),
|
|
381
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children }),
|
|
382
|
+
trailingDecorator && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "animate-in slide-in-from-right-1 duration-200 group-hover:translate-x-1", children: trailingDecorator })
|
|
383
|
+
]
|
|
384
|
+
}
|
|
385
|
+
);
|
|
386
|
+
};
|
|
387
|
+
var Toast = ({
|
|
388
|
+
message,
|
|
389
|
+
type,
|
|
390
|
+
duration = 5e3,
|
|
391
|
+
onDismiss,
|
|
392
|
+
isVisible
|
|
393
|
+
}) => {
|
|
394
|
+
const [isDismissing, setIsDismissing] = react.useState(false);
|
|
395
|
+
const [progressWidth, setProgressWidth] = react.useState(100);
|
|
396
|
+
react.useEffect(() => {
|
|
397
|
+
if (isVisible && !isDismissing) {
|
|
398
|
+
const timer = setTimeout(() => {
|
|
399
|
+
setIsDismissing(true);
|
|
400
|
+
setTimeout(() => {
|
|
401
|
+
onDismiss?.();
|
|
402
|
+
}, 300);
|
|
403
|
+
}, duration);
|
|
404
|
+
return () => clearTimeout(timer);
|
|
405
|
+
}
|
|
406
|
+
}, [isVisible, isDismissing, duration, onDismiss]);
|
|
407
|
+
react.useEffect(() => {
|
|
408
|
+
if (isVisible) {
|
|
409
|
+
setIsDismissing(false);
|
|
410
|
+
setProgressWidth(0);
|
|
411
|
+
}
|
|
412
|
+
}, [isVisible]);
|
|
413
|
+
react.useEffect(() => {
|
|
414
|
+
if (isVisible && !isDismissing) {
|
|
415
|
+
const progressTimer = setInterval(() => {
|
|
416
|
+
setProgressWidth((prev) => {
|
|
417
|
+
if (prev >= 100) return 100;
|
|
418
|
+
return prev + 100 / (duration / 100);
|
|
419
|
+
});
|
|
420
|
+
}, 100);
|
|
421
|
+
return () => clearInterval(progressTimer);
|
|
422
|
+
}
|
|
423
|
+
}, [isVisible, isDismissing, duration]);
|
|
424
|
+
if (!isVisible) return null;
|
|
425
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
426
|
+
"div",
|
|
427
|
+
{
|
|
428
|
+
className: `fixed top-4 right-4 z-50 max-w-sm w-[calc(100vw-2rem)] sm:w-auto transition-all duration-300 ${isDismissing ? "translate-x-full opacity-0" : "translate-x-0 opacity-100"}`,
|
|
429
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
430
|
+
"div",
|
|
431
|
+
{
|
|
432
|
+
className: `p-3 sm:p-4 shadow-lg border transition-all duration-300 ${type === "success" ? "bg-green-50 dark:bg-green-900/70 border-green-200 dark:border-green-700 text-green-800 dark:text-green-200" : "bg-rose-50 dark:bg-rose-900/70 border-rose-200 dark:border-rose-700 text-rose-800 dark:text-rose-200"}`,
|
|
433
|
+
children: [
|
|
434
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
|
|
435
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
436
|
+
"div",
|
|
437
|
+
{
|
|
438
|
+
className: `w-5 h-5 mt-0.5 flex-shrink-0 ${type === "success" ? "text-green-600 dark:text-green-400" : "text-rose-600 dark:text-rose-400"}`,
|
|
439
|
+
children: type === "success" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "w-5 h-5" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-5 h-5" })
|
|
440
|
+
}
|
|
441
|
+
),
|
|
442
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", children: message }) }),
|
|
443
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
444
|
+
"button",
|
|
445
|
+
{
|
|
446
|
+
onClick: () => {
|
|
447
|
+
setIsDismissing(true);
|
|
448
|
+
setTimeout(() => {
|
|
449
|
+
onDismiss?.();
|
|
450
|
+
}, 300);
|
|
451
|
+
},
|
|
452
|
+
className: "text-neutral-400 hover:text-neutral-600 dark:text-neutral-500 dark:hover:text-neutral-300 transition-colors duration-300",
|
|
453
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "w-4 h-4" })
|
|
454
|
+
}
|
|
455
|
+
)
|
|
456
|
+
] }),
|
|
457
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 w-full bg-neutral-200 dark:bg-neutral-600 h-1 transition-all duration-300", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
458
|
+
"div",
|
|
459
|
+
{
|
|
460
|
+
className: `h-full transition-all duration-100 ease-linear ${type === "success" ? "bg-green-500 dark:bg-green-400" : "bg-rose-500 dark:bg-rose-400"}`,
|
|
461
|
+
style: { width: `${progressWidth}%` }
|
|
462
|
+
}
|
|
463
|
+
) })
|
|
464
|
+
]
|
|
465
|
+
}
|
|
466
|
+
)
|
|
467
|
+
}
|
|
468
|
+
);
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
exports.AnimatedButton = AnimatedButton;
|
|
472
|
+
exports.Input = Input;
|
|
473
|
+
exports.TextButton = TextButton;
|
|
474
|
+
exports.Toast = Toast;
|
|
475
|
+
//# sourceMappingURL=chunk-ZD6CMWPW.js.map
|
|
476
|
+
//# sourceMappingURL=chunk-ZD6CMWPW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/enhanced/animated-button/animated-button.tsx","../src/components/enhanced/input/input.tsx","../src/components/enhanced/text-button/text-button.tsx","../src/components/enhanced/toast/toast.tsx"],"names":["jsx","motion","forwardRef","useState","useEffect","jsxs","Info","ChevronDown","ChevronUp","Check","AlertTriangle","X"],"mappings":"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","file":"chunk-ZD6CMWPW.js","sourcesContent":["\"use client\";\n\nimport { motion } from \"framer-motion\";\n\nexport interface AnimatedButtonProps {\n label: string;\n variant?: \"primary\" | \"outlined\";\n buttonContainerClassName?: string;\n buttonTextClassName?: string;\n onClick?: () => void;\n}\n\nexport const AnimatedButton = ({\n label,\n variant = \"primary\",\n buttonContainerClassName,\n buttonTextClassName,\n onClick,\n}: AnimatedButtonProps) => {\n const handleOnClick = () => {\n onClick?.();\n };\n\n const baseButtonClass = \"text-xs tracking-wider font-medium\";\n\n const variantButtonClass = `${\n variant === \"outlined\" ? \"border border-1 bg-white\" : \"bg-[#0F62FE]\"\n }`;\n\n return (\n <motion.button\n whileHover={{\n scale: variant === \"primary\" ? 1.025 : 1,\n boxShadow:\n variant === \"primary\"\n ? \"0 0 4px rgba(15, 96, 254, 0.4), 0 0 16px rgba(15, 96, 254, 0.2)\"\n : \"\",\n }}\n whileTap={{ scale: variant === \"primary\" ? 0.98 : 1 }}\n onClick={handleOnClick}\n className={`w-fit p-2 px-4 ${variantButtonClass} ${buttonContainerClassName}`}\n >\n <span className={`${baseButtonClass} ${buttonTextClassName}`}>\n {label.toUpperCase()}\n </span>\n </motion.button>\n );\n};\n","\"use client\";\n\nimport { ReactNode, forwardRef, useState, useEffect } from \"react\";\nimport { ChevronUp, ChevronDown, Info } from \"lucide-react\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface InputProps {\n label?: string;\n placeholder?: string;\n value?: string | number;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onNumberChange?: (value: number) => void;\n onSelectChange?: (value: string) => void;\n onFocus?: (e: React.FocusEvent<HTMLInputElement | HTMLSelectElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement | HTMLSelectElement>) => void;\n type?: \"text\" | \"email\" | \"password\" | \"number\" | \"search\" | \"select\" | \"mobile\";\n disabled?: boolean;\n required?: boolean;\n error?: string;\n helperText?: string;\n autoComplete?: string;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n leadingDecorator?: ReactNode;\n trailingDecorator?: ReactNode;\n onLeadingClick?: () => void;\n onTrailingClick?: () => void;\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"default\" | \"filled\";\n className?: string;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n allowNegative?: boolean;\n showControls?: boolean;\n options?: SelectOption[];\n readOnly?: boolean;\n tabIndex?: number;\n tooltip?: {\n content: ReactNode;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n };\n}\n\nexport const Input = forwardRef<HTMLInputElement | HTMLSelectElement, InputProps>(\n (\n {\n label,\n placeholder,\n value,\n onChange,\n onNumberChange,\n onSelectChange,\n onFocus,\n onBlur,\n type = \"text\",\n disabled = false,\n required = false,\n error,\n helperText,\n leadingIcon,\n trailingIcon,\n leadingDecorator,\n trailingDecorator,\n onLeadingClick,\n onTrailingClick,\n size = \"md\",\n variant = \"default\",\n className = \"\",\n min,\n max,\n step = 1,\n precision = 0,\n allowNegative = true,\n showControls = false,\n options = [],\n autoComplete,\n readOnly = false,\n tabIndex = 0,\n tooltip,\n ...props\n },\n ref\n ) => {\n const [showTooltip, setShowTooltip] = useState(false);\n\n const isNumberType = type === \"number\";\n const isSelectType = type === \"select\";\n const isMobileType = type === \"mobile\";\n\n const [inputValue, setInputValue] = useState<string>(\n value !== undefined ? value.toString() : \"\"\n );\n\n useEffect(() => {\n if (value !== undefined) {\n setInputValue(value.toString());\n }\n }, [value]);\n\n const formatNumber = (num: number): number => {\n if (precision > 0) {\n return parseFloat(num.toFixed(precision));\n }\n return Math.round(num);\n };\n\n const isValidNumber = (str: string): boolean => {\n if (str === \"\" || str === \"-\") return true;\n const num = parseFloat(str);\n if (isNaN(num)) return false;\n if (!allowNegative && num < 0) return false;\n if (min !== undefined && num < min) return false;\n if (max !== undefined && num > max) return false;\n return true;\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (isMobileType) {\n const digits = (e.target.value || \"\").replace(/\\D/g, \"\").slice(0, 10);\n onChange?.({\n target: { value: digits },\n } as React.ChangeEvent<HTMLInputElement>);\n return;\n }\n\n if (isNumberType && onNumberChange) {\n const newValue = e.target.value;\n\n if (newValue === \"\" || (allowNegative && newValue === \"-\")) {\n setInputValue(newValue);\n return;\n }\n\n if (isValidNumber(newValue)) {\n setInputValue(newValue);\n const numValue = parseFloat(newValue);\n if (!isNaN(numValue)) {\n onNumberChange(formatNumber(numValue));\n }\n }\n } else {\n onChange?.(e);\n }\n };\n\n const handleSelectChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onSelectChange?.(e.target.value);\n };\n\n const handleIncrement = () => {\n if (disabled || !isNumberType) return;\n\n const currentNum = parseFloat(inputValue) || 0;\n const newValue = currentNum + step;\n const constrainedValue =\n max !== undefined ? Math.min(newValue, max) : newValue;\n const finalValue = formatNumber(constrainedValue);\n\n setInputValue(finalValue.toString());\n onNumberChange?.(finalValue);\n };\n\n const handleDecrement = () => {\n if (disabled || !isNumberType) return;\n\n const currentNum = parseFloat(inputValue) || 0;\n const newValue = currentNum - step;\n const constrainedValue =\n min !== undefined ? Math.max(newValue, min) : newValue;\n const finalValue = formatNumber(constrainedValue);\n\n setInputValue(finalValue.toString());\n onNumberChange?.(finalValue);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (isNumberType && onNumberChange) {\n if (inputValue !== \"\" && inputValue !== \"-\") {\n const numValue = parseFloat(inputValue);\n if (!isNaN(numValue)) {\n const cleanValue = formatNumber(numValue);\n setInputValue(cleanValue.toString());\n onNumberChange(cleanValue);\n }\n } else if (inputValue === \"\" || inputValue === \"-\") {\n setInputValue(\"\");\n }\n }\n\n onBlur?.(e);\n };\n\n const baseInputStyles =\n \"w-full transition-colors focus:outline-none min-h-[52px]\";\n\n const sizeStyles = {\n sm: \"px-3 py-2 text-sm\",\n md: \"px-4 py-3 text-base\",\n lg: \"px-5 py-4 text-lg\",\n };\n\n const controlSizeStyles = {\n sm: \"w-6 h-5\",\n md: \"w-8 h-6\",\n lg: \"w-10 h-8\",\n };\n\n const iconSizeStyles = {\n sm: 12,\n md: 16,\n lg: 20,\n };\n\n const variantStyles = {\n default:\n \"border bg-white/60 dark:bg-neutral-800/60 backdrop-blur-sm transition-colors duration-300 rounded-lg\",\n filled:\n \"border-0 bg-neutral-50/60 dark:bg-neutral-700/60 backdrop-blur-sm transition-colors duration-300 rounded-lg\",\n };\n\n const stateStyles = error\n ? \"border-rose-500/50 dark:border-rose-400/50 focus:border-rose-600/70 dark:focus:border-rose-500/70 focus:ring-1 focus:ring-rose-500/50 dark:focus:ring-rose-400/50\"\n : \"border-neutral-300/50 dark:border-neutral-600/50 focus:border-blue-500/70 dark:focus:border-blue-400/70 focus:ring-1 focus:ring-blue-500/50 dark:focus:ring-blue-400/50\";\n\n const disabledStyles = disabled\n ? \"bg-neutral-100/60 dark:bg-neutral-700/60 text-neutral-500 dark:text-neutral-400 cursor-not-allowed\"\n : \"text-neutral-900 dark:text-neutral-100\";\n\n const hasControls = isNumberType && showControls;\n const hasLeadingContent = leadingIcon || leadingDecorator;\n const hasTrailingContent = trailingIcon || trailingDecorator || hasControls;\n\n const inputClasses = `\n ${baseInputStyles}\n ${sizeStyles[size]}\n ${variantStyles[variant]}\n ${stateStyles}\n ${disabledStyles}\n ${hasLeadingContent || isMobileType ? \"pl-10\" : \"\"}\n ${hasTrailingContent ? (hasControls ? \"pr-20\" : \"pr-10\") : \"\"}\n ${className}\n `\n .trim()\n .replace(/\\s+/g, \" \");\n\n const selectClasses = `\n ${baseInputStyles}\n ${sizeStyles[size]}\n ${variantStyles[variant]}\n ${stateStyles}\n ${disabledStyles}\n ${hasLeadingContent ? \"pl-10\" : \"\"}\n ${hasTrailingContent ? \"pr-10\" : \"\"}\n ${className}\n appearance-none cursor-pointer\n `\n .trim()\n .replace(/\\s+/g, \" \");\n\n const canDecrement =\n !disabled && (min === undefined || (parseFloat(inputValue) || 0) > min);\n const canIncrement =\n !disabled && (max === undefined || (parseFloat(inputValue) || 0) < max);\n\n return (\n <div className=\"w-full\">\n {label && (\n <div className=\"relative mb-2\">\n <label className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300 transition-colors duration-300 flex items-center\">\n <span className=\"text-xs sm:text-sm\">{label}</span>\n {required && <span className=\"text-rose-500 ml-1\">*</span>}\n {tooltip && (\n <button\n type=\"button\"\n className=\"ml-2 text-neutral-400 dark:text-neutral-500 hover:text-neutral-600 dark:hover:text-neutral-300 transition-colors duration-300\"\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n onFocus={() => setShowTooltip(true)}\n onBlur={() => setShowTooltip(false)}\n >\n <Info className=\"w-4 h-4\" />\n </button>\n )}\n </label>\n\n {tooltip && showTooltip && (\n <div className=\"absolute z-[9999] pointer-events-none left-0 bottom-full mt-2\">\n <div className=\"bg-neutral-900/80 dark:bg-neutral-100/80 backdrop-blur-md text-white dark:text-neutral-900 text-sm rounded-xl p-3 shadow-lg w-80 transition-colors duration-300\">\n {tooltip.content}\n </div>\n </div>\n )}\n </div>\n )}\n\n <div className=\"relative\">\n {hasLeadingContent && (\n <div\n className={`absolute inset-y-0 left-0 pl-3 flex items-center ${\n onLeadingClick ? \"cursor-pointer\" : \"pointer-events-none\"\n }`}\n onClick={onLeadingClick}\n >\n {leadingDecorator ? (\n <span className=\"text-neutral-400\">{leadingDecorator}</span>\n ) : (\n <span className=\"text-neutral-400\">{leadingIcon}</span>\n )}\n </div>\n )}\n\n {isMobileType && (\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center z-10 pointer-events-none border-r pr-3 border-neutral-300/50 dark:border-neutral-600/50\">\n <span className=\"text-neutral-500 dark:text-neutral-300\">+1</span>\n </div>\n )}\n\n {isSelectType ? (\n <select\n ref={ref as React.Ref<HTMLSelectElement>}\n value={value}\n onChange={handleSelectChange}\n onFocus={onFocus}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n className={selectClasses}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type={isMobileType ? \"tel\" : isNumberType ? \"text\" : type}\n inputMode={\n isMobileType ? \"numeric\" : isNumberType ? \"numeric\" : undefined\n }\n value={isNumberType && onNumberChange ? inputValue : value}\n onChange={handleInputChange}\n onFocus={onFocus}\n onBlur={isNumberType && onNumberChange ? handleBlur : onBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n autoComplete={isMobileType ? autoComplete ?? \"tel\" : autoComplete}\n className={inputClasses}\n readOnly={readOnly}\n tabIndex={tabIndex}\n {...props}\n />\n )}\n\n {hasControls && (\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-1\">\n <div className=\"flex\">\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={!canDecrement}\n className={`\n ${controlSizeStyles[size]}\n flex items-center justify-center\n text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100\n disabled:text-neutral-300 disabled:cursor-not-allowed\n transition-colors\n border-r border-neutral-300\n `}\n >\n <ChevronDown size={iconSizeStyles[size]} />\n </button>\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={!canIncrement}\n className={`\n ${controlSizeStyles[size]}\n flex items-center justify-center\n text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100\n disabled:text-neutral-300 disabled:cursor-not-allowed\n transition-colors\n `}\n >\n <ChevronUp size={iconSizeStyles[size]} />\n </button>\n </div>\n </div>\n )}\n\n {isSelectType && !trailingIcon && !trailingDecorator && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none\">\n <ChevronDown\n size={iconSizeStyles[size]}\n className=\"text-neutral-400\"\n />\n </div>\n )}\n\n {(trailingIcon || trailingDecorator) && !hasControls && (\n <div\n className={`absolute top-1/2 -translate-y-1/3 right-0 pr-3 flex items-center ${\n onTrailingClick ? \"cursor-pointer\" : \"\"\n }`}\n onClick={onTrailingClick}\n onMouseEnter={tooltip ? () => setShowTooltip(true) : undefined}\n onMouseLeave={tooltip ? () => setShowTooltip(false) : undefined}\n onFocus={tooltip ? () => setShowTooltip(true) : undefined}\n onBlur={tooltip ? () => setShowTooltip(false) : undefined}\n >\n {trailingDecorator ? (\n <span className=\"text-neutral-400\">{trailingDecorator}</span>\n ) : (\n <span className=\"text-neutral-400\">{trailingIcon}</span>\n )}\n </div>\n )}\n </div>\n\n {(error || helperText) && (\n <div className=\"mt-2\">\n {error && (\n <p className=\"text-sm text-rose-600 dark:text-rose-400 transition-colors duration-300\">\n {error}\n </p>\n )}\n {helperText && !error && (\n <p className=\"text-sm text-neutral-500 dark:text-neutral-400 transition-colors duration-300\">\n {helperText}\n </p>\n )}\n </div>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n","import { ReactNode, ButtonHTMLAttributes } from \"react\";\n\nexport interface TextButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n onClick?: () => void;\n disabled?: boolean;\n leadingDecorator?: ReactNode;\n trailingDecorator?: ReactNode;\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"success\" | \"disabled\";\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n type?: \"button\" | \"submit\" | \"reset\";\n}\n\nexport const TextButton = ({\n children,\n onClick,\n disabled = false,\n leadingDecorator,\n trailingDecorator,\n variant = \"primary\",\n size = \"md\",\n className = \"\",\n type = \"button\",\n ...buttonProps\n}: TextButtonProps) => {\n const baseStyles = `group inline-flex justify-center items-center gap-2 font-medium uppercase tracking-wide transition-all duration-200 ${\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\"\n }`;\n\n const variantStyles = {\n primary: \"text-blue-600 hover:text-blue-700 focus:ring-blue-500\",\n secondary: \"text-neutral-600 hover:text-neutral-700 focus:ring-neutral-500\",\n danger: \"text-rose-600 hover:text-rose-700 focus:ring-rose-500\",\n success: \"text-green-600 hover:text-green-700 focus:ring-green-500\",\n disabled: \"text-neutral-400 cursor-not-allowed\",\n };\n\n const sizeStyles = {\n sm: \"text-xs px-2 py-1\",\n md: \"text-sm px-3 py-2\",\n lg: \"text-base px-4 py-3\",\n };\n\n const disabledStyles = disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer\";\n\n return (\n <button\n type={type}\n className={`${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${disabledStyles} ${className}`}\n onClick={onClick}\n disabled={disabled}\n {...buttonProps}\n >\n {leadingDecorator && (\n <span className=\"animate-in slide-in-from-left-1 duration-200\">\n {leadingDecorator}\n </span>\n )}\n\n <span>{children}</span>\n\n {trailingDecorator && (\n <span className=\"animate-in slide-in-from-right-1 duration-200 group-hover:translate-x-1\">\n {trailingDecorator}\n </span>\n )}\n </button>\n );\n};\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { Check, X, AlertTriangle } from \"lucide-react\";\n\nexport interface ToastProps {\n message: string;\n type: \"success\" | \"error\";\n duration?: number;\n onDismiss?: () => void;\n isVisible: boolean;\n}\n\nexport const Toast: React.FC<ToastProps> = ({\n message,\n type,\n duration = 5000,\n onDismiss,\n isVisible,\n}) => {\n const [isDismissing, setIsDismissing] = useState(false);\n const [progressWidth, setProgressWidth] = useState(100);\n\n // Auto-dismiss after specified duration\n useEffect(() => {\n if (isVisible && !isDismissing) {\n const timer = setTimeout(() => {\n setIsDismissing(true);\n setTimeout(() => {\n onDismiss?.();\n }, 300); // Wait for slide-out animation\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [isVisible, isDismissing, duration, onDismiss]);\n\n // Reset dismiss state when toast becomes visible\n useEffect(() => {\n if (isVisible) {\n setIsDismissing(false);\n setProgressWidth(0); // Start at 0% to fill up\n }\n }, [isVisible]);\n\n // Animate progress bar\n useEffect(() => {\n if (isVisible && !isDismissing) {\n const progressTimer = setInterval(() => {\n setProgressWidth((prev) => {\n if (prev >= 100) return 100;\n return prev + 100 / (duration / 100); // Increase by 1% every 100ms\n });\n }, 100);\n\n return () => clearInterval(progressTimer);\n }\n }, [isVisible, isDismissing, duration]);\n\n if (!isVisible) return null;\n\n return (\n <div\n className={`fixed top-4 right-4 z-50 max-w-sm w-[calc(100vw-2rem)] sm:w-auto transition-all duration-300 ${\n isDismissing\n ? \"translate-x-full opacity-0\"\n : \"translate-x-0 opacity-100\"\n }`}\n >\n <div\n className={`p-3 sm:p-4 shadow-lg border transition-all duration-300 ${\n type === \"success\"\n ? \"bg-green-50 dark:bg-green-900/70 border-green-200 dark:border-green-700 text-green-800 dark:text-green-200\"\n : \"bg-rose-50 dark:bg-rose-900/70 border-rose-200 dark:border-rose-700 text-rose-800 dark:text-rose-200\"\n }`}\n >\n <div className=\"flex items-start gap-3\">\n <div\n className={`w-5 h-5 mt-0.5 flex-shrink-0 ${\n type === \"success\"\n ? \"text-green-600 dark:text-green-400\"\n : \"text-rose-600 dark:text-rose-400\"\n }`}\n >\n {type === \"success\" ? (\n <Check className=\"w-5 h-5\" />\n ) : (\n <AlertTriangle className=\"w-5 h-5\" />\n )}\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm\">{message}</p>\n </div>\n <button\n onClick={() => {\n setIsDismissing(true);\n setTimeout(() => {\n onDismiss?.();\n }, 300);\n }}\n className=\"text-neutral-400 hover:text-neutral-600 dark:text-neutral-500 dark:hover:text-neutral-300 transition-colors duration-300\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Progress Bar Timer */}\n <div className=\"mt-3 w-full bg-neutral-200 dark:bg-neutral-600 h-1 transition-all duration-300\">\n <div\n className={`h-full transition-all duration-100 ease-linear ${\n type === \"success\"\n ? \"bg-green-500 dark:bg-green-400\"\n : \"bg-rose-500 dark:bg-rose-400\"\n }`}\n style={{ width: `${progressWidth}%` }}\n />\n </div>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React$1 from 'react';
|
|
3
|
+
import React__default, { ReactNode, ButtonHTMLAttributes } from 'react';
|
|
4
|
+
|
|
5
|
+
interface AnimatedButtonProps {
|
|
6
|
+
label: string;
|
|
7
|
+
variant?: "primary" | "outlined";
|
|
8
|
+
buttonContainerClassName?: string;
|
|
9
|
+
buttonTextClassName?: string;
|
|
10
|
+
onClick?: () => void;
|
|
11
|
+
}
|
|
12
|
+
declare const AnimatedButton: ({ label, variant, buttonContainerClassName, buttonTextClassName, onClick, }: AnimatedButtonProps) => react_jsx_runtime.JSX.Element;
|
|
13
|
+
|
|
14
|
+
interface SelectOption {
|
|
15
|
+
value: string;
|
|
16
|
+
label: string;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface InputProps {
|
|
20
|
+
label?: string;
|
|
21
|
+
placeholder?: string;
|
|
22
|
+
value?: string | number;
|
|
23
|
+
onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
24
|
+
onNumberChange?: (value: number) => void;
|
|
25
|
+
onSelectChange?: (value: string) => void;
|
|
26
|
+
onFocus?: (e: React.FocusEvent<HTMLInputElement | HTMLSelectElement>) => void;
|
|
27
|
+
onBlur?: (e: React.FocusEvent<HTMLInputElement | HTMLSelectElement>) => void;
|
|
28
|
+
type?: "text" | "email" | "password" | "number" | "search" | "select" | "mobile";
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
required?: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
helperText?: string;
|
|
33
|
+
autoComplete?: string;
|
|
34
|
+
leadingIcon?: ReactNode;
|
|
35
|
+
trailingIcon?: ReactNode;
|
|
36
|
+
leadingDecorator?: ReactNode;
|
|
37
|
+
trailingDecorator?: ReactNode;
|
|
38
|
+
onLeadingClick?: () => void;
|
|
39
|
+
onTrailingClick?: () => void;
|
|
40
|
+
size?: "sm" | "md" | "lg";
|
|
41
|
+
variant?: "default" | "filled";
|
|
42
|
+
className?: string;
|
|
43
|
+
min?: number;
|
|
44
|
+
max?: number;
|
|
45
|
+
step?: number;
|
|
46
|
+
precision?: number;
|
|
47
|
+
allowNegative?: boolean;
|
|
48
|
+
showControls?: boolean;
|
|
49
|
+
options?: SelectOption[];
|
|
50
|
+
readOnly?: boolean;
|
|
51
|
+
tabIndex?: number;
|
|
52
|
+
tooltip?: {
|
|
53
|
+
content: ReactNode;
|
|
54
|
+
position?: "top" | "bottom" | "left" | "right";
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
declare const Input: React$1.ForwardRefExoticComponent<InputProps & React$1.RefAttributes<HTMLInputElement | HTMLSelectElement>>;
|
|
58
|
+
|
|
59
|
+
interface TextButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
60
|
+
children: React.ReactNode;
|
|
61
|
+
onClick?: () => void;
|
|
62
|
+
disabled?: boolean;
|
|
63
|
+
leadingDecorator?: ReactNode;
|
|
64
|
+
trailingDecorator?: ReactNode;
|
|
65
|
+
variant?: "primary" | "secondary" | "danger" | "success" | "disabled";
|
|
66
|
+
size?: "sm" | "md" | "lg";
|
|
67
|
+
className?: string;
|
|
68
|
+
type?: "button" | "submit" | "reset";
|
|
69
|
+
}
|
|
70
|
+
declare const TextButton: ({ children, onClick, disabled, leadingDecorator, trailingDecorator, variant, size, className, type, ...buttonProps }: TextButtonProps) => react_jsx_runtime.JSX.Element;
|
|
71
|
+
|
|
72
|
+
interface ToastProps {
|
|
73
|
+
message: string;
|
|
74
|
+
type: "success" | "error";
|
|
75
|
+
duration?: number;
|
|
76
|
+
onDismiss?: () => void;
|
|
77
|
+
isVisible: boolean;
|
|
78
|
+
}
|
|
79
|
+
declare const Toast: React__default.FC<ToastProps>;
|
|
80
|
+
|
|
81
|
+
export { AnimatedButton, type AnimatedButtonProps, Input, type InputProps, type SelectOption, TextButton, type TextButtonProps, Toast, type ToastProps };
|