@igorao79/uivix 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/dist/index.mjs ADDED
@@ -0,0 +1,3587 @@
1
+ // src/components/Button/Button.tsx
2
+ import React from "react";
3
+
4
+ // src/utils/cn.ts
5
+ import { clsx } from "clsx";
6
+ import { twMerge } from "tailwind-merge";
7
+ function cn(...inputs) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+
11
+ // src/components/Button/Button.tsx
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ var variantStyles = {
14
+ default: "bg-zinc-900 text-white hover:bg-zinc-800 dark:bg-white dark:text-zinc-900 dark:hover:bg-zinc-200",
15
+ secondary: "bg-zinc-100 text-zinc-900 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-100 dark:hover:bg-zinc-700",
16
+ outline: "border border-zinc-300 bg-transparent text-zinc-900 hover:bg-zinc-100 dark:border-zinc-700 dark:text-zinc-100 dark:hover:bg-zinc-800",
17
+ ghost: "bg-transparent text-zinc-900 hover:bg-zinc-100 dark:text-zinc-100 dark:hover:bg-zinc-800",
18
+ destructive: "bg-red-600 text-white hover:bg-red-700 dark:bg-red-700 dark:hover:bg-red-800",
19
+ link: "bg-transparent text-zinc-900 underline-offset-4 hover:underline dark:text-zinc-100 p-0 h-auto",
20
+ gradient: "bg-gradient-to-r from-violet-600 to-indigo-600 text-white hover:from-violet-700 hover:to-indigo-700 shadow-md hover:shadow-lg",
21
+ glow: "bg-violet-600 text-white hover:bg-violet-700 shadow-[0_0_15px_rgba(139,92,246,0.4)] hover:shadow-[0_0_25px_rgba(139,92,246,0.6)] dark:shadow-[0_0_15px_rgba(167,139,250,0.4)] dark:hover:shadow-[0_0_25px_rgba(167,139,250,0.6)]",
22
+ soft: "bg-violet-100 text-violet-700 hover:bg-violet-200 dark:bg-violet-900/30 dark:text-violet-300 dark:hover:bg-violet-900/50"
23
+ };
24
+ var sizeStyles = {
25
+ sm: "h-8 px-3 text-xs gap-1.5",
26
+ md: "h-10 px-4 text-sm gap-2",
27
+ lg: "h-12 px-6 text-base gap-2.5",
28
+ icon: "h-10 w-10"
29
+ };
30
+ var Spinner = ({ className }) => /* @__PURE__ */ jsxs(
31
+ "svg",
32
+ {
33
+ className: cn("animate-spin", className),
34
+ xmlns: "http://www.w3.org/2000/svg",
35
+ fill: "none",
36
+ viewBox: "0 0 24 24",
37
+ children: [
38
+ /* @__PURE__ */ jsx(
39
+ "circle",
40
+ {
41
+ className: "opacity-25",
42
+ cx: "12",
43
+ cy: "12",
44
+ r: "10",
45
+ stroke: "currentColor",
46
+ strokeWidth: "4"
47
+ }
48
+ ),
49
+ /* @__PURE__ */ jsx(
50
+ "path",
51
+ {
52
+ className: "opacity-75",
53
+ fill: "currentColor",
54
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
55
+ }
56
+ )
57
+ ]
58
+ }
59
+ );
60
+ var Button = React.forwardRef(
61
+ ({
62
+ className,
63
+ variant = "default",
64
+ size = "md",
65
+ pill = false,
66
+ loading = false,
67
+ leftIcon,
68
+ rightIcon,
69
+ disabled,
70
+ children,
71
+ ...props
72
+ }, ref) => {
73
+ const spinnerSize = size === "sm" ? "h-3 w-3" : size === "lg" ? "h-5 w-5" : "h-4 w-4";
74
+ return /* @__PURE__ */ jsxs(
75
+ "button",
76
+ {
77
+ ref,
78
+ disabled: disabled || loading,
79
+ className: cn(
80
+ "inline-flex items-center justify-center font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
81
+ variantStyles[variant],
82
+ sizeStyles[size],
83
+ pill ? "rounded-full" : "rounded-md",
84
+ className
85
+ ),
86
+ ...props,
87
+ children: [
88
+ loading && /* @__PURE__ */ jsx(Spinner, { className: spinnerSize }),
89
+ !loading && leftIcon && /* @__PURE__ */ jsx("span", { className: "shrink-0", children: leftIcon }),
90
+ children,
91
+ !loading && rightIcon && /* @__PURE__ */ jsx("span", { className: "shrink-0", children: rightIcon })
92
+ ]
93
+ }
94
+ );
95
+ }
96
+ );
97
+ Button.displayName = "Button";
98
+
99
+ // src/components/Input/Input.tsx
100
+ import React2, { useState, useId } from "react";
101
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
102
+ var variantStyles2 = {
103
+ default: "border border-zinc-300 bg-transparent dark:border-zinc-700 dark:bg-transparent",
104
+ filled: "border border-transparent bg-zinc-100 dark:bg-zinc-800",
105
+ underline: "border-b border-zinc-300 bg-transparent rounded-none px-0 dark:border-zinc-700",
106
+ floating: "peer border border-zinc-300 bg-transparent dark:border-zinc-700 dark:bg-transparent",
107
+ ghost: "border border-transparent bg-transparent hover:bg-zinc-100 dark:hover:bg-zinc-800 focus-visible:bg-zinc-100 dark:focus-visible:bg-zinc-800",
108
+ glow: "border border-zinc-300 bg-transparent dark:border-zinc-700 dark:bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-violet-500 focus-visible:shadow-[0_0_10px_rgba(139,92,246,0.5),0_0_20px_rgba(139,92,246,0.2)] dark:focus-visible:border-violet-400 dark:focus-visible:shadow-[0_0_10px_rgba(167,139,250,0.5),0_0_20px_rgba(167,139,250,0.2)]"
109
+ };
110
+ var sizeStyles2 = {
111
+ sm: "h-8 px-2 text-xs",
112
+ md: "h-10 px-3 text-sm",
113
+ lg: "h-12 px-4 text-base"
114
+ };
115
+ var iconSizeStyles = {
116
+ sm: { left: "left-2", right: "right-2", inputLeft: "pl-7", inputRight: "pr-7" },
117
+ md: { left: "left-3", right: "right-3", inputLeft: "pl-9", inputRight: "pr-9" },
118
+ lg: { left: "left-4", right: "right-4", inputLeft: "pl-11", inputRight: "pr-11" }
119
+ };
120
+ var floatingSizeStyles = {
121
+ sm: {
122
+ input: "h-10 pt-4 pb-1 px-3 text-xs",
123
+ label: "text-xs left-3",
124
+ floated: "top-1 text-[10px]",
125
+ resting: "top-1/2 -translate-y-1/2 text-xs"
126
+ },
127
+ md: {
128
+ input: "h-12 pt-5 pb-2 px-3 text-sm",
129
+ label: "text-sm left-3",
130
+ floated: "top-1.5 text-[11px]",
131
+ resting: "top-1/2 -translate-y-1/2 text-sm"
132
+ },
133
+ lg: {
134
+ input: "h-14 pt-6 pb-2 px-4 text-base",
135
+ label: "text-base left-4",
136
+ floated: "top-2 text-xs",
137
+ resting: "top-1/2 -translate-y-1/2 text-base"
138
+ }
139
+ };
140
+ var Input = React2.forwardRef(
141
+ ({
142
+ className,
143
+ variant = "default",
144
+ inputSize = "md",
145
+ error,
146
+ label,
147
+ labelClassName,
148
+ wrapperClassName,
149
+ leftIcon,
150
+ rightIcon,
151
+ id,
152
+ onChange,
153
+ onFocus,
154
+ onBlur,
155
+ defaultValue,
156
+ value: controlledValue,
157
+ ...props
158
+ }, ref) => {
159
+ if (variant === "floating") {
160
+ return /* @__PURE__ */ jsx2(
161
+ FloatingInputInternal,
162
+ {
163
+ ref,
164
+ className,
165
+ inputSize,
166
+ error,
167
+ label: label || "",
168
+ labelClassName,
169
+ wrapperClassName,
170
+ id,
171
+ onChange,
172
+ onFocus,
173
+ onBlur,
174
+ defaultValue,
175
+ value: controlledValue,
176
+ ...props
177
+ }
178
+ );
179
+ }
180
+ if (leftIcon || rightIcon) {
181
+ const iconSizes = iconSizeStyles[inputSize];
182
+ return /* @__PURE__ */ jsxs2("div", { className: cn("relative w-full", wrapperClassName), children: [
183
+ leftIcon && /* @__PURE__ */ jsx2("span", { className: cn("pointer-events-none absolute top-1/2 -translate-y-1/2 text-zinc-400 dark:text-zinc-500", iconSizes.left), children: leftIcon }),
184
+ /* @__PURE__ */ jsx2(
185
+ "input",
186
+ {
187
+ ref,
188
+ id,
189
+ className: cn(
190
+ "w-full rounded-md text-zinc-900 placeholder:text-zinc-400 transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-zinc-100 dark:placeholder:text-zinc-500",
191
+ variantStyles2[variant],
192
+ sizeStyles2[inputSize],
193
+ leftIcon && iconSizes.inputLeft,
194
+ rightIcon && iconSizes.inputRight,
195
+ error && "border-red-500 focus-visible:ring-red-500 dark:border-red-500",
196
+ className
197
+ ),
198
+ onChange,
199
+ onFocus,
200
+ onBlur,
201
+ defaultValue,
202
+ value: controlledValue,
203
+ ...props
204
+ }
205
+ ),
206
+ rightIcon && /* @__PURE__ */ jsx2("span", { className: cn("pointer-events-none absolute top-1/2 -translate-y-1/2 text-zinc-400 dark:text-zinc-500", iconSizes.right), children: rightIcon })
207
+ ] });
208
+ }
209
+ return /* @__PURE__ */ jsx2(
210
+ "input",
211
+ {
212
+ ref,
213
+ id,
214
+ className: cn(
215
+ "w-full rounded-md text-zinc-900 placeholder:text-zinc-400 transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-zinc-100 dark:placeholder:text-zinc-500",
216
+ variantStyles2[variant],
217
+ sizeStyles2[inputSize],
218
+ error && "border-red-500 focus-visible:ring-red-500 dark:border-red-500",
219
+ className
220
+ ),
221
+ onChange,
222
+ onFocus,
223
+ onBlur,
224
+ defaultValue,
225
+ value: controlledValue,
226
+ ...props
227
+ }
228
+ );
229
+ }
230
+ );
231
+ Input.displayName = "Input";
232
+ var FloatingInputInternal = React2.forwardRef(
233
+ ({
234
+ className,
235
+ inputSize,
236
+ error,
237
+ label,
238
+ labelClassName,
239
+ wrapperClassName,
240
+ id,
241
+ onChange,
242
+ onFocus,
243
+ onBlur,
244
+ defaultValue,
245
+ value: controlledValue,
246
+ ...props
247
+ }, ref) => {
248
+ const generatedId = useId();
249
+ const inputId = id || generatedId;
250
+ const [focused, setFocused] = useState(false);
251
+ const [internalValue, setInternalValue] = useState((defaultValue == null ? void 0 : defaultValue.toString()) || "");
252
+ const value = controlledValue !== void 0 ? controlledValue.toString() : internalValue;
253
+ const isFloated = focused || value.length > 0;
254
+ const sizes = floatingSizeStyles[inputSize];
255
+ return /* @__PURE__ */ jsxs2("div", { className: cn("relative w-full", wrapperClassName), children: [
256
+ /* @__PURE__ */ jsx2(
257
+ "input",
258
+ {
259
+ ref,
260
+ id: inputId,
261
+ className: cn(
262
+ "peer w-full rounded-md border border-zinc-300 bg-transparent text-zinc-900 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-zinc-700 dark:bg-transparent dark:text-zinc-100",
263
+ sizes.input,
264
+ error && "border-red-500 focus-visible:ring-red-500 dark:border-red-500",
265
+ className
266
+ ),
267
+ value: controlledValue !== void 0 ? controlledValue : void 0,
268
+ defaultValue: controlledValue !== void 0 ? void 0 : defaultValue,
269
+ onChange: (e) => {
270
+ if (controlledValue === void 0) setInternalValue(e.target.value);
271
+ onChange == null ? void 0 : onChange(e);
272
+ },
273
+ onFocus: (e) => {
274
+ setFocused(true);
275
+ onFocus == null ? void 0 : onFocus(e);
276
+ },
277
+ onBlur: (e) => {
278
+ setFocused(false);
279
+ onBlur == null ? void 0 : onBlur(e);
280
+ },
281
+ placeholder: " ",
282
+ ...props
283
+ }
284
+ ),
285
+ /* @__PURE__ */ jsx2(
286
+ "label",
287
+ {
288
+ htmlFor: inputId,
289
+ className: cn(
290
+ "pointer-events-none absolute transition-all duration-200 ease-out",
291
+ sizes.label,
292
+ isFloated ? cn(sizes.floated, focused ? error ? "text-red-500" : "text-zinc-500 dark:text-zinc-400" : "text-zinc-400 dark:text-zinc-500") : cn(sizes.resting, "text-zinc-400 dark:text-zinc-500"),
293
+ labelClassName
294
+ ),
295
+ children: label
296
+ }
297
+ )
298
+ ] });
299
+ }
300
+ );
301
+ FloatingInputInternal.displayName = "FloatingInputInternal";
302
+
303
+ // src/components/Input/PasswordInput.tsx
304
+ import React3, { useState as useState2 } from "react";
305
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
306
+ var sizeStyles3 = {
307
+ sm: { input: "h-8 px-2 pr-8 text-xs", btn: "right-1.5 h-5 w-5" },
308
+ md: { input: "h-10 px-3 pr-10 text-sm", btn: "right-2.5 h-5 w-5" },
309
+ lg: { input: "h-12 px-4 pr-12 text-base", btn: "right-3.5 h-6 w-6" }
310
+ };
311
+ var EyeIcon = () => /* @__PURE__ */ jsxs3("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "h-full w-full", children: [
312
+ /* @__PURE__ */ jsx3("path", { d: "M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" }),
313
+ /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "3" })
314
+ ] });
315
+ var EyeOffIcon = () => /* @__PURE__ */ jsxs3("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "h-full w-full", children: [
316
+ /* @__PURE__ */ jsx3("path", { d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49" }),
317
+ /* @__PURE__ */ jsx3("path", { d: "M14.084 14.158a3 3 0 0 1-4.242-4.242" }),
318
+ /* @__PURE__ */ jsx3("path", { d: "M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143" }),
319
+ /* @__PURE__ */ jsx3("path", { d: "m2 2 20 20" })
320
+ ] });
321
+ var PasswordInput = React3.forwardRef(
322
+ ({ className, inputSize = "md", error, wrapperClassName, ...props }, ref) => {
323
+ const [visible, setVisible] = useState2(false);
324
+ const sizes = sizeStyles3[inputSize];
325
+ return /* @__PURE__ */ jsxs3("div", { className: cn("relative w-full", wrapperClassName), children: [
326
+ /* @__PURE__ */ jsx3(
327
+ "input",
328
+ {
329
+ ref,
330
+ type: visible ? "text" : "password",
331
+ className: cn(
332
+ "w-full rounded-md border border-zinc-300 bg-transparent text-zinc-900 placeholder:text-zinc-400 transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-zinc-700 dark:bg-transparent dark:text-zinc-100 dark:placeholder:text-zinc-500",
333
+ sizes.input,
334
+ error && "border-red-500 focus-visible:ring-red-500 dark:border-red-500",
335
+ className
336
+ ),
337
+ ...props
338
+ }
339
+ ),
340
+ /* @__PURE__ */ jsx3(
341
+ "button",
342
+ {
343
+ type: "button",
344
+ tabIndex: -1,
345
+ onClick: () => setVisible((v) => !v),
346
+ className: cn(
347
+ "absolute top-1/2 -translate-y-1/2 text-zinc-400 hover:text-zinc-600 dark:text-zinc-500 dark:hover:text-zinc-300 transition-colors",
348
+ sizes.btn
349
+ ),
350
+ "aria-label": visible ? "Hide password" : "Show password",
351
+ children: visible ? /* @__PURE__ */ jsx3(EyeOffIcon, {}) : /* @__PURE__ */ jsx3(EyeIcon, {})
352
+ }
353
+ )
354
+ ] });
355
+ }
356
+ );
357
+ PasswordInput.displayName = "PasswordInput";
358
+
359
+ // src/components/Input/SearchInput.tsx
360
+ import React4, { useState as useState3 } from "react";
361
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
362
+ var sizeStyles4 = {
363
+ sm: { input: "h-8 pl-7 pr-7 text-xs", iconL: "left-2 h-3.5 w-3.5", iconR: "right-1.5 h-3.5 w-3.5" },
364
+ md: { input: "h-10 pl-9 pr-9 text-sm", iconL: "left-3 h-4 w-4", iconR: "right-2.5 h-4 w-4" },
365
+ lg: { input: "h-12 pl-11 pr-11 text-base", iconL: "left-4 h-5 w-5", iconR: "right-3.5 h-5 w-5" }
366
+ };
367
+ var SearchIcon = ({ className }) => /* @__PURE__ */ jsxs4("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
368
+ /* @__PURE__ */ jsx4("circle", { cx: "11", cy: "11", r: "8" }),
369
+ /* @__PURE__ */ jsx4("path", { d: "m21 21-4.3-4.3" })
370
+ ] });
371
+ var XIcon = ({ className }) => /* @__PURE__ */ jsxs4("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
372
+ /* @__PURE__ */ jsx4("path", { d: "M18 6 6 18" }),
373
+ /* @__PURE__ */ jsx4("path", { d: "m6 6 12 12" })
374
+ ] });
375
+ var SearchInput = React4.forwardRef(
376
+ ({ className, inputSize = "md", onClear, wrapperClassName, onChange, value: controlledValue, defaultValue, ...props }, ref) => {
377
+ const [internalValue, setInternalValue] = useState3((defaultValue == null ? void 0 : defaultValue.toString()) || "");
378
+ const value = controlledValue !== void 0 ? controlledValue.toString() : internalValue;
379
+ const sizes = sizeStyles4[inputSize];
380
+ const handleChange = (e) => {
381
+ if (controlledValue === void 0) setInternalValue(e.target.value);
382
+ onChange == null ? void 0 : onChange(e);
383
+ };
384
+ const handleClear = () => {
385
+ if (controlledValue === void 0) setInternalValue("");
386
+ onClear == null ? void 0 : onClear();
387
+ };
388
+ return /* @__PURE__ */ jsxs4("div", { className: cn("relative w-full", wrapperClassName), children: [
389
+ /* @__PURE__ */ jsx4("span", { className: cn("pointer-events-none absolute top-1/2 -translate-y-1/2 text-zinc-400 dark:text-zinc-500", sizes.iconL), children: /* @__PURE__ */ jsx4(SearchIcon, { className: "h-full w-full" }) }),
390
+ /* @__PURE__ */ jsx4(
391
+ "input",
392
+ {
393
+ ref,
394
+ type: "search",
395
+ className: cn(
396
+ "w-full rounded-md border border-zinc-300 bg-transparent text-zinc-900 placeholder:text-zinc-400 transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-zinc-700 dark:bg-transparent dark:text-zinc-100 dark:placeholder:text-zinc-500 [&::-webkit-search-cancel-button]:hidden",
397
+ sizes.input,
398
+ className
399
+ ),
400
+ value: controlledValue !== void 0 ? controlledValue : void 0,
401
+ defaultValue: controlledValue !== void 0 ? void 0 : defaultValue,
402
+ onChange: handleChange,
403
+ ...props
404
+ }
405
+ ),
406
+ value.length > 0 && /* @__PURE__ */ jsx4(
407
+ "button",
408
+ {
409
+ type: "button",
410
+ tabIndex: -1,
411
+ onClick: handleClear,
412
+ className: cn(
413
+ "absolute top-1/2 -translate-y-1/2 text-zinc-400 hover:text-zinc-600 dark:text-zinc-500 dark:hover:text-zinc-300 transition-colors",
414
+ sizes.iconR
415
+ ),
416
+ "aria-label": "Clear search",
417
+ children: /* @__PURE__ */ jsx4(XIcon, { className: "h-full w-full" })
418
+ }
419
+ )
420
+ ] });
421
+ }
422
+ );
423
+ SearchInput.displayName = "SearchInput";
424
+
425
+ // src/components/Input/OTPInput.tsx
426
+ import React5, { useRef, useState as useState4, useCallback } from "react";
427
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
428
+ var sizeStyles5 = {
429
+ sm: "h-8 w-8 text-sm",
430
+ md: "h-10 w-10 text-lg",
431
+ lg: "h-12 w-12 text-xl"
432
+ };
433
+ var OTPInput = ({
434
+ length = 6,
435
+ onComplete,
436
+ onChange,
437
+ inputSize = "md",
438
+ error = false,
439
+ disabled = false,
440
+ className,
441
+ wrapperClassName,
442
+ separatorAfter
443
+ }) => {
444
+ const [values, setValues] = useState4(Array(length).fill(""));
445
+ const inputRefs = useRef([]);
446
+ const focusInput = useCallback((index) => {
447
+ var _a;
448
+ if (index >= 0 && index < length) {
449
+ (_a = inputRefs.current[index]) == null ? void 0 : _a.focus();
450
+ }
451
+ }, [length]);
452
+ const updateValues = useCallback(
453
+ (newValues) => {
454
+ setValues(newValues);
455
+ const otp = newValues.join("");
456
+ onChange == null ? void 0 : onChange(otp);
457
+ if (otp.length === length && newValues.every((v) => v !== "")) {
458
+ onComplete == null ? void 0 : onComplete(otp);
459
+ }
460
+ },
461
+ [length, onChange, onComplete]
462
+ );
463
+ const handleChange = (index, e) => {
464
+ const val = e.target.value;
465
+ if (!/^\d*$/.test(val)) return;
466
+ const digit = val.slice(-1);
467
+ const newValues = [...values];
468
+ newValues[index] = digit;
469
+ updateValues(newValues);
470
+ if (digit && index < length - 1) {
471
+ focusInput(index + 1);
472
+ }
473
+ };
474
+ const handleKeyDown = (index, e) => {
475
+ if (e.key === "Backspace") {
476
+ e.preventDefault();
477
+ const newValues = [...values];
478
+ if (values[index]) {
479
+ newValues[index] = "";
480
+ updateValues(newValues);
481
+ } else if (index > 0) {
482
+ newValues[index - 1] = "";
483
+ updateValues(newValues);
484
+ focusInput(index - 1);
485
+ }
486
+ } else if (e.key === "ArrowLeft") {
487
+ focusInput(index - 1);
488
+ } else if (e.key === "ArrowRight") {
489
+ focusInput(index + 1);
490
+ }
491
+ };
492
+ const handlePaste = (e) => {
493
+ e.preventDefault();
494
+ const pasted = e.clipboardData.getData("text").replace(/\D/g, "").slice(0, length);
495
+ if (!pasted) return;
496
+ const newValues = [...values];
497
+ for (let i = 0; i < pasted.length; i++) {
498
+ newValues[i] = pasted[i];
499
+ }
500
+ updateValues(newValues);
501
+ focusInput(Math.min(pasted.length, length - 1));
502
+ };
503
+ const separatorSet = new Set(separatorAfter || []);
504
+ return /* @__PURE__ */ jsx5("div", { className: cn("flex items-center gap-2", wrapperClassName), children: values.map((val, i) => /* @__PURE__ */ jsxs5(React5.Fragment, { children: [
505
+ /* @__PURE__ */ jsx5(
506
+ "input",
507
+ {
508
+ ref: (el) => {
509
+ inputRefs.current[i] = el;
510
+ },
511
+ type: "text",
512
+ inputMode: "numeric",
513
+ autoComplete: "one-time-code",
514
+ maxLength: 1,
515
+ value: val,
516
+ disabled,
517
+ onChange: (e) => handleChange(i, e),
518
+ onKeyDown: (e) => handleKeyDown(i, e),
519
+ onPaste: i === 0 ? handlePaste : void 0,
520
+ onFocus: (e) => e.target.select(),
521
+ className: cn(
522
+ "rounded-md border border-zinc-300 bg-transparent text-center font-mono text-zinc-900 transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-zinc-700 dark:bg-transparent dark:text-zinc-100",
523
+ sizeStyles5[inputSize],
524
+ error && "border-red-500 focus-visible:ring-red-500 dark:border-red-500",
525
+ className
526
+ ),
527
+ "aria-label": `Digit ${i + 1}`
528
+ }
529
+ ),
530
+ separatorSet.has(i) && /* @__PURE__ */ jsx5("span", { className: "text-zinc-400 dark:text-zinc-500 text-lg font-bold select-none", children: "-" })
531
+ ] }, i)) });
532
+ };
533
+ OTPInput.displayName = "OTPInput";
534
+
535
+ // src/components/Label/Label.tsx
536
+ import React6 from "react";
537
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
538
+ var sizeStyles6 = {
539
+ sm: "text-xs",
540
+ md: "text-sm",
541
+ lg: "text-base"
542
+ };
543
+ var Label = React6.forwardRef(
544
+ ({ className, size = "md", required, children, ...props }, ref) => {
545
+ return /* @__PURE__ */ jsxs6(
546
+ "label",
547
+ {
548
+ ref,
549
+ className: cn(
550
+ "font-medium text-zinc-900 dark:text-zinc-100 leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
551
+ sizeStyles6[size],
552
+ className
553
+ ),
554
+ ...props,
555
+ children: [
556
+ children,
557
+ required && /* @__PURE__ */ jsx6("span", { className: "ml-1 text-red-500", children: "*" })
558
+ ]
559
+ }
560
+ );
561
+ }
562
+ );
563
+ Label.displayName = "Label";
564
+
565
+ // src/components/Text/TypewriterText.tsx
566
+ import { useState as useState5, useEffect, useCallback as useCallback2, useMemo } from "react";
567
+ import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
568
+ var TypewriterText = ({
569
+ words,
570
+ typeSpeed = 80,
571
+ deleteSpeed = 50,
572
+ pauseDuration = 1500,
573
+ loop = true,
574
+ cursor = true,
575
+ cursorChar = "|",
576
+ className,
577
+ cursorClassName,
578
+ as: Tag = "span"
579
+ }) => {
580
+ const [text, setText] = useState5("");
581
+ const [wordIndex, setWordIndex] = useState5(0);
582
+ const [isDeleting, setIsDeleting] = useState5(false);
583
+ const longestWord = useMemo(
584
+ () => words.reduce((a, b) => a.length >= b.length ? a : b, ""),
585
+ [words]
586
+ );
587
+ const tick = useCallback2(() => {
588
+ const currentWord = words[wordIndex] || "";
589
+ if (isDeleting) {
590
+ setText(currentWord.substring(0, text.length - 1));
591
+ } else {
592
+ setText(currentWord.substring(0, text.length + 1));
593
+ }
594
+ }, [text, wordIndex, isDeleting, words]);
595
+ useEffect(() => {
596
+ const currentWord = words[wordIndex] || "";
597
+ if (!isDeleting && text === currentWord) {
598
+ if (!loop && wordIndex === words.length - 1) return;
599
+ const timeout2 = setTimeout(() => setIsDeleting(true), pauseDuration);
600
+ return () => clearTimeout(timeout2);
601
+ }
602
+ if (isDeleting && text === "") {
603
+ setIsDeleting(false);
604
+ setWordIndex((prev) => (prev + 1) % words.length);
605
+ return;
606
+ }
607
+ const speed = isDeleting ? deleteSpeed : typeSpeed;
608
+ const timeout = setTimeout(tick, speed);
609
+ return () => clearTimeout(timeout);
610
+ }, [text, isDeleting, wordIndex, words, typeSpeed, deleteSpeed, pauseDuration, loop, tick]);
611
+ return /* @__PURE__ */ jsxs7(Tag, { className: cn("inline-grid", className), children: [
612
+ /* @__PURE__ */ jsx7("span", { className: "invisible col-start-1 row-start-1 whitespace-pre", "aria-hidden": "true", children: longestWord }),
613
+ /* @__PURE__ */ jsxs7("span", { className: "col-start-1 row-start-1 whitespace-pre", children: [
614
+ text,
615
+ cursor && /* @__PURE__ */ jsx7(
616
+ "span",
617
+ {
618
+ className: cn(
619
+ "inline-block w-[2px] h-[1em] align-middle ml-0.5 animate-[uixy-blink_1s_step-end_infinite] bg-current",
620
+ cursorClassName
621
+ )
622
+ }
623
+ )
624
+ ] }),
625
+ /* @__PURE__ */ jsx7("style", { children: `
626
+ @keyframes uixy-blink {
627
+ 0%, 100% { opacity: 1; }
628
+ 50% { opacity: 0; }
629
+ }
630
+ ` })
631
+ ] });
632
+ };
633
+ TypewriterText.displayName = "TypewriterText";
634
+
635
+ // src/components/Text/GradientText.tsx
636
+ import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
637
+ var GradientText = ({
638
+ children,
639
+ animate = true,
640
+ speed = 3,
641
+ colors = "from-violet-500 via-pink-500 to-indigo-500",
642
+ as: Tag = "span",
643
+ className
644
+ }) => {
645
+ return /* @__PURE__ */ jsxs8(
646
+ Tag,
647
+ {
648
+ className: cn(
649
+ "inline-block bg-clip-text text-transparent bg-gradient-to-r",
650
+ colors,
651
+ animate && "bg-[length:200%_auto]",
652
+ className
653
+ ),
654
+ style: animate ? {
655
+ animation: `uixy-gradient ${speed}s linear infinite`
656
+ } : void 0,
657
+ children: [
658
+ /* @__PURE__ */ jsx8("style", { children: `
659
+ @keyframes uixy-gradient {
660
+ 0% { background-position: 0% center; }
661
+ 100% { background-position: 200% center; }
662
+ }
663
+ ` }),
664
+ children
665
+ ]
666
+ }
667
+ );
668
+ };
669
+ GradientText.displayName = "GradientText";
670
+
671
+ // src/components/Text/GlitchText.tsx
672
+ import { useEffect as useEffect2, useRef as useRef2 } from "react";
673
+ import { jsx as jsx9 } from "react/jsx-runtime";
674
+ var glitchCounter = 0;
675
+ var GlitchText = ({
676
+ children,
677
+ speed = 3,
678
+ intensity = 5,
679
+ as: Tag = "span",
680
+ className
681
+ }) => {
682
+ const wrapperRef = useRef2(null);
683
+ const idRef = useRef2(`uixy-g-${++glitchCounter}`);
684
+ const id = idRef.current;
685
+ const offset = Math.max(1, Math.min(intensity, 10));
686
+ useEffect2(() => {
687
+ const styleEl = document.createElement("style");
688
+ styleEl.textContent = `
689
+ .${id} { position: relative; display: inline-block; }
690
+ .${id}::before, .${id}::after {
691
+ content: "${children.replace(/"/g, '\\"')}";
692
+ position: absolute; inset: 0; opacity: 0.8;
693
+ }
694
+ .${id}::before {
695
+ color: #0ff; z-index: -1;
696
+ animation: ${id}-a ${speed}s infinite;
697
+ }
698
+ .${id}::after {
699
+ color: #f0f; z-index: -1;
700
+ animation: ${id}-b ${speed}s infinite;
701
+ }
702
+ @keyframes ${id}-a {
703
+ 0%, 15%, 40%, 46%, 80%, 86%, 100% { transform: translate(0); clip-path: inset(0 0 100% 0); }
704
+ 5% { transform: translate(${offset}px, 0); clip-path: inset(10% 0 70% 0); }
705
+ 10% { transform: translate(-${offset}px, 0); clip-path: inset(50% 0 10% 0); }
706
+ 42% { transform: translate(${offset * 0.6}px, 0); clip-path: inset(20% 0 50% 0); }
707
+ 44% { transform: translate(-${offset * 0.8}px, 0); clip-path: inset(60% 0 5% 0); }
708
+ 82% { transform: translate(-${offset * 0.5}px, 0); clip-path: inset(5% 0 80% 0); }
709
+ 84% { transform: translate(${offset}px, 0); clip-path: inset(40% 0 20% 0); }
710
+ }
711
+ @keyframes ${id}-b {
712
+ 0%, 15%, 50%, 56%, 85%, 91%, 100% { transform: translate(0); clip-path: inset(0 0 100% 0); }
713
+ 5% { transform: translate(-${offset}px, 0); clip-path: inset(30% 0 40% 0); }
714
+ 10% { transform: translate(${offset}px, 0); clip-path: inset(70% 0 0% 0); }
715
+ 52% { transform: translate(-${offset * 0.7}px, 0); clip-path: inset(15% 0 60% 0); }
716
+ 54% { transform: translate(${offset * 0.5}px, 0); clip-path: inset(75% 0 0% 0); }
717
+ 87% { transform: translate(${offset * 0.8}px, 0); clip-path: inset(0% 0 85% 0); }
718
+ 89% { transform: translate(-${offset * 0.6}px, 0); clip-path: inset(55% 0 15% 0); }
719
+ }
720
+ `;
721
+ document.head.appendChild(styleEl);
722
+ return () => {
723
+ document.head.removeChild(styleEl);
724
+ };
725
+ }, [children, speed, offset, id]);
726
+ return /* @__PURE__ */ jsx9(Tag, { ref: wrapperRef, className: cn("relative inline-block", className), children: /* @__PURE__ */ jsx9("span", { className: id, children }) });
727
+ };
728
+ GlitchText.displayName = "GlitchText";
729
+
730
+ // src/components/Text/ShimmerText.tsx
731
+ import { useEffect as useEffect3, useRef as useRef3 } from "react";
732
+ import { jsx as jsx10 } from "react/jsx-runtime";
733
+ var shimmerStyleInjected = false;
734
+ var ShimmerText = ({
735
+ children,
736
+ speed = 2,
737
+ shimmerColor = "rgba(255,255,255,0.8)",
738
+ baseColor = "rgba(255,255,255,0.4)",
739
+ as: Tag = "span",
740
+ className
741
+ }) => {
742
+ const ref = useRef3(null);
743
+ useEffect3(() => {
744
+ if (!shimmerStyleInjected) {
745
+ shimmerStyleInjected = true;
746
+ const style = document.createElement("style");
747
+ style.textContent = `
748
+ @keyframes uixy-shimmer {
749
+ 0% { background-position: 200% center; }
750
+ 100% { background-position: -200% center; }
751
+ }
752
+ .uixy-shimmer-text {
753
+ -webkit-background-clip: text !important;
754
+ background-clip: text !important;
755
+ -webkit-text-fill-color: transparent !important;
756
+ color: transparent !important;
757
+ }
758
+ `;
759
+ document.head.appendChild(style);
760
+ }
761
+ }, []);
762
+ return /* @__PURE__ */ jsx10(
763
+ Tag,
764
+ {
765
+ ref,
766
+ className: cn("uixy-shimmer-text inline-block", className),
767
+ style: {
768
+ backgroundImage: `linear-gradient(90deg, ${baseColor} 0%, ${baseColor} 35%, ${shimmerColor} 50%, ${baseColor} 65%, ${baseColor} 100%)`,
769
+ backgroundSize: "200% 100%",
770
+ animation: `uixy-shimmer ${speed}s linear infinite`
771
+ },
772
+ children
773
+ }
774
+ );
775
+ };
776
+ ShimmerText.displayName = "ShimmerText";
777
+
778
+ // src/components/Text/WaveText.tsx
779
+ import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
780
+ var WaveText = ({
781
+ children,
782
+ delay = 80,
783
+ duration = 1,
784
+ height = 12,
785
+ as: Tag = "span",
786
+ className
787
+ }) => {
788
+ const letters = children.split("");
789
+ return /* @__PURE__ */ jsxs9(Tag, { className: cn("inline-flex", className), children: [
790
+ /* @__PURE__ */ jsx11("style", { children: `
791
+ @keyframes uixy-wave {
792
+ 0%, 100% { transform: translateY(0); }
793
+ 50% { transform: translateY(-${height}px); }
794
+ }
795
+ ` }),
796
+ letters.map((letter, i) => /* @__PURE__ */ jsx11(
797
+ "span",
798
+ {
799
+ style: {
800
+ display: "inline-block",
801
+ animation: `uixy-wave ${duration}s ease-in-out infinite`,
802
+ animationDelay: `${i * delay}ms`,
803
+ whiteSpace: letter === " " ? "pre" : void 0
804
+ },
805
+ children: letter === " " ? "\xA0" : letter
806
+ },
807
+ i
808
+ ))
809
+ ] });
810
+ };
811
+ WaveText.displayName = "WaveText";
812
+
813
+ // src/components/Text/BlurText.tsx
814
+ import { useEffect as useEffect4, useRef as useRef4, useState as useState6 } from "react";
815
+ import { jsx as jsx12 } from "react/jsx-runtime";
816
+ var BlurText = ({
817
+ children,
818
+ mode = "word",
819
+ delay = 100,
820
+ duration = 500,
821
+ triggerOnView = true,
822
+ as: Tag = "span",
823
+ className
824
+ }) => {
825
+ const containerRef = useRef4(null);
826
+ const [visible, setVisible] = useState6(!triggerOnView);
827
+ useEffect4(() => {
828
+ if (!triggerOnView) {
829
+ const t = setTimeout(() => setVisible(true), 50);
830
+ return () => clearTimeout(t);
831
+ }
832
+ const el = containerRef.current;
833
+ if (!el) return;
834
+ const observer = new IntersectionObserver(
835
+ ([entry]) => {
836
+ if (entry.isIntersecting) {
837
+ setVisible(true);
838
+ observer.disconnect();
839
+ }
840
+ },
841
+ { threshold: 0.1 }
842
+ );
843
+ observer.observe(el);
844
+ return () => observer.disconnect();
845
+ }, [triggerOnView]);
846
+ const units = mode === "word" ? children.split(" ").map((w, i, arr) => i < arr.length - 1 ? w + " " : w) : children.split("");
847
+ return /* @__PURE__ */ jsx12("div", { ref: containerRef, className: "inline", children: /* @__PURE__ */ jsx12(Tag, { className: cn("inline", className), children: units.map((unit, i) => /* @__PURE__ */ jsx12(
848
+ "span",
849
+ {
850
+ style: {
851
+ display: "inline-block",
852
+ transition: `opacity ${duration}ms ease, filter ${duration}ms ease, transform ${duration}ms ease`,
853
+ transitionDelay: visible ? `${i * delay}ms` : "0ms",
854
+ opacity: visible ? 1 : 0,
855
+ filter: visible ? "blur(0px)" : "blur(10px)",
856
+ transform: visible ? "translateY(0)" : "translateY(12px)",
857
+ whiteSpace: "pre"
858
+ },
859
+ children: unit
860
+ },
861
+ i
862
+ )) }) });
863
+ };
864
+ BlurText.displayName = "BlurText";
865
+
866
+ // src/components/Text/CounterText.tsx
867
+ import { useEffect as useEffect5, useRef as useRef5, useState as useState7 } from "react";
868
+ import { jsxs as jsxs10 } from "react/jsx-runtime";
869
+ function easeOutQuart(t) {
870
+ return 1 - Math.pow(1 - t, 4);
871
+ }
872
+ var CounterText = ({
873
+ target,
874
+ from = 0,
875
+ duration = 2e3,
876
+ decimals = 0,
877
+ prefix = "",
878
+ suffix = "",
879
+ separator = ",",
880
+ triggerOnView = true,
881
+ as: Tag = "span",
882
+ className
883
+ }) => {
884
+ const ref = useRef5(null);
885
+ const [value, setValue] = useState7(from);
886
+ const [started, setStarted] = useState7(!triggerOnView);
887
+ useEffect5(() => {
888
+ if (!triggerOnView) return;
889
+ const el = ref.current;
890
+ if (!el) return;
891
+ const observer = new IntersectionObserver(
892
+ ([entry]) => {
893
+ if (entry.isIntersecting) {
894
+ setStarted(true);
895
+ observer.disconnect();
896
+ }
897
+ },
898
+ { threshold: 0.2 }
899
+ );
900
+ observer.observe(el);
901
+ return () => observer.disconnect();
902
+ }, [triggerOnView]);
903
+ useEffect5(() => {
904
+ if (!started) return;
905
+ const startTime = performance.now();
906
+ let rafId;
907
+ const animate = (now) => {
908
+ const elapsed = now - startTime;
909
+ const progress = Math.min(elapsed / duration, 1);
910
+ const eased = easeOutQuart(progress);
911
+ const current = from + (target - from) * eased;
912
+ setValue(current);
913
+ if (progress < 1) {
914
+ rafId = requestAnimationFrame(animate);
915
+ }
916
+ };
917
+ rafId = requestAnimationFrame(animate);
918
+ return () => cancelAnimationFrame(rafId);
919
+ }, [started, from, target, duration]);
920
+ const formatNumber = (num) => {
921
+ const fixed = num.toFixed(decimals);
922
+ if (!separator) return fixed;
923
+ const [int, dec] = fixed.split(".");
924
+ const formatted = int.replace(/\B(?=(\d{3})+(?!\d))/g, separator);
925
+ return dec !== void 0 ? `${formatted}.${dec}` : formatted;
926
+ };
927
+ return /* @__PURE__ */ jsxs10(Tag, { ref, className: cn("tabular-nums", className), children: [
928
+ prefix,
929
+ formatNumber(value),
930
+ suffix
931
+ ] });
932
+ };
933
+ CounterText.displayName = "CounterText";
934
+
935
+ // src/components/Text/MediaText.tsx
936
+ import { useEffect as useEffect6 } from "react";
937
+ import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
938
+ var mediaTextStyleInjected = false;
939
+ var MediaText = ({
940
+ children,
941
+ src,
942
+ videoSrc,
943
+ backgroundSize = "cover",
944
+ backgroundPosition = "center",
945
+ loop = true,
946
+ muted = true,
947
+ as: Tag = "h1",
948
+ className
949
+ }) => {
950
+ useEffect6(() => {
951
+ if (mediaTextStyleInjected) return;
952
+ mediaTextStyleInjected = true;
953
+ const style = document.createElement("style");
954
+ style.textContent = `
955
+ .uixy-media-text-clip {
956
+ -webkit-background-clip: text !important;
957
+ background-clip: text !important;
958
+ -webkit-text-fill-color: transparent !important;
959
+ color: transparent !important;
960
+ }
961
+ .uixy-media-text-video-container {
962
+ position: relative;
963
+ display: inline-block;
964
+ overflow: hidden;
965
+ }
966
+ .uixy-media-text-video-container video {
967
+ position: absolute;
968
+ top: 0;
969
+ left: 0;
970
+ width: 100%;
971
+ height: 100%;
972
+ object-fit: cover;
973
+ }
974
+ .uixy-media-text-video-overlay {
975
+ position: relative;
976
+ z-index: 1;
977
+ mix-blend-mode: screen;
978
+ background: #000;
979
+ }
980
+ `;
981
+ document.head.appendChild(style);
982
+ }, []);
983
+ if (src && !videoSrc) {
984
+ return /* @__PURE__ */ jsx13(
985
+ Tag,
986
+ {
987
+ className: cn("uixy-media-text-clip inline-block", className),
988
+ style: {
989
+ backgroundImage: `url(${src})`,
990
+ backgroundSize,
991
+ backgroundPosition,
992
+ backgroundRepeat: "no-repeat"
993
+ },
994
+ children
995
+ }
996
+ );
997
+ }
998
+ if (videoSrc) {
999
+ return /* @__PURE__ */ jsxs11("span", { className: "uixy-media-text-video-container", children: [
1000
+ /* @__PURE__ */ jsx13(
1001
+ "video",
1002
+ {
1003
+ src: videoSrc,
1004
+ autoPlay: true,
1005
+ loop,
1006
+ muted,
1007
+ playsInline: true,
1008
+ preload: "auto"
1009
+ }
1010
+ ),
1011
+ /* @__PURE__ */ jsx13(
1012
+ Tag,
1013
+ {
1014
+ className: cn("uixy-media-text-video-overlay whitespace-nowrap", className),
1015
+ children
1016
+ }
1017
+ )
1018
+ ] });
1019
+ }
1020
+ return /* @__PURE__ */ jsx13(Tag, { className: cn("inline-block", className), children });
1021
+ };
1022
+ MediaText.displayName = "MediaText";
1023
+
1024
+ // src/components/Text/SparklesText.tsx
1025
+ import { useEffect as useEffect7, useRef as useRef6, useCallback as useCallback3 } from "react";
1026
+ import { jsx as jsx14 } from "react/jsx-runtime";
1027
+ var sparklesStyleInjected = false;
1028
+ var SparklesText = ({
1029
+ children,
1030
+ sparkleColor = "#FFC700",
1031
+ count = 12,
1032
+ minSize = 4,
1033
+ maxSize = 14,
1034
+ speed = 450,
1035
+ as: Tag = "span",
1036
+ className
1037
+ }) => {
1038
+ const containerRef = useRef6(null);
1039
+ const injectStyles = useCallback3(() => {
1040
+ if (sparklesStyleInjected) return;
1041
+ sparklesStyleInjected = true;
1042
+ const style = document.createElement("style");
1043
+ style.textContent = `
1044
+ @keyframes uixy-sparkle-life {
1045
+ 0% { transform: scale(0) rotate(0deg); opacity: 0; }
1046
+ 20% { transform: scale(0.6) rotate(60deg); opacity: 0.8; }
1047
+ 50% { transform: scale(1) rotate(140deg); opacity: 1; }
1048
+ 80% { transform: scale(0.6) rotate(240deg); opacity: 0.8; }
1049
+ 100% { transform: scale(0) rotate(360deg); opacity: 0; }
1050
+ }
1051
+ `;
1052
+ document.head.appendChild(style);
1053
+ }, []);
1054
+ useEffect7(() => {
1055
+ injectStyles();
1056
+ const container = containerRef.current;
1057
+ if (!container) return;
1058
+ const createSparkleSVG = () => {
1059
+ const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
1060
+ const size = minSize + Math.random() * (maxSize - minSize);
1061
+ const duration = 1.2 + Math.random() * 1.2;
1062
+ svg.setAttribute("viewBox", "0 0 24 24");
1063
+ svg.setAttribute("fill", sparkleColor);
1064
+ svg.innerHTML = `<path d="M12 0L14.59 8.41L23 12L14.59 15.59L12 24L9.41 15.59L1 12L9.41 8.41Z"/>`;
1065
+ Object.assign(svg.style, {
1066
+ position: "absolute",
1067
+ left: `${Math.random() * 100}%`,
1068
+ top: `${Math.random() * 100}%`,
1069
+ width: `${size}px`,
1070
+ height: `${size}px`,
1071
+ pointerEvents: "none",
1072
+ animation: `uixy-sparkle-life ${duration}s ease-in-out forwards`,
1073
+ zIndex: "1"
1074
+ });
1075
+ container.appendChild(svg);
1076
+ setTimeout(() => {
1077
+ if (svg.parentNode === container) {
1078
+ container.removeChild(svg);
1079
+ }
1080
+ }, duration * 1e3);
1081
+ };
1082
+ for (let i = 0; i < count; i++) {
1083
+ setTimeout(() => createSparkleSVG(), Math.random() * speed * 2);
1084
+ }
1085
+ const interval = setInterval(() => {
1086
+ createSparkleSVG();
1087
+ }, speed);
1088
+ return () => {
1089
+ clearInterval(interval);
1090
+ const svgs = container.querySelectorAll("svg");
1091
+ svgs.forEach((s) => s.remove());
1092
+ };
1093
+ }, [sparkleColor, count, minSize, maxSize, speed, injectStyles]);
1094
+ return /* @__PURE__ */ jsx14(Tag, { ref: containerRef, className: cn("relative inline-block", className), children: /* @__PURE__ */ jsx14("span", { className: "relative z-[2]", children }) });
1095
+ };
1096
+ SparklesText.displayName = "SparklesText";
1097
+
1098
+ // src/components/Text/HighlightText.tsx
1099
+ import { useEffect as useEffect8, useRef as useRef7, useState as useState8 } from "react";
1100
+ import { jsx as jsx15 } from "react/jsx-runtime";
1101
+ var highlightStyleInjected = false;
1102
+ var HighlightText = ({
1103
+ children,
1104
+ variant = "marker",
1105
+ color = "rgba(139, 92, 246, 0.35)",
1106
+ colorTo,
1107
+ duration = 800,
1108
+ delay = 0,
1109
+ triggerOnView = true,
1110
+ as: Tag = "span",
1111
+ className
1112
+ }) => {
1113
+ const containerRef = useRef7(null);
1114
+ const [active, setActive] = useState8(false);
1115
+ useEffect8(() => {
1116
+ if (!highlightStyleInjected) {
1117
+ highlightStyleInjected = true;
1118
+ const style = document.createElement("style");
1119
+ style.textContent = `
1120
+ /* \u2500\u2500 marker \u2500\u2500 */
1121
+ .uixy-hl-marker {
1122
+ background-size: 0% 100%;
1123
+ background-repeat: no-repeat;
1124
+ background-position: left center;
1125
+ padding: 0.05em 0.15em;
1126
+ margin: -0.05em -0.15em;
1127
+ border-radius: 0.15em;
1128
+ }
1129
+ .uixy-hl-marker.uixy-hl-on { background-size: 100% 100%; }
1130
+
1131
+ /* \u2500\u2500 underline \u2500\u2500 */
1132
+ .uixy-hl-underline {
1133
+ background-size: 0% 3px;
1134
+ background-repeat: no-repeat;
1135
+ background-position: left bottom;
1136
+ padding-bottom: 4px;
1137
+ }
1138
+ .uixy-hl-underline.uixy-hl-on { background-size: 100% 3px; }
1139
+
1140
+ /* \u2500\u2500 box \u2500\u2500 */
1141
+ .uixy-hl-box {
1142
+ border: 2px solid transparent;
1143
+ border-radius: 4px;
1144
+ padding: 0.05em 0.25em;
1145
+ margin: -0.05em -0.25em;
1146
+ }
1147
+ .uixy-hl-box.uixy-hl-on { border-color: var(--uixy-hl-c); }
1148
+
1149
+ /* \u2500\u2500 strikethrough \u2500\u2500 */
1150
+ .uixy-hl-strikethrough {
1151
+ position: relative;
1152
+ }
1153
+ .uixy-hl-strikethrough::after {
1154
+ content: '';
1155
+ position: absolute;
1156
+ left: 0;
1157
+ top: 50%;
1158
+ height: 2.5px;
1159
+ background: var(--uixy-hl-c);
1160
+ width: 0%;
1161
+ transition: width var(--uixy-hl-dur) cubic-bezier(0.25, 0.1, 0.25, 1);
1162
+ border-radius: 2px;
1163
+ }
1164
+ .uixy-hl-strikethrough.uixy-hl-on::after { width: 100%; }
1165
+
1166
+ /* \u2500\u2500 gradient \u2500\u2500 */
1167
+ .uixy-hl-gradient {
1168
+ background-size: 0% 100%;
1169
+ background-repeat: no-repeat;
1170
+ background-position: left center;
1171
+ padding: 0.05em 0.15em;
1172
+ margin: -0.05em -0.15em;
1173
+ border-radius: 0.15em;
1174
+ }
1175
+ .uixy-hl-gradient.uixy-hl-on { background-size: 100% 100%; }
1176
+
1177
+ /* \u2500\u2500 glow \u2500\u2500 */
1178
+ .uixy-hl-glow {
1179
+ text-shadow: none;
1180
+ transition: text-shadow var(--uixy-hl-dur) ease;
1181
+ }
1182
+ .uixy-hl-glow.uixy-hl-on {
1183
+ text-shadow:
1184
+ 0 0 8px var(--uixy-hl-c),
1185
+ 0 0 20px var(--uixy-hl-c),
1186
+ 0 0 40px var(--uixy-hl-c);
1187
+ }
1188
+
1189
+ /* \u2500\u2500 bracket \u2500\u2500 */
1190
+ .uixy-hl-bracket {
1191
+ position: relative;
1192
+ padding: 0 0.3em;
1193
+ margin: 0 -0.3em;
1194
+ }
1195
+ .uixy-hl-bracket::before,
1196
+ .uixy-hl-bracket::after {
1197
+ position: absolute;
1198
+ top: -2px;
1199
+ bottom: -2px;
1200
+ width: 6px;
1201
+ border: 2px solid transparent;
1202
+ transition: border-color var(--uixy-hl-dur) ease;
1203
+ content: '';
1204
+ }
1205
+ .uixy-hl-bracket::before {
1206
+ left: 0;
1207
+ border-right: none;
1208
+ border-radius: 3px 0 0 3px;
1209
+ }
1210
+ .uixy-hl-bracket::after {
1211
+ right: 0;
1212
+ border-left: none;
1213
+ border-radius: 0 3px 3px 0;
1214
+ }
1215
+ .uixy-hl-bracket.uixy-hl-on::before,
1216
+ .uixy-hl-bracket.uixy-hl-on::after {
1217
+ border-color: var(--uixy-hl-c);
1218
+ }
1219
+ `;
1220
+ document.head.appendChild(style);
1221
+ }
1222
+ }, []);
1223
+ useEffect8(() => {
1224
+ if (!triggerOnView) {
1225
+ const timer = setTimeout(() => setActive(true), Math.max(delay, 50));
1226
+ return () => clearTimeout(timer);
1227
+ }
1228
+ const el = containerRef.current;
1229
+ if (!el) return;
1230
+ const observer = new IntersectionObserver(
1231
+ ([entry]) => {
1232
+ if (entry.isIntersecting) {
1233
+ setTimeout(() => setActive(true), delay);
1234
+ observer.disconnect();
1235
+ }
1236
+ },
1237
+ { threshold: 0.5 }
1238
+ );
1239
+ observer.observe(el);
1240
+ return () => observer.disconnect();
1241
+ }, [triggerOnView, delay]);
1242
+ const gradientBg = variant === "gradient" && colorTo ? `linear-gradient(120deg, ${color}, ${colorTo})` : `linear-gradient(${color}, ${color})`;
1243
+ const transitionProp = variant === "box" ? `border-color ${duration}ms cubic-bezier(0.25,0.1,0.25,1)` : variant === "glow" || variant === "bracket" ? void 0 : `background-size ${duration}ms cubic-bezier(0.25,0.1,0.25,1)`;
1244
+ return /* @__PURE__ */ jsx15("div", { ref: containerRef, className: "inline", children: /* @__PURE__ */ jsx15(
1245
+ Tag,
1246
+ {
1247
+ className: cn(
1248
+ `uixy-hl-${variant}`,
1249
+ active && "uixy-hl-on",
1250
+ className
1251
+ ),
1252
+ style: {
1253
+ ...["marker", "underline", "gradient"].includes(variant) ? { backgroundImage: gradientBg } : {},
1254
+ "--uixy-hl-c": color,
1255
+ "--uixy-hl-dur": `${duration}ms`,
1256
+ ...transitionProp ? { transition: transitionProp } : {}
1257
+ },
1258
+ children
1259
+ }
1260
+ ) });
1261
+ };
1262
+ HighlightText.displayName = "HighlightText";
1263
+
1264
+ // src/components/Card/Card.tsx
1265
+ import { forwardRef, useEffect as useEffect9, useRef as useRef8, useCallback as useCallback4 } from "react";
1266
+ import { jsx as jsx16 } from "react/jsx-runtime";
1267
+ var cardStyleInjected = false;
1268
+ function injectCardStyles() {
1269
+ if (cardStyleInjected) return;
1270
+ cardStyleInjected = true;
1271
+ const style = document.createElement("style");
1272
+ style.textContent = `
1273
+ /* \u2500\u2500 spotlight \u2500\u2500 */
1274
+ .uixy-card-spotlight {
1275
+ --uixy-mx: 50%; --uixy-my: 50%;
1276
+ position: relative; overflow: hidden;
1277
+ }
1278
+ .uixy-card-spotlight::before {
1279
+ content:''; position:absolute; inset:0;
1280
+ background: radial-gradient(600px circle at var(--uixy-mx) var(--uixy-my), rgba(139,92,246,0.15), transparent 40%);
1281
+ opacity:0; transition:opacity .3s; pointer-events:none; z-index:0;
1282
+ }
1283
+ .uixy-card-spotlight:hover::before { opacity:1; }
1284
+
1285
+ /* \u2500\u2500 neon \u2500\u2500 */
1286
+ .uixy-card-neon {
1287
+ box-shadow: 0 0 5px var(--uixy-neon, rgba(139,92,246,0.4)),
1288
+ 0 0 20px var(--uixy-neon, rgba(139,92,246,0.2)),
1289
+ inset 0 0 20px var(--uixy-neon, rgba(139,92,246,0.05));
1290
+ transition: box-shadow 0.3s ease;
1291
+ }
1292
+ .uixy-card-neon:hover {
1293
+ box-shadow: 0 0 10px var(--uixy-neon, rgba(139,92,246,0.6)),
1294
+ 0 0 40px var(--uixy-neon, rgba(139,92,246,0.3)),
1295
+ 0 0 80px var(--uixy-neon, rgba(139,92,246,0.15)),
1296
+ inset 0 0 30px var(--uixy-neon, rgba(139,92,246,0.08));
1297
+ }
1298
+
1299
+ /* \u2500\u2500 tilt \u2500\u2500 */
1300
+ .uixy-card-tilt {
1301
+ transition: transform 0.15s ease;
1302
+ transform-style: preserve-3d;
1303
+ perspective: 1000px;
1304
+ }
1305
+
1306
+ /* \u2500\u2500 animated border \u2500\u2500 */
1307
+ @keyframes uixy-border-spin {
1308
+ to { --uixy-angle: 360deg; }
1309
+ }
1310
+ @property --uixy-angle { syntax:'<angle>'; initial-value:0deg; inherits:false; }
1311
+ .uixy-card-animated-border {
1312
+ position:relative; overflow:hidden;
1313
+ }
1314
+ .uixy-card-animated-border::before {
1315
+ content:''; position:absolute; inset:-2px;
1316
+ background: conic-gradient(from var(--uixy-angle,0deg), #8b5cf6, #3b82f6, #06b6d4, #8b5cf6);
1317
+ animation: uixy-border-spin 3s linear infinite;
1318
+ border-radius: inherit;
1319
+ z-index: -1;
1320
+ }
1321
+ .uixy-card-animated-border::after {
1322
+ content:''; position:absolute; inset:2px;
1323
+ background: rgb(24 24 27);
1324
+ border-radius: inherit;
1325
+ z-index: -1;
1326
+ }
1327
+
1328
+ /* \u2500\u2500 noise \u2500\u2500 */
1329
+ .uixy-card-noise { position:relative; overflow:hidden; }
1330
+ .uixy-card-noise::before {
1331
+ content:''; position:absolute; inset:-50%;
1332
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
1333
+ background-size: 128px;
1334
+ opacity: 0.04;
1335
+ pointer-events: none;
1336
+ z-index:0;
1337
+ }
1338
+
1339
+ /* \u2500\u2500 lifted \u2500\u2500 */
1340
+ .uixy-card-lifted {
1341
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
1342
+ }
1343
+ .uixy-card-lifted:hover {
1344
+ transform: translateY(-6px);
1345
+ box-shadow: 0 20px 40px rgba(0,0,0,0.3), 0 8px 16px rgba(0,0,0,0.2);
1346
+ }
1347
+ `;
1348
+ document.head.appendChild(style);
1349
+ }
1350
+ var Card = forwardRef(
1351
+ ({ variant = "default", className, children, onMouseMove, onMouseLeave, ...props }, ref) => {
1352
+ const innerRef = useRef8(null);
1353
+ const cardRef = ref || innerRef;
1354
+ useEffect9(() => {
1355
+ injectCardStyles();
1356
+ }, []);
1357
+ const handleMouseMove = useCallback4(
1358
+ (e) => {
1359
+ const el = cardRef.current;
1360
+ if (!el) return;
1361
+ const rect = el.getBoundingClientRect();
1362
+ const x = e.clientX - rect.left;
1363
+ const y = e.clientY - rect.top;
1364
+ if (variant === "spotlight") {
1365
+ el.style.setProperty("--uixy-mx", `${x}px`);
1366
+ el.style.setProperty("--uixy-my", `${y}px`);
1367
+ }
1368
+ if (variant === "tilt") {
1369
+ const cx = rect.width / 2;
1370
+ const cy = rect.height / 2;
1371
+ const rotateX = (y - cy) / cy * -8;
1372
+ const rotateY = (x - cx) / cx * 8;
1373
+ el.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(1.02)`;
1374
+ }
1375
+ onMouseMove == null ? void 0 : onMouseMove(e);
1376
+ },
1377
+ [variant, onMouseMove, cardRef]
1378
+ );
1379
+ const handleMouseLeave = useCallback4(
1380
+ (e) => {
1381
+ if (variant === "tilt") {
1382
+ const el = cardRef.current;
1383
+ if (el) el.style.transform = "perspective(1000px) rotateX(0) rotateY(0) scale(1)";
1384
+ }
1385
+ onMouseLeave == null ? void 0 : onMouseLeave(e);
1386
+ },
1387
+ [variant, onMouseLeave, cardRef]
1388
+ );
1389
+ const base = "rounded-xl p-6";
1390
+ const variants = {
1391
+ default: `${base} border border-zinc-800 bg-zinc-900`,
1392
+ bordered: `${base} border-2 border-zinc-600 bg-zinc-900/50`,
1393
+ elevated: `${base} bg-zinc-900 shadow-xl shadow-black/30`,
1394
+ ghost: `${base} hover:bg-zinc-900/50 transition-colors`,
1395
+ gradient: `${base} border border-zinc-800 bg-gradient-to-br from-violet-950/40 via-zinc-900 to-cyan-950/30`,
1396
+ glass: `${base} border border-white/10 bg-white/5 backdrop-blur-lg`,
1397
+ spotlight: `${base} border border-zinc-800 bg-zinc-900 uixy-card-spotlight`,
1398
+ neon: `${base} border border-violet-500/30 bg-zinc-900 uixy-card-neon`,
1399
+ tilt: `${base} border border-zinc-800 bg-zinc-900 uixy-card-tilt cursor-pointer`,
1400
+ "animated-border": `${base} bg-zinc-900 uixy-card-animated-border`,
1401
+ noise: `${base} border border-zinc-800 bg-zinc-900 uixy-card-noise`,
1402
+ lifted: `${base} border border-zinc-800 bg-zinc-900 uixy-card-lifted cursor-pointer`
1403
+ };
1404
+ const needsZWrap = variant === "spotlight" || variant === "noise" || variant === "animated-border";
1405
+ return /* @__PURE__ */ jsx16(
1406
+ "div",
1407
+ {
1408
+ ref: cardRef,
1409
+ className: cn(variants[variant], className),
1410
+ onMouseMove: handleMouseMove,
1411
+ onMouseLeave: handleMouseLeave,
1412
+ ...props,
1413
+ children: needsZWrap ? /* @__PURE__ */ jsx16("div", { className: "relative z-10", children }) : children
1414
+ }
1415
+ );
1416
+ }
1417
+ );
1418
+ Card.displayName = "Card";
1419
+ var CardHeader = forwardRef(
1420
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx16("div", { ref, className: cn("mb-4", className), ...props })
1421
+ );
1422
+ CardHeader.displayName = "CardHeader";
1423
+ var CardTitle = forwardRef(
1424
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx16("h3", { ref, className: cn("text-lg font-semibold text-zinc-100", className), ...props })
1425
+ );
1426
+ CardTitle.displayName = "CardTitle";
1427
+ var CardDescription = forwardRef(
1428
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx16("p", { ref, className: cn("text-sm text-zinc-400 mt-1", className), ...props })
1429
+ );
1430
+ CardDescription.displayName = "CardDescription";
1431
+ var CardContent = forwardRef(
1432
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx16("div", { ref, className: cn("", className), ...props })
1433
+ );
1434
+ CardContent.displayName = "CardContent";
1435
+ var CardFooter = forwardRef(
1436
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx16("div", { ref, className: cn("mt-4 flex items-center gap-2", className), ...props })
1437
+ );
1438
+ CardFooter.displayName = "CardFooter";
1439
+
1440
+ // src/components/Background/ParticleBackground.tsx
1441
+ import { useEffect as useEffect10, useRef as useRef9, useCallback as useCallback5 } from "react";
1442
+ import { jsx as jsx17 } from "react/jsx-runtime";
1443
+ var ParticleBackground = ({
1444
+ items,
1445
+ count,
1446
+ connectionDistance = 180,
1447
+ arrows = false,
1448
+ mouseDistance = 200,
1449
+ color = [110, 120, 220],
1450
+ speed = 1,
1451
+ fontSize = [13, 18],
1452
+ imageSize = 28,
1453
+ lineWidth = 0.6,
1454
+ maxOpacity = 0.25,
1455
+ className
1456
+ }) => {
1457
+ const canvasRef = useRef9(null);
1458
+ const nodesRef = useRef9([]);
1459
+ const mouseRef = useRef9({ x: -9999, y: -9999 });
1460
+ const rafRef = useRef9(0);
1461
+ const normalize = useCallback5(
1462
+ (item) => {
1463
+ if (typeof item === "string") {
1464
+ if (/^(https?:\/\/|data:image|\/|\.\.?\/)/.test(item)) {
1465
+ return { content: item, type: "image" };
1466
+ }
1467
+ const emojiRegex = /^[\p{Emoji_Presentation}\p{Extended_Pictographic}\u200d\ufe0f]{1,8}$/u;
1468
+ if (emojiRegex.test(item.trim())) {
1469
+ return { content: item.trim(), type: "emoji" };
1470
+ }
1471
+ return { content: item, type: "text" };
1472
+ }
1473
+ return { content: item.content, type: item.type || "text" };
1474
+ },
1475
+ []
1476
+ );
1477
+ useEffect10(() => {
1478
+ const canvas = canvasRef.current;
1479
+ if (!canvas) return;
1480
+ const ctx = canvas.getContext("2d");
1481
+ if (!ctx) return;
1482
+ const [baseR, baseG, baseB] = color;
1483
+ const resize = () => {
1484
+ canvas.width = canvas.offsetWidth;
1485
+ canvas.height = canvas.offsetHeight;
1486
+ };
1487
+ resize();
1488
+ window.addEventListener("resize", resize);
1489
+ const nodeCount = count != null ? count : Math.min(Math.floor(canvas.width * canvas.height / 22e3), 60);
1490
+ const nodes = Array.from({ length: nodeCount }, (_, i) => {
1491
+ const item = normalize(items[i % items.length]);
1492
+ const node = {
1493
+ x: Math.random() * canvas.width,
1494
+ y: Math.random() * canvas.height,
1495
+ vx: (Math.random() - 0.5) * 0.3 * speed,
1496
+ vy: (Math.random() - 0.5) * 0.3 * speed,
1497
+ content: item.content,
1498
+ type: item.type,
1499
+ opacity: Math.random() * (maxOpacity - 0.05) + 0.05,
1500
+ shade: Math.random(),
1501
+ fontSize: fontSize[0] + Math.random() * (fontSize[1] - fontSize[0])
1502
+ };
1503
+ if (item.type === "image") {
1504
+ const img = new Image();
1505
+ img.crossOrigin = "anonymous";
1506
+ img.src = item.content;
1507
+ node.img = img;
1508
+ node.imgLoaded = false;
1509
+ img.onload = () => {
1510
+ node.imgLoaded = true;
1511
+ };
1512
+ }
1513
+ return node;
1514
+ });
1515
+ nodesRef.current = nodes;
1516
+ const onMouse = (e) => {
1517
+ const rect = canvas.getBoundingClientRect();
1518
+ mouseRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
1519
+ };
1520
+ const onMouseLeave = () => {
1521
+ mouseRef.current = { x: -9999, y: -9999 };
1522
+ };
1523
+ canvas.addEventListener("mousemove", onMouse);
1524
+ canvas.addEventListener("mouseleave", onMouseLeave);
1525
+ const getColor = (shade, alpha) => {
1526
+ const v = 40;
1527
+ const r = Math.round(baseR + (shade - 0.5) * v);
1528
+ const g = Math.round(baseG + (shade - 0.5) * v);
1529
+ const b = Math.round(baseB + (shade - 0.5) * (v * 0.3));
1530
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
1531
+ };
1532
+ const drawArrow = (fromX, fromY, toX, toY, color2) => {
1533
+ const headLen = 6;
1534
+ const dx = toX - fromX;
1535
+ const dy = toY - fromY;
1536
+ const angle = Math.atan2(dy, dx);
1537
+ const mx = (fromX + toX) / 2;
1538
+ const my = (fromY + toY) / 2;
1539
+ ctx.beginPath();
1540
+ ctx.moveTo(
1541
+ mx - headLen * Math.cos(angle - Math.PI / 6),
1542
+ my - headLen * Math.sin(angle - Math.PI / 6)
1543
+ );
1544
+ ctx.lineTo(mx, my);
1545
+ ctx.lineTo(
1546
+ mx - headLen * Math.cos(angle + Math.PI / 6),
1547
+ my - headLen * Math.sin(angle + Math.PI / 6)
1548
+ );
1549
+ ctx.strokeStyle = color2;
1550
+ ctx.lineWidth = lineWidth;
1551
+ ctx.stroke();
1552
+ };
1553
+ const draw = () => {
1554
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
1555
+ const mouse = mouseRef.current;
1556
+ for (const n of nodes) {
1557
+ n.x += n.vx;
1558
+ n.y += n.vy;
1559
+ if (n.x < -50) n.x = canvas.width + 50;
1560
+ if (n.x > canvas.width + 50) n.x = -50;
1561
+ if (n.y < -30) n.y = canvas.height + 30;
1562
+ if (n.y > canvas.height + 30) n.y = -30;
1563
+ }
1564
+ for (let i = 0; i < nodes.length; i++) {
1565
+ for (let j = i + 1; j < nodes.length; j++) {
1566
+ const dx = nodes[i].x - nodes[j].x;
1567
+ const dy = nodes[i].y - nodes[j].y;
1568
+ const dist = Math.sqrt(dx * dx + dy * dy);
1569
+ if (dist < connectionDistance) {
1570
+ const avgShade = (nodes[i].shade + nodes[j].shade) / 2;
1571
+ const alpha = (1 - dist / connectionDistance) * 0.1;
1572
+ const c = getColor(avgShade, alpha);
1573
+ ctx.beginPath();
1574
+ ctx.moveTo(nodes[i].x, nodes[i].y);
1575
+ ctx.lineTo(nodes[j].x, nodes[j].y);
1576
+ ctx.strokeStyle = c;
1577
+ ctx.lineWidth = lineWidth;
1578
+ ctx.stroke();
1579
+ if (arrows) {
1580
+ drawArrow(nodes[i].x, nodes[i].y, nodes[j].x, nodes[j].y, c);
1581
+ }
1582
+ }
1583
+ }
1584
+ }
1585
+ for (const n of nodes) {
1586
+ const dx = mouse.x - n.x;
1587
+ const dy = mouse.y - n.y;
1588
+ const dist = Math.sqrt(dx * dx + dy * dy);
1589
+ if (dist < mouseDistance) {
1590
+ const alpha = (1 - dist / mouseDistance) * 0.25;
1591
+ const c = getColor(n.shade, alpha);
1592
+ ctx.beginPath();
1593
+ ctx.moveTo(n.x, n.y);
1594
+ ctx.lineTo(mouse.x, mouse.y);
1595
+ ctx.strokeStyle = c;
1596
+ ctx.lineWidth = lineWidth * 1.2;
1597
+ ctx.stroke();
1598
+ if (arrows) {
1599
+ drawArrow(n.x, n.y, mouse.x, mouse.y, c);
1600
+ }
1601
+ }
1602
+ }
1603
+ for (const n of nodes) {
1604
+ const dx = mouse.x - n.x;
1605
+ const dy = mouse.y - n.y;
1606
+ const dist = Math.sqrt(dx * dx + dy * dy);
1607
+ const hoverBoost = dist < mouseDistance ? (1 - dist / mouseDistance) * 0.35 : 0;
1608
+ const alpha = Math.min(n.opacity + hoverBoost, 1);
1609
+ if (n.type === "image" && n.img && n.imgLoaded) {
1610
+ ctx.globalAlpha = alpha;
1611
+ const s = imageSize;
1612
+ ctx.drawImage(n.img, n.x - s / 2, n.y - s / 2, s, s);
1613
+ ctx.globalAlpha = 1;
1614
+ } else if (n.type === "emoji") {
1615
+ ctx.globalAlpha = alpha;
1616
+ ctx.font = `${n.fontSize + 4}px serif`;
1617
+ ctx.textAlign = "center";
1618
+ ctx.textBaseline = "middle";
1619
+ ctx.fillText(n.content, n.x, n.y);
1620
+ ctx.globalAlpha = 1;
1621
+ } else {
1622
+ ctx.font = `600 ${n.fontSize}px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`;
1623
+ ctx.textAlign = "center";
1624
+ ctx.textBaseline = "middle";
1625
+ ctx.fillStyle = getColor(n.shade, alpha);
1626
+ ctx.fillText(n.content, n.x, n.y);
1627
+ }
1628
+ }
1629
+ rafRef.current = requestAnimationFrame(draw);
1630
+ };
1631
+ draw();
1632
+ return () => {
1633
+ cancelAnimationFrame(rafRef.current);
1634
+ window.removeEventListener("resize", resize);
1635
+ canvas.removeEventListener("mousemove", onMouse);
1636
+ canvas.removeEventListener("mouseleave", onMouseLeave);
1637
+ };
1638
+ }, [items, count, connectionDistance, arrows, mouseDistance, color, speed, fontSize, imageSize, lineWidth, maxOpacity, normalize]);
1639
+ return /* @__PURE__ */ jsx17(
1640
+ "canvas",
1641
+ {
1642
+ ref: canvasRef,
1643
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
1644
+ style: { display: "block" }
1645
+ }
1646
+ );
1647
+ };
1648
+ ParticleBackground.displayName = "ParticleBackground";
1649
+
1650
+ // src/components/Background/AuroraBackground.tsx
1651
+ import { useEffect as useEffect11, useRef as useRef10 } from "react";
1652
+ import { jsx as jsx18 } from "react/jsx-runtime";
1653
+ var AuroraBackground = ({
1654
+ colors = ["#8b5cf6", "#3b82f6", "#06b6d4", "#8b5cf6"],
1655
+ speed = 1,
1656
+ blur = 120,
1657
+ opacity = 0.3,
1658
+ className
1659
+ }) => {
1660
+ const canvasRef = useRef10(null);
1661
+ const rafRef = useRef10(0);
1662
+ useEffect11(() => {
1663
+ const canvas = canvasRef.current;
1664
+ if (!canvas) return;
1665
+ const ctx = canvas.getContext("2d");
1666
+ if (!ctx) return;
1667
+ const resize = () => {
1668
+ canvas.width = canvas.offsetWidth;
1669
+ canvas.height = canvas.offsetHeight;
1670
+ };
1671
+ resize();
1672
+ window.addEventListener("resize", resize);
1673
+ let t = 0;
1674
+ const parseColor = (c) => {
1675
+ const tmp = document.createElement("div");
1676
+ tmp.style.color = c;
1677
+ document.body.appendChild(tmp);
1678
+ const computed = getComputedStyle(tmp).color;
1679
+ document.body.removeChild(tmp);
1680
+ const m = computed.match(/\d+/g);
1681
+ return m ? [+m[0], +m[1], +m[2]] : [139, 92, 246];
1682
+ };
1683
+ const rgbColors = colors.map(parseColor);
1684
+ const draw = () => {
1685
+ const w = canvas.width;
1686
+ const h = canvas.height;
1687
+ ctx.clearRect(0, 0, w, h);
1688
+ const blobCount = rgbColors.length;
1689
+ for (let i = 0; i < blobCount; i++) {
1690
+ const phase = i / blobCount * Math.PI * 2;
1691
+ const x = w * 0.5 + Math.sin(t * 0.3 * speed + phase) * w * 0.35;
1692
+ const y = h * 0.4 + Math.cos(t * 0.2 * speed + phase * 1.3) * h * 0.25;
1693
+ const radius = Math.max(w, h) * (0.3 + Math.sin(t * 0.15 * speed + i) * 0.1);
1694
+ const [r, g, b] = rgbColors[i % rgbColors.length];
1695
+ const grad = ctx.createRadialGradient(x, y, 0, x, y, radius);
1696
+ grad.addColorStop(0, `rgba(${r}, ${g}, ${b}, ${opacity})`);
1697
+ grad.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);
1698
+ ctx.fillStyle = grad;
1699
+ ctx.fillRect(0, 0, w, h);
1700
+ }
1701
+ t += 0.016;
1702
+ rafRef.current = requestAnimationFrame(draw);
1703
+ };
1704
+ draw();
1705
+ return () => {
1706
+ cancelAnimationFrame(rafRef.current);
1707
+ window.removeEventListener("resize", resize);
1708
+ };
1709
+ }, [colors, speed, blur, opacity]);
1710
+ return /* @__PURE__ */ jsx18(
1711
+ "canvas",
1712
+ {
1713
+ ref: canvasRef,
1714
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
1715
+ style: { display: "block", filter: `blur(${blur}px)` }
1716
+ }
1717
+ );
1718
+ };
1719
+ AuroraBackground.displayName = "AuroraBackground";
1720
+
1721
+ // src/components/Background/GridBackground.tsx
1722
+ import { useEffect as useEffect12, useRef as useRef11 } from "react";
1723
+ import { jsx as jsx19 } from "react/jsx-runtime";
1724
+ var gridStyleInjected = false;
1725
+ var GridBackground = ({
1726
+ variant = "grid",
1727
+ size = 40,
1728
+ color = "rgba(255,255,255,0.08)",
1729
+ opacity = 1,
1730
+ followMouse = false,
1731
+ maskRadius = 300,
1732
+ className
1733
+ }) => {
1734
+ const containerRef = useRef11(null);
1735
+ useEffect12(() => {
1736
+ if (!gridStyleInjected) {
1737
+ gridStyleInjected = true;
1738
+ const style = document.createElement("style");
1739
+ style.textContent = `
1740
+ .uixy-grid-bg {
1741
+ --uixy-grid-mx: 50%;
1742
+ --uixy-grid-my: 50%;
1743
+ }
1744
+ `;
1745
+ document.head.appendChild(style);
1746
+ }
1747
+ }, []);
1748
+ useEffect12(() => {
1749
+ if (!followMouse) return;
1750
+ const el = containerRef.current;
1751
+ if (!el) return;
1752
+ const onMove = (e) => {
1753
+ const rect = el.getBoundingClientRect();
1754
+ el.style.setProperty("--uixy-grid-mx", `${e.clientX - rect.left}px`);
1755
+ el.style.setProperty("--uixy-grid-my", `${e.clientY - rect.top}px`);
1756
+ };
1757
+ el.addEventListener("mousemove", onMove);
1758
+ return () => el.removeEventListener("mousemove", onMove);
1759
+ }, [followMouse]);
1760
+ let bgImage;
1761
+ if (variant === "dots") {
1762
+ bgImage = `radial-gradient(circle, ${color} 1px, transparent 1px)`;
1763
+ } else if (variant === "cross") {
1764
+ bgImage = `
1765
+ linear-gradient(${color} 1px, transparent 1px),
1766
+ linear-gradient(90deg, ${color} 1px, transparent 1px),
1767
+ radial-gradient(circle, ${color} 1.5px, transparent 1.5px)
1768
+ `;
1769
+ } else {
1770
+ bgImage = `
1771
+ linear-gradient(${color} 1px, transparent 1px),
1772
+ linear-gradient(90deg, ${color} 1px, transparent 1px)
1773
+ `;
1774
+ }
1775
+ const bgSize = variant === "cross" ? `${size}px ${size}px, ${size}px ${size}px, ${size}px ${size}px` : `${size}px ${size}px`;
1776
+ const maskImage = followMouse ? `radial-gradient(circle ${maskRadius}px at var(--uixy-grid-mx) var(--uixy-grid-my), black, transparent)` : void 0;
1777
+ return /* @__PURE__ */ jsx19(
1778
+ "div",
1779
+ {
1780
+ ref: containerRef,
1781
+ className: `uixy-grid-bg ${className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full"}`,
1782
+ style: {
1783
+ backgroundImage: bgImage,
1784
+ backgroundSize: bgSize,
1785
+ opacity,
1786
+ WebkitMaskImage: maskImage,
1787
+ maskImage
1788
+ }
1789
+ }
1790
+ );
1791
+ };
1792
+ GridBackground.displayName = "GridBackground";
1793
+
1794
+ // src/components/Background/StarfieldBackground.tsx
1795
+ import { useEffect as useEffect13, useRef as useRef12 } from "react";
1796
+ import { jsx as jsx20 } from "react/jsx-runtime";
1797
+ var StarfieldBackground = ({
1798
+ count = 300,
1799
+ speed = 1,
1800
+ color = [200, 200, 255],
1801
+ maxSize = 2.5,
1802
+ warp = false,
1803
+ className
1804
+ }) => {
1805
+ const canvasRef = useRef12(null);
1806
+ const rafRef = useRef12(0);
1807
+ useEffect13(() => {
1808
+ const canvas = canvasRef.current;
1809
+ if (!canvas) return;
1810
+ const ctx = canvas.getContext("2d");
1811
+ if (!ctx) return;
1812
+ const resize = () => {
1813
+ canvas.width = canvas.offsetWidth;
1814
+ canvas.height = canvas.offsetHeight;
1815
+ };
1816
+ resize();
1817
+ window.addEventListener("resize", resize);
1818
+ const stars = Array.from({ length: count }, () => ({
1819
+ x: (Math.random() - 0.5) * 2e3,
1820
+ y: (Math.random() - 0.5) * 2e3,
1821
+ z: Math.random() * 1e3,
1822
+ prevX: 0,
1823
+ prevY: 0
1824
+ }));
1825
+ const baseSpeed = warp ? 8 : 1.5;
1826
+ const draw = () => {
1827
+ const w = canvas.width;
1828
+ const h = canvas.height;
1829
+ const cx = w / 2;
1830
+ const cy = h / 2;
1831
+ const [r, g, b] = color;
1832
+ if (warp) {
1833
+ ctx.fillStyle = "rgba(0, 0, 0, 0.15)";
1834
+ ctx.fillRect(0, 0, w, h);
1835
+ } else {
1836
+ ctx.clearRect(0, 0, w, h);
1837
+ }
1838
+ for (const star of stars) {
1839
+ const prevZ = star.z + baseSpeed * speed;
1840
+ star.prevX = star.x / prevZ * 500 + cx;
1841
+ star.prevY = star.y / prevZ * 500 + cy;
1842
+ star.z -= baseSpeed * speed;
1843
+ if (star.z <= 1) {
1844
+ star.x = (Math.random() - 0.5) * 2e3;
1845
+ star.y = (Math.random() - 0.5) * 2e3;
1846
+ star.z = 1e3;
1847
+ star.prevX = star.x / star.z * 500 + cx;
1848
+ star.prevY = star.y / star.z * 500 + cy;
1849
+ continue;
1850
+ }
1851
+ const sx = star.x / star.z * 500 + cx;
1852
+ const sy = star.y / star.z * 500 + cy;
1853
+ if (sx < -10 || sx > w + 10 || sy < -10 || sy > h + 10) continue;
1854
+ const size = Math.max(0.3, (1 - star.z / 1e3) * maxSize);
1855
+ const alpha = Math.min(1, (1 - star.z / 1e3) * 1.5);
1856
+ if (warp) {
1857
+ ctx.beginPath();
1858
+ ctx.moveTo(star.prevX, star.prevY);
1859
+ ctx.lineTo(sx, sy);
1860
+ ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${alpha * 0.6})`;
1861
+ ctx.lineWidth = size * 0.8;
1862
+ ctx.stroke();
1863
+ }
1864
+ ctx.beginPath();
1865
+ ctx.arc(sx, sy, size, 0, Math.PI * 2);
1866
+ ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${alpha})`;
1867
+ ctx.fill();
1868
+ }
1869
+ rafRef.current = requestAnimationFrame(draw);
1870
+ };
1871
+ draw();
1872
+ return () => {
1873
+ cancelAnimationFrame(rafRef.current);
1874
+ window.removeEventListener("resize", resize);
1875
+ };
1876
+ }, [count, speed, color, maxSize, warp]);
1877
+ return /* @__PURE__ */ jsx20(
1878
+ "canvas",
1879
+ {
1880
+ ref: canvasRef,
1881
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
1882
+ style: { display: "block", background: "black" }
1883
+ }
1884
+ );
1885
+ };
1886
+ StarfieldBackground.displayName = "StarfieldBackground";
1887
+
1888
+ // src/components/Background/WaveBackground.tsx
1889
+ import { useEffect as useEffect14, useRef as useRef13 } from "react";
1890
+ import { jsx as jsx21 } from "react/jsx-runtime";
1891
+ var WaveBackground = ({
1892
+ colors = ["rgba(139,92,246,0.15)", "rgba(59,130,246,0.12)", "rgba(6,182,212,0.1)"],
1893
+ layers = 3,
1894
+ speed = 1,
1895
+ amplitude = 40,
1896
+ frequency = 8e-3,
1897
+ className
1898
+ }) => {
1899
+ const canvasRef = useRef13(null);
1900
+ const rafRef = useRef13(0);
1901
+ useEffect14(() => {
1902
+ const canvas = canvasRef.current;
1903
+ if (!canvas) return;
1904
+ const ctx = canvas.getContext("2d");
1905
+ if (!ctx) return;
1906
+ const resize = () => {
1907
+ canvas.width = canvas.offsetWidth;
1908
+ canvas.height = canvas.offsetHeight;
1909
+ };
1910
+ resize();
1911
+ window.addEventListener("resize", resize);
1912
+ let t = 0;
1913
+ const draw = () => {
1914
+ const w = canvas.width;
1915
+ const h = canvas.height;
1916
+ ctx.clearRect(0, 0, w, h);
1917
+ for (let l = 0; l < layers; l++) {
1918
+ const color = colors[l % colors.length];
1919
+ const yBase = h * (0.5 + l * 0.12);
1920
+ const amp = amplitude * (1 - l * 0.15);
1921
+ const freq = frequency * (1 + l * 0.3);
1922
+ const phaseOffset = l * 1.2;
1923
+ ctx.beginPath();
1924
+ ctx.moveTo(0, h);
1925
+ for (let x = 0; x <= w; x += 3) {
1926
+ const y = yBase + Math.sin(x * freq + t * speed + phaseOffset) * amp + Math.sin(x * freq * 0.5 + t * speed * 0.7 + phaseOffset * 2) * amp * 0.5;
1927
+ ctx.lineTo(x, y);
1928
+ }
1929
+ ctx.lineTo(w, h);
1930
+ ctx.closePath();
1931
+ ctx.fillStyle = color;
1932
+ ctx.fill();
1933
+ }
1934
+ t += 0.02;
1935
+ rafRef.current = requestAnimationFrame(draw);
1936
+ };
1937
+ draw();
1938
+ return () => {
1939
+ cancelAnimationFrame(rafRef.current);
1940
+ window.removeEventListener("resize", resize);
1941
+ };
1942
+ }, [colors, layers, speed, amplitude, frequency]);
1943
+ return /* @__PURE__ */ jsx21(
1944
+ "canvas",
1945
+ {
1946
+ ref: canvasRef,
1947
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
1948
+ style: { display: "block" }
1949
+ }
1950
+ );
1951
+ };
1952
+ WaveBackground.displayName = "WaveBackground";
1953
+
1954
+ // src/components/Background/GradientMeshBackground.tsx
1955
+ import { useEffect as useEffect15, useRef as useRef14 } from "react";
1956
+ import { jsx as jsx22 } from "react/jsx-runtime";
1957
+ var meshStyleInjected = false;
1958
+ var GradientMeshBackground = ({
1959
+ colors = ["#8b5cf6", "#3b82f6", "#06b6d4", "#ec4899"],
1960
+ speed = 1,
1961
+ intensity = 1,
1962
+ className
1963
+ }) => {
1964
+ const containerRef = useRef14(null);
1965
+ useEffect15(() => {
1966
+ if (!meshStyleInjected) {
1967
+ meshStyleInjected = true;
1968
+ const style = document.createElement("style");
1969
+ style.textContent = `
1970
+ @keyframes uixy-mesh-1 {
1971
+ 0%, 100% { transform: translate(0%, 0%) scale(1); }
1972
+ 25% { transform: translate(30%, -20%) scale(1.1); }
1973
+ 50% { transform: translate(-10%, 30%) scale(0.95); }
1974
+ 75% { transform: translate(20%, 10%) scale(1.05); }
1975
+ }
1976
+ @keyframes uixy-mesh-2 {
1977
+ 0%, 100% { transform: translate(0%, 0%) scale(1); }
1978
+ 25% { transform: translate(-25%, 15%) scale(1.05); }
1979
+ 50% { transform: translate(20%, -25%) scale(1.1); }
1980
+ 75% { transform: translate(-15%, -10%) scale(0.9); }
1981
+ }
1982
+ @keyframes uixy-mesh-3 {
1983
+ 0%, 100% { transform: translate(0%, 0%) scale(1.05); }
1984
+ 33% { transform: translate(15%, 25%) scale(0.95); }
1985
+ 66% { transform: translate(-20%, -15%) scale(1.1); }
1986
+ }
1987
+ @keyframes uixy-mesh-4 {
1988
+ 0%, 100% { transform: translate(0%, 0%) scale(0.95); }
1989
+ 33% { transform: translate(-30%, 10%) scale(1.1); }
1990
+ 66% { transform: translate(10%, -30%) scale(1); }
1991
+ }
1992
+ `;
1993
+ document.head.appendChild(style);
1994
+ }
1995
+ }, []);
1996
+ const animations = [
1997
+ `uixy-mesh-1 ${12 / speed}s ease-in-out infinite`,
1998
+ `uixy-mesh-2 ${15 / speed}s ease-in-out infinite`,
1999
+ `uixy-mesh-3 ${18 / speed}s ease-in-out infinite`,
2000
+ `uixy-mesh-4 ${14 / speed}s ease-in-out infinite`
2001
+ ];
2002
+ const positions = [
2003
+ { top: "10%", left: "15%" },
2004
+ { top: "60%", right: "10%" },
2005
+ { bottom: "15%", left: "25%" },
2006
+ { top: "30%", right: "30%" }
2007
+ ];
2008
+ return /* @__PURE__ */ jsx22(
2009
+ "div",
2010
+ {
2011
+ ref: containerRef,
2012
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
2013
+ style: { overflow: "hidden", position: "relative" },
2014
+ children: colors.slice(0, 4).map((color, i) => /* @__PURE__ */ jsx22(
2015
+ "div",
2016
+ {
2017
+ style: {
2018
+ position: "absolute",
2019
+ width: "60%",
2020
+ height: "60%",
2021
+ borderRadius: "50%",
2022
+ background: `radial-gradient(circle, ${color} 0%, transparent 70%)`,
2023
+ opacity: 0.25 * intensity,
2024
+ filter: "blur(80px)",
2025
+ animation: animations[i],
2026
+ ...positions[i]
2027
+ }
2028
+ },
2029
+ i
2030
+ ))
2031
+ }
2032
+ );
2033
+ };
2034
+ GradientMeshBackground.displayName = "GradientMeshBackground";
2035
+
2036
+ // src/components/Background/MatrixRainBackground.tsx
2037
+ import { useEffect as useEffect16, useRef as useRef15 } from "react";
2038
+ import { jsx as jsx23 } from "react/jsx-runtime";
2039
+ var MatrixRainBackground = ({
2040
+ charset = "abcdefghijklmnopqrstuvwxyz0123456789@#$%&*<>{}[]",
2041
+ columnWidth = 20,
2042
+ speed = 1,
2043
+ color = "#22c55e",
2044
+ fontSize = 14,
2045
+ className
2046
+ }) => {
2047
+ const canvasRef = useRef15(null);
2048
+ const rafRef = useRef15(0);
2049
+ useEffect16(() => {
2050
+ const canvas = canvasRef.current;
2051
+ if (!canvas) return;
2052
+ const ctx = canvas.getContext("2d");
2053
+ if (!ctx) return;
2054
+ const resize = () => {
2055
+ canvas.width = canvas.offsetWidth;
2056
+ canvas.height = canvas.offsetHeight;
2057
+ };
2058
+ resize();
2059
+ window.addEventListener("resize", resize);
2060
+ const chars = charset.split("");
2061
+ let columns = Math.floor(canvas.width / columnWidth);
2062
+ let drops = Array.from({ length: columns }, () => Math.random() * -100);
2063
+ const draw = () => {
2064
+ const w = canvas.width;
2065
+ const h = canvas.height;
2066
+ const newCols = Math.floor(w / columnWidth);
2067
+ if (newCols !== columns) {
2068
+ columns = newCols;
2069
+ drops = Array.from({ length: columns }, () => Math.random() * -100);
2070
+ }
2071
+ ctx.fillStyle = "rgba(0, 0, 0, 0.06)";
2072
+ ctx.fillRect(0, 0, w, h);
2073
+ ctx.font = `${fontSize}px monospace`;
2074
+ for (let i = 0; i < columns; i++) {
2075
+ const char = chars[Math.floor(Math.random() * chars.length)];
2076
+ const x = i * columnWidth;
2077
+ const y = drops[i] * fontSize;
2078
+ ctx.fillStyle = color;
2079
+ ctx.globalAlpha = 0.9;
2080
+ ctx.fillText(char, x, y);
2081
+ ctx.globalAlpha = 0.3;
2082
+ const trailChar = chars[Math.floor(Math.random() * chars.length)];
2083
+ ctx.fillText(trailChar, x, y - fontSize);
2084
+ ctx.globalAlpha = 1;
2085
+ if (y > h && Math.random() > 0.98) {
2086
+ drops[i] = 0;
2087
+ }
2088
+ drops[i] += speed * 0.5;
2089
+ }
2090
+ rafRef.current = requestAnimationFrame(draw);
2091
+ };
2092
+ draw();
2093
+ return () => {
2094
+ cancelAnimationFrame(rafRef.current);
2095
+ window.removeEventListener("resize", resize);
2096
+ };
2097
+ }, [charset, columnWidth, speed, color, fontSize]);
2098
+ return /* @__PURE__ */ jsx23(
2099
+ "canvas",
2100
+ {
2101
+ ref: canvasRef,
2102
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
2103
+ style: { display: "block", background: "black" }
2104
+ }
2105
+ );
2106
+ };
2107
+ MatrixRainBackground.displayName = "MatrixRainBackground";
2108
+
2109
+ // src/components/Background/BokehBackground.tsx
2110
+ import { useEffect as useEffect17, useRef as useRef16 } from "react";
2111
+ import { jsx as jsx24 } from "react/jsx-runtime";
2112
+ var bokehStyleInjected = false;
2113
+ var clipPaths = {
2114
+ circle: "",
2115
+ hexagon: "polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%)",
2116
+ diamond: "polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)",
2117
+ triangle: "polygon(50% 0%, 100% 100%, 0% 100%)",
2118
+ star: "polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%)",
2119
+ ring: ""
2120
+ };
2121
+ var shapeKeys = ["circle", "hexagon", "diamond", "triangle", "star", "ring"];
2122
+ var BokehBackground = ({
2123
+ count = 15,
2124
+ colors = ["#8b5cf6", "#3b82f6", "#06b6d4", "#ec4899", "#f97316"],
2125
+ shape = "circle",
2126
+ speed = 1,
2127
+ sizeRange = [40, 200],
2128
+ className
2129
+ }) => {
2130
+ const containerRef = useRef16(null);
2131
+ useEffect17(() => {
2132
+ if (!bokehStyleInjected) {
2133
+ bokehStyleInjected = true;
2134
+ const style = document.createElement("style");
2135
+ style.textContent = `
2136
+ @keyframes uixy-bokeh-float {
2137
+ 0%, 100% { transform: translate(0, 0) scale(1) rotate(0deg); }
2138
+ 25% { transform: translate(var(--uixy-bk-dx1), var(--uixy-bk-dy1)) scale(var(--uixy-bk-s1)) rotate(var(--uixy-bk-r1)); }
2139
+ 50% { transform: translate(var(--uixy-bk-dx2), var(--uixy-bk-dy2)) scale(var(--uixy-bk-s2)) rotate(var(--uixy-bk-r2)); }
2140
+ 75% { transform: translate(var(--uixy-bk-dx3), var(--uixy-bk-dy3)) scale(var(--uixy-bk-s3)) rotate(var(--uixy-bk-r3)); }
2141
+ }
2142
+ `;
2143
+ document.head.appendChild(style);
2144
+ }
2145
+ }, []);
2146
+ const elements = Array.from({ length: count }, (_, i) => {
2147
+ const size = sizeRange[0] + Math.random() * (sizeRange[1] - sizeRange[0]);
2148
+ const color = colors[i % colors.length];
2149
+ const duration = (15 + Math.random() * 20) / speed;
2150
+ const rp = () => `${(Math.random() - 0.5) * 60}px`;
2151
+ const rs = () => `${0.8 + Math.random() * 0.4}`;
2152
+ const rr = () => `${(Math.random() - 0.5) * 40}deg`;
2153
+ const s = shape === "mixed" ? shapeKeys[i % shapeKeys.length] : shape;
2154
+ const isRing = s === "ring";
2155
+ const isCircle = s === "circle";
2156
+ const clip = clipPaths[s];
2157
+ const baseStyle = {
2158
+ position: "absolute",
2159
+ left: `${Math.random() * 100}%`,
2160
+ top: `${Math.random() * 100}%`,
2161
+ width: size,
2162
+ height: size,
2163
+ opacity: 0.35 + Math.random() * 0.3,
2164
+ filter: `blur(${1.5 + Math.random() * 3}px)`,
2165
+ animation: `uixy-bokeh-float ${duration}s ease-in-out infinite`,
2166
+ animationDelay: `${-Math.random() * duration}s`,
2167
+ "--uixy-bk-dx1": rp(),
2168
+ "--uixy-bk-dy1": rp(),
2169
+ "--uixy-bk-s1": rs(),
2170
+ "--uixy-bk-r1": rr(),
2171
+ "--uixy-bk-dx2": rp(),
2172
+ "--uixy-bk-dy2": rp(),
2173
+ "--uixy-bk-s2": rs(),
2174
+ "--uixy-bk-r2": rr(),
2175
+ "--uixy-bk-dx3": rp(),
2176
+ "--uixy-bk-dy3": rp(),
2177
+ "--uixy-bk-s3": rs(),
2178
+ "--uixy-bk-r3": rr()
2179
+ };
2180
+ if (isRing) {
2181
+ return {
2182
+ key: i,
2183
+ style: {
2184
+ ...baseStyle,
2185
+ borderRadius: "50%",
2186
+ border: `${2 + Math.random() * 3}px solid ${color}50`,
2187
+ background: "transparent"
2188
+ }
2189
+ };
2190
+ }
2191
+ return {
2192
+ key: i,
2193
+ style: {
2194
+ ...baseStyle,
2195
+ borderRadius: isCircle ? "50%" : "0",
2196
+ background: isCircle ? `radial-gradient(circle at 35% 35%, ${color}45, ${color}18, transparent)` : `linear-gradient(135deg, ${color}40, ${color}15, transparent)`,
2197
+ border: `1px solid ${color}20`,
2198
+ clipPath: clip || void 0
2199
+ }
2200
+ };
2201
+ });
2202
+ return /* @__PURE__ */ jsx24(
2203
+ "div",
2204
+ {
2205
+ ref: containerRef,
2206
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
2207
+ style: { overflow: "hidden", position: "relative" },
2208
+ children: elements.map((c) => /* @__PURE__ */ jsx24("div", { style: c.style }, c.key))
2209
+ }
2210
+ );
2211
+ };
2212
+ BokehBackground.displayName = "BokehBackground";
2213
+
2214
+ // src/components/Background/PixelBackground.tsx
2215
+ import { useEffect as useEffect18, useRef as useRef17 } from "react";
2216
+ import { jsx as jsx25 } from "react/jsx-runtime";
2217
+ function hexToRgb(hex) {
2218
+ const h = hex.replace("#", "");
2219
+ return [
2220
+ parseInt(h.substring(0, 2), 16),
2221
+ parseInt(h.substring(2, 4), 16),
2222
+ parseInt(h.substring(4, 6), 16)
2223
+ ];
2224
+ }
2225
+ function makeNoise(cols, rows) {
2226
+ const arr = new Float32Array(cols * rows);
2227
+ for (let i = 0; i < arr.length; i++) arr[i] = Math.random();
2228
+ return arr;
2229
+ }
2230
+ function smoothNoise(noise, cols, rows, x, y) {
2231
+ const x0 = Math.floor(x) % cols;
2232
+ const y0 = Math.floor(y) % rows;
2233
+ const x1 = (x0 + 1) % cols;
2234
+ const y1 = (y0 + 1) % rows;
2235
+ const fx = x - Math.floor(x);
2236
+ const fy = y - Math.floor(y);
2237
+ const sx = fx * fx * (3 - 2 * fx);
2238
+ const sy = fy * fy * (3 - 2 * fy);
2239
+ const n00 = noise[y0 * cols + x0];
2240
+ const n10 = noise[y0 * cols + x1];
2241
+ const n01 = noise[y1 * cols + x0];
2242
+ const n11 = noise[y1 * cols + x1];
2243
+ return (n00 * (1 - sx) + n10 * sx) * (1 - sy) + (n01 * (1 - sx) + n11 * sx) * sy;
2244
+ }
2245
+ var PixelBackground = ({
2246
+ variant = "rain",
2247
+ pixelSize = 8,
2248
+ colors,
2249
+ speed = 1,
2250
+ opacity = 0.6,
2251
+ className
2252
+ }) => {
2253
+ const canvasRef = useRef17(null);
2254
+ const rafRef = useRef17(0);
2255
+ useEffect18(() => {
2256
+ const canvas = canvasRef.current;
2257
+ if (!canvas) return;
2258
+ const ctx = canvas.getContext("2d");
2259
+ if (!ctx) return;
2260
+ const resize = () => {
2261
+ canvas.width = canvas.offsetWidth;
2262
+ canvas.height = canvas.offsetHeight;
2263
+ };
2264
+ resize();
2265
+ window.addEventListener("resize", resize);
2266
+ const ps = pixelSize;
2267
+ if (variant === "rain") {
2268
+ const palette = (colors || ["#8b5cf6", "#6366f1", "#3b82f6", "#06b6d4"]).map(hexToRgb);
2269
+ let cols = Math.ceil(canvas.width / ps);
2270
+ const makeDrop = (col, startY) => ({
2271
+ x: col,
2272
+ y: startY != null ? startY : -(Math.random() * 30),
2273
+ len: 4 + Math.floor(Math.random() * 12),
2274
+ speed: 0.15 + Math.random() * 0.25,
2275
+ color: palette[Math.floor(Math.random() * palette.length)]
2276
+ });
2277
+ let drops = [];
2278
+ cols = Math.ceil(canvas.width / ps);
2279
+ for (let c = 0; c < cols; c++) {
2280
+ if (Math.random() < 0.35) {
2281
+ drops.push(makeDrop(c));
2282
+ }
2283
+ }
2284
+ const draw = () => {
2285
+ const w = canvas.width;
2286
+ const h = canvas.height;
2287
+ const rows = Math.ceil(h / ps);
2288
+ cols = Math.ceil(w / ps);
2289
+ ctx.fillStyle = "rgba(0, 0, 0, 0.12)";
2290
+ ctx.fillRect(0, 0, w, h);
2291
+ for (const d of drops) {
2292
+ const headRow = Math.floor(d.y);
2293
+ for (let i = 0; i < d.len; i++) {
2294
+ const row = headRow - i;
2295
+ if (row < 0 || row >= rows) continue;
2296
+ const brightness = 1 - i / d.len;
2297
+ const a = brightness * brightness * opacity;
2298
+ const [r, g, b] = d.color;
2299
+ ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`;
2300
+ ctx.fillRect(d.x * ps, row * ps, ps - 1, ps - 1);
2301
+ }
2302
+ const hr = Math.floor(d.y);
2303
+ if (hr >= 0 && hr < rows) {
2304
+ const [r, g, b] = d.color;
2305
+ ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${opacity * 0.3})`;
2306
+ ctx.fillRect(d.x * ps - 1, hr * ps - 1, ps + 2, ps + 2);
2307
+ }
2308
+ d.y += d.speed * speed;
2309
+ }
2310
+ drops = drops.filter((d) => {
2311
+ if ((d.y - d.len) * ps > h) {
2312
+ return false;
2313
+ }
2314
+ return true;
2315
+ });
2316
+ if (Math.random() < 0.3 * speed) {
2317
+ const col = Math.floor(Math.random() * cols);
2318
+ drops.push(makeDrop(col, -2));
2319
+ }
2320
+ rafRef.current = requestAnimationFrame(draw);
2321
+ };
2322
+ draw();
2323
+ } else if (variant === "life") {
2324
+ const palette = colors || ["#22c55e", "#16a34a", "#15803d"];
2325
+ const cols = Math.ceil(canvas.width / ps);
2326
+ const rows = Math.ceil(canvas.height / ps);
2327
+ let grid = Array.from(
2328
+ { length: rows },
2329
+ () => Array.from({ length: cols }, () => Math.random() > 0.82 ? 1 : 0)
2330
+ );
2331
+ let ages = Array.from(
2332
+ { length: rows },
2333
+ () => new Float32Array(cols)
2334
+ );
2335
+ let frame = 0;
2336
+ const draw = () => {
2337
+ ctx.fillStyle = "rgba(0, 0, 0, 0.15)";
2338
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
2339
+ for (let r = 0; r < rows; r++) {
2340
+ for (let c = 0; c < cols; c++) {
2341
+ if (grid[r][c]) {
2342
+ ages[r][c] = Math.min(ages[r][c] + 0.08, 1);
2343
+ } else {
2344
+ ages[r][c] = Math.max(ages[r][c] - 0.05, 0);
2345
+ }
2346
+ if (ages[r][c] > 0.01) {
2347
+ ctx.globalAlpha = ages[r][c] * opacity;
2348
+ ctx.fillStyle = palette[(r + c) % palette.length];
2349
+ ctx.fillRect(c * ps, r * ps, ps - 1, ps - 1);
2350
+ }
2351
+ }
2352
+ }
2353
+ ctx.globalAlpha = 1;
2354
+ frame++;
2355
+ if (frame % Math.max(1, Math.round(6 / speed)) === 0) {
2356
+ const next = grid.map((row) => [...row]);
2357
+ for (let r = 0; r < rows; r++) {
2358
+ for (let c = 0; c < cols; c++) {
2359
+ let n = 0;
2360
+ for (let dr = -1; dr <= 1; dr++) {
2361
+ for (let dc = -1; dc <= 1; dc++) {
2362
+ if (dr === 0 && dc === 0) continue;
2363
+ const nr = (r + dr + rows) % rows;
2364
+ const nc = (c + dc + cols) % cols;
2365
+ n += grid[nr][nc];
2366
+ }
2367
+ }
2368
+ if (grid[r][c]) {
2369
+ next[r][c] = n === 2 || n === 3 ? 1 : 0;
2370
+ } else {
2371
+ next[r][c] = n === 3 ? 1 : 0;
2372
+ }
2373
+ }
2374
+ }
2375
+ grid = next;
2376
+ let alive = 0;
2377
+ for (let r = 0; r < rows; r++) for (let c = 0; c < cols; c++) alive += grid[r][c];
2378
+ if (alive < rows * cols * 0.03) {
2379
+ for (let r = 0; r < rows; r++) {
2380
+ for (let c = 0; c < cols; c++) {
2381
+ if (Math.random() > 0.85) grid[r][c] = 1;
2382
+ }
2383
+ }
2384
+ }
2385
+ }
2386
+ rafRef.current = requestAnimationFrame(draw);
2387
+ };
2388
+ draw();
2389
+ } else if (variant === "terrain") {
2390
+ const palette = colors || ["#0f172a", "#1e3a5f", "#1a4731", "#365314", "#4d7c0f", "#65a30d", "#84cc16", "#a3e635"];
2391
+ const cols = Math.ceil(canvas.width / ps);
2392
+ const rows = Math.ceil(canvas.height / ps);
2393
+ const noise = (x, y, t2) => {
2394
+ return Math.sin(x * 0.04 + t2 * 0.7) * 0.35 + Math.sin(y * 0.06 - t2 * 0.5) * 0.25 + Math.sin((x + y) * 0.025 + t2 * 0.3) * 0.2 + Math.sin(x * 0.1 - y * 0.08 + t2 * 0.4) * 0.2;
2395
+ };
2396
+ let t = 0;
2397
+ const draw = () => {
2398
+ for (let r = 0; r < rows; r++) {
2399
+ for (let c = 0; c < cols; c++) {
2400
+ const n = (noise(c, r, t) + 1) / 2;
2401
+ const idx = Math.min(palette.length - 1, Math.floor(n * palette.length));
2402
+ ctx.globalAlpha = opacity;
2403
+ ctx.fillStyle = palette[idx];
2404
+ ctx.fillRect(c * ps, r * ps, ps, ps);
2405
+ }
2406
+ }
2407
+ ctx.globalAlpha = 1;
2408
+ t += 6e-3 * speed;
2409
+ rafRef.current = requestAnimationFrame(draw);
2410
+ };
2411
+ draw();
2412
+ } else {
2413
+ const palette = (colors || ["#8b5cf6", "#6366f1", "#3b82f6", "#06b6d4", "#14b8a6"]).map(hexToRgb);
2414
+ const cols = Math.ceil(canvas.width / ps);
2415
+ const rows = Math.ceil(canvas.height / ps);
2416
+ const noiseSize = 64;
2417
+ const noise1 = makeNoise(noiseSize, noiseSize);
2418
+ const noise2 = makeNoise(noiseSize, noiseSize);
2419
+ const noise3 = makeNoise(noiseSize, noiseSize);
2420
+ let t = 0;
2421
+ const draw = () => {
2422
+ for (let r = 0; r < rows; r++) {
2423
+ for (let c = 0; c < cols; c++) {
2424
+ const n1 = smoothNoise(noise1, noiseSize, noiseSize, c * 0.08 + t * 0.5, r * 0.08 + t * 0.3);
2425
+ const n2 = smoothNoise(noise2, noiseSize, noiseSize, c * 0.12 - t * 0.4, r * 0.12 + t * 0.2);
2426
+ const n3 = smoothNoise(noise3, noiseSize, noiseSize, c * 0.05 + t * 0.2, r * 0.05 - t * 0.35);
2427
+ const combined = n1 * 0.5 + n2 * 0.3 + n3 * 0.2;
2428
+ const pi = combined * (palette.length - 1);
2429
+ const idx0 = Math.floor(pi);
2430
+ const idx1 = Math.min(idx0 + 1, palette.length - 1);
2431
+ const frac = pi - idx0;
2432
+ const [r0, g0, b0] = palette[idx0];
2433
+ const [r1, g1, b1] = palette[idx1];
2434
+ const fr = Math.round(r0 + (r1 - r0) * frac);
2435
+ const fg = Math.round(g0 + (g1 - g0) * frac);
2436
+ const fb = Math.round(b0 + (b1 - b0) * frac);
2437
+ ctx.globalAlpha = opacity * (0.5 + combined * 0.5);
2438
+ ctx.fillStyle = `rgb(${fr}, ${fg}, ${fb})`;
2439
+ ctx.fillRect(c * ps, r * ps, ps, ps);
2440
+ }
2441
+ }
2442
+ ctx.globalAlpha = 1;
2443
+ t += 0.015 * speed;
2444
+ rafRef.current = requestAnimationFrame(draw);
2445
+ };
2446
+ draw();
2447
+ }
2448
+ return () => {
2449
+ cancelAnimationFrame(rafRef.current);
2450
+ window.removeEventListener("resize", resize);
2451
+ };
2452
+ }, [variant, pixelSize, colors, speed, opacity]);
2453
+ return /* @__PURE__ */ jsx25(
2454
+ "canvas",
2455
+ {
2456
+ ref: canvasRef,
2457
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
2458
+ style: { display: "block", background: "#09090b", imageRendering: "pixelated" }
2459
+ }
2460
+ );
2461
+ };
2462
+ PixelBackground.displayName = "PixelBackground";
2463
+
2464
+ // src/components/Background/RippleBackground.tsx
2465
+ import { useEffect as useEffect19 } from "react";
2466
+ import { jsx as jsx26 } from "react/jsx-runtime";
2467
+ var rippleStyleInjected = false;
2468
+ var RippleBackground = ({
2469
+ count = 6,
2470
+ color = "rgba(139, 92, 246, 0.15)",
2471
+ duration = 4,
2472
+ className
2473
+ }) => {
2474
+ useEffect19(() => {
2475
+ if (rippleStyleInjected) return;
2476
+ rippleStyleInjected = true;
2477
+ const style = document.createElement("style");
2478
+ style.textContent = `
2479
+ @keyframes uixy-ripple {
2480
+ 0% { transform: translate(-50%, -50%) scale(0.5); opacity: 1; }
2481
+ 100% { transform: translate(-50%, -50%) scale(4); opacity: 0; }
2482
+ }
2483
+ `;
2484
+ document.head.appendChild(style);
2485
+ }, []);
2486
+ const rings = Array.from({ length: count }, (_, i) => ({
2487
+ key: i,
2488
+ style: {
2489
+ position: "absolute",
2490
+ left: "50%",
2491
+ top: "50%",
2492
+ width: "200px",
2493
+ height: "200px",
2494
+ borderRadius: "50%",
2495
+ border: `1.5px solid ${color}`,
2496
+ boxShadow: `0 0 30px 2px ${color}`,
2497
+ animation: `uixy-ripple ${duration}s ease-out infinite`,
2498
+ animationDelay: `${i * duration / count}s`,
2499
+ pointerEvents: "none"
2500
+ }
2501
+ }));
2502
+ return /* @__PURE__ */ jsx26(
2503
+ "div",
2504
+ {
2505
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none",
2506
+ style: { overflow: "hidden", position: "relative" },
2507
+ children: rings.map((r) => /* @__PURE__ */ jsx26("div", { style: r.style }, r.key))
2508
+ }
2509
+ );
2510
+ };
2511
+ RippleBackground.displayName = "RippleBackground";
2512
+
2513
+ // src/components/Background/DotPatternBackground.tsx
2514
+ import { useEffect as useEffect20, useRef as useRef18 } from "react";
2515
+ import { jsx as jsx27 } from "react/jsx-runtime";
2516
+ var DotPatternBackground = ({
2517
+ spacing = 24,
2518
+ radius = 1.2,
2519
+ color = "rgba(161, 161, 170, 0.25)",
2520
+ glow = false,
2521
+ glowColor,
2522
+ mouseReactive = true,
2523
+ mouseRadius = 120,
2524
+ className
2525
+ }) => {
2526
+ const canvasRef = useRef18(null);
2527
+ const mouseRef = useRef18({ x: -9999, y: -9999 });
2528
+ const rafRef = useRef18(0);
2529
+ useEffect20(() => {
2530
+ const canvas = canvasRef.current;
2531
+ if (!canvas) return;
2532
+ const ctx = canvas.getContext("2d");
2533
+ if (!ctx) return;
2534
+ const resize = () => {
2535
+ canvas.width = canvas.offsetWidth;
2536
+ canvas.height = canvas.offsetHeight;
2537
+ };
2538
+ resize();
2539
+ window.addEventListener("resize", resize);
2540
+ const onMouse = (e) => {
2541
+ const rect = canvas.getBoundingClientRect();
2542
+ mouseRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
2543
+ };
2544
+ if (mouseReactive) window.addEventListener("mousemove", onMouse);
2545
+ const cols = Math.ceil(3e3 / spacing);
2546
+ const rows = Math.ceil(2e3 / spacing);
2547
+ const phases = glow ? Array.from({ length: cols * rows }, () => ({
2548
+ offset: Math.random() * Math.PI * 2,
2549
+ speed: 0.5 + Math.random() * 2
2550
+ })) : [];
2551
+ let t = 0;
2552
+ const gc = glowColor || color;
2553
+ const draw = () => {
2554
+ const w = canvas.width;
2555
+ const h = canvas.height;
2556
+ ctx.clearRect(0, 0, w, h);
2557
+ const curCols = Math.ceil(w / spacing) + 1;
2558
+ const curRows = Math.ceil(h / spacing) + 1;
2559
+ const mx = mouseRef.current.x;
2560
+ const my = mouseRef.current.y;
2561
+ for (let r = 0; r < curRows; r++) {
2562
+ for (let c = 0; c < curCols; c++) {
2563
+ const x = c * spacing;
2564
+ const y = r * spacing;
2565
+ let dotRadius = radius;
2566
+ let dotAlpha = 1;
2567
+ if (mouseReactive) {
2568
+ const dx = mx - x;
2569
+ const dy = my - y;
2570
+ const dist = Math.sqrt(dx * dx + dy * dy);
2571
+ if (dist < mouseRadius) {
2572
+ const factor = 1 - dist / mouseRadius;
2573
+ dotRadius = radius + factor * radius * 2.5;
2574
+ dotAlpha = 1;
2575
+ }
2576
+ }
2577
+ if (glow) {
2578
+ const idx = (r * cols + c) % phases.length;
2579
+ if (idx < phases.length) {
2580
+ const p = phases[idx];
2581
+ const pulse = (Math.sin(t * p.speed + p.offset) + 1) / 2;
2582
+ dotRadius += pulse * radius * 1.5;
2583
+ dotAlpha *= 0.4 + pulse * 0.6;
2584
+ }
2585
+ }
2586
+ ctx.beginPath();
2587
+ ctx.arc(x, y, dotRadius, 0, Math.PI * 2);
2588
+ if (glow && dotRadius > radius * 1.5) {
2589
+ ctx.fillStyle = gc;
2590
+ ctx.shadowBlur = 8;
2591
+ ctx.shadowColor = gc;
2592
+ } else {
2593
+ ctx.fillStyle = color;
2594
+ ctx.shadowBlur = 0;
2595
+ }
2596
+ ctx.globalAlpha = dotAlpha;
2597
+ ctx.fill();
2598
+ }
2599
+ }
2600
+ ctx.globalAlpha = 1;
2601
+ ctx.shadowBlur = 0;
2602
+ t += 0.016;
2603
+ rafRef.current = requestAnimationFrame(draw);
2604
+ };
2605
+ draw();
2606
+ return () => {
2607
+ cancelAnimationFrame(rafRef.current);
2608
+ window.removeEventListener("resize", resize);
2609
+ window.removeEventListener("mousemove", onMouse);
2610
+ };
2611
+ }, [spacing, radius, color, glow, glowColor, mouseReactive, mouseRadius]);
2612
+ return /* @__PURE__ */ jsx27(
2613
+ "canvas",
2614
+ {
2615
+ ref: canvasRef,
2616
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
2617
+ style: { display: "block" }
2618
+ }
2619
+ );
2620
+ };
2621
+ DotPatternBackground.displayName = "DotPatternBackground";
2622
+
2623
+ // src/components/Background/RetroGridBackground.tsx
2624
+ import { useEffect as useEffect21, useRef as useRef19 } from "react";
2625
+ import { jsx as jsx28 } from "react/jsx-runtime";
2626
+ function hexToRgba(hex, a) {
2627
+ const h = hex.replace("#", "");
2628
+ return `rgba(${parseInt(h.slice(0, 2), 16)},${parseInt(h.slice(2, 4), 16)},${parseInt(h.slice(4, 6), 16)},${a})`;
2629
+ }
2630
+ var RetroGridBackground = ({
2631
+ cellSize = 50,
2632
+ lineColor = "#8b5cf6",
2633
+ speed = 1,
2634
+ glow = true,
2635
+ verticalLines = 25,
2636
+ horizontalLines = 16,
2637
+ className
2638
+ }) => {
2639
+ const canvasRef = useRef19(null);
2640
+ const rafRef = useRef19(0);
2641
+ useEffect21(() => {
2642
+ const canvas = canvasRef.current;
2643
+ if (!canvas) return;
2644
+ const ctx = canvas.getContext("2d");
2645
+ if (!ctx) return;
2646
+ const resize = () => {
2647
+ canvas.width = canvas.offsetWidth;
2648
+ canvas.height = canvas.offsetHeight;
2649
+ };
2650
+ resize();
2651
+ window.addEventListener("resize", resize);
2652
+ let scrollY = 0;
2653
+ const draw = () => {
2654
+ const w = canvas.width;
2655
+ const h = canvas.height;
2656
+ ctx.clearRect(0, 0, w, h);
2657
+ const horizon = h * 0.35;
2658
+ const groundH = h - horizon;
2659
+ const cx = w / 2;
2660
+ ctx.lineWidth = 1;
2661
+ const half = Math.floor(verticalLines / 2);
2662
+ for (let i = -half; i <= half; i++) {
2663
+ const spread = i / half;
2664
+ const bottomX = cx + spread * w * 1.2;
2665
+ const edgeFade = 1 - Math.abs(spread) * 0.5;
2666
+ ctx.strokeStyle = hexToRgba(lineColor, 0.25 * edgeFade);
2667
+ ctx.beginPath();
2668
+ ctx.moveTo(cx, horizon);
2669
+ ctx.lineTo(bottomX, h);
2670
+ ctx.stroke();
2671
+ }
2672
+ const scrollPhase = scrollY % 1;
2673
+ for (let i = 0; i < horizontalLines + 2; i++) {
2674
+ const rawT = (i - scrollPhase) / horizontalLines;
2675
+ if (rawT < 0 || rawT > 1) continue;
2676
+ const perspT = rawT * rawT;
2677
+ const y = horizon + perspT * groundH;
2678
+ const alpha = 0.08 + rawT * 0.3;
2679
+ const thickness = 0.5 + rawT * 1;
2680
+ const spanFactor = rawT * 1.2;
2681
+ const leftX = cx - w * spanFactor;
2682
+ const rightX = cx + w * spanFactor;
2683
+ ctx.strokeStyle = hexToRgba(lineColor, alpha);
2684
+ ctx.lineWidth = thickness;
2685
+ ctx.beginPath();
2686
+ ctx.moveTo(leftX, y);
2687
+ ctx.lineTo(rightX, y);
2688
+ ctx.stroke();
2689
+ }
2690
+ if (glow) {
2691
+ const grad = ctx.createLinearGradient(0, 0, w, 0);
2692
+ grad.addColorStop(0, "transparent");
2693
+ grad.addColorStop(0.2, hexToRgba(lineColor, 0.4));
2694
+ grad.addColorStop(0.5, hexToRgba(lineColor, 0.9));
2695
+ grad.addColorStop(0.8, hexToRgba(lineColor, 0.4));
2696
+ grad.addColorStop(1, "transparent");
2697
+ ctx.strokeStyle = grad;
2698
+ ctx.lineWidth = 1.5;
2699
+ ctx.shadowBlur = 25;
2700
+ ctx.shadowColor = lineColor;
2701
+ ctx.beginPath();
2702
+ ctx.moveTo(0, horizon);
2703
+ ctx.lineTo(w, horizon);
2704
+ ctx.stroke();
2705
+ ctx.shadowBlur = 0;
2706
+ const vGrad = ctx.createLinearGradient(cx, horizon - 80, cx, horizon + 30);
2707
+ vGrad.addColorStop(0, "transparent");
2708
+ vGrad.addColorStop(0.5, hexToRgba(lineColor, 0.15));
2709
+ vGrad.addColorStop(1, "transparent");
2710
+ ctx.fillStyle = vGrad;
2711
+ ctx.fillRect(cx - 60, horizon - 80, 120, 110);
2712
+ const ambGrad = ctx.createRadialGradient(cx, horizon, 10, cx, horizon, w * 0.5);
2713
+ ambGrad.addColorStop(0, hexToRgba(lineColor, 0.06));
2714
+ ambGrad.addColorStop(1, "transparent");
2715
+ ctx.fillStyle = ambGrad;
2716
+ ctx.fillRect(0, horizon - 100, w, 200);
2717
+ ctx.fillStyle = hexToRgba(lineColor, 0.15);
2718
+ for (let i = 0; i < 30; i++) {
2719
+ const sx = i * 137.5 % w;
2720
+ const sy = i * 97.3 % (horizon - 10);
2721
+ const sr = 0.5 + i % 3 * 0.4;
2722
+ ctx.beginPath();
2723
+ ctx.arc(sx, sy, sr, 0, Math.PI * 2);
2724
+ ctx.fill();
2725
+ }
2726
+ }
2727
+ scrollY += 0.02 * speed;
2728
+ rafRef.current = requestAnimationFrame(draw);
2729
+ };
2730
+ draw();
2731
+ return () => {
2732
+ cancelAnimationFrame(rafRef.current);
2733
+ window.removeEventListener("resize", resize);
2734
+ };
2735
+ }, [cellSize, lineColor, speed, glow, verticalLines, horizontalLines]);
2736
+ return /* @__PURE__ */ jsx28(
2737
+ "canvas",
2738
+ {
2739
+ ref: canvasRef,
2740
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
2741
+ style: { display: "block" }
2742
+ }
2743
+ );
2744
+ };
2745
+ RetroGridBackground.displayName = "RetroGridBackground";
2746
+
2747
+ // src/components/Background/MeteorBackground.tsx
2748
+ import { useEffect as useEffect22, useRef as useRef20 } from "react";
2749
+ import { jsx as jsx29 } from "react/jsx-runtime";
2750
+ var MeteorBackground = ({
2751
+ count = 20,
2752
+ angle = 215,
2753
+ color = "#a1a1aa",
2754
+ tailLength = 80,
2755
+ speed = 1,
2756
+ className
2757
+ }) => {
2758
+ const canvasRef = useRef20(null);
2759
+ const rafRef = useRef20(0);
2760
+ useEffect22(() => {
2761
+ const canvas = canvasRef.current;
2762
+ if (!canvas) return;
2763
+ const ctx = canvas.getContext("2d");
2764
+ if (!ctx) return;
2765
+ const resize = () => {
2766
+ canvas.width = canvas.offsetWidth;
2767
+ canvas.height = canvas.offsetHeight;
2768
+ };
2769
+ resize();
2770
+ window.addEventListener("resize", resize);
2771
+ const rad = angle * Math.PI / 180;
2772
+ const dx = Math.cos(rad);
2773
+ const dy = Math.sin(rad);
2774
+ const spawnMeteor = () => {
2775
+ const w = canvas.width;
2776
+ const h = canvas.height;
2777
+ return {
2778
+ x: Math.random() * (w + 400) - 200,
2779
+ y: -Math.random() * h * 0.5 - 50,
2780
+ speed: (2 + Math.random() * 4) * speed,
2781
+ length: tailLength * (0.5 + Math.random() * 1),
2782
+ opacity: 0.3 + Math.random() * 0.7,
2783
+ width: 0.5 + Math.random() * 1.5
2784
+ };
2785
+ };
2786
+ let meteors = Array.from({ length: count }, () => {
2787
+ const m = spawnMeteor();
2788
+ m.x += dx * Math.random() * canvas.height * 2;
2789
+ m.y += dy * Math.random() * canvas.height * 2;
2790
+ return m;
2791
+ });
2792
+ const draw = () => {
2793
+ const w = canvas.width;
2794
+ const h = canvas.height;
2795
+ ctx.clearRect(0, 0, w, h);
2796
+ for (const m of meteors) {
2797
+ const headX = m.x;
2798
+ const headY = m.y;
2799
+ const tailX = headX - dx * m.length;
2800
+ const tailY = headY - dy * m.length;
2801
+ const grad = ctx.createLinearGradient(tailX, tailY, headX, headY);
2802
+ grad.addColorStop(0, "transparent");
2803
+ grad.addColorStop(0.6, `${color}${Math.round(m.opacity * 100).toString(16).padStart(2, "0")}`);
2804
+ grad.addColorStop(1, color);
2805
+ ctx.beginPath();
2806
+ ctx.moveTo(tailX, tailY);
2807
+ ctx.lineTo(headX, headY);
2808
+ ctx.strokeStyle = grad;
2809
+ ctx.lineWidth = m.width;
2810
+ ctx.lineCap = "round";
2811
+ ctx.globalAlpha = m.opacity;
2812
+ ctx.stroke();
2813
+ ctx.beginPath();
2814
+ ctx.arc(headX, headY, m.width + 0.5, 0, Math.PI * 2);
2815
+ ctx.fillStyle = color;
2816
+ ctx.globalAlpha = m.opacity * 0.8;
2817
+ ctx.shadowBlur = 6;
2818
+ ctx.shadowColor = color;
2819
+ ctx.fill();
2820
+ ctx.shadowBlur = 0;
2821
+ m.x += dx * m.speed;
2822
+ m.y += dy * m.speed;
2823
+ if (m.x < -200 || m.x > w + 200 || m.y > h + 200) {
2824
+ Object.assign(m, spawnMeteor());
2825
+ }
2826
+ }
2827
+ ctx.globalAlpha = 1;
2828
+ rafRef.current = requestAnimationFrame(draw);
2829
+ };
2830
+ draw();
2831
+ return () => {
2832
+ cancelAnimationFrame(rafRef.current);
2833
+ window.removeEventListener("resize", resize);
2834
+ };
2835
+ }, [count, angle, color, tailLength, speed]);
2836
+ return /* @__PURE__ */ jsx29(
2837
+ "canvas",
2838
+ {
2839
+ ref: canvasRef,
2840
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none w-full h-full",
2841
+ style: { display: "block" }
2842
+ }
2843
+ );
2844
+ };
2845
+ MeteorBackground.displayName = "MeteorBackground";
2846
+
2847
+ // src/components/Background/BeamsBackground.tsx
2848
+ import { useEffect as useEffect23 } from "react";
2849
+ import { jsx as jsx30 } from "react/jsx-runtime";
2850
+ var beamsStyleInjected = false;
2851
+ var BeamsBackground = ({
2852
+ count = 8,
2853
+ colors = ["#8b5cf6", "#3b82f6", "#06b6d4", "#ec4899"],
2854
+ speed = 1,
2855
+ opacity = 0.12,
2856
+ beamWidth = 300,
2857
+ className
2858
+ }) => {
2859
+ useEffect23(() => {
2860
+ if (beamsStyleInjected) return;
2861
+ beamsStyleInjected = true;
2862
+ const style = document.createElement("style");
2863
+ style.textContent = `
2864
+ @keyframes uixy-beam-sway {
2865
+ 0%, 100% { transform: rotate(var(--uixy-beam-r0)) scaleY(1); opacity: var(--uixy-beam-o); }
2866
+ 25% { transform: rotate(var(--uixy-beam-r1)) scaleY(1.1); opacity: calc(var(--uixy-beam-o) * 1.3); }
2867
+ 50% { transform: rotate(var(--uixy-beam-r2)) scaleY(0.9); opacity: var(--uixy-beam-o); }
2868
+ 75% { transform: rotate(var(--uixy-beam-r3)) scaleY(1.05); opacity: calc(var(--uixy-beam-o) * 0.8); }
2869
+ }
2870
+ `;
2871
+ document.head.appendChild(style);
2872
+ }, []);
2873
+ const beams = Array.from({ length: count }, (_, i) => {
2874
+ const angle = -30 + i / (count - 1) * 60;
2875
+ const color = colors[i % colors.length];
2876
+ const duration = (12 + Math.random() * 10) / speed;
2877
+ const jitter = (Math.random() - 0.5) * 15;
2878
+ return {
2879
+ key: i,
2880
+ style: {
2881
+ position: "absolute",
2882
+ bottom: "-20%",
2883
+ left: "50%",
2884
+ width: `${beamWidth}px`,
2885
+ height: "160%",
2886
+ marginLeft: `${-beamWidth / 2}px`,
2887
+ transformOrigin: "center bottom",
2888
+ background: `linear-gradient(to top, ${color}00 0%, ${color} 30%, ${color}80 60%, transparent 100%)`,
2889
+ filter: `blur(${40 + Math.random() * 30}px)`,
2890
+ animation: `uixy-beam-sway ${duration}s ease-in-out infinite`,
2891
+ animationDelay: `${-Math.random() * duration}s`,
2892
+ "--uixy-beam-r0": `${angle + jitter}deg`,
2893
+ "--uixy-beam-r1": `${angle + jitter + 5}deg`,
2894
+ "--uixy-beam-r2": `${angle + jitter - 4}deg`,
2895
+ "--uixy-beam-r3": `${angle + jitter + 3}deg`,
2896
+ "--uixy-beam-o": String(opacity),
2897
+ pointerEvents: "none",
2898
+ mixBlendMode: "screen"
2899
+ }
2900
+ };
2901
+ });
2902
+ return /* @__PURE__ */ jsx30(
2903
+ "div",
2904
+ {
2905
+ className: className != null ? className : "fixed inset-0 -z-10 pointer-events-none",
2906
+ style: { overflow: "hidden", position: "relative" },
2907
+ children: beams.map((b) => /* @__PURE__ */ jsx30("div", { style: b.style }, b.key))
2908
+ }
2909
+ );
2910
+ };
2911
+ BeamsBackground.displayName = "BeamsBackground";
2912
+
2913
+ // src/components/Other/Badge.tsx
2914
+ import { forwardRef as forwardRef2, useEffect as useEffect24 } from "react";
2915
+ import { jsx as jsx31, jsxs as jsxs12 } from "react/jsx-runtime";
2916
+ var badgeStyleInjected = false;
2917
+ var Badge = forwardRef2(
2918
+ ({ variant = "default", size = "md", dot, dotColor, pill = true, icon, className, children, ...props }, ref) => {
2919
+ useEffect24(() => {
2920
+ if (!badgeStyleInjected) {
2921
+ badgeStyleInjected = true;
2922
+ const style = document.createElement("style");
2923
+ style.textContent = `
2924
+ @keyframes uixy-badge-shimmer {
2925
+ 0% { background-position: -200% center; }
2926
+ 100% { background-position: 200% center; }
2927
+ }
2928
+ `;
2929
+ document.head.appendChild(style);
2930
+ }
2931
+ }, []);
2932
+ const variants = {
2933
+ default: "bg-violet-500/15 text-violet-400 border-violet-500/20",
2934
+ secondary: "bg-zinc-500/15 text-zinc-400 border-zinc-500/20",
2935
+ outline: "bg-transparent text-zinc-300 border-zinc-600",
2936
+ success: "bg-emerald-500/15 text-emerald-400 border-emerald-500/20",
2937
+ warning: "bg-amber-500/15 text-amber-400 border-amber-500/20",
2938
+ destructive: "bg-red-500/15 text-red-400 border-red-500/20",
2939
+ glow: "bg-violet-500/15 text-violet-400 border-violet-500/30 shadow-[0_0_8px_rgba(139,92,246,0.3)]",
2940
+ gradient: "bg-gradient-to-r from-violet-500/20 to-indigo-500/20 text-violet-300 border-violet-500/20",
2941
+ glass: "bg-white/5 backdrop-blur-md text-zinc-200 border-white/10",
2942
+ neon: "bg-transparent text-cyan-400 border-cyan-400/50 shadow-[0_0_6px_rgba(34,211,238,0.4),inset_0_0_6px_rgba(34,211,238,0.1)]",
2943
+ shimmer: "text-zinc-200 border-zinc-700",
2944
+ soft: "bg-violet-500/8 text-violet-300 border-transparent",
2945
+ info: "bg-blue-500/15 text-blue-400 border-blue-500/20",
2946
+ premium: "bg-gradient-to-r from-amber-500/20 via-yellow-400/20 to-amber-500/20 text-amber-300 border-amber-500/25",
2947
+ new: "bg-gradient-to-r from-emerald-500/20 to-teal-500/20 text-emerald-300 border-emerald-500/20",
2948
+ beta: "bg-gradient-to-r from-indigo-500/20 to-purple-500/20 text-indigo-300 border-indigo-500/20"
2949
+ };
2950
+ const sizes = {
2951
+ sm: "text-[10px] px-1.5 py-0.5 gap-1",
2952
+ md: "text-xs px-2.5 py-0.5 gap-1.5",
2953
+ lg: "text-sm px-3 py-1 gap-1.5"
2954
+ };
2955
+ const dotColors = {
2956
+ default: "bg-violet-400",
2957
+ secondary: "bg-zinc-400",
2958
+ outline: "bg-zinc-400",
2959
+ success: "bg-emerald-400",
2960
+ warning: "bg-amber-400",
2961
+ destructive: "bg-red-400",
2962
+ glow: "bg-violet-400",
2963
+ gradient: "bg-violet-400",
2964
+ glass: "bg-zinc-300",
2965
+ neon: "bg-cyan-400",
2966
+ shimmer: "bg-zinc-400",
2967
+ soft: "bg-violet-400",
2968
+ info: "bg-blue-400",
2969
+ premium: "bg-amber-400",
2970
+ new: "bg-emerald-400",
2971
+ beta: "bg-indigo-400"
2972
+ };
2973
+ const shimmerStyle = variant === "shimmer" ? {
2974
+ backgroundImage: "linear-gradient(90deg, transparent 25%, rgba(255,255,255,0.08) 50%, transparent 75%)",
2975
+ backgroundSize: "200% 100%",
2976
+ animation: "uixy-badge-shimmer 2s ease-in-out infinite"
2977
+ } : {};
2978
+ return /* @__PURE__ */ jsxs12(
2979
+ "span",
2980
+ {
2981
+ ref,
2982
+ className: cn(
2983
+ "inline-flex items-center font-medium border whitespace-nowrap transition-colors",
2984
+ pill ? "rounded-full" : "rounded-md",
2985
+ variants[variant],
2986
+ sizes[size],
2987
+ className
2988
+ ),
2989
+ style: shimmerStyle,
2990
+ ...props,
2991
+ children: [
2992
+ dot && /* @__PURE__ */ jsx31(
2993
+ "span",
2994
+ {
2995
+ className: cn("w-1.5 h-1.5 rounded-full animate-pulse shrink-0", dotColor ? "" : dotColors[variant]),
2996
+ style: dotColor ? { backgroundColor: dotColor } : void 0
2997
+ }
2998
+ ),
2999
+ icon && /* @__PURE__ */ jsx31("span", { className: "shrink-0 [&>svg]:w-3 [&>svg]:h-3", children: icon }),
3000
+ children
3001
+ ]
3002
+ }
3003
+ );
3004
+ }
3005
+ );
3006
+ Badge.displayName = "Badge";
3007
+
3008
+ // src/components/Other/Tooltip.tsx
3009
+ import { useState as useState10, useRef as useRef21, useEffect as useEffect25, useCallback as useCallback6 } from "react";
3010
+ import { jsx as jsx32, jsxs as jsxs13 } from "react/jsx-runtime";
3011
+ var tooltipStyleInjected = false;
3012
+ var Tooltip = ({
3013
+ content,
3014
+ side = "top",
3015
+ variant = "default",
3016
+ delay = 300,
3017
+ arrow = true,
3018
+ children,
3019
+ className
3020
+ }) => {
3021
+ const [state, setState] = useState10("hidden");
3022
+ const timerRef = useRef21();
3023
+ useEffect25(() => {
3024
+ if (!tooltipStyleInjected) {
3025
+ tooltipStyleInjected = true;
3026
+ const style = document.createElement("style");
3027
+ style.textContent = `
3028
+ .uixy-tt { pointer-events: none; }
3029
+ .uixy-tt[data-state="entering"] { opacity: 0; transform: translateY(var(--uixy-tt-dy,0)) translateX(var(--uixy-tt-dx,0)) scale(0.95); }
3030
+ .uixy-tt[data-state="visible"] { opacity: 1; transform: translateY(0) translateX(0) scale(1); transition: opacity .15s ease-out, transform .15s ease-out; }
3031
+ .uixy-tt[data-state="leaving"] { opacity: 0; transform: scale(0.97); transition: opacity .1s ease-in, transform .1s ease-in; }
3032
+ `;
3033
+ document.head.appendChild(style);
3034
+ }
3035
+ }, []);
3036
+ const show = useCallback6(() => {
3037
+ clearTimeout(timerRef.current);
3038
+ timerRef.current = setTimeout(() => {
3039
+ setState("entering");
3040
+ requestAnimationFrame(() => {
3041
+ requestAnimationFrame(() => setState("visible"));
3042
+ });
3043
+ }, delay);
3044
+ }, [delay]);
3045
+ const hide = useCallback6(() => {
3046
+ clearTimeout(timerRef.current);
3047
+ setState("leaving");
3048
+ timerRef.current = setTimeout(() => setState("hidden"), 120);
3049
+ }, []);
3050
+ useEffect25(() => () => clearTimeout(timerRef.current), []);
3051
+ const variants = {
3052
+ default: "bg-zinc-800 text-zinc-100 border border-zinc-700",
3053
+ dark: "bg-zinc-950 text-zinc-100 border border-zinc-800",
3054
+ light: "bg-zinc-100 text-zinc-900 border border-zinc-200",
3055
+ gradient: "bg-gradient-to-r from-violet-600 to-indigo-600 text-white",
3056
+ glass: "bg-white/10 backdrop-blur-md text-zinc-100 border border-white/20",
3057
+ outlined: "bg-transparent text-zinc-300 border-2 border-zinc-500",
3058
+ neon: "bg-zinc-950 text-violet-300 border border-violet-500/50 shadow-[0_0_12px_rgba(139,92,246,0.3)]",
3059
+ success: "bg-emerald-950 text-emerald-200 border border-emerald-700/50",
3060
+ warning: "bg-amber-950 text-amber-200 border border-amber-700/50",
3061
+ error: "bg-red-950 text-red-200 border border-red-700/50"
3062
+ };
3063
+ const arrowBg = {
3064
+ default: "bg-zinc-800 border-zinc-700",
3065
+ dark: "bg-zinc-950 border-zinc-800",
3066
+ light: "bg-zinc-100 border-zinc-200",
3067
+ gradient: "bg-violet-600 border-violet-600",
3068
+ glass: "bg-white/10 border-white/20",
3069
+ outlined: "bg-zinc-950 border-zinc-500",
3070
+ neon: "bg-zinc-950 border-violet-500/50",
3071
+ success: "bg-emerald-950 border-emerald-700/50",
3072
+ warning: "bg-amber-950 border-amber-700/50",
3073
+ error: "bg-red-950 border-red-700/50"
3074
+ };
3075
+ const slideVars = {
3076
+ top: { "--uixy-tt-dy": "4px", "--uixy-tt-dx": "0" },
3077
+ bottom: { "--uixy-tt-dy": "-4px", "--uixy-tt-dx": "0" },
3078
+ left: { "--uixy-tt-dx": "4px", "--uixy-tt-dy": "0" },
3079
+ right: { "--uixy-tt-dx": "-4px", "--uixy-tt-dy": "0" }
3080
+ };
3081
+ const positionStyle = {
3082
+ top: { bottom: "100%", left: "50%", transform: "translateX(-50%)", marginBottom: 8 },
3083
+ bottom: { top: "100%", left: "50%", transform: "translateX(-50%)", marginTop: 8 },
3084
+ left: { right: "100%", top: "50%", transform: "translateY(-50%)", marginRight: 8 },
3085
+ right: { left: "100%", top: "50%", transform: "translateY(-50%)", marginLeft: 8 }
3086
+ };
3087
+ const arrowSide = {
3088
+ top: { bottom: -4, left: "50%", marginLeft: -4 },
3089
+ bottom: { top: -4, left: "50%", marginLeft: -4 },
3090
+ left: { right: -4, top: "50%", marginTop: -4 },
3091
+ right: { left: -4, top: "50%", marginTop: -4 }
3092
+ };
3093
+ const arrowBorderSide = {
3094
+ top: "border-b border-r",
3095
+ bottom: "border-t border-l",
3096
+ left: "border-t border-r",
3097
+ right: "border-b border-l"
3098
+ };
3099
+ if (state === "hidden") {
3100
+ return /* @__PURE__ */ jsx32("div", { className: "relative inline-flex", onMouseEnter: show, onMouseLeave: hide, onFocus: show, onBlur: hide, children });
3101
+ }
3102
+ return /* @__PURE__ */ jsxs13("div", { className: "relative inline-flex", onMouseEnter: show, onMouseLeave: hide, onFocus: show, onBlur: hide, children: [
3103
+ children,
3104
+ /* @__PURE__ */ jsxs13(
3105
+ "div",
3106
+ {
3107
+ className: cn(
3108
+ "uixy-tt absolute z-50 px-3 py-1.5 text-xs font-medium rounded-lg whitespace-nowrap shadow-lg",
3109
+ variants[variant],
3110
+ className
3111
+ ),
3112
+ style: { ...positionStyle[side], ...slideVars[side] },
3113
+ "data-state": state,
3114
+ role: "tooltip",
3115
+ children: [
3116
+ content,
3117
+ arrow && /* @__PURE__ */ jsx32(
3118
+ "span",
3119
+ {
3120
+ className: cn("absolute w-2 h-2 rotate-45", arrowBorderSide[side], arrowBg[variant]),
3121
+ style: arrowSide[side]
3122
+ }
3123
+ )
3124
+ ]
3125
+ }
3126
+ )
3127
+ ] });
3128
+ };
3129
+ Tooltip.displayName = "Tooltip";
3130
+
3131
+ // src/components/Other/Toggle.tsx
3132
+ import { forwardRef as forwardRef3, useEffect as useEffect26 } from "react";
3133
+ import { jsx as jsx33, jsxs as jsxs14 } from "react/jsx-runtime";
3134
+ var toggleStyleInjected = false;
3135
+ var Toggle = forwardRef3(
3136
+ ({ size = "md", variant = "default", color, label, className, checked, disabled, ...props }, ref) => {
3137
+ useEffect26(() => {
3138
+ if (!toggleStyleInjected) {
3139
+ toggleStyleInjected = true;
3140
+ const style = document.createElement("style");
3141
+ style.textContent = `
3142
+ .uixy-toggle-thumb {
3143
+ transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.2s ease;
3144
+ }
3145
+ .uixy-toggle-track {
3146
+ transition: background-color 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
3147
+ }
3148
+ `;
3149
+ document.head.appendChild(style);
3150
+ }
3151
+ }, []);
3152
+ const sizes = {
3153
+ sm: { trackW: 32, trackH: 18, thumb: 14, pad: 2 },
3154
+ md: { trackW: 44, trackH: 24, thumb: 18, pad: 3 },
3155
+ lg: { trackW: 56, trackH: 30, thumb: 24, pad: 3 }
3156
+ };
3157
+ const s = sizes[size];
3158
+ const translatePx = s.trackW - s.thumb - s.pad * 2;
3159
+ const activeColor = color || "#8b5cf6";
3160
+ const trackStyles = { width: s.trackW, height: s.trackH };
3161
+ const thumbStyles = {
3162
+ width: s.thumb,
3163
+ height: s.thumb,
3164
+ transform: checked ? `translateX(${translatePx}px)` : "translateX(0px)"
3165
+ };
3166
+ let trackClasses = "uixy-toggle-track rounded-full relative cursor-pointer";
3167
+ let thumbClasses = "uixy-toggle-thumb absolute rounded-full shadow-sm";
3168
+ if (variant === "default" || variant === "ios") {
3169
+ trackStyles.backgroundColor = checked ? activeColor : "rgb(63, 63, 70)";
3170
+ thumbStyles.backgroundColor = "white";
3171
+ thumbStyles.top = s.pad;
3172
+ thumbStyles.left = s.pad;
3173
+ if (variant === "ios" && checked) {
3174
+ thumbStyles.boxShadow = "0 2px 8px rgba(0,0,0,0.2)";
3175
+ }
3176
+ } else if (variant === "material") {
3177
+ trackStyles.backgroundColor = checked ? `${activeColor}60` : "rgb(82, 82, 91)";
3178
+ thumbStyles.backgroundColor = checked ? activeColor : "rgb(161, 161, 170)";
3179
+ thumbStyles.top = s.pad - 1;
3180
+ thumbStyles.left = s.pad;
3181
+ thumbStyles.width = s.thumb + 2;
3182
+ thumbStyles.height = s.thumb + 2;
3183
+ thumbStyles.boxShadow = "0 2px 6px rgba(0,0,0,0.3)";
3184
+ } else if (variant === "outline") {
3185
+ trackStyles.backgroundColor = "transparent";
3186
+ trackStyles.border = `2px solid ${checked ? activeColor : "rgb(113, 113, 122)"}`;
3187
+ thumbStyles.backgroundColor = checked ? activeColor : "rgb(161, 161, 170)";
3188
+ thumbStyles.top = s.pad;
3189
+ thumbStyles.left = s.pad;
3190
+ } else if (variant === "glow") {
3191
+ trackStyles.backgroundColor = checked ? activeColor : "rgb(63, 63, 70)";
3192
+ if (checked) {
3193
+ trackStyles.boxShadow = `0 0 12px ${activeColor}60, 0 0 24px ${activeColor}30`;
3194
+ }
3195
+ thumbStyles.backgroundColor = "white";
3196
+ thumbStyles.top = s.pad;
3197
+ thumbStyles.left = s.pad;
3198
+ } else if (variant === "pill") {
3199
+ trackStyles.backgroundColor = checked ? activeColor : "rgb(63, 63, 70)";
3200
+ trackClasses += " " + (size === "sm" ? "!rounded-sm" : size === "md" ? "!rounded-md" : "!rounded-lg");
3201
+ thumbClasses = thumbClasses.replace("rounded-full", size === "sm" ? "rounded-[2px]" : size === "md" ? "rounded-[4px]" : "rounded-[6px]");
3202
+ thumbStyles.backgroundColor = "white";
3203
+ thumbStyles.top = s.pad;
3204
+ thumbStyles.left = s.pad;
3205
+ } else if (variant === "slim") {
3206
+ trackStyles.height = Math.round(s.trackH * 0.55);
3207
+ trackStyles.backgroundColor = checked ? `${activeColor}60` : "rgb(63, 63, 70)";
3208
+ trackStyles.borderRadius = s.trackH;
3209
+ thumbStyles.backgroundColor = checked ? activeColor : "rgb(161, 161, 170)";
3210
+ thumbStyles.top = -Math.round((s.thumb - Math.round(s.trackH * 0.55)) / 2);
3211
+ thumbStyles.left = s.pad;
3212
+ thumbStyles.boxShadow = "0 1px 4px rgba(0,0,0,0.3)";
3213
+ } else if (variant === "labeled") {
3214
+ trackStyles.backgroundColor = checked ? activeColor : "rgb(63, 63, 70)";
3215
+ thumbStyles.backgroundColor = "white";
3216
+ thumbStyles.top = s.pad;
3217
+ thumbStyles.left = s.pad;
3218
+ }
3219
+ return /* @__PURE__ */ jsxs14("label", { className: cn("inline-flex items-center gap-2.5 cursor-pointer select-none", disabled && "opacity-50 cursor-not-allowed", className), children: [
3220
+ /* @__PURE__ */ jsxs14("div", { className: "relative", children: [
3221
+ /* @__PURE__ */ jsx33("input", { ref, type: "checkbox", className: "sr-only peer", checked, disabled, ...props }),
3222
+ /* @__PURE__ */ jsx33("div", { className: trackClasses, style: trackStyles, children: variant === "labeled" && /* @__PURE__ */ jsx33(
3223
+ "span",
3224
+ {
3225
+ className: "absolute inset-0 flex items-center text-white font-bold select-none",
3226
+ style: { fontSize: Math.round(s.thumb * 0.45), paddingLeft: s.pad + 3, paddingRight: s.pad + 3, justifyContent: checked ? "flex-start" : "flex-end" },
3227
+ children: checked ? "ON" : "OFF"
3228
+ }
3229
+ ) }),
3230
+ /* @__PURE__ */ jsx33("div", { className: thumbClasses, style: thumbStyles })
3231
+ ] }),
3232
+ label && /* @__PURE__ */ jsx33("span", { className: "text-sm text-zinc-300", children: label })
3233
+ ] });
3234
+ }
3235
+ );
3236
+ Toggle.displayName = "Toggle";
3237
+
3238
+ // src/components/Other/Separator.tsx
3239
+ import { forwardRef as forwardRef4 } from "react";
3240
+ import { jsx as jsx34, jsxs as jsxs15 } from "react/jsx-runtime";
3241
+ var Separator = forwardRef4(
3242
+ ({ orientation = "horizontal", variant = "default", label, className, ...props }, ref) => {
3243
+ const isH = orientation === "horizontal";
3244
+ if (variant === "gradient") {
3245
+ return /* @__PURE__ */ jsx34(
3246
+ "div",
3247
+ {
3248
+ ref,
3249
+ role: "separator",
3250
+ className: cn(
3251
+ isH ? "w-full h-px" : "h-full w-px",
3252
+ className
3253
+ ),
3254
+ style: {
3255
+ background: isH ? "linear-gradient(to right, transparent, rgba(113,113,122,0.5), transparent)" : "linear-gradient(to bottom, transparent, rgba(113,113,122,0.5), transparent)"
3256
+ },
3257
+ ...props
3258
+ }
3259
+ );
3260
+ }
3261
+ const styles = {
3262
+ default: "border-solid",
3263
+ dashed: "border-dashed",
3264
+ dotted: "border-dotted"
3265
+ };
3266
+ if (label && isH) {
3267
+ return /* @__PURE__ */ jsxs15("div", { ref, role: "separator", className: cn("flex items-center gap-3", className), ...props, children: [
3268
+ /* @__PURE__ */ jsx34("div", { className: cn("flex-1 border-t border-zinc-800", styles[variant]) }),
3269
+ /* @__PURE__ */ jsx34("span", { className: "text-xs text-zinc-500 whitespace-nowrap", children: label }),
3270
+ /* @__PURE__ */ jsx34("div", { className: cn("flex-1 border-t border-zinc-800", styles[variant]) })
3271
+ ] });
3272
+ }
3273
+ return /* @__PURE__ */ jsx34(
3274
+ "div",
3275
+ {
3276
+ ref,
3277
+ role: "separator",
3278
+ className: cn(
3279
+ isH ? cn("w-full border-t border-zinc-800", styles[variant]) : cn("h-full border-l border-zinc-800", styles[variant]),
3280
+ className
3281
+ ),
3282
+ ...props
3283
+ }
3284
+ );
3285
+ }
3286
+ );
3287
+ Separator.displayName = "Separator";
3288
+
3289
+ // src/components/Other/Skeleton.tsx
3290
+ import { useEffect as useEffect27 } from "react";
3291
+ import { jsx as jsx35 } from "react/jsx-runtime";
3292
+ var skeletonStyleInjected = false;
3293
+ var Skeleton = ({
3294
+ variant = "rectangle",
3295
+ width,
3296
+ height,
3297
+ animation = "shimmer",
3298
+ className,
3299
+ ...props
3300
+ }) => {
3301
+ useEffect27(() => {
3302
+ if (!skeletonStyleInjected) {
3303
+ skeletonStyleInjected = true;
3304
+ const style = document.createElement("style");
3305
+ style.textContent = `
3306
+ @keyframes uixy-skeleton-shimmer {
3307
+ 0% { background-position: -200% 0; }
3308
+ 100% { background-position: 200% 0; }
3309
+ }
3310
+ `;
3311
+ document.head.appendChild(style);
3312
+ }
3313
+ }, []);
3314
+ const shapes = {
3315
+ rectangle: "rounded-md",
3316
+ circle: "rounded-full",
3317
+ text: "rounded h-4"
3318
+ };
3319
+ const animStyles = {
3320
+ pulse: {},
3321
+ shimmer: {
3322
+ background: "linear-gradient(90deg, rgba(63,63,70,0.4) 25%, rgba(82,82,91,0.6) 50%, rgba(63,63,70,0.4) 75%)",
3323
+ backgroundSize: "400% 100%",
3324
+ animation: "uixy-skeleton-shimmer 1.5s ease-in-out infinite"
3325
+ },
3326
+ none: {}
3327
+ };
3328
+ return /* @__PURE__ */ jsx35(
3329
+ "div",
3330
+ {
3331
+ className: cn(
3332
+ shapes[variant],
3333
+ animation === "pulse" && "animate-pulse bg-zinc-800",
3334
+ animation === "none" && "bg-zinc-800",
3335
+ className
3336
+ ),
3337
+ style: {
3338
+ width: width != null ? width : variant === "circle" ? 40 : "100%",
3339
+ height: height != null ? height : variant === "circle" ? 40 : variant === "text" ? 16 : 20,
3340
+ ...animation === "shimmer" ? animStyles.shimmer : {}
3341
+ },
3342
+ ...props
3343
+ }
3344
+ );
3345
+ };
3346
+ Skeleton.displayName = "Skeleton";
3347
+
3348
+ // src/components/Other/Progress.tsx
3349
+ import { forwardRef as forwardRef5, useEffect as useEffect28 } from "react";
3350
+ import { jsx as jsx36, jsxs as jsxs16 } from "react/jsx-runtime";
3351
+ var progressStyleInjected = false;
3352
+ var Progress = forwardRef5(
3353
+ ({ value = 0, variant = "default", size = "md", showValue, color, className, ...props }, ref) => {
3354
+ useEffect28(() => {
3355
+ if (!progressStyleInjected) {
3356
+ progressStyleInjected = true;
3357
+ const style = document.createElement("style");
3358
+ style.textContent = `
3359
+ @keyframes uixy-progress-stripes {
3360
+ 0% { background-position: 1rem 0; }
3361
+ 100% { background-position: 0 0; }
3362
+ }
3363
+ `;
3364
+ document.head.appendChild(style);
3365
+ }
3366
+ }, []);
3367
+ const clamped = Math.min(100, Math.max(0, value));
3368
+ const sizes = {
3369
+ sm: "h-1.5",
3370
+ md: "h-2.5",
3371
+ lg: "h-4"
3372
+ };
3373
+ const barBase = "h-full rounded-full transition-all duration-500 ease-out";
3374
+ const barStyles = {
3375
+ default: color || "#8b5cf6",
3376
+ gradient: "",
3377
+ striped: color || "#8b5cf6",
3378
+ glow: color || "#8b5cf6"
3379
+ };
3380
+ const barCss = {
3381
+ width: `${clamped}%`
3382
+ };
3383
+ if (variant === "gradient") {
3384
+ barCss.background = "linear-gradient(90deg, #8b5cf6, #3b82f6, #06b6d4)";
3385
+ } else if (variant === "striped") {
3386
+ barCss.backgroundColor = barStyles.striped;
3387
+ barCss.backgroundImage = "linear-gradient(45deg, rgba(255,255,255,0.1) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0.1) 75%, transparent 75%, transparent)";
3388
+ barCss.backgroundSize = "1rem 1rem";
3389
+ barCss.animation = "uixy-progress-stripes 0.6s linear infinite";
3390
+ } else if (variant === "glow") {
3391
+ barCss.backgroundColor = barStyles.glow;
3392
+ barCss.boxShadow = `0 0 8px ${color || "#8b5cf6"}80, 0 0 20px ${color || "#8b5cf6"}40`;
3393
+ } else {
3394
+ barCss.backgroundColor = barStyles.default;
3395
+ }
3396
+ return /* @__PURE__ */ jsxs16("div", { ref, className: cn("relative w-full", className), ...props, children: [
3397
+ /* @__PURE__ */ jsx36("div", { className: cn("w-full rounded-full bg-zinc-800 overflow-hidden", sizes[size]), children: /* @__PURE__ */ jsx36("div", { className: barBase, style: barCss }) }),
3398
+ showValue && size === "lg" && /* @__PURE__ */ jsxs16("span", { className: "absolute right-2 top-1/2 -translate-y-1/2 text-[10px] font-medium text-white", children: [
3399
+ Math.round(clamped),
3400
+ "%"
3401
+ ] }),
3402
+ showValue && size !== "lg" && /* @__PURE__ */ jsxs16("span", { className: "text-[10px] text-zinc-400 mt-1 block text-right", children: [
3403
+ Math.round(clamped),
3404
+ "%"
3405
+ ] })
3406
+ ] });
3407
+ }
3408
+ );
3409
+ Progress.displayName = "Progress";
3410
+
3411
+ // src/components/Other/Avatar.tsx
3412
+ import { forwardRef as forwardRef6, useState as useState11 } from "react";
3413
+ import { jsx as jsx37, jsxs as jsxs17 } from "react/jsx-runtime";
3414
+ var Avatar = forwardRef6(
3415
+ ({ src, alt, fallback, size = 40, shape = "circle", status, ring, ringColor, className, ...props }, ref) => {
3416
+ const [imgError, setImgError] = useState11(false);
3417
+ const statusColors = {
3418
+ online: "bg-emerald-500",
3419
+ offline: "bg-zinc-500",
3420
+ busy: "bg-red-500",
3421
+ away: "bg-amber-500"
3422
+ };
3423
+ const showFallback = !src || imgError;
3424
+ const dotSize = Math.max(10, Math.round(size * 0.28));
3425
+ const borderW = Math.max(2, Math.round(size * 0.06));
3426
+ const angle = 45 * (Math.PI / 180);
3427
+ const radius = size / 2;
3428
+ const dotX = radius + radius * Math.cos(angle) - dotSize / 2;
3429
+ const dotY = radius + radius * Math.sin(angle) - dotSize / 2;
3430
+ return /* @__PURE__ */ jsxs17(
3431
+ "div",
3432
+ {
3433
+ ref,
3434
+ className: cn("relative inline-flex shrink-0", className),
3435
+ style: { width: size, height: size },
3436
+ ...props,
3437
+ children: [
3438
+ /* @__PURE__ */ jsx37(
3439
+ "div",
3440
+ {
3441
+ className: cn(
3442
+ "flex items-center justify-center bg-zinc-800 overflow-hidden",
3443
+ shape === "circle" ? "rounded-full" : "rounded-lg",
3444
+ ring && "ring-2 ring-offset-2 ring-offset-zinc-950"
3445
+ ),
3446
+ style: {
3447
+ width: size,
3448
+ height: size,
3449
+ ...ring ? { "--tw-ring-color": ringColor || "#8b5cf6" } : {}
3450
+ },
3451
+ children: !showFallback ? /* @__PURE__ */ jsx37(
3452
+ "img",
3453
+ {
3454
+ src,
3455
+ alt: alt || "",
3456
+ onError: () => setImgError(true),
3457
+ className: "w-full h-full object-cover"
3458
+ }
3459
+ ) : /* @__PURE__ */ jsx37("span", { className: "font-medium text-zinc-300 select-none", style: { fontSize: size * 0.38 }, children: fallback || "?" })
3460
+ }
3461
+ ),
3462
+ status && /* @__PURE__ */ jsx37(
3463
+ "span",
3464
+ {
3465
+ className: cn("absolute rounded-full", statusColors[status]),
3466
+ style: {
3467
+ width: dotSize,
3468
+ height: dotSize,
3469
+ left: shape === "circle" ? dotX : void 0,
3470
+ top: shape === "circle" ? dotY : void 0,
3471
+ bottom: shape !== "circle" ? -dotSize / 4 : void 0,
3472
+ right: shape !== "circle" ? -dotSize / 4 : void 0,
3473
+ border: `${borderW}px solid #09090b`,
3474
+ zIndex: 1
3475
+ }
3476
+ }
3477
+ )
3478
+ ]
3479
+ }
3480
+ );
3481
+ }
3482
+ );
3483
+ Avatar.displayName = "Avatar";
3484
+
3485
+ // src/components/Other/Marquee.tsx
3486
+ import { useEffect as useEffect29 } from "react";
3487
+ import { jsx as jsx38 } from "react/jsx-runtime";
3488
+ var marqueeStyleInjected = false;
3489
+ var Marquee = ({
3490
+ children,
3491
+ speed = 30,
3492
+ direction = "left",
3493
+ pauseOnHover = true,
3494
+ fade = true,
3495
+ repeat = 4,
3496
+ className
3497
+ }) => {
3498
+ useEffect29(() => {
3499
+ if (!marqueeStyleInjected) {
3500
+ marqueeStyleInjected = true;
3501
+ const style = document.createElement("style");
3502
+ style.textContent = `
3503
+ @keyframes uixy-marquee-h { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }
3504
+ @keyframes uixy-marquee-v { 0% { transform: translateY(0); } 100% { transform: translateY(-50%); } }
3505
+ `;
3506
+ document.head.appendChild(style);
3507
+ }
3508
+ }, []);
3509
+ const isVertical = direction === "up" || direction === "down";
3510
+ const isReverse = direction === "right" || direction === "down";
3511
+ const animName = isVertical ? "uixy-marquee-v" : "uixy-marquee-h";
3512
+ const animDir = isReverse ? "reverse" : "normal";
3513
+ const fadeDir = isVertical ? "to bottom" : "to right";
3514
+ return /* @__PURE__ */ jsx38(
3515
+ "div",
3516
+ {
3517
+ className: cn("overflow-hidden relative", className),
3518
+ style: fade ? {
3519
+ maskImage: `linear-gradient(${fadeDir}, transparent 0%, black 10%, black 90%, transparent 100%)`,
3520
+ WebkitMaskImage: `linear-gradient(${fadeDir}, transparent 0%, black 10%, black 90%, transparent 100%)`
3521
+ } : void 0,
3522
+ children: /* @__PURE__ */ jsx38(
3523
+ "div",
3524
+ {
3525
+ className: cn(
3526
+ isVertical ? "flex flex-col" : "flex",
3527
+ pauseOnHover && "hover:[animation-play-state:paused]"
3528
+ ),
3529
+ style: {
3530
+ animation: `${animName} ${speed}s linear infinite`,
3531
+ animationDirection: animDir
3532
+ },
3533
+ children: Array.from({ length: repeat }, (_, i) => /* @__PURE__ */ jsx38("div", { className: cn(isVertical ? "flex flex-col" : "flex", "shrink-0"), children }, i))
3534
+ }
3535
+ )
3536
+ }
3537
+ );
3538
+ };
3539
+ Marquee.displayName = "Marquee";
3540
+ export {
3541
+ AuroraBackground,
3542
+ Avatar,
3543
+ Badge,
3544
+ BeamsBackground,
3545
+ BlurText,
3546
+ BokehBackground,
3547
+ Button,
3548
+ Card,
3549
+ CardContent,
3550
+ CardDescription,
3551
+ CardFooter,
3552
+ CardHeader,
3553
+ CardTitle,
3554
+ CounterText,
3555
+ DotPatternBackground,
3556
+ GlitchText,
3557
+ GradientMeshBackground,
3558
+ GradientText,
3559
+ GridBackground,
3560
+ HighlightText,
3561
+ Input,
3562
+ Label,
3563
+ Marquee,
3564
+ MatrixRainBackground,
3565
+ MediaText,
3566
+ MeteorBackground,
3567
+ OTPInput,
3568
+ ParticleBackground,
3569
+ PasswordInput,
3570
+ PixelBackground,
3571
+ Progress,
3572
+ RetroGridBackground,
3573
+ RippleBackground,
3574
+ SearchInput,
3575
+ Separator,
3576
+ ShimmerText,
3577
+ Skeleton,
3578
+ SparklesText,
3579
+ StarfieldBackground,
3580
+ Toggle,
3581
+ Tooltip,
3582
+ TypewriterText,
3583
+ WaveBackground,
3584
+ WaveText,
3585
+ cn
3586
+ };
3587
+ //# sourceMappingURL=index.mjs.map