viscous-ui 1.0.80

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,3958 @@
1
+ // src/components/Loader/Loader.jsx
2
+ import React, { useEffect, useState } from "react";
3
+ var Loader = ({
4
+ type = "spinner",
5
+ size = 48,
6
+ accent = "#6366f1",
7
+ bg = "transparent",
8
+ label = "",
9
+ speed = 1
10
+ }) => {
11
+ const [dots, setDots] = useState(0);
12
+ const [progress, setProgress] = useState(0);
13
+ const alpha = (hex, op) => {
14
+ const r = parseInt(hex.slice(1, 3), 16);
15
+ const g = parseInt(hex.slice(3, 5), 16);
16
+ const b = parseInt(hex.slice(5, 7), 16);
17
+ return `rgba(${r},${g},${b},${op})`;
18
+ };
19
+ useEffect(() => {
20
+ if (type === "dots") {
21
+ const t = setInterval(() => setDots((d) => (d + 1) % 4), 400 / speed);
22
+ return () => clearInterval(t);
23
+ }
24
+ if (type === "bar") {
25
+ const t = setInterval(() => setProgress((p) => p >= 100 ? 0 : p + 2), 30 / speed);
26
+ return () => clearInterval(t);
27
+ }
28
+ }, [type, speed]);
29
+ const dur = `${1 / speed}s`;
30
+ const wrapStyle = {
31
+ display: "inline-flex",
32
+ flexDirection: "column",
33
+ alignItems: "center",
34
+ justifyContent: "center",
35
+ gap: "12px",
36
+ background: bg,
37
+ padding: bg !== "transparent" ? "24px" : "0",
38
+ borderRadius: "16px",
39
+ fontFamily: "system-ui, sans-serif"
40
+ };
41
+ const labelEl = label ? /* @__PURE__ */ React.createElement("span", { style: { fontSize: "13px", color: "rgba(255,255,255,0.45)", letterSpacing: "0.3px" } }, label) : null;
42
+ if (type === "spinner") return /* @__PURE__ */ React.createElement("div", { style: wrapStyle }, /* @__PURE__ */ React.createElement("svg", { width: size, height: size, viewBox: "0 0 48 48" }, /* @__PURE__ */ React.createElement(
43
+ "circle",
44
+ {
45
+ cx: "24",
46
+ cy: "24",
47
+ r: "20",
48
+ fill: "none",
49
+ stroke: alpha(accent, 0.15),
50
+ strokeWidth: "4"
51
+ }
52
+ ), /* @__PURE__ */ React.createElement(
53
+ "circle",
54
+ {
55
+ cx: "24",
56
+ cy: "24",
57
+ r: "20",
58
+ fill: "none",
59
+ stroke: accent,
60
+ strokeWidth: "4",
61
+ strokeLinecap: "round",
62
+ strokeDasharray: "31.4 94.2",
63
+ style: { transformOrigin: "center", animation: `spin ${dur} linear infinite` }
64
+ }
65
+ ), /* @__PURE__ */ React.createElement("style", null, `@keyframes spin { to { transform: rotate(360deg); } }`)), labelEl);
66
+ if (type === "pulse") return /* @__PURE__ */ React.createElement("div", { style: wrapStyle }, /* @__PURE__ */ React.createElement("div", { style: { position: "relative", width: size, height: size } }, /* @__PURE__ */ React.createElement("div", { style: {
67
+ position: "absolute",
68
+ inset: 0,
69
+ borderRadius: "50%",
70
+ background: alpha(accent, 0.2),
71
+ animation: `pulse ${dur} ease-out infinite`
72
+ } }), /* @__PURE__ */ React.createElement("div", { style: {
73
+ position: "absolute",
74
+ inset: "25%",
75
+ borderRadius: "50%",
76
+ background: accent
77
+ } }), /* @__PURE__ */ React.createElement("style", null, `@keyframes pulse { 0%{transform:scale(1);opacity:1} 100%{transform:scale(2);opacity:0} }`)), labelEl);
78
+ if (type === "dots") return /* @__PURE__ */ React.createElement("div", { style: wrapStyle }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", gap: "8px", alignItems: "center" } }, [0, 1, 2].map((i) => /* @__PURE__ */ React.createElement("div", { key: i, style: {
79
+ width: size / 5,
80
+ height: size / 5,
81
+ borderRadius: "50%",
82
+ background: dots === i ? accent : alpha(accent, 0.25),
83
+ transition: "background 0.2s"
84
+ } }))), labelEl);
85
+ if (type === "bar") return /* @__PURE__ */ React.createElement("div", { style: wrapStyle }, /* @__PURE__ */ React.createElement("div", { style: {
86
+ width: size * 3,
87
+ height: size / 8,
88
+ background: alpha(accent, 0.15),
89
+ borderRadius: "99px",
90
+ overflow: "hidden"
91
+ } }, /* @__PURE__ */ React.createElement("div", { style: {
92
+ height: "100%",
93
+ borderRadius: "99px",
94
+ background: accent,
95
+ width: `${progress}%`,
96
+ transition: "width 0.03s linear"
97
+ } })), labelEl);
98
+ if (type === "ring") return /* @__PURE__ */ React.createElement("div", { style: wrapStyle }, /* @__PURE__ */ React.createElement("div", { style: {
99
+ width: size,
100
+ height: size,
101
+ borderRadius: "50%",
102
+ border: `4px solid ${alpha(accent, 0.15)}`,
103
+ borderTop: `4px solid ${accent}`,
104
+ borderRight: `4px solid ${accent}`,
105
+ animation: `spin ${dur} linear infinite`
106
+ } }), /* @__PURE__ */ React.createElement("style", null, `@keyframes spin { to { transform: rotate(360deg); } }`), labelEl);
107
+ return null;
108
+ };
109
+
110
+ // src/components/NotificationToast/NotificationToast.jsx
111
+ import React2, { useState as useState2, useEffect as useEffect2 } from "react";
112
+ var NotificationToast = ({
113
+ title = "New Message",
114
+ message = "You have a new notification from the team.",
115
+ type = "success",
116
+ duration = 3e3,
117
+ accent = "#6366f1",
118
+ bg = "#0f172a",
119
+ radius = "14px",
120
+ showProgress = true
121
+ }) => {
122
+ const [visible, setVisible] = useState2(true);
123
+ const [progress, setProgress] = useState2(100);
124
+ const typeColors = {
125
+ success: "#10b981",
126
+ error: "#ef4444",
127
+ warning: "#f59e0b",
128
+ info: "#3b82f6"
129
+ };
130
+ const typeIcons = {
131
+ success: "M5 13l4 4L19 7",
132
+ error: "M6 18L18 6M6 6l12 12",
133
+ warning: "M12 9v4m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z",
134
+ info: "M13 16h-1v-4h-1m1-4h.01M12 2a10 10 0 100 20A10 10 0 0012 2z"
135
+ };
136
+ const color = typeColors[type] || accent;
137
+ useEffect2(() => {
138
+ if (!showProgress) return;
139
+ const step = 100 / (duration / 50);
140
+ const timer = setInterval(() => {
141
+ setProgress((p) => {
142
+ if (p <= 0) {
143
+ clearInterval(timer);
144
+ setVisible(false);
145
+ return 0;
146
+ }
147
+ return p - step;
148
+ });
149
+ }, 50);
150
+ return () => clearInterval(timer);
151
+ }, [duration, showProgress]);
152
+ if (!visible) return null;
153
+ return /* @__PURE__ */ React2.createElement("div", { style: {
154
+ background: bg,
155
+ borderRadius: radius,
156
+ padding: "16px 18px",
157
+ width: "320px",
158
+ color: "white",
159
+ fontFamily: "system-ui, sans-serif",
160
+ boxShadow: "0 10px 40px rgba(0,0,0,0.5)",
161
+ border: `1px solid rgba(255,255,255,0.08)`,
162
+ position: "relative",
163
+ overflow: "hidden"
164
+ } }, /* @__PURE__ */ React2.createElement("div", { style: { display: "flex", alignItems: "flex-start", gap: "12px" } }, /* @__PURE__ */ React2.createElement("div", { style: {
165
+ width: 36,
166
+ height: 36,
167
+ borderRadius: "10px",
168
+ flexShrink: 0,
169
+ background: `${color}22`,
170
+ border: `1px solid ${color}44`,
171
+ display: "flex",
172
+ alignItems: "center",
173
+ justifyContent: "center"
174
+ } }, /* @__PURE__ */ React2.createElement(
175
+ "svg",
176
+ {
177
+ width: "16",
178
+ height: "16",
179
+ viewBox: "0 0 24 24",
180
+ fill: "none",
181
+ stroke: color,
182
+ strokeWidth: "2.5",
183
+ strokeLinecap: "round",
184
+ strokeLinejoin: "round"
185
+ },
186
+ /* @__PURE__ */ React2.createElement("path", { d: typeIcons[type] || typeIcons.info })
187
+ )), /* @__PURE__ */ React2.createElement("div", { style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React2.createElement("div", { style: { fontSize: "14px", fontWeight: "700", marginBottom: "3px" } }, title), /* @__PURE__ */ React2.createElement("div", { style: { fontSize: "12px", color: "rgba(255,255,255,0.5)", lineHeight: 1.5 } }, message)), /* @__PURE__ */ React2.createElement(
188
+ "button",
189
+ {
190
+ onClick: () => setVisible(false),
191
+ style: {
192
+ background: "transparent",
193
+ border: "none",
194
+ cursor: "pointer",
195
+ color: "rgba(255,255,255,0.3)",
196
+ padding: "2px",
197
+ flexShrink: 0,
198
+ lineHeight: 1
199
+ }
200
+ },
201
+ /* @__PURE__ */ React2.createElement(
202
+ "svg",
203
+ {
204
+ width: "14",
205
+ height: "14",
206
+ viewBox: "0 0 24 24",
207
+ fill: "none",
208
+ stroke: "currentColor",
209
+ strokeWidth: "2.5",
210
+ strokeLinecap: "round"
211
+ },
212
+ /* @__PURE__ */ React2.createElement("path", { d: "M18 6L6 18M6 6l12 12" })
213
+ )
214
+ )), showProgress && /* @__PURE__ */ React2.createElement("div", { style: {
215
+ position: "absolute",
216
+ bottom: 0,
217
+ left: 0,
218
+ right: 0,
219
+ height: "3px",
220
+ background: "rgba(255,255,255,0.07)"
221
+ } }, /* @__PURE__ */ React2.createElement("div", { style: {
222
+ height: "100%",
223
+ width: `${progress}%`,
224
+ background: color,
225
+ transition: "width 0.05s linear",
226
+ borderRadius: "0 2px 2px 0"
227
+ } })));
228
+ };
229
+
230
+ // src/components/AvatarCard/AvatarCard.jsx
231
+ import React3, { useState as useState3 } from "react";
232
+ var AvatarCard = ({
233
+ name = "Aryan Sharma",
234
+ role = "Frontend Developer",
235
+ followers = 2400,
236
+ following = 180,
237
+ projects = 34,
238
+ bio = "Building beautiful UIs one component at a time.",
239
+ avatar = "",
240
+ accent = "#6366f1",
241
+ bg = "#0f172a",
242
+ radius = "20px"
243
+ }) => {
244
+ const [followed, setFollowed] = useState3(false);
245
+ const alpha = (hex, op) => {
246
+ const r = parseInt(hex.slice(1, 3), 16);
247
+ const g = parseInt(hex.slice(3, 5), 16);
248
+ const b = parseInt(hex.slice(5, 7), 16);
249
+ return `rgba(${r},${g},${b},${op})`;
250
+ };
251
+ const initials = name.split(" ").map((n) => n[0]).join("").slice(0, 2).toUpperCase();
252
+ const stats = [
253
+ { label: "Followers", value: followed ? followers + 1 : followers },
254
+ { label: "Following", value: following },
255
+ { label: "Projects", value: projects }
256
+ ];
257
+ return /* @__PURE__ */ React3.createElement("div", { style: {
258
+ background: bg,
259
+ borderRadius: radius,
260
+ padding: "24px 20px",
261
+ width: "280px",
262
+ color: "#fff",
263
+ fontFamily: "system-ui, sans-serif",
264
+ boxShadow: "0 10px 40px rgba(0,0,0,0.5)",
265
+ border: "1px solid rgba(255,255,255,0.08)",
266
+ position: "relative",
267
+ overflow: "hidden"
268
+ } }, /* @__PURE__ */ React3.createElement("div", { style: {
269
+ position: "absolute",
270
+ top: 0,
271
+ left: 0,
272
+ right: 0,
273
+ height: "3px",
274
+ background: `linear-gradient(90deg, ${accent}, ${alpha(accent, 0.3)})`
275
+ } }), /* @__PURE__ */ React3.createElement("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", marginBottom: "16px" } }, /* @__PURE__ */ React3.createElement("div", { style: {
276
+ width: 72,
277
+ height: 72,
278
+ borderRadius: "50%",
279
+ background: avatar ? `url(${avatar}) center/cover` : `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.5)})`,
280
+ display: "flex",
281
+ alignItems: "center",
282
+ justifyContent: "center",
283
+ fontSize: "24px",
284
+ fontWeight: "800",
285
+ color: "#fff",
286
+ border: `3px solid ${alpha(accent, 0.4)}`,
287
+ marginBottom: "12px"
288
+ } }, !avatar && initials), /* @__PURE__ */ React3.createElement("div", { style: { fontSize: "16px", fontWeight: "700", marginBottom: "3px" } }, name), /* @__PURE__ */ React3.createElement("div", { style: {
289
+ fontSize: "12px",
290
+ fontWeight: "600",
291
+ color: accent,
292
+ background: alpha(accent, 0.12),
293
+ padding: "2px 10px",
294
+ borderRadius: "20px",
295
+ border: `1px solid ${alpha(accent, 0.3)}`
296
+ } }, role)), /* @__PURE__ */ React3.createElement("p", { style: {
297
+ fontSize: "12px",
298
+ color: "rgba(255,255,255,0.45)",
299
+ textAlign: "center",
300
+ lineHeight: 1.6,
301
+ marginBottom: "18px",
302
+ padding: "0 4px"
303
+ } }, bio), /* @__PURE__ */ React3.createElement("div", { style: {
304
+ display: "flex",
305
+ justifyContent: "space-around",
306
+ background: "rgba(255,255,255,0.04)",
307
+ border: "1px solid rgba(255,255,255,0.07)",
308
+ borderRadius: "12px",
309
+ padding: "12px 8px",
310
+ marginBottom: "16px"
311
+ } }, stats.map((s) => /* @__PURE__ */ React3.createElement("div", { key: s.label, style: { textAlign: "center" } }, /* @__PURE__ */ React3.createElement("div", { style: { fontSize: "18px", fontWeight: "800" } }, s.value >= 1e3 ? (s.value / 1e3).toFixed(1) + "k" : s.value), /* @__PURE__ */ React3.createElement("div", { style: { fontSize: "10px", color: "rgba(255,255,255,0.4)", marginTop: "2px" } }, s.label)))));
312
+ };
313
+
314
+ // src/components/PricingCard/PricingCard.jsx
315
+ import React4 from "react";
316
+ var PricingCard = ({
317
+ planName = "Pro Plan",
318
+ description = "For teams that need more power.",
319
+ price = 29,
320
+ currency = "$",
321
+ period = "per month",
322
+ badgeText = "Most Popular",
323
+ ctaText = "Get Started",
324
+ accent = "#6366f1",
325
+ bg = "#0f172a",
326
+ radius = "20px",
327
+ features = [
328
+ "Unlimited projects",
329
+ "Priority support",
330
+ "Advanced analytics",
331
+ "Custom integrations",
332
+ "Team collaboration"
333
+ ],
334
+ onCtaClick = () => {
335
+ }
336
+ }) => {
337
+ const alpha = (hex, op) => {
338
+ const r = parseInt(hex.slice(1, 3), 16);
339
+ const g = parseInt(hex.slice(3, 5), 16);
340
+ const b = parseInt(hex.slice(5, 7), 16);
341
+ return `rgba(${r},${g},${b},${op})`;
342
+ };
343
+ return /* @__PURE__ */ React4.createElement("div", { style: {
344
+ background: bg,
345
+ borderRadius: radius,
346
+ padding: "28px 24px",
347
+ width: "300px",
348
+ color: "#fff",
349
+ fontFamily: "system-ui, sans-serif",
350
+ boxShadow: "0 10px 40px rgba(0,0,0,0.5)",
351
+ border: `1px solid ${alpha(accent, 0.25)}`,
352
+ position: "relative",
353
+ overflow: "hidden"
354
+ } }, /* @__PURE__ */ React4.createElement("div", { style: {
355
+ position: "absolute",
356
+ top: 0,
357
+ left: 0,
358
+ right: 0,
359
+ height: "3px",
360
+ background: `linear-gradient(90deg, ${accent}, ${alpha(accent, 0.3)})`
361
+ } }), badgeText && /* @__PURE__ */ React4.createElement("div", { style: {
362
+ display: "inline-flex",
363
+ alignItems: "center",
364
+ gap: "6px",
365
+ padding: "4px 12px",
366
+ borderRadius: "100px",
367
+ marginBottom: "14px",
368
+ background: alpha(accent, 0.12),
369
+ border: `1px solid ${alpha(accent, 0.3)}`,
370
+ fontSize: "11px",
371
+ fontWeight: "700",
372
+ color: accent,
373
+ letterSpacing: "0.5px",
374
+ textTransform: "uppercase"
375
+ } }, /* @__PURE__ */ React4.createElement("div", { style: { width: 6, height: 6, borderRadius: "50%", background: accent } }), badgeText), /* @__PURE__ */ React4.createElement("div", { style: { fontSize: "20px", fontWeight: "800", marginBottom: "4px" } }, planName), /* @__PURE__ */ React4.createElement("div", { style: { fontSize: "13px", color: "rgba(255,255,255,0.45)", marginBottom: "20px", lineHeight: 1.5 } }, description), /* @__PURE__ */ React4.createElement("div", { style: { display: "flex", alignItems: "flex-end", gap: "3px", marginBottom: "4px" } }, /* @__PURE__ */ React4.createElement("span", { style: { fontSize: "18px", fontWeight: "700", color: "rgba(255,255,255,0.5)", lineHeight: 2 } }, currency), /* @__PURE__ */ React4.createElement("span", { style: { fontSize: "52px", fontWeight: "800", color: "#fff", lineHeight: 1 } }, Math.round(price))), /* @__PURE__ */ React4.createElement("div", { style: { fontSize: "12px", color: "rgba(255,255,255,0.35)", marginBottom: "20px" } }, period), /* @__PURE__ */ React4.createElement("div", { style: { height: "1px", background: "rgba(255,255,255,0.07)", marginBottom: "16px" } }), /* @__PURE__ */ React4.createElement("ul", { style: { listStyle: "none", padding: 0, margin: "0 0 22px", display: "flex", flexDirection: "column", gap: "10px" } }, features.map((f, i) => /* @__PURE__ */ React4.createElement("li", { key: i, style: { display: "flex", alignItems: "center", gap: "10px", fontSize: "13px", color: "rgba(255,255,255,0.75)" } }, /* @__PURE__ */ React4.createElement("div", { style: {
376
+ width: "18px",
377
+ height: "18px",
378
+ borderRadius: "50%",
379
+ flexShrink: 0,
380
+ display: "flex",
381
+ alignItems: "center",
382
+ justifyContent: "center",
383
+ background: alpha(accent, 0.18),
384
+ border: `1px solid ${alpha(accent, 0.4)}`
385
+ } }, /* @__PURE__ */ React4.createElement(
386
+ "svg",
387
+ {
388
+ width: "10",
389
+ height: "10",
390
+ viewBox: "0 0 12 12",
391
+ fill: "none",
392
+ stroke: "#fff",
393
+ strokeWidth: "2",
394
+ strokeLinecap: "round",
395
+ strokeLinejoin: "round"
396
+ },
397
+ /* @__PURE__ */ React4.createElement("polyline", { points: "1.5,6 4.5,9 10.5,3" })
398
+ )), f))), /* @__PURE__ */ React4.createElement(
399
+ "button",
400
+ {
401
+ onClick: onCtaClick,
402
+ style: {
403
+ width: "100%",
404
+ padding: "13px",
405
+ borderRadius: "12px",
406
+ border: "none",
407
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.7)})`,
408
+ color: "#fff",
409
+ fontSize: "14px",
410
+ fontWeight: "700",
411
+ cursor: "pointer",
412
+ letterSpacing: "0.2px",
413
+ fontFamily: "system-ui, sans-serif"
414
+ },
415
+ onMouseEnter: (e) => e.currentTarget.style.opacity = "0.88",
416
+ onMouseLeave: (e) => e.currentTarget.style.opacity = "1"
417
+ },
418
+ ctaText
419
+ ));
420
+ };
421
+
422
+ // src/components/Navbar/Navbar.jsx
423
+ import React5, { useState as useState4, useEffect as useEffect3 } from "react";
424
+ var Navbar = ({
425
+ logo = "VirtualAI",
426
+ links = ["Home", "Features", "Pricing", "Blog"],
427
+ ctaText = "Get Started",
428
+ accent = "#6366f1",
429
+ bg = "#0f172a",
430
+ onCtaClick = () => {
431
+ },
432
+ onLinkClick = () => {
433
+ }
434
+ }) => {
435
+ const [scrolled, setScrolled] = useState4(false);
436
+ const [menuOpen, setMenuOpen] = useState4(false);
437
+ const [active, setActive] = useState4("Home");
438
+ const [isMobile, setIsMobile] = useState4(false);
439
+ const alpha = (hex, op) => {
440
+ const r = parseInt(hex.slice(1, 3), 16);
441
+ const g = parseInt(hex.slice(3, 5), 16);
442
+ const b = parseInt(hex.slice(5, 7), 16);
443
+ return `rgba(${r},${g},${b},${op})`;
444
+ };
445
+ useEffect3(() => {
446
+ const checkMobile = () => setIsMobile(window.innerWidth < 768);
447
+ checkMobile();
448
+ window.addEventListener("resize", checkMobile);
449
+ return () => window.removeEventListener("resize", checkMobile);
450
+ }, []);
451
+ useEffect3(() => {
452
+ const handler = () => setScrolled(window.scrollY > 10);
453
+ window.addEventListener("scroll", handler);
454
+ return () => window.removeEventListener("scroll", handler);
455
+ }, []);
456
+ useEffect3(() => {
457
+ if (!isMobile) setMenuOpen(false);
458
+ }, [isMobile]);
459
+ const handleLink = (link) => {
460
+ setActive(link);
461
+ setMenuOpen(false);
462
+ onLinkClick(link);
463
+ };
464
+ return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement("style", null, `
465
+ @keyframes nbSlideDown {
466
+ from { opacity: 0; transform: translateY(-8px); }
467
+ to { opacity: 1; transform: translateY(0); }
468
+ }
469
+ .nb-link:hover { color: rgba(255,255,255,0.9) !important; background: rgba(255,255,255,0.05) !important; }
470
+ .nb-cta:hover { opacity: 0.85 !important; }
471
+ .nb-ham:hover { background: rgba(255,255,255,0.1) !important; }
472
+ .nb-mlink:hover { background: rgba(255,255,255,0.06) !important; }
473
+ `), /* @__PURE__ */ React5.createElement("nav", { style: {
474
+ position: "sticky",
475
+ top: 0,
476
+ left: 0,
477
+ right: 0,
478
+ zIndex: 1e3,
479
+ background: scrolled ? alpha(bg, 0.96) : bg,
480
+ borderBottom: `1px solid ${scrolled ? "rgba(255,255,255,0.09)" : "rgba(255,255,255,0.04)"}`,
481
+ backdropFilter: scrolled ? "blur(12px)" : "none",
482
+ WebkitBackdropFilter: scrolled ? "blur(12px)" : "none",
483
+ transition: "all 0.3s ease",
484
+ fontFamily: "system-ui, -apple-system, sans-serif",
485
+ width: "100%",
486
+ boxSizing: "border-box"
487
+ } }, /* @__PURE__ */ React5.createElement("div", { style: {
488
+ maxWidth: "1200px",
489
+ margin: "0 auto",
490
+ padding: "0 20px",
491
+ height: isMobile ? "56px" : "64px",
492
+ display: "flex",
493
+ alignItems: "center",
494
+ justifyContent: "space-between",
495
+ gap: "16px",
496
+ boxSizing: "border-box"
497
+ } }, /* @__PURE__ */ React5.createElement("div", { style: { display: "flex", alignItems: "center", gap: "8px", cursor: "pointer", flexShrink: 0 } }, /* @__PURE__ */ React5.createElement("div", { style: {
498
+ width: isMobile ? "26px" : "30px",
499
+ height: isMobile ? "26px" : "30px",
500
+ borderRadius: "8px",
501
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.6)})`,
502
+ display: "flex",
503
+ alignItems: "center",
504
+ justifyContent: "center",
505
+ fontSize: isMobile ? "12px" : "14px",
506
+ fontWeight: "800",
507
+ color: "#fff",
508
+ flexShrink: 0
509
+ } }, logo[0]), /* @__PURE__ */ React5.createElement("span", { style: {
510
+ fontSize: isMobile ? "14px" : "16px",
511
+ fontWeight: "800",
512
+ color: "#fff",
513
+ letterSpacing: "-0.3px"
514
+ } }, logo)), !isMobile && /* @__PURE__ */ React5.createElement("div", { style: { display: "flex", alignItems: "center", gap: "2px", flex: 1, justifyContent: "center" } }, links.map((link) => /* @__PURE__ */ React5.createElement(
515
+ "button",
516
+ {
517
+ key: link,
518
+ className: "nb-link",
519
+ onClick: () => handleLink(link),
520
+ style: {
521
+ background: active === link ? alpha(accent, 0.12) : "transparent",
522
+ border: "none",
523
+ padding: "7px 16px",
524
+ borderRadius: "9px",
525
+ fontSize: "14px",
526
+ fontWeight: active === link ? "700" : "500",
527
+ color: active === link ? accent : "rgba(255,255,255,0.5)",
528
+ cursor: "pointer",
529
+ transition: "all 0.2s",
530
+ fontFamily: "inherit",
531
+ whiteSpace: "nowrap"
532
+ }
533
+ },
534
+ link
535
+ ))), /* @__PURE__ */ React5.createElement("div", { style: { display: "flex", alignItems: "center", gap: "8px", flexShrink: 0 } }, /* @__PURE__ */ React5.createElement(
536
+ "button",
537
+ {
538
+ className: "nb-cta",
539
+ onClick: onCtaClick,
540
+ style: {
541
+ padding: isMobile ? "7px 14px" : "9px 20px",
542
+ borderRadius: "10px",
543
+ border: "none",
544
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.75)})`,
545
+ color: "#fff",
546
+ fontSize: isMobile ? "12px" : "13px",
547
+ fontWeight: "700",
548
+ cursor: "pointer",
549
+ fontFamily: "inherit",
550
+ transition: "opacity 0.2s",
551
+ whiteSpace: "nowrap"
552
+ }
553
+ },
554
+ ctaText
555
+ ), isMobile && /* @__PURE__ */ React5.createElement(
556
+ "button",
557
+ {
558
+ className: "nb-ham",
559
+ onClick: () => setMenuOpen((o) => !o),
560
+ style: {
561
+ background: "rgba(255,255,255,0.06)",
562
+ border: "1px solid rgba(255,255,255,0.1)",
563
+ borderRadius: "8px",
564
+ width: "34px",
565
+ height: "34px",
566
+ cursor: "pointer",
567
+ display: "flex",
568
+ flexDirection: "column",
569
+ alignItems: "center",
570
+ justifyContent: "center",
571
+ gap: "5px",
572
+ transition: "background 0.2s",
573
+ flexShrink: 0,
574
+ padding: 0
575
+ }
576
+ },
577
+ /* @__PURE__ */ React5.createElement("div", { style: {
578
+ width: "16px",
579
+ height: "1.5px",
580
+ background: "rgba(255,255,255,0.7)",
581
+ borderRadius: "2px",
582
+ transform: menuOpen ? "rotate(45deg) translate(4px, 4px)" : "none",
583
+ transition: "transform 0.25s"
584
+ } }),
585
+ /* @__PURE__ */ React5.createElement("div", { style: {
586
+ width: "16px",
587
+ height: "1.5px",
588
+ background: "rgba(255,255,255,0.7)",
589
+ borderRadius: "2px",
590
+ opacity: menuOpen ? 0 : 1,
591
+ transition: "opacity 0.2s"
592
+ } }),
593
+ /* @__PURE__ */ React5.createElement("div", { style: {
594
+ width: "16px",
595
+ height: "1.5px",
596
+ background: "rgba(255,255,255,0.7)",
597
+ borderRadius: "2px",
598
+ transform: menuOpen ? "rotate(-45deg) translate(4px, -4px)" : "none",
599
+ transition: "transform 0.25s"
600
+ } })
601
+ ))), isMobile && menuOpen && /* @__PURE__ */ React5.createElement("div", { style: {
602
+ animation: "nbSlideDown 0.2s ease",
603
+ borderTop: "1px solid rgba(255,255,255,0.06)",
604
+ padding: "10px 16px 16px",
605
+ display: "flex",
606
+ flexDirection: "column",
607
+ gap: "3px",
608
+ background: alpha(bg, 0.98)
609
+ } }, links.map((link) => /* @__PURE__ */ React5.createElement(
610
+ "button",
611
+ {
612
+ key: link,
613
+ className: "nb-mlink",
614
+ onClick: () => handleLink(link),
615
+ style: {
616
+ background: active === link ? alpha(accent, 0.1) : "transparent",
617
+ border: "none",
618
+ padding: "11px 14px",
619
+ borderRadius: "10px",
620
+ fontSize: "14px",
621
+ fontWeight: active === link ? "700" : "500",
622
+ color: active === link ? accent : "rgba(255,255,255,0.55)",
623
+ cursor: "pointer",
624
+ textAlign: "left",
625
+ fontFamily: "inherit",
626
+ width: "100%",
627
+ transition: "all 0.15s",
628
+ display: "flex",
629
+ alignItems: "center",
630
+ justifyContent: "space-between"
631
+ }
632
+ },
633
+ link,
634
+ active === link && /* @__PURE__ */ React5.createElement(
635
+ "svg",
636
+ {
637
+ width: "14",
638
+ height: "14",
639
+ viewBox: "0 0 24 24",
640
+ fill: "none",
641
+ stroke: accent,
642
+ strokeWidth: "2.5",
643
+ strokeLinecap: "round"
644
+ },
645
+ /* @__PURE__ */ React5.createElement("polyline", { points: "9 18 15 12 9 6" })
646
+ )
647
+ )), /* @__PURE__ */ React5.createElement("div", { style: { height: "1px", background: "rgba(255,255,255,0.07)", margin: "8px 0" } }), /* @__PURE__ */ React5.createElement(
648
+ "button",
649
+ {
650
+ onClick: () => {
651
+ setMenuOpen(false);
652
+ onCtaClick();
653
+ },
654
+ style: {
655
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.75)})`,
656
+ border: "none",
657
+ padding: "12px",
658
+ borderRadius: "12px",
659
+ fontSize: "14px",
660
+ fontWeight: "700",
661
+ color: "#fff",
662
+ cursor: "pointer",
663
+ fontFamily: "inherit",
664
+ width: "100%"
665
+ }
666
+ },
667
+ ctaText
668
+ ))));
669
+ };
670
+
671
+ // src/components/Footer/Footer.jsx
672
+ import React6 from "react";
673
+ var Footer = ({
674
+ logo = "VirtualAI",
675
+ links = ["Home", "Features", "Pricing", "Blog", "Contact"],
676
+ copyright = "VirtualAI",
677
+ accent = "#6366f1",
678
+ bg = "#0f172a"
679
+ }) => {
680
+ return /* @__PURE__ */ React6.createElement("footer", { style: {
681
+ background: bg,
682
+ borderTop: "1px solid rgba(255,255,255,0.06)",
683
+ fontFamily: "system-ui, sans-serif",
684
+ width: "100%",
685
+ boxSizing: "border-box",
686
+ padding: "28px 24px"
687
+ } }, /* @__PURE__ */ React6.createElement("div", { style: {
688
+ maxWidth: "900px",
689
+ margin: "0 auto",
690
+ display: "flex",
691
+ flexDirection: "column",
692
+ alignItems: "center",
693
+ gap: "20px"
694
+ } }, /* @__PURE__ */ React6.createElement("div", { style: { display: "flex", alignItems: "center", gap: "8px" } }, /* @__PURE__ */ React6.createElement("div", { style: {
695
+ width: "26px",
696
+ height: "26px",
697
+ borderRadius: "7px",
698
+ background: `linear-gradient(135deg, ${accent}, rgba(99,102,241,0.5))`,
699
+ display: "flex",
700
+ alignItems: "center",
701
+ justifyContent: "center",
702
+ fontSize: "12px",
703
+ fontWeight: "800",
704
+ color: "#fff"
705
+ } }, logo[0]), /* @__PURE__ */ React6.createElement("span", { style: { fontSize: "15px", fontWeight: "800", color: "#fff" } }, logo)), /* @__PURE__ */ React6.createElement("div", { style: { display: "flex", flexWrap: "wrap", justifyContent: "center", gap: "4px" } }, links.map((link) => /* @__PURE__ */ React6.createElement(
706
+ "a",
707
+ {
708
+ key: link,
709
+ href: "#",
710
+ style: {
711
+ fontSize: "13px",
712
+ color: "rgba(255,255,255,0.4)",
713
+ textDecoration: "none",
714
+ padding: "4px 12px",
715
+ borderRadius: "8px",
716
+ transition: "color 0.2s"
717
+ },
718
+ onMouseEnter: (e) => e.currentTarget.style.color = "rgba(255,255,255,0.85)",
719
+ onMouseLeave: (e) => e.currentTarget.style.color = "rgba(255,255,255,0.4)"
720
+ },
721
+ link
722
+ ))), /* @__PURE__ */ React6.createElement("div", { style: { width: "100%", height: "1px", background: "rgba(255,255,255,0.06)" } }), /* @__PURE__ */ React6.createElement("p", { style: { fontSize: "12px", color: "rgba(255,255,255,0.22)", margin: 0 } }, "\xA9 ", (/* @__PURE__ */ new Date()).getFullYear(), " ", copyright, ". All rights reserved.")));
723
+ };
724
+
725
+ // src/components/Sidebar/Sidebar.jsx
726
+ import React7, { useState as useState5 } from "react";
727
+ var Sidebar = ({
728
+ logo = "VirtualAI",
729
+ accent = "#6366f1",
730
+ bg = "#0f172a",
731
+ items = [
732
+ {
733
+ label: "Dashboard",
734
+ icon: "M3 3h7v7H3zM14 3h7v7h-7zM3 14h7v7H3zM14 14h7v7h-7z",
735
+ component: /* @__PURE__ */ React7.createElement("div", { style: { padding: "24px" } }, /* @__PURE__ */ React7.createElement("h2", { style: { color: "#fff", fontSize: "20px", fontWeight: "700", marginBottom: "8px" } }, "Dashboard"), /* @__PURE__ */ React7.createElement("p", { style: { color: "rgba(255,255,255,0.4)", fontSize: "14px" } }, "Welcome to your dashboard overview."))
736
+ },
737
+ {
738
+ label: "Analytics",
739
+ icon: "M18 20V10M12 20V4M6 20v-6",
740
+ component: /* @__PURE__ */ React7.createElement("div", { style: { padding: "24px" } }, /* @__PURE__ */ React7.createElement("h2", { style: { color: "#fff", fontSize: "20px", fontWeight: "700", marginBottom: "8px" } }, "Analytics"), /* @__PURE__ */ React7.createElement("p", { style: { color: "rgba(255,255,255,0.4)", fontSize: "14px" } }, "View your stats and performance here."))
741
+ },
742
+ {
743
+ label: "Users",
744
+ icon: "M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2M9 11a4 4 0 100-8 4 4 0 000 8zM23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",
745
+ component: /* @__PURE__ */ React7.createElement("div", { style: { padding: "24px" } }, /* @__PURE__ */ React7.createElement("h2", { style: { color: "#fff", fontSize: "20px", fontWeight: "700", marginBottom: "8px" } }, "Users"), /* @__PURE__ */ React7.createElement("p", { style: { color: "rgba(255,255,255,0.4)", fontSize: "14px" } }, "Manage your users and permissions."))
746
+ },
747
+ {
748
+ label: "Settings",
749
+ icon: "M12 15a3 3 0 100-6 3 3 0 000 6zM19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-4 0v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83-2.83l.06-.06A1.65 1.65 0 004.68 15a1.65 1.65 0 00-1.51-1H3a2 2 0 010-4h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 012.83-2.83l.06.06A1.65 1.65 0 009 4.68a1.65 1.65 0 001-1.51V3a2 2 0 014 0v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 2.83l-.06.06A1.65 1.65 0 0019.4 9a1.65 1.65 0 001.51 1H21a2 2 0 010 4h-.09a1.65 1.65 0 00-1.51 1z",
750
+ component: /* @__PURE__ */ React7.createElement("div", { style: { padding: "24px" } }, /* @__PURE__ */ React7.createElement("h2", { style: { color: "#fff", fontSize: "20px", fontWeight: "700", marginBottom: "8px" } }, "Settings"), /* @__PURE__ */ React7.createElement("p", { style: { color: "rgba(255,255,255,0.4)", fontSize: "14px" } }, "Configure your preferences here."))
751
+ }
752
+ ]
753
+ }) => {
754
+ const [active, setActive] = useState5(0);
755
+ const [collapsed, setCollapsed] = useState5(false);
756
+ const alpha = (hex, op) => {
757
+ const r = parseInt(hex.slice(1, 3), 16);
758
+ const g = parseInt(hex.slice(3, 5), 16);
759
+ const b = parseInt(hex.slice(5, 7), 16);
760
+ return `rgba(${r},${g},${b},${op})`;
761
+ };
762
+ const activeItem = items[active];
763
+ return /* @__PURE__ */ React7.createElement("div", { style: {
764
+ display: "flex",
765
+ height: "480px",
766
+ fontFamily: "system-ui, sans-serif",
767
+ borderRadius: "16px",
768
+ overflow: "hidden",
769
+ border: "1px solid rgba(255,255,255,0.07)"
770
+ } }, /* @__PURE__ */ React7.createElement("div", { style: {
771
+ width: collapsed ? "60px" : "200px",
772
+ background: bg,
773
+ borderRight: "1px solid rgba(255,255,255,0.06)",
774
+ display: "flex",
775
+ flexDirection: "column",
776
+ transition: "width 0.25s ease",
777
+ flexShrink: 0,
778
+ overflow: "hidden"
779
+ } }, /* @__PURE__ */ React7.createElement("div", { style: {
780
+ height: "56px",
781
+ display: "flex",
782
+ alignItems: "center",
783
+ gap: "10px",
784
+ padding: collapsed ? "0 14px" : "0 16px",
785
+ borderBottom: "1px solid rgba(255,255,255,0.05)",
786
+ overflow: "hidden",
787
+ flexShrink: 0
788
+ } }, /* @__PURE__ */ React7.createElement("div", { style: {
789
+ width: "28px",
790
+ height: "28px",
791
+ borderRadius: "8px",
792
+ flexShrink: 0,
793
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.6)})`,
794
+ display: "flex",
795
+ alignItems: "center",
796
+ justifyContent: "center",
797
+ fontSize: "13px",
798
+ fontWeight: "800",
799
+ color: "#fff"
800
+ } }, logo[0]), !collapsed && /* @__PURE__ */ React7.createElement("span", { style: { fontSize: "14px", fontWeight: "800", color: "#fff", whiteSpace: "nowrap" } }, logo)), /* @__PURE__ */ React7.createElement("nav", { style: { flex: 1, padding: "10px 8px", display: "flex", flexDirection: "column", gap: "3px", overflowY: "auto" } }, items.map((item, i) => /* @__PURE__ */ React7.createElement(
801
+ "button",
802
+ {
803
+ key: i,
804
+ onClick: () => setActive(i),
805
+ title: collapsed ? item.label : "",
806
+ style: {
807
+ display: "flex",
808
+ alignItems: "center",
809
+ gap: "10px",
810
+ padding: collapsed ? "9px 0" : "9px 12px",
811
+ justifyContent: collapsed ? "center" : "flex-start",
812
+ borderRadius: "10px",
813
+ border: "none",
814
+ cursor: "pointer",
815
+ transition: "all 0.2s",
816
+ fontFamily: "inherit",
817
+ width: "100%",
818
+ background: active === i ? alpha(accent, 0.12) : "transparent",
819
+ color: active === i ? accent : "rgba(255,255,255,0.45)",
820
+ borderLeft: active === i ? `2px solid ${accent}` : "2px solid transparent"
821
+ },
822
+ onMouseEnter: (e) => {
823
+ if (active !== i) {
824
+ e.currentTarget.style.background = "rgba(255,255,255,0.04)";
825
+ e.currentTarget.style.color = "rgba(255,255,255,0.8)";
826
+ }
827
+ },
828
+ onMouseLeave: (e) => {
829
+ if (active !== i) {
830
+ e.currentTarget.style.background = "transparent";
831
+ e.currentTarget.style.color = "rgba(255,255,255,0.45)";
832
+ }
833
+ }
834
+ },
835
+ /* @__PURE__ */ React7.createElement(
836
+ "svg",
837
+ {
838
+ width: "16",
839
+ height: "16",
840
+ viewBox: "0 0 24 24",
841
+ fill: "none",
842
+ stroke: "currentColor",
843
+ strokeWidth: "2",
844
+ strokeLinecap: "round",
845
+ strokeLinejoin: "round",
846
+ style: { flexShrink: 0 }
847
+ },
848
+ /* @__PURE__ */ React7.createElement("path", { d: item.icon })
849
+ ),
850
+ !collapsed && /* @__PURE__ */ React7.createElement("span", { style: { fontSize: "13px", fontWeight: active === i ? "700" : "500", whiteSpace: "nowrap" } }, item.label)
851
+ ))), /* @__PURE__ */ React7.createElement("div", { style: { padding: "8px", borderTop: "1px solid rgba(255,255,255,0.05)" } }, /* @__PURE__ */ React7.createElement(
852
+ "button",
853
+ {
854
+ onClick: () => setCollapsed((c) => !c),
855
+ style: {
856
+ width: "100%",
857
+ padding: "8px",
858
+ borderRadius: "9px",
859
+ border: "none",
860
+ background: "rgba(255,255,255,0.04)",
861
+ cursor: "pointer",
862
+ display: "flex",
863
+ alignItems: "center",
864
+ justifyContent: "center",
865
+ color: "rgba(255,255,255,0.3)",
866
+ transition: "all 0.2s"
867
+ },
868
+ onMouseEnter: (e) => e.currentTarget.style.color = "rgba(255,255,255,0.7)",
869
+ onMouseLeave: (e) => e.currentTarget.style.color = "rgba(255,255,255,0.3)"
870
+ },
871
+ /* @__PURE__ */ React7.createElement(
872
+ "svg",
873
+ {
874
+ width: "15",
875
+ height: "15",
876
+ viewBox: "0 0 24 24",
877
+ fill: "none",
878
+ stroke: "currentColor",
879
+ strokeWidth: "2",
880
+ strokeLinecap: "round"
881
+ },
882
+ /* @__PURE__ */ React7.createElement("path", { d: collapsed ? "M9 18l6-6-6-6" : "M15 18l-6-6 6-6" })
883
+ )
884
+ ))), /* @__PURE__ */ React7.createElement("div", { style: {
885
+ flex: 1,
886
+ background: "rgba(255,255,255,0.02)",
887
+ overflow: "auto"
888
+ } }, /* @__PURE__ */ React7.createElement("div", { style: {
889
+ height: "56px",
890
+ display: "flex",
891
+ alignItems: "center",
892
+ padding: "0 20px",
893
+ borderBottom: "1px solid rgba(255,255,255,0.05)",
894
+ gap: "10px"
895
+ } }, /* @__PURE__ */ React7.createElement("div", { style: {
896
+ width: "6px",
897
+ height: "6px",
898
+ borderRadius: "50%",
899
+ background: accent
900
+ } }), /* @__PURE__ */ React7.createElement("span", { style: { fontSize: "14px", fontWeight: "700", color: "#fff" } }, activeItem == null ? void 0 : activeItem.label)), /* @__PURE__ */ React7.createElement("div", { style: { color: "#fff" } }, activeItem == null ? void 0 : activeItem.component)));
901
+ };
902
+
903
+ // src/components/Charts/Charts.jsx
904
+ import React8, { useState as useState6 } from "react";
905
+ var Charts = ({
906
+ type = "bar",
907
+ data = [
908
+ { label: "Jan", value: 40 },
909
+ { label: "Feb", value: 70 },
910
+ { label: "Mar", value: 55 },
911
+ { label: "Apr", value: 90 },
912
+ { label: "May", value: 65 },
913
+ { label: "Jun", value: 80 },
914
+ { label: "Jul", value: 100 },
915
+ { label: "Aug", value: 30 }
916
+ ],
917
+ title = "Monthly Stats",
918
+ accent = "#6366f1",
919
+ bg = "#0f172a",
920
+ radius = "16px",
921
+ showGrid = true,
922
+ showValues = true
923
+ }) => {
924
+ const [hovered, setHovered] = useState6(null);
925
+ const alpha = (hex, op) => {
926
+ const r = parseInt(hex.slice(1, 3), 16);
927
+ const g = parseInt(hex.slice(3, 5), 16);
928
+ const b = parseInt(hex.slice(5, 7), 16);
929
+ return `rgba(${r},${g},${b},${op})`;
930
+ };
931
+ const max = Math.max(...data.map((d) => d.value));
932
+ const min = Math.min(...data.map((d) => d.value));
933
+ const W = 320;
934
+ const H = 160;
935
+ const padL = 28;
936
+ const padR = 12;
937
+ const padT = 16;
938
+ const padB = 28;
939
+ const chartW = W - padL - padR;
940
+ const chartH = H - padT - padB;
941
+ const getX = (i) => padL + i / (data.length - 1) * chartW;
942
+ const getY = (v) => padT + chartH - (v - min) / (max - min || 1) * chartH;
943
+ const points = data.map((d, i) => `${getX(i)},${getY(d.value)}`).join(" ");
944
+ const areaPoints = `${padL},${padT + chartH} ` + points + ` ${getX(data.length - 1)},${padT + chartH}`;
945
+ const gridLines = [0, 0.25, 0.5, 0.75, 1].map((t) => ({
946
+ y: padT + chartH * (1 - t),
947
+ val: Math.round(min + t * (max - min))
948
+ }));
949
+ const BarChart = () => {
950
+ const barW = Math.min(28, chartW / data.length * 0.55);
951
+ return /* @__PURE__ */ React8.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, showGrid && gridLines.map((g, i) => /* @__PURE__ */ React8.createElement("g", { key: i }, /* @__PURE__ */ React8.createElement(
952
+ "line",
953
+ {
954
+ x1: padL,
955
+ y1: g.y,
956
+ x2: W - padR,
957
+ y2: g.y,
958
+ stroke: "rgba(255,255,255,0.05)",
959
+ strokeWidth: "1"
960
+ }
961
+ ), /* @__PURE__ */ React8.createElement(
962
+ "text",
963
+ {
964
+ x: padL - 4,
965
+ y: g.y + 4,
966
+ textAnchor: "end",
967
+ fill: "rgba(255,255,255,0.25)",
968
+ fontSize: "9"
969
+ },
970
+ g.val
971
+ ))), data.map((d, i) => {
972
+ const x = padL + i / data.length * chartW + (chartW / data.length - barW) / 2;
973
+ const barH = (d.value - min) / (max - min || 1) * chartH;
974
+ const y = padT + chartH - barH;
975
+ const isH = hovered === i;
976
+ return /* @__PURE__ */ React8.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ React8.createElement(
977
+ "rect",
978
+ {
979
+ x,
980
+ y: padT,
981
+ width: barW,
982
+ height: chartH,
983
+ fill: "transparent",
984
+ rx: "4"
985
+ }
986
+ ), /* @__PURE__ */ React8.createElement(
987
+ "rect",
988
+ {
989
+ x,
990
+ y,
991
+ width: barW,
992
+ height: barH,
993
+ fill: isH ? accent : alpha(accent, 0.55),
994
+ rx: "4",
995
+ style: { transition: "fill 0.15s" }
996
+ }
997
+ ), showValues && isH && /* @__PURE__ */ React8.createElement(
998
+ "text",
999
+ {
1000
+ x: x + barW / 2,
1001
+ y: y - 5,
1002
+ textAnchor: "middle",
1003
+ fill: "#fff",
1004
+ fontSize: "9",
1005
+ fontWeight: "700"
1006
+ },
1007
+ d.value
1008
+ ), /* @__PURE__ */ React8.createElement(
1009
+ "text",
1010
+ {
1011
+ x: x + barW / 2,
1012
+ y: H - 6,
1013
+ textAnchor: "middle",
1014
+ fill: "rgba(255,255,255,0.3)",
1015
+ fontSize: "9"
1016
+ },
1017
+ d.label
1018
+ ));
1019
+ }));
1020
+ };
1021
+ const LineChart = () => /* @__PURE__ */ React8.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, /* @__PURE__ */ React8.createElement("defs", null, /* @__PURE__ */ React8.createElement("linearGradient", { id: "lg", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ React8.createElement("stop", { offset: "0%", stopColor: accent, stopOpacity: "0.3" }), /* @__PURE__ */ React8.createElement("stop", { offset: "100%", stopColor: accent, stopOpacity: "0" }))), showGrid && gridLines.map((g, i) => /* @__PURE__ */ React8.createElement("g", { key: i }, /* @__PURE__ */ React8.createElement(
1022
+ "line",
1023
+ {
1024
+ x1: padL,
1025
+ y1: g.y,
1026
+ x2: W - padR,
1027
+ y2: g.y,
1028
+ stroke: "rgba(255,255,255,0.05)",
1029
+ strokeWidth: "1"
1030
+ }
1031
+ ), /* @__PURE__ */ React8.createElement(
1032
+ "text",
1033
+ {
1034
+ x: padL - 4,
1035
+ y: g.y + 4,
1036
+ textAnchor: "end",
1037
+ fill: "rgba(255,255,255,0.25)",
1038
+ fontSize: "9"
1039
+ },
1040
+ g.val
1041
+ ))), /* @__PURE__ */ React8.createElement("polygon", { points: areaPoints, fill: "url(#lg)" }), /* @__PURE__ */ React8.createElement(
1042
+ "polyline",
1043
+ {
1044
+ points,
1045
+ fill: "none",
1046
+ stroke: accent,
1047
+ strokeWidth: "2",
1048
+ strokeLinejoin: "round",
1049
+ strokeLinecap: "round"
1050
+ }
1051
+ ), data.map((d, i) => {
1052
+ const isH = hovered === i;
1053
+ return /* @__PURE__ */ React8.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ React8.createElement("circle", { cx: getX(i), cy: getY(d.value), r: "10", fill: "transparent" }), /* @__PURE__ */ React8.createElement(
1054
+ "circle",
1055
+ {
1056
+ cx: getX(i),
1057
+ cy: getY(d.value),
1058
+ r: isH ? 5 : 3,
1059
+ fill: isH ? "#fff" : accent,
1060
+ stroke: accent,
1061
+ strokeWidth: "2",
1062
+ style: { transition: "all 0.15s" }
1063
+ }
1064
+ ), showValues && isH && /* @__PURE__ */ React8.createElement(
1065
+ "text",
1066
+ {
1067
+ x: getX(i),
1068
+ y: getY(d.value) - 10,
1069
+ textAnchor: "middle",
1070
+ fill: "#fff",
1071
+ fontSize: "9",
1072
+ fontWeight: "700"
1073
+ },
1074
+ d.value
1075
+ ), /* @__PURE__ */ React8.createElement(
1076
+ "text",
1077
+ {
1078
+ x: getX(i),
1079
+ y: H - 6,
1080
+ textAnchor: "middle",
1081
+ fill: "rgba(255,255,255,0.3)",
1082
+ fontSize: "9"
1083
+ },
1084
+ d.label
1085
+ ));
1086
+ }));
1087
+ const PieChart = () => {
1088
+ var _a, _b;
1089
+ const cx = W / 2, cy = H / 2 - 4, r = Math.min(H, W) / 2 - 24;
1090
+ const total = data.reduce((s, d) => s + d.value, 0);
1091
+ const colors = [
1092
+ accent,
1093
+ alpha(accent, 0.75),
1094
+ alpha(accent, 0.55),
1095
+ alpha(accent, 0.4),
1096
+ alpha(accent, 0.3),
1097
+ alpha(accent, 0.2),
1098
+ alpha(accent, 0.12)
1099
+ ];
1100
+ let startAngle = -Math.PI / 2;
1101
+ const slices = data.map((d, i) => {
1102
+ const angle = d.value / total * 2 * Math.PI;
1103
+ const x1 = cx + r * Math.cos(startAngle);
1104
+ const y1 = cy + r * Math.sin(startAngle);
1105
+ const x2 = cx + r * Math.cos(startAngle + angle);
1106
+ const y2 = cy + r * Math.sin(startAngle + angle);
1107
+ const lx = cx + (r + 14) * Math.cos(startAngle + angle / 2);
1108
+ const ly = cy + (r + 14) * Math.sin(startAngle + angle / 2);
1109
+ const large = angle > Math.PI ? 1 : 0;
1110
+ const path = `M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2} Z`;
1111
+ const slice = { path, color: colors[i % colors.length], d, angle, lx, ly, i };
1112
+ startAngle += angle;
1113
+ return slice;
1114
+ });
1115
+ return /* @__PURE__ */ React8.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, slices.map((s) => /* @__PURE__ */ React8.createElement("g", { key: s.i, onMouseEnter: () => setHovered(s.i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ React8.createElement(
1116
+ "path",
1117
+ {
1118
+ d: s.path,
1119
+ fill: s.color,
1120
+ stroke: bg,
1121
+ strokeWidth: "2",
1122
+ transform: hovered === s.i ? `translate(${Math.cos(s.angle / 2 - Math.PI / 2) * 4}, ${Math.sin(s.angle / 2 - Math.PI / 2) * 4})` : "",
1123
+ style: { transition: "transform 0.15s", cursor: "pointer" }
1124
+ }
1125
+ ))), hovered !== null && /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(
1126
+ "text",
1127
+ {
1128
+ x: cx,
1129
+ y: cy - 8,
1130
+ textAnchor: "middle",
1131
+ fill: "#fff",
1132
+ fontSize: "16",
1133
+ fontWeight: "800"
1134
+ },
1135
+ (_a = data[hovered]) == null ? void 0 : _a.value
1136
+ ), /* @__PURE__ */ React8.createElement(
1137
+ "text",
1138
+ {
1139
+ x: cx,
1140
+ y: cy + 10,
1141
+ textAnchor: "middle",
1142
+ fill: "rgba(255,255,255,0.4)",
1143
+ fontSize: "9"
1144
+ },
1145
+ (_b = data[hovered]) == null ? void 0 : _b.label
1146
+ )), hovered === null && /* @__PURE__ */ React8.createElement(
1147
+ "text",
1148
+ {
1149
+ x: cx,
1150
+ y: cy + 5,
1151
+ textAnchor: "middle",
1152
+ fill: "rgba(255,255,255,0.2)",
1153
+ fontSize: "9"
1154
+ },
1155
+ "Hover slice"
1156
+ ));
1157
+ };
1158
+ const AreaChart = () => /* @__PURE__ */ React8.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, /* @__PURE__ */ React8.createElement("defs", null, /* @__PURE__ */ React8.createElement("linearGradient", { id: "ag", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ React8.createElement("stop", { offset: "0%", stopColor: accent, stopOpacity: "0.5" }), /* @__PURE__ */ React8.createElement("stop", { offset: "100%", stopColor: accent, stopOpacity: "0.02" }))), showGrid && gridLines.map((g, i) => /* @__PURE__ */ React8.createElement("g", { key: i }, /* @__PURE__ */ React8.createElement(
1159
+ "line",
1160
+ {
1161
+ x1: padL,
1162
+ y1: g.y,
1163
+ x2: W - padR,
1164
+ y2: g.y,
1165
+ stroke: "rgba(255,255,255,0.05)",
1166
+ strokeWidth: "1"
1167
+ }
1168
+ ), /* @__PURE__ */ React8.createElement(
1169
+ "text",
1170
+ {
1171
+ x: padL - 4,
1172
+ y: g.y + 4,
1173
+ textAnchor: "end",
1174
+ fill: "rgba(255,255,255,0.25)",
1175
+ fontSize: "9"
1176
+ },
1177
+ g.val
1178
+ ))), /* @__PURE__ */ React8.createElement("polygon", { points: areaPoints, fill: "url(#ag)" }), /* @__PURE__ */ React8.createElement(
1179
+ "polyline",
1180
+ {
1181
+ points,
1182
+ fill: "none",
1183
+ stroke: accent,
1184
+ strokeWidth: "1.5",
1185
+ strokeLinejoin: "round",
1186
+ strokeLinecap: "round"
1187
+ }
1188
+ ), data.map((d, i) => /* @__PURE__ */ React8.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ React8.createElement("rect", { x: getX(i) - 12, y: padT, width: 24, height: chartH, fill: "transparent" }), hovered === i && /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(
1189
+ "line",
1190
+ {
1191
+ x1: getX(i),
1192
+ y1: padT,
1193
+ x2: getX(i),
1194
+ y2: padT + chartH,
1195
+ stroke: "rgba(255,255,255,0.1)",
1196
+ strokeWidth: "1",
1197
+ strokeDasharray: "3 3"
1198
+ }
1199
+ ), showValues && /* @__PURE__ */ React8.createElement(
1200
+ "text",
1201
+ {
1202
+ x: getX(i),
1203
+ y: getY(d.value) - 10,
1204
+ textAnchor: "middle",
1205
+ fill: "#fff",
1206
+ fontSize: "9",
1207
+ fontWeight: "700"
1208
+ },
1209
+ d.value
1210
+ )), /* @__PURE__ */ React8.createElement(
1211
+ "text",
1212
+ {
1213
+ x: getX(i),
1214
+ y: H - 6,
1215
+ textAnchor: "middle",
1216
+ fill: "rgba(255,255,255,0.3)",
1217
+ fontSize: "9"
1218
+ },
1219
+ d.label
1220
+ ))));
1221
+ const renderChart = () => {
1222
+ if (type === "line") return /* @__PURE__ */ React8.createElement(LineChart, null);
1223
+ if (type === "pie") return /* @__PURE__ */ React8.createElement(PieChart, null);
1224
+ if (type === "area") return /* @__PURE__ */ React8.createElement(AreaChart, null);
1225
+ return /* @__PURE__ */ React8.createElement(BarChart, null);
1226
+ };
1227
+ return /* @__PURE__ */ React8.createElement("div", { style: {
1228
+ background: bg,
1229
+ borderRadius: radius,
1230
+ padding: "20px",
1231
+ fontFamily: "system-ui, sans-serif",
1232
+ border: "1px solid rgba(255,255,255,0.07)",
1233
+ width: "100%",
1234
+ maxWidth: "360px",
1235
+ boxSizing: "border-box"
1236
+ } }, /* @__PURE__ */ React8.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "16px" } }, /* @__PURE__ */ React8.createElement("p", { style: { fontSize: "14px", fontWeight: "700", color: "#fff", margin: 0 } }, title), /* @__PURE__ */ React8.createElement("span", { style: {
1237
+ fontSize: "10px",
1238
+ fontWeight: "700",
1239
+ padding: "3px 9px",
1240
+ borderRadius: "6px",
1241
+ background: alpha(accent, 0.12),
1242
+ color: accent,
1243
+ border: `1px solid ${alpha(accent, 0.25)}`,
1244
+ textTransform: "capitalize"
1245
+ } }, type)), renderChart());
1246
+ };
1247
+
1248
+ // src/components/ImageCard/ImageCard.jsx
1249
+ import React9, { useState as useState7 } from "react";
1250
+ var ImageCard = ({
1251
+ image = "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=600&q=80",
1252
+ tag = "Travel",
1253
+ title = "Discover the Hidden Peaks of the Himalayas",
1254
+ description = "A breathtaking journey through untouched landscapes, ancient monasteries, and snow-capped summits that few have ever seen.",
1255
+ buttonText = "Read More",
1256
+ accent = "#6366f1",
1257
+ bg = "#0f172a",
1258
+ radius = "20px",
1259
+ onButtonClick = () => {
1260
+ }
1261
+ }) => {
1262
+ const [hovered, setHovered] = useState7(false);
1263
+ const alpha = (hex, op) => {
1264
+ const r = parseInt(hex.slice(1, 3), 16);
1265
+ const g = parseInt(hex.slice(3, 5), 16);
1266
+ const b = parseInt(hex.slice(5, 7), 16);
1267
+ return `rgba(${r},${g},${b},${op})`;
1268
+ };
1269
+ return /* @__PURE__ */ React9.createElement(
1270
+ "div",
1271
+ {
1272
+ onMouseEnter: () => setHovered(true),
1273
+ onMouseLeave: () => setHovered(false),
1274
+ style: {
1275
+ background: bg,
1276
+ borderRadius: radius,
1277
+ overflow: "hidden",
1278
+ width: "300px",
1279
+ border: `1px solid ${hovered ? alpha(accent, 0.3) : "rgba(255,255,255,0.07)"}`,
1280
+ fontFamily: "system-ui, sans-serif",
1281
+ transition: "border-color 0.25s, transform 0.25s",
1282
+ transform: hovered ? "translateY(-4px)" : "none",
1283
+ boxShadow: hovered ? `0 16px 40px rgba(0,0,0,0.5)` : "0 4px 20px rgba(0,0,0,0.3)"
1284
+ }
1285
+ },
1286
+ /* @__PURE__ */ React9.createElement("div", { style: { position: "relative", width: "100%", height: "180px", overflow: "hidden" } }, /* @__PURE__ */ React9.createElement(
1287
+ "img",
1288
+ {
1289
+ src: image,
1290
+ alt: title,
1291
+ style: {
1292
+ width: "100%",
1293
+ height: "100%",
1294
+ objectFit: "cover",
1295
+ transform: hovered ? "scale(1.05)" : "scale(1)",
1296
+ transition: "transform 0.4s ease"
1297
+ }
1298
+ }
1299
+ ), /* @__PURE__ */ React9.createElement("div", { style: {
1300
+ position: "absolute",
1301
+ inset: 0,
1302
+ background: "linear-gradient(to top, rgba(0,0,0,0.5) 0%, transparent 60%)"
1303
+ } }), tag && /* @__PURE__ */ React9.createElement("div", { style: {
1304
+ position: "absolute",
1305
+ top: "12px",
1306
+ left: "12px",
1307
+ padding: "4px 10px",
1308
+ borderRadius: "20px",
1309
+ background: alpha(accent, 0.85),
1310
+ fontSize: "10px",
1311
+ fontWeight: "700",
1312
+ color: "#fff",
1313
+ letterSpacing: "0.5px",
1314
+ textTransform: "uppercase"
1315
+ } }, tag)),
1316
+ /* @__PURE__ */ React9.createElement("div", { style: { padding: "18px" } }, /* @__PURE__ */ React9.createElement("h3", { style: {
1317
+ fontSize: "15px",
1318
+ fontWeight: "700",
1319
+ color: "#fff",
1320
+ margin: "0 0 8px",
1321
+ lineHeight: 1.4
1322
+ } }, title), /* @__PURE__ */ React9.createElement("p", { style: {
1323
+ fontSize: "13px",
1324
+ color: "rgba(255,255,255,0.45)",
1325
+ lineHeight: 1.65,
1326
+ margin: "0 0 18px"
1327
+ } }, description), /* @__PURE__ */ React9.createElement(
1328
+ "button",
1329
+ {
1330
+ onClick: onButtonClick,
1331
+ style: {
1332
+ width: "100%",
1333
+ padding: "11px",
1334
+ borderRadius: "12px",
1335
+ border: "none",
1336
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.7)})`,
1337
+ color: "#fff",
1338
+ fontSize: "13px",
1339
+ fontWeight: "700",
1340
+ cursor: "pointer",
1341
+ fontFamily: "inherit",
1342
+ transition: "opacity 0.2s"
1343
+ },
1344
+ onMouseEnter: (e) => e.currentTarget.style.opacity = "0.85",
1345
+ onMouseLeave: (e) => e.currentTarget.style.opacity = "1"
1346
+ },
1347
+ buttonText
1348
+ ))
1349
+ );
1350
+ };
1351
+
1352
+ // src/components/ImageSlider/ImageSlider.jsx
1353
+ import React10, { useState as useState8 } from "react";
1354
+ var ImageSlider = ({
1355
+ images = [
1356
+ {
1357
+ src: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=600&q=80",
1358
+ title: "Hidden Peaks of Himalayas",
1359
+ tag: "Travel"
1360
+ },
1361
+ {
1362
+ src: "https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?w=600&q=80",
1363
+ title: "City Lights at Night",
1364
+ tag: "Urban"
1365
+ },
1366
+ {
1367
+ src: "https://images.unsplash.com/photo-1500534314209-a25ddb2bd429?w=600&q=80",
1368
+ title: "Tropical Beach Paradise",
1369
+ tag: "Nature"
1370
+ },
1371
+ {
1372
+ src: "https://images.unsplash.com/photo-1519681393784-d120267933ba?w=600&q=80",
1373
+ title: "Starry Mountain Night",
1374
+ tag: "Adventure"
1375
+ }
1376
+ ],
1377
+ accent = "#6366f1",
1378
+ bg = "#0f172a",
1379
+ radius = "20px",
1380
+ showDots = true,
1381
+ showCaption = true,
1382
+ autoPlay = false
1383
+ }) => {
1384
+ const [current, setCurrent] = useState8(0);
1385
+ const [dir, setDir] = useState8(null);
1386
+ const alpha = (hex, op) => {
1387
+ const r = parseInt(hex.slice(1, 3), 16);
1388
+ const g = parseInt(hex.slice(3, 5), 16);
1389
+ const b = parseInt(hex.slice(5, 7), 16);
1390
+ return `rgba(${r},${g},${b},${op})`;
1391
+ };
1392
+ const prev = () => {
1393
+ setDir("left");
1394
+ setCurrent((c) => (c - 1 + images.length) % images.length);
1395
+ };
1396
+ const next = () => {
1397
+ setDir("right");
1398
+ setCurrent((c) => (c + 1) % images.length);
1399
+ };
1400
+ const goTo = (i) => {
1401
+ setDir(i > current ? "right" : "left");
1402
+ setCurrent(i);
1403
+ };
1404
+ const img = images[current];
1405
+ return /* @__PURE__ */ React10.createElement("div", { style: {
1406
+ background: bg,
1407
+ borderRadius: radius,
1408
+ overflow: "hidden",
1409
+ width: "300px",
1410
+ border: "1px solid rgba(255,255,255,0.07)",
1411
+ fontFamily: "system-ui, sans-serif",
1412
+ boxShadow: "0 10px 40px rgba(0,0,0,0.4)"
1413
+ } }, /* @__PURE__ */ React10.createElement("div", { style: { position: "relative", width: "100%", height: "200px", overflow: "hidden", background: "#000" } }, /* @__PURE__ */ React10.createElement(
1414
+ "img",
1415
+ {
1416
+ key: current,
1417
+ src: img.src,
1418
+ alt: img.title,
1419
+ style: {
1420
+ width: "100%",
1421
+ height: "100%",
1422
+ objectFit: "cover",
1423
+ animation: `sliderFade 0.35s ease`
1424
+ }
1425
+ }
1426
+ ), /* @__PURE__ */ React10.createElement("style", null, `@keyframes sliderFade { from { opacity: 0; transform: scale(1.03); } to { opacity: 1; transform: scale(1); } }`), /* @__PURE__ */ React10.createElement("div", { style: {
1427
+ position: "absolute",
1428
+ inset: 0,
1429
+ background: "linear-gradient(to top, rgba(0,0,0,0.65) 0%, transparent 55%)"
1430
+ } }), img.tag && /* @__PURE__ */ React10.createElement("div", { style: {
1431
+ position: "absolute",
1432
+ top: "12px",
1433
+ left: "12px",
1434
+ padding: "4px 10px",
1435
+ borderRadius: "20px",
1436
+ background: alpha(accent, 0.85),
1437
+ fontSize: "10px",
1438
+ fontWeight: "700",
1439
+ color: "#fff",
1440
+ letterSpacing: "0.5px",
1441
+ textTransform: "uppercase"
1442
+ } }, img.tag), /* @__PURE__ */ React10.createElement("div", { style: {
1443
+ position: "absolute",
1444
+ top: "12px",
1445
+ right: "12px",
1446
+ padding: "4px 10px",
1447
+ borderRadius: "20px",
1448
+ background: "rgba(0,0,0,0.5)",
1449
+ fontSize: "10px",
1450
+ fontWeight: "600",
1451
+ color: "rgba(255,255,255,0.7)"
1452
+ } }, current + 1, " / ", images.length), /* @__PURE__ */ React10.createElement(
1453
+ "button",
1454
+ {
1455
+ onClick: prev,
1456
+ style: {
1457
+ position: "absolute",
1458
+ left: "10px",
1459
+ top: "50%",
1460
+ transform: "translateY(-50%)",
1461
+ width: "34px",
1462
+ height: "34px",
1463
+ borderRadius: "50%",
1464
+ background: "rgba(0,0,0,0.5)",
1465
+ border: "1px solid rgba(255,255,255,0.15)",
1466
+ color: "#fff",
1467
+ cursor: "pointer",
1468
+ display: "flex",
1469
+ alignItems: "center",
1470
+ justifyContent: "center",
1471
+ transition: "background 0.2s",
1472
+ padding: 0
1473
+ },
1474
+ onMouseEnter: (e) => e.currentTarget.style.background = alpha(accent, 0.8),
1475
+ onMouseLeave: (e) => e.currentTarget.style.background = "rgba(0,0,0,0.5)"
1476
+ },
1477
+ /* @__PURE__ */ React10.createElement(
1478
+ "svg",
1479
+ {
1480
+ width: "14",
1481
+ height: "14",
1482
+ viewBox: "0 0 24 24",
1483
+ fill: "none",
1484
+ stroke: "currentColor",
1485
+ strokeWidth: "2.5",
1486
+ strokeLinecap: "round"
1487
+ },
1488
+ /* @__PURE__ */ React10.createElement("polyline", { points: "15 18 9 12 15 6" })
1489
+ )
1490
+ ), /* @__PURE__ */ React10.createElement(
1491
+ "button",
1492
+ {
1493
+ onClick: next,
1494
+ style: {
1495
+ position: "absolute",
1496
+ right: "10px",
1497
+ top: "50%",
1498
+ transform: "translateY(-50%)",
1499
+ width: "34px",
1500
+ height: "34px",
1501
+ borderRadius: "50%",
1502
+ background: "rgba(0,0,0,0.5)",
1503
+ border: "1px solid rgba(255,255,255,0.15)",
1504
+ color: "#fff",
1505
+ cursor: "pointer",
1506
+ display: "flex",
1507
+ alignItems: "center",
1508
+ justifyContent: "center",
1509
+ transition: "background 0.2s",
1510
+ padding: 0
1511
+ },
1512
+ onMouseEnter: (e) => e.currentTarget.style.background = alpha(accent, 0.8),
1513
+ onMouseLeave: (e) => e.currentTarget.style.background = "rgba(0,0,0,0.5)"
1514
+ },
1515
+ /* @__PURE__ */ React10.createElement(
1516
+ "svg",
1517
+ {
1518
+ width: "14",
1519
+ height: "14",
1520
+ viewBox: "0 0 24 24",
1521
+ fill: "none",
1522
+ stroke: "currentColor",
1523
+ strokeWidth: "2.5",
1524
+ strokeLinecap: "round"
1525
+ },
1526
+ /* @__PURE__ */ React10.createElement("polyline", { points: "9 18 15 12 9 6" })
1527
+ )
1528
+ )), showCaption && /* @__PURE__ */ React10.createElement("div", { style: { padding: "14px 16px 4px" } }, /* @__PURE__ */ React10.createElement(
1529
+ "p",
1530
+ {
1531
+ style: {
1532
+ fontSize: "14px",
1533
+ fontWeight: "700",
1534
+ color: "#fff",
1535
+ margin: 0,
1536
+ lineHeight: 1.4,
1537
+ animation: "sliderFade 0.3s ease"
1538
+ },
1539
+ key: current + "-title"
1540
+ },
1541
+ img.title
1542
+ )), showDots && /* @__PURE__ */ React10.createElement("div", { style: {
1543
+ display: "flex",
1544
+ justifyContent: "center",
1545
+ gap: "6px",
1546
+ padding: "12px 16px 16px"
1547
+ } }, images.map((_, i) => /* @__PURE__ */ React10.createElement(
1548
+ "button",
1549
+ {
1550
+ key: i,
1551
+ onClick: () => goTo(i),
1552
+ style: {
1553
+ width: i === current ? "20px" : "6px",
1554
+ height: "6px",
1555
+ borderRadius: "3px",
1556
+ border: "none",
1557
+ cursor: "pointer",
1558
+ padding: 0,
1559
+ background: i === current ? accent : "rgba(255,255,255,0.2)",
1560
+ transition: "all 0.25s ease"
1561
+ }
1562
+ }
1563
+ ))));
1564
+ };
1565
+
1566
+ // src/components/BackgoundImageSlider/BackgoundImageSlider.jsx
1567
+ import React11, { useState as useState9, useEffect as useEffect4, useCallback } from "react";
1568
+ var BackgoundImageSlider = ({
1569
+ images = [
1570
+ {
1571
+ src: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1400&q=80",
1572
+ tag: "Travel",
1573
+ title: "Hidden Peaks of the Himalayas",
1574
+ description: "A breathtaking journey through untouched landscapes and ancient monasteries."
1575
+ },
1576
+ {
1577
+ src: "https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?w=1400&q=80",
1578
+ tag: "Urban",
1579
+ title: "City Lights at Night",
1580
+ description: "Explore the vibrant energy of the world's most iconic skylines after dark."
1581
+ },
1582
+ {
1583
+ src: "https://images.unsplash.com/photo-1500534314209-a25ddb2bd429?w=1400&q=80",
1584
+ tag: "Nature",
1585
+ title: "Tropical Beach Paradise",
1586
+ description: "Crystal clear waters and white sand beaches that feel like the edge of the world."
1587
+ },
1588
+ {
1589
+ src: "https://images.unsplash.com/photo-1519681393784-d120267933ba?w=1400&q=80",
1590
+ tag: "Adventure",
1591
+ title: "Starry Mountain Night",
1592
+ description: "Where silence meets the cosmos \u2014 a night sky like you've never seen before."
1593
+ }
1594
+ ],
1595
+ width = "100%",
1596
+ height = "520px",
1597
+ accent = "#6366f1",
1598
+ radius = "0px",
1599
+ showDots = true,
1600
+ autoPlay = false,
1601
+ autoPlayInterval = 4e3
1602
+ }) => {
1603
+ const [current, setCurrent] = useState9(0);
1604
+ const [animating, setAnimating] = useState9(false);
1605
+ const alpha = (hex, op) => {
1606
+ const r = parseInt(hex.slice(1, 3), 16);
1607
+ const g = parseInt(hex.slice(3, 5), 16);
1608
+ const b = parseInt(hex.slice(5, 7), 16);
1609
+ return `rgba(${r},${g},${b},${op})`;
1610
+ };
1611
+ const go = useCallback((index) => {
1612
+ if (animating) return;
1613
+ setAnimating(true);
1614
+ setCurrent((index + images.length) % images.length);
1615
+ setTimeout(() => setAnimating(false), 400);
1616
+ }, [animating, images.length]);
1617
+ const prev = () => go(current - 1);
1618
+ const next = () => go(current + 1);
1619
+ useEffect4(() => {
1620
+ if (!autoPlay) return;
1621
+ const t = setInterval(() => go(current + 1), autoPlayInterval);
1622
+ return () => clearInterval(t);
1623
+ }, [autoPlay, autoPlayInterval, current, go]);
1624
+ const img = images[current];
1625
+ return /* @__PURE__ */ React11.createElement(React11.Fragment, null, /* @__PURE__ */ React11.createElement("style", null, `
1626
+ @keyframes hs-fade { from { opacity: 0; transform: scale(1.04); } to { opacity: 1; transform: scale(1); } }
1627
+ @keyframes hs-up { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: translateY(0); } }
1628
+ .hs-prev:hover, .hs-next:hover { background: rgba(0,0,0,0.65) !important; border-color: rgba(255,255,255,0.35) !important; }
1629
+ `), /* @__PURE__ */ React11.createElement("div", { style: {
1630
+ position: "relative",
1631
+ width,
1632
+ height,
1633
+ borderRadius: radius,
1634
+ overflow: "hidden",
1635
+ fontFamily: "system-ui, -apple-system, sans-serif",
1636
+ userSelect: "none"
1637
+ } }, /* @__PURE__ */ React11.createElement(
1638
+ "img",
1639
+ {
1640
+ key: current,
1641
+ src: img.src,
1642
+ alt: img.title,
1643
+ style: {
1644
+ position: "absolute",
1645
+ inset: 0,
1646
+ width: "100%",
1647
+ height: "100%",
1648
+ objectFit: "cover",
1649
+ animation: "hs-fade 0.4s ease"
1650
+ }
1651
+ }
1652
+ ), /* @__PURE__ */ React11.createElement("div", { style: {
1653
+ position: "absolute",
1654
+ inset: 0,
1655
+ background: "linear-gradient(to top, rgba(0,0,0,0.75) 0%, rgba(0,0,0,0.2) 50%, rgba(0,0,0,0.1) 100%)"
1656
+ } }), img.tag && /* @__PURE__ */ React11.createElement(
1657
+ "div",
1658
+ {
1659
+ key: current + "-tag",
1660
+ style: {
1661
+ position: "absolute",
1662
+ top: "24px",
1663
+ left: "28px",
1664
+ padding: "5px 14px",
1665
+ borderRadius: "20px",
1666
+ background: alpha(accent, 0.85),
1667
+ fontSize: "11px",
1668
+ fontWeight: "700",
1669
+ color: "#fff",
1670
+ letterSpacing: "0.6px",
1671
+ textTransform: "uppercase",
1672
+ animation: "hs-up 0.4s ease"
1673
+ }
1674
+ },
1675
+ img.tag
1676
+ ), /* @__PURE__ */ React11.createElement("div", { style: {
1677
+ position: "absolute",
1678
+ top: "24px",
1679
+ right: "28px",
1680
+ padding: "5px 12px",
1681
+ borderRadius: "20px",
1682
+ background: "rgba(0,0,0,0.45)",
1683
+ fontSize: "11px",
1684
+ fontWeight: "600",
1685
+ color: "rgba(255,255,255,0.7)"
1686
+ } }, current + 1, " / ", images.length), /* @__PURE__ */ React11.createElement(
1687
+ "button",
1688
+ {
1689
+ className: "hs-prev",
1690
+ onClick: prev,
1691
+ style: {
1692
+ position: "absolute",
1693
+ left: "20px",
1694
+ top: "50%",
1695
+ transform: "translateY(-50%)",
1696
+ width: "44px",
1697
+ height: "44px",
1698
+ borderRadius: "50%",
1699
+ background: "rgba(0,0,0,0.4)",
1700
+ border: "1px solid rgba(255,255,255,0.2)",
1701
+ color: "#fff",
1702
+ cursor: "pointer",
1703
+ display: "flex",
1704
+ alignItems: "center",
1705
+ justifyContent: "center",
1706
+ transition: "all 0.2s",
1707
+ padding: 0,
1708
+ zIndex: 10
1709
+ }
1710
+ },
1711
+ /* @__PURE__ */ React11.createElement(
1712
+ "svg",
1713
+ {
1714
+ width: "18",
1715
+ height: "18",
1716
+ viewBox: "0 0 24 24",
1717
+ fill: "none",
1718
+ stroke: "currentColor",
1719
+ strokeWidth: "2.5",
1720
+ strokeLinecap: "round",
1721
+ strokeLinejoin: "round"
1722
+ },
1723
+ /* @__PURE__ */ React11.createElement("polyline", { points: "15 18 9 12 15 6" })
1724
+ )
1725
+ ), /* @__PURE__ */ React11.createElement(
1726
+ "button",
1727
+ {
1728
+ className: "hs-next",
1729
+ onClick: next,
1730
+ style: {
1731
+ position: "absolute",
1732
+ right: "20px",
1733
+ top: "50%",
1734
+ transform: "translateY(-50%)",
1735
+ width: "44px",
1736
+ height: "44px",
1737
+ borderRadius: "50%",
1738
+ background: "rgba(0,0,0,0.4)",
1739
+ border: "1px solid rgba(255,255,255,0.2)",
1740
+ color: "#fff",
1741
+ cursor: "pointer",
1742
+ display: "flex",
1743
+ alignItems: "center",
1744
+ justifyContent: "center",
1745
+ transition: "all 0.2s",
1746
+ padding: 0,
1747
+ zIndex: 10
1748
+ }
1749
+ },
1750
+ /* @__PURE__ */ React11.createElement(
1751
+ "svg",
1752
+ {
1753
+ width: "18",
1754
+ height: "18",
1755
+ viewBox: "0 0 24 24",
1756
+ fill: "none",
1757
+ stroke: "currentColor",
1758
+ strokeWidth: "2.5",
1759
+ strokeLinecap: "round",
1760
+ strokeLinejoin: "round"
1761
+ },
1762
+ /* @__PURE__ */ React11.createElement("polyline", { points: "9 18 15 12 9 6" })
1763
+ )
1764
+ ), /* @__PURE__ */ React11.createElement("div", { style: {
1765
+ position: "absolute",
1766
+ bottom: showDots ? "56px" : "28px",
1767
+ left: "28px",
1768
+ right: "28px",
1769
+ zIndex: 5
1770
+ } }, /* @__PURE__ */ React11.createElement(
1771
+ "h2",
1772
+ {
1773
+ key: current + "-title",
1774
+ style: {
1775
+ fontSize: "clamp(20px, 4vw, 36px)",
1776
+ fontWeight: "800",
1777
+ color: "#fff",
1778
+ margin: "0 0 8px",
1779
+ lineHeight: 1.25,
1780
+ textShadow: "0 2px 12px rgba(0,0,0,0.4)",
1781
+ animation: "hs-up 0.45s ease",
1782
+ maxWidth: "600px"
1783
+ }
1784
+ },
1785
+ img.title
1786
+ ), /* @__PURE__ */ React11.createElement(
1787
+ "p",
1788
+ {
1789
+ key: current + "-desc",
1790
+ style: {
1791
+ fontSize: "clamp(13px, 2vw, 15px)",
1792
+ color: "rgba(255,255,255,0.7)",
1793
+ margin: 0,
1794
+ lineHeight: 1.6,
1795
+ textShadow: "0 1px 6px rgba(0,0,0,0.5)",
1796
+ animation: "hs-up 0.5s ease",
1797
+ maxWidth: "500px"
1798
+ }
1799
+ },
1800
+ img.description
1801
+ )), showDots && /* @__PURE__ */ React11.createElement("div", { style: {
1802
+ position: "absolute",
1803
+ bottom: "20px",
1804
+ left: 0,
1805
+ right: 0,
1806
+ display: "flex",
1807
+ justifyContent: "center",
1808
+ gap: "6px",
1809
+ zIndex: 5
1810
+ } }, images.map((_, i) => /* @__PURE__ */ React11.createElement(
1811
+ "button",
1812
+ {
1813
+ key: i,
1814
+ onClick: () => go(i),
1815
+ style: {
1816
+ width: i === current ? "24px" : "7px",
1817
+ height: "7px",
1818
+ borderRadius: "4px",
1819
+ border: "none",
1820
+ padding: 0,
1821
+ cursor: "pointer",
1822
+ background: i === current ? accent : "rgba(255,255,255,0.4)",
1823
+ transition: "all 0.3s ease"
1824
+ }
1825
+ }
1826
+ )))));
1827
+ };
1828
+
1829
+ // src/components/PageLoader/PageLoader.jsx
1830
+ import React12, { useState as useState10, useEffect as useEffect5 } from "react";
1831
+ var PageLoader = ({
1832
+ logo = "VirtualAI",
1833
+ accent = "#6366f1",
1834
+ bg = "",
1835
+ type = "spinner",
1836
+ loadingText = "Loading...",
1837
+ subText = "",
1838
+ duration = 6e3,
1839
+ onComplete = () => {
1840
+ }
1841
+ }) => {
1842
+ const [progress, setProgress] = useState10(0);
1843
+ const [done, setDone] = useState10(false);
1844
+ const alpha = (hex, op) => {
1845
+ const r = parseInt(hex.slice(1, 3), 16);
1846
+ const g = parseInt(hex.slice(3, 5), 16);
1847
+ const b = parseInt(hex.slice(5, 7), 16);
1848
+ return `rgba(${r},${g},${b},${op})`;
1849
+ };
1850
+ useEffect5(() => {
1851
+ const steps = 100;
1852
+ const interval = duration / steps;
1853
+ let current = 0;
1854
+ const timer = setInterval(() => {
1855
+ current += 1;
1856
+ setProgress(current);
1857
+ if (current >= 100) {
1858
+ clearInterval(timer);
1859
+ setTimeout(() => {
1860
+ setDone(true);
1861
+ onComplete();
1862
+ }, 300);
1863
+ }
1864
+ }, interval);
1865
+ return () => clearInterval(timer);
1866
+ }, [duration]);
1867
+ if (done) return null;
1868
+ return /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement("style", null, `
1869
+ @keyframes pl-spin { to { transform: rotate(360deg); } }
1870
+ @keyframes pl-pulse { 0%,100%{transform:scale(1);opacity:1} 50%{transform:scale(1.15);opacity:0.7} }
1871
+ @keyframes pl-dot { 0%,80%,100%{transform:scale(0.6);opacity:0.3} 40%{transform:scale(1);opacity:1} }
1872
+ @keyframes pl-fade { from{opacity:0;transform:translateY(10px)} to{opacity:1;transform:translateY(0)} }
1873
+ @keyframes pl-bar { 0%{background-position:0% 50%} 100%{background-position:200% 50%} }
1874
+ `), /* @__PURE__ */ React12.createElement("div", { style: {
1875
+ width: "100%",
1876
+ height: "100%",
1877
+ background: bg,
1878
+ display: "flex",
1879
+ flexDirection: "column",
1880
+ alignItems: "center",
1881
+ justifyContent: "center",
1882
+ gap: "28px",
1883
+ fontFamily: "system-ui, -apple-system, sans-serif",
1884
+ animation: "pl-fade 0.3s ease"
1885
+ } }, /* @__PURE__ */ React12.createElement("div", { style: {
1886
+ position: "absolute",
1887
+ top: "-100px",
1888
+ left: "-100px",
1889
+ width: "400px",
1890
+ height: "400px",
1891
+ borderRadius: "50%",
1892
+ background: `radial-gradient(circle, ${alpha(accent, 0.12)}, transparent 70%)`,
1893
+ filter: "blur(60px)",
1894
+ pointerEvents: "none"
1895
+ } }), /* @__PURE__ */ React12.createElement("div", { style: {
1896
+ position: "absolute",
1897
+ bottom: "-100px",
1898
+ right: "-100px",
1899
+ width: "350px",
1900
+ height: "350px",
1901
+ borderRadius: "50%",
1902
+ background: `radial-gradient(circle, ${alpha(accent, 0.08)}, transparent 70%)`,
1903
+ filter: "blur(60px)",
1904
+ pointerEvents: "none"
1905
+ } }), /* @__PURE__ */ React12.createElement("div", { style: { display: "flex", alignItems: "center", gap: "10px", animation: "pl-fade 0.4s ease" } }, /* @__PURE__ */ React12.createElement("div", { style: {
1906
+ width: "36px",
1907
+ height: "36px",
1908
+ borderRadius: "10px",
1909
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.6)})`,
1910
+ display: "flex",
1911
+ alignItems: "center",
1912
+ justifyContent: "center",
1913
+ fontSize: "16px",
1914
+ fontWeight: "800",
1915
+ color: "#fff",
1916
+ animation: type === "pulse" ? `pl-pulse 1.5s ease infinite` : "none"
1917
+ } }, logo[0]), /* @__PURE__ */ React12.createElement("span", { style: { fontSize: "20px", fontWeight: "800", color: "#fff", letterSpacing: "-0.5px" } }, logo)), type === "spinner" && /* @__PURE__ */ React12.createElement("div", { style: { position: "relative", width: "56px", height: "56px" } }, /* @__PURE__ */ React12.createElement("svg", { width: "56", height: "56", viewBox: "0 0 56 56" }, /* @__PURE__ */ React12.createElement(
1918
+ "circle",
1919
+ {
1920
+ cx: "28",
1921
+ cy: "28",
1922
+ r: "22",
1923
+ fill: "none",
1924
+ stroke: alpha(accent, 0.12),
1925
+ strokeWidth: "4"
1926
+ }
1927
+ ), /* @__PURE__ */ React12.createElement(
1928
+ "circle",
1929
+ {
1930
+ cx: "28",
1931
+ cy: "28",
1932
+ r: "22",
1933
+ fill: "none",
1934
+ stroke: accent,
1935
+ strokeWidth: "4",
1936
+ strokeLinecap: "round",
1937
+ strokeDasharray: "34.8 104.4",
1938
+ style: { transformOrigin: "center", animation: "pl-spin 0.9s linear infinite" }
1939
+ }
1940
+ )), /* @__PURE__ */ React12.createElement("span", { style: {
1941
+ position: "absolute",
1942
+ inset: 0,
1943
+ display: "flex",
1944
+ alignItems: "center",
1945
+ justifyContent: "center",
1946
+ fontSize: "11px",
1947
+ fontWeight: "700",
1948
+ color: accent
1949
+ } }, Math.round(progress), "%")), type === "dots" && /* @__PURE__ */ React12.createElement("div", { style: { display: "flex", gap: "10px", alignItems: "center" } }, [0, 1, 2].map((i) => /* @__PURE__ */ React12.createElement("div", { key: i, style: {
1950
+ width: "12px",
1951
+ height: "12px",
1952
+ borderRadius: "50%",
1953
+ background: accent,
1954
+ animation: `pl-dot 1.2s ease infinite`,
1955
+ animationDelay: `${i * 0.2}s`
1956
+ } }))), type === "pulse" && /* @__PURE__ */ React12.createElement("div", { style: { position: "relative", width: "56px", height: "56px" } }, [0, 1].map((i) => /* @__PURE__ */ React12.createElement("div", { key: i, style: {
1957
+ position: "absolute",
1958
+ inset: 0,
1959
+ borderRadius: "50%",
1960
+ background: alpha(accent, 0.3),
1961
+ animation: `pl-pulse 1.5s ease infinite`,
1962
+ animationDelay: `${i * 0.4}s`
1963
+ } })), /* @__PURE__ */ React12.createElement("div", { style: {
1964
+ position: "absolute",
1965
+ inset: "30%",
1966
+ borderRadius: "50%",
1967
+ background: accent
1968
+ } })), type === "ring" && /* @__PURE__ */ React12.createElement("div", { style: {
1969
+ width: "52px",
1970
+ height: "52px",
1971
+ borderRadius: "50%",
1972
+ border: `4px solid ${alpha(accent, 0.15)}`,
1973
+ borderTop: `4px solid ${accent}`,
1974
+ borderRight: `4px solid ${accent}`,
1975
+ animation: "pl-spin 0.9s linear infinite"
1976
+ } }), type === "bar" && /* @__PURE__ */ React12.createElement("div", { style: { width: "200px", display: "flex", flexDirection: "column", gap: "8px" } }, /* @__PURE__ */ React12.createElement("div", { style: {
1977
+ width: "100%",
1978
+ height: "4px",
1979
+ background: alpha(accent, 0.15),
1980
+ borderRadius: "2px",
1981
+ overflow: "hidden"
1982
+ } }, /* @__PURE__ */ React12.createElement("div", { style: {
1983
+ height: "100%",
1984
+ width: `${progress}%`,
1985
+ borderRadius: "2px",
1986
+ background: `linear-gradient(90deg, ${accent}, ${alpha(accent, 0.6)}, ${accent})`,
1987
+ backgroundSize: "200% 100%",
1988
+ animation: "pl-bar 1.2s linear infinite",
1989
+ transition: "width 0.03s linear"
1990
+ } })), /* @__PURE__ */ React12.createElement("div", { style: {
1991
+ display: "flex",
1992
+ justifyContent: "space-between",
1993
+ fontSize: "11px",
1994
+ color: "rgba(255,255,255,0.3)"
1995
+ } }, /* @__PURE__ */ React12.createElement("span", null, loadingText), /* @__PURE__ */ React12.createElement("span", null, Math.round(progress), "%")), subText && /* @__PURE__ */ React12.createElement("p", { style: { fontSize: "12px", color: "rgba(255,255,255,0.18)", margin: "4px 0 0", textAlign: "center" } }, subText)), type !== "bar" && /* @__PURE__ */ React12.createElement("div", { style: { textAlign: "center" } }, /* @__PURE__ */ React12.createElement("p", { style: { fontSize: "13px", color: "rgba(255,255,255,0.3)", margin: "0 0 4px" } }, loadingText), subText && /* @__PURE__ */ React12.createElement("p", { style: { fontSize: "12px", color: "rgba(255,255,255,0.15)", margin: 0 } }, subText))));
1996
+ };
1997
+
1998
+ // src/components/OTPInput/OTPInput.jsx
1999
+ import React13, { useState as useState11, useRef, useEffect as useEffect6 } from "react";
2000
+ var OTPInput = ({
2001
+ length = 6,
2002
+ onComplete = () => {
2003
+ },
2004
+ onCancel = () => {
2005
+ },
2006
+ accent = "#6366f1",
2007
+ bg = "#0f172a",
2008
+ radius = "16px",
2009
+ label = "Enter verification code",
2010
+ subLabel = "We sent a code to your email",
2011
+ errorText = "",
2012
+ resendText = "Resend code",
2013
+ onResend = () => {
2014
+ }
2015
+ }) => {
2016
+ const [otp, setOtp] = useState11(Array(length).fill(""));
2017
+ const [focused, setFocused] = useState11(0);
2018
+ const [completed, setCompleted] = useState11(false);
2019
+ const [resendTimer, setResendTimer] = useState11(30);
2020
+ const inputs = useRef([]);
2021
+ const alpha = (hex, op) => {
2022
+ const r = parseInt(hex.slice(1, 3), 16);
2023
+ const g = parseInt(hex.slice(3, 5), 16);
2024
+ const b = parseInt(hex.slice(5, 7), 16);
2025
+ return `rgba(${r},${g},${b},${op})`;
2026
+ };
2027
+ useEffect6(() => {
2028
+ var _a;
2029
+ (_a = inputs.current[0]) == null ? void 0 : _a.focus();
2030
+ }, []);
2031
+ useEffect6(() => {
2032
+ if (resendTimer <= 0) return;
2033
+ const t = setInterval(() => setResendTimer((s) => s - 1), 1e3);
2034
+ return () => clearInterval(t);
2035
+ }, [resendTimer]);
2036
+ const handleChange = (e, i) => {
2037
+ var _a;
2038
+ const val = e.target.value.replace(/\D/g, "").slice(-1);
2039
+ const newOtp = [...otp];
2040
+ newOtp[i] = val;
2041
+ setOtp(newOtp);
2042
+ if (val && i < length - 1) {
2043
+ (_a = inputs.current[i + 1]) == null ? void 0 : _a.focus();
2044
+ setFocused(i + 1);
2045
+ }
2046
+ if (newOtp.every((v) => v !== "")) {
2047
+ setCompleted(true);
2048
+ onComplete(newOtp.join(""));
2049
+ } else {
2050
+ setCompleted(false);
2051
+ }
2052
+ };
2053
+ const handleKeyDown = (e, i) => {
2054
+ var _a, _b, _c;
2055
+ if (e.key === "Backspace") {
2056
+ const newOtp = [...otp];
2057
+ if (otp[i]) {
2058
+ newOtp[i] = "";
2059
+ setOtp(newOtp);
2060
+ } else if (i > 0) {
2061
+ newOtp[i - 1] = "";
2062
+ setOtp(newOtp);
2063
+ (_a = inputs.current[i - 1]) == null ? void 0 : _a.focus();
2064
+ setFocused(i - 1);
2065
+ }
2066
+ setCompleted(false);
2067
+ }
2068
+ if (e.key === "ArrowLeft" && i > 0) {
2069
+ (_b = inputs.current[i - 1]) == null ? void 0 : _b.focus();
2070
+ setFocused(i - 1);
2071
+ }
2072
+ if (e.key === "ArrowRight" && i < length - 1) {
2073
+ (_c = inputs.current[i + 1]) == null ? void 0 : _c.focus();
2074
+ setFocused(i + 1);
2075
+ }
2076
+ };
2077
+ const handlePaste = (e) => {
2078
+ var _a;
2079
+ e.preventDefault();
2080
+ const pasted = e.clipboardData.getData("text").replace(/\D/g, "").slice(0, length);
2081
+ if (!pasted) return;
2082
+ const newOtp = [...otp];
2083
+ pasted.split("").forEach((ch, i) => {
2084
+ newOtp[i] = ch;
2085
+ });
2086
+ setOtp(newOtp);
2087
+ const nextIndex = Math.min(pasted.length, length - 1);
2088
+ (_a = inputs.current[nextIndex]) == null ? void 0 : _a.focus();
2089
+ setFocused(nextIndex);
2090
+ if (newOtp.every((v) => v !== "")) {
2091
+ setCompleted(true);
2092
+ onComplete(newOtp.join(""));
2093
+ }
2094
+ };
2095
+ const handleResend = () => {
2096
+ var _a;
2097
+ setOtp(Array(length).fill(""));
2098
+ setCompleted(false);
2099
+ setResendTimer(30);
2100
+ (_a = inputs.current[0]) == null ? void 0 : _a.focus();
2101
+ setFocused(0);
2102
+ onResend();
2103
+ };
2104
+ return /* @__PURE__ */ React13.createElement("div", { style: {
2105
+ background: bg,
2106
+ borderRadius: radius,
2107
+ padding: "28px 24px",
2108
+ width: "fit-content",
2109
+ fontFamily: "system-ui, sans-serif",
2110
+ border: "1px solid rgba(255,255,255,0.07)",
2111
+ boxShadow: "0 10px 40px rgba(0,0,0,0.4)"
2112
+ } }, /* @__PURE__ */ React13.createElement("div", { style: { textAlign: "center", marginBottom: "24px" } }, /* @__PURE__ */ React13.createElement("div", { style: {
2113
+ width: "44px",
2114
+ height: "44px",
2115
+ borderRadius: "12px",
2116
+ background: alpha(accent, 0.12),
2117
+ border: `1px solid ${alpha(accent, 0.25)}`,
2118
+ display: "flex",
2119
+ alignItems: "center",
2120
+ justifyContent: "center",
2121
+ margin: "0 auto 14px"
2122
+ } }, /* @__PURE__ */ React13.createElement(
2123
+ "svg",
2124
+ {
2125
+ width: "20",
2126
+ height: "20",
2127
+ viewBox: "0 0 24 24",
2128
+ fill: "none",
2129
+ stroke: accent,
2130
+ strokeWidth: "2",
2131
+ strokeLinecap: "round",
2132
+ strokeLinejoin: "round"
2133
+ },
2134
+ /* @__PURE__ */ React13.createElement("rect", { x: "2", y: "7", width: "20", height: "14", rx: "2" }),
2135
+ /* @__PURE__ */ React13.createElement("path", { d: "M16 3l-4 4-4-4" })
2136
+ )), /* @__PURE__ */ React13.createElement("p", { style: { fontSize: "15px", fontWeight: "700", color: "#fff", margin: "0 0 5px" } }, label), /* @__PURE__ */ React13.createElement("p", { style: { fontSize: "12px", color: "rgba(255,255,255,0.35)", margin: 0 } }, subLabel)), /* @__PURE__ */ React13.createElement("div", { style: { display: "flex", gap: "10px", justifyContent: "center", marginBottom: "8px" } }, otp.map((val, i) => /* @__PURE__ */ React13.createElement(
2137
+ "input",
2138
+ {
2139
+ key: i,
2140
+ ref: (el) => inputs.current[i] = el,
2141
+ type: "text",
2142
+ inputMode: "numeric",
2143
+ maxLength: 1,
2144
+ value: val,
2145
+ onChange: (e) => handleChange(e, i),
2146
+ onKeyDown: (e) => handleKeyDown(e, i),
2147
+ onPaste: handlePaste,
2148
+ onFocus: () => setFocused(i),
2149
+ style: {
2150
+ width: "44px",
2151
+ height: "52px",
2152
+ textAlign: "center",
2153
+ fontSize: "20px",
2154
+ fontWeight: "700",
2155
+ color: "#fff",
2156
+ background: val ? alpha(accent, 0.1) : "rgba(255,255,255,0.04)",
2157
+ border: `1.5px solid ${errorText ? "rgba(239,68,68,0.6)" : focused === i ? accent : val ? alpha(accent, 0.4) : "rgba(255,255,255,0.1)"}`,
2158
+ borderRadius: "12px",
2159
+ outline: "none",
2160
+ caretColor: accent,
2161
+ transition: "all 0.2s",
2162
+ fontFamily: "inherit"
2163
+ }
2164
+ }
2165
+ ))), length === 6 && /* @__PURE__ */ React13.createElement("div", { style: { display: "flex", justifyContent: "center", marginBottom: "8px" } }, /* @__PURE__ */ React13.createElement("div", { style: { display: "flex", gap: "10px" } }, [0, 1, 2].map((i) => /* @__PURE__ */ React13.createElement("div", { key: i, style: { width: "44px" } })), /* @__PURE__ */ React13.createElement("div", { style: { width: "10px", display: "flex", alignItems: "center", justifyContent: "center" } }, /* @__PURE__ */ React13.createElement("div", { style: { width: "6px", height: "1.5px", background: "rgba(255,255,255,0.15)", borderRadius: "1px" } })), [0, 1, 2].map((i) => /* @__PURE__ */ React13.createElement("div", { key: i, style: { width: "44px" } })))), errorText && /* @__PURE__ */ React13.createElement("p", { style: {
2166
+ fontSize: "12px",
2167
+ color: "#f87171",
2168
+ textAlign: "center",
2169
+ margin: "6px 0 0",
2170
+ display: "flex",
2171
+ alignItems: "center",
2172
+ justifyContent: "center",
2173
+ gap: "5px"
2174
+ } }, /* @__PURE__ */ React13.createElement(
2175
+ "svg",
2176
+ {
2177
+ width: "12",
2178
+ height: "12",
2179
+ viewBox: "0 0 24 24",
2180
+ fill: "none",
2181
+ stroke: "currentColor",
2182
+ strokeWidth: "2.5",
2183
+ strokeLinecap: "round"
2184
+ },
2185
+ /* @__PURE__ */ React13.createElement("circle", { cx: "12", cy: "12", r: "10" }),
2186
+ /* @__PURE__ */ React13.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
2187
+ /* @__PURE__ */ React13.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
2188
+ ), errorText), /* @__PURE__ */ React13.createElement(
2189
+ "button",
2190
+ {
2191
+ onClick: () => completed && onComplete(otp.join("")),
2192
+ disabled: !completed,
2193
+ style: {
2194
+ width: "100%",
2195
+ padding: "12px",
2196
+ borderRadius: "12px",
2197
+ border: "none",
2198
+ marginTop: "20px",
2199
+ background: completed ? `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.7)})` : "rgba(255,255,255,0.06)",
2200
+ color: completed ? "#fff" : "rgba(255,255,255,0.25)",
2201
+ fontSize: "14px",
2202
+ fontWeight: "700",
2203
+ cursor: completed ? "pointer" : "not-allowed",
2204
+ fontFamily: "inherit",
2205
+ transition: "all 0.25s"
2206
+ }
2207
+ },
2208
+ completed ? "Verify Code" : `Enter ${length - otp.filter((v) => v).length} more digit${length - otp.filter((v) => v).length !== 1 ? "s" : ""}`
2209
+ ), /* @__PURE__ */ React13.createElement("p", { style: { textAlign: "center", fontSize: "12px", color: "rgba(255,255,255,0.25)", margin: "14px 0 0" } }, "Didn't receive it?", " ", /* @__PURE__ */ React13.createElement(
2210
+ "button",
2211
+ {
2212
+ onClick: handleResend,
2213
+ disabled: resendTimer > 0,
2214
+ style: {
2215
+ background: "transparent",
2216
+ border: "none",
2217
+ padding: 0,
2218
+ fontSize: "12px",
2219
+ fontWeight: "700",
2220
+ color: resendTimer > 0 ? "rgba(255,255,255,0.25)" : accent,
2221
+ cursor: resendTimer > 0 ? "default" : "pointer",
2222
+ fontFamily: "inherit"
2223
+ }
2224
+ },
2225
+ resendTimer > 0 ? `${resendText} (${resendTimer}s)` : resendText
2226
+ )));
2227
+ };
2228
+
2229
+ // src/components/InvoiceCard/InvoiceCard.jsx
2230
+ import React14, { useState as useState12 } from "react";
2231
+ var InvoiceCard = ({
2232
+ invoiceNumber = "INV-2024-001",
2233
+ date = "21 March 2024",
2234
+ dueDate = "31 March 2024",
2235
+ from = {
2236
+ name: "VirtualAI Inc.",
2237
+ email: "billing@virtualai.com",
2238
+ address: "123 Tech Street, San Francisco, CA"
2239
+ },
2240
+ to = {
2241
+ name: "Aryan Sharma",
2242
+ email: "aryan@example.com",
2243
+ address: "456 Dev Lane, Mumbai, India"
2244
+ },
2245
+ items = [
2246
+ { name: "Pro Plan Subscription", qty: 1, price: 29 },
2247
+ { name: "Extra AI Credits (500)", qty: 2, price: 9 },
2248
+ { name: "Custom Domain Setup", qty: 1, price: 15 }
2249
+ ],
2250
+ taxRate = 18,
2251
+ currency = "$",
2252
+ accent = "#6366f1",
2253
+ bg = "#0f172a",
2254
+ radius = "20px",
2255
+ status = "unpaid",
2256
+ onPayClick = () => {
2257
+ },
2258
+ onDownloadClick = () => {
2259
+ }
2260
+ }) => {
2261
+ const [paid, setPaid] = useState12(status === "paid");
2262
+ const alpha = (hex, op) => {
2263
+ const r = parseInt(hex.slice(1, 3), 16);
2264
+ const g = parseInt(hex.slice(3, 5), 16);
2265
+ const b = parseInt(hex.slice(5, 7), 16);
2266
+ return `rgba(${r},${g},${b},${op})`;
2267
+ };
2268
+ const subtotal = items.reduce((s, i) => s + i.qty * i.price, 0);
2269
+ const tax = parseFloat((subtotal * taxRate / 100).toFixed(2));
2270
+ const total = parseFloat((subtotal + tax).toFixed(2));
2271
+ const statusConfig = {
2272
+ paid: { label: "Paid", bg: "rgba(16,185,129,0.15)", color: "#34d399", border: "rgba(16,185,129,0.3)" },
2273
+ unpaid: { label: "Unpaid", bg: "rgba(239,68,68,0.12)", color: "#f87171", border: "rgba(239,68,68,0.3)" },
2274
+ pending: { label: "Pending", bg: "rgba(245,158,11,0.12)", color: "#fbbf24", border: "rgba(245,158,11,0.3)" }
2275
+ };
2276
+ const sc = statusConfig[paid ? "paid" : status] || statusConfig.unpaid;
2277
+ const Row = ({ label, value, bold, large, accentColor }) => /* @__PURE__ */ React14.createElement("div", { style: {
2278
+ display: "flex",
2279
+ justifyContent: "space-between",
2280
+ alignItems: "center",
2281
+ padding: "5px 0"
2282
+ } }, /* @__PURE__ */ React14.createElement("span", { style: {
2283
+ fontSize: large ? "14px" : "12px",
2284
+ fontWeight: bold ? "700" : "400",
2285
+ color: large ? "#fff" : "rgba(255,255,255,0.45)"
2286
+ } }, label), /* @__PURE__ */ React14.createElement("span", { style: {
2287
+ fontSize: large ? "16px" : "13px",
2288
+ fontWeight: bold ? "800" : "600",
2289
+ color: accentColor || (large ? "#fff" : "rgba(255,255,255,0.85)")
2290
+ } }, currency, typeof value === "number" ? value.toFixed(2) : value));
2291
+ return /* @__PURE__ */ React14.createElement("div", { style: {
2292
+ background: bg,
2293
+ borderRadius: radius,
2294
+ padding: "24px",
2295
+ width: "340px",
2296
+ fontFamily: "system-ui, sans-serif",
2297
+ border: "1px solid rgba(255,255,255,0.07)",
2298
+ boxShadow: "0 10px 40px rgba(0,0,0,0.4)",
2299
+ color: "#fff"
2300
+ } }, /* @__PURE__ */ React14.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start", marginBottom: "20px" } }, /* @__PURE__ */ React14.createElement("div", null, /* @__PURE__ */ React14.createElement("div", { style: { display: "flex", alignItems: "center", gap: "7px", marginBottom: "4px" } }, /* @__PURE__ */ React14.createElement("div", { style: {
2301
+ width: "24px",
2302
+ height: "24px",
2303
+ borderRadius: "6px",
2304
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.6)})`,
2305
+ display: "flex",
2306
+ alignItems: "center",
2307
+ justifyContent: "center",
2308
+ fontSize: "11px",
2309
+ fontWeight: "800",
2310
+ color: "#fff"
2311
+ } }, "V"), /* @__PURE__ */ React14.createElement("span", { style: { fontSize: "14px", fontWeight: "800" } }, from.name)), /* @__PURE__ */ React14.createElement("p", { style: { fontSize: "11px", color: "rgba(255,255,255,0.3)", margin: 0 } }, invoiceNumber)), /* @__PURE__ */ React14.createElement("div", { style: {
2312
+ padding: "4px 12px",
2313
+ borderRadius: "20px",
2314
+ fontSize: "11px",
2315
+ fontWeight: "700",
2316
+ background: sc.bg,
2317
+ color: sc.color,
2318
+ border: `1px solid ${sc.border}`,
2319
+ textTransform: "uppercase",
2320
+ letterSpacing: "0.5px"
2321
+ } }, sc.label)), /* @__PURE__ */ React14.createElement("div", { style: {
2322
+ display: "grid",
2323
+ gridTemplateColumns: "1fr 1fr",
2324
+ gap: "12px",
2325
+ background: "rgba(255,255,255,0.03)",
2326
+ border: "1px solid rgba(255,255,255,0.06)",
2327
+ borderRadius: "12px",
2328
+ padding: "14px",
2329
+ marginBottom: "20px"
2330
+ } }, [{ label: "From", info: from }, { label: "To", info: to }].map(({ label, info }) => /* @__PURE__ */ React14.createElement("div", { key: label }, /* @__PURE__ */ React14.createElement("p", { style: { fontSize: "10px", fontWeight: "700", color: "rgba(255,255,255,0.25)", textTransform: "uppercase", letterSpacing: "0.8px", marginBottom: "5px" } }, label), /* @__PURE__ */ React14.createElement("p", { style: { fontSize: "12px", fontWeight: "700", color: "#fff", margin: "0 0 2px" } }, info.name), /* @__PURE__ */ React14.createElement("p", { style: { fontSize: "11px", color: "rgba(255,255,255,0.35)", margin: "0 0 2px" } }, info.email), /* @__PURE__ */ React14.createElement("p", { style: { fontSize: "10px", color: "rgba(255,255,255,0.25)", margin: 0, lineHeight: 1.4 } }, info.address)))), /* @__PURE__ */ React14.createElement("div", { style: { display: "flex", gap: "10px", marginBottom: "20px" } }, [{ label: "Issue Date", val: date }, { label: "Due Date", val: dueDate }].map(({ label, val }) => /* @__PURE__ */ React14.createElement("div", { key: label, style: {
2331
+ flex: 1,
2332
+ background: "rgba(255,255,255,0.03)",
2333
+ border: "1px solid rgba(255,255,255,0.06)",
2334
+ borderRadius: "10px",
2335
+ padding: "10px 12px"
2336
+ } }, /* @__PURE__ */ React14.createElement("p", { style: { fontSize: "10px", color: "rgba(255,255,255,0.25)", textTransform: "uppercase", letterSpacing: "0.8px", margin: "0 0 3px", fontWeight: "700" } }, label), /* @__PURE__ */ React14.createElement("p", { style: { fontSize: "12px", fontWeight: "700", color: "#fff", margin: 0 } }, val)))), /* @__PURE__ */ React14.createElement("div", { style: { marginBottom: "16px" } }, /* @__PURE__ */ React14.createElement("div", { style: {
2337
+ display: "grid",
2338
+ gridTemplateColumns: "1fr auto auto",
2339
+ gap: "8px",
2340
+ padding: "6px 8px",
2341
+ borderBottom: "1px solid rgba(255,255,255,0.06)",
2342
+ marginBottom: "4px"
2343
+ } }, ["Item", "Qty", "Amount"].map((h) => /* @__PURE__ */ React14.createElement("span", { key: h, style: { fontSize: "10px", fontWeight: "700", color: "rgba(255,255,255,0.25)", textTransform: "uppercase", letterSpacing: "0.8px", textAlign: h !== "Item" ? "right" : "left" } }, h))), items.map((item, i) => /* @__PURE__ */ React14.createElement("div", { key: i, style: {
2344
+ display: "grid",
2345
+ gridTemplateColumns: "1fr auto auto",
2346
+ gap: "8px",
2347
+ padding: "8px",
2348
+ borderRadius: "8px",
2349
+ background: i % 2 === 0 ? "rgba(255,255,255,0.02)" : "transparent"
2350
+ } }, /* @__PURE__ */ React14.createElement("span", { style: { fontSize: "12px", color: "rgba(255,255,255,0.75)" } }, item.name), /* @__PURE__ */ React14.createElement("span", { style: { fontSize: "12px", color: "rgba(255,255,255,0.35)", textAlign: "right" } }, "\xD7", item.qty), /* @__PURE__ */ React14.createElement("span", { style: { fontSize: "12px", fontWeight: "600", color: "#fff", textAlign: "right" } }, currency, (item.qty * item.price).toFixed(2))))), /* @__PURE__ */ React14.createElement("div", { style: {
2351
+ background: "rgba(255,255,255,0.03)",
2352
+ border: "1px solid rgba(255,255,255,0.06)",
2353
+ borderRadius: "12px",
2354
+ padding: "12px 14px",
2355
+ marginBottom: "20px"
2356
+ } }, /* @__PURE__ */ React14.createElement(Row, { label: "Subtotal", value: subtotal }), /* @__PURE__ */ React14.createElement(Row, { label: `Tax (${taxRate}%)`, value: tax }), /* @__PURE__ */ React14.createElement("div", { style: { height: "1px", background: "rgba(255,255,255,0.07)", margin: "8px 0" } }), /* @__PURE__ */ React14.createElement(Row, { label: "Total", value: total, bold: true, large: true, accentColor: accent })), /* @__PURE__ */ React14.createElement("div", { style: { display: "flex", gap: "8px" } }, !paid && /* @__PURE__ */ React14.createElement(
2357
+ "button",
2358
+ {
2359
+ onClick: () => {
2360
+ setPaid(true);
2361
+ onPayClick();
2362
+ },
2363
+ style: {
2364
+ flex: 1,
2365
+ padding: "11px",
2366
+ borderRadius: "12px",
2367
+ border: "none",
2368
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.7)})`,
2369
+ color: "#fff",
2370
+ fontSize: "13px",
2371
+ fontWeight: "700",
2372
+ cursor: "pointer",
2373
+ fontFamily: "inherit",
2374
+ transition: "opacity 0.2s"
2375
+ },
2376
+ onMouseEnter: (e) => e.currentTarget.style.opacity = "0.85",
2377
+ onMouseLeave: (e) => e.currentTarget.style.opacity = "1"
2378
+ },
2379
+ "Pay ",
2380
+ currency,
2381
+ total.toFixed(2)
2382
+ ), paid && /* @__PURE__ */ React14.createElement("div", { style: {
2383
+ flex: 1,
2384
+ padding: "11px",
2385
+ borderRadius: "12px",
2386
+ background: "rgba(16,185,129,0.1)",
2387
+ border: "1px solid rgba(16,185,129,0.25)",
2388
+ display: "flex",
2389
+ alignItems: "center",
2390
+ justifyContent: "center",
2391
+ gap: "6px",
2392
+ fontSize: "13px",
2393
+ fontWeight: "700",
2394
+ color: "#34d399"
2395
+ } }, /* @__PURE__ */ React14.createElement(
2396
+ "svg",
2397
+ {
2398
+ width: "14",
2399
+ height: "14",
2400
+ viewBox: "0 0 24 24",
2401
+ fill: "none",
2402
+ stroke: "currentColor",
2403
+ strokeWidth: "2.5",
2404
+ strokeLinecap: "round"
2405
+ },
2406
+ /* @__PURE__ */ React14.createElement("polyline", { points: "20 6 9 17 4 12" })
2407
+ ), "Payment Done"), /* @__PURE__ */ React14.createElement(
2408
+ "button",
2409
+ {
2410
+ onClick: onDownloadClick,
2411
+ style: {
2412
+ width: "42px",
2413
+ padding: "11px",
2414
+ borderRadius: "12px",
2415
+ background: "rgba(255,255,255,0.05)",
2416
+ border: "1px solid rgba(255,255,255,0.1)",
2417
+ color: "rgba(255,255,255,0.5)",
2418
+ cursor: "pointer",
2419
+ display: "flex",
2420
+ alignItems: "center",
2421
+ justifyContent: "center",
2422
+ transition: "all 0.2s"
2423
+ },
2424
+ onMouseEnter: (e) => {
2425
+ e.currentTarget.style.color = "#fff";
2426
+ e.currentTarget.style.borderColor = "rgba(255,255,255,0.25)";
2427
+ },
2428
+ onMouseLeave: (e) => {
2429
+ e.currentTarget.style.color = "rgba(255,255,255,0.5)";
2430
+ e.currentTarget.style.borderColor = "rgba(255,255,255,0.1)";
2431
+ }
2432
+ },
2433
+ /* @__PURE__ */ React14.createElement(
2434
+ "svg",
2435
+ {
2436
+ width: "15",
2437
+ height: "15",
2438
+ viewBox: "0 0 24 24",
2439
+ fill: "none",
2440
+ stroke: "currentColor",
2441
+ strokeWidth: "2",
2442
+ strokeLinecap: "round",
2443
+ strokeLinejoin: "round"
2444
+ },
2445
+ /* @__PURE__ */ React14.createElement("path", { d: "M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3" })
2446
+ )
2447
+ )));
2448
+ };
2449
+
2450
+ // src/components/FileUpload/FileUpload.jsx
2451
+ import React15, { useState as useState13, useRef as useRef2 } from "react";
2452
+ var FileUpload = ({
2453
+ accept = "*",
2454
+ multiple = true,
2455
+ maxSizeMB = 5,
2456
+ accent = "#6366f1",
2457
+ bg = "#0f172a",
2458
+ radius = "16px",
2459
+ label = "Drop files here or click to upload",
2460
+ subLabel = "Supports any file up to",
2461
+ onUpload = () => {
2462
+ }
2463
+ }) => {
2464
+ const [files, setFiles] = useState13([]);
2465
+ const [dragging, setDragging] = useState13(false);
2466
+ const [error, setError] = useState13("");
2467
+ const inputRef = useRef2(null);
2468
+ const alpha = (hex, op) => {
2469
+ const r = parseInt(hex.slice(1, 3), 16);
2470
+ const g = parseInt(hex.slice(3, 5), 16);
2471
+ const b = parseInt(hex.slice(5, 7), 16);
2472
+ return `rgba(${r},${g},${b},${op})`;
2473
+ };
2474
+ const formatSize = (bytes) => {
2475
+ if (bytes < 1024) return bytes + " B";
2476
+ if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB";
2477
+ return (bytes / (1024 * 1024)).toFixed(1) + " MB";
2478
+ };
2479
+ const getIcon = (type) => {
2480
+ if (type.startsWith("image/")) return { path: "M21 19V5a2 2 0 00-2-2H5a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2zM8.5 13.5l2.5 3 3.5-4.5 4.5 6H5l3.5-4.5z", color: "#a78bfa" };
2481
+ if (type.includes("pdf")) return { path: "M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8zM14 2v6h6M16 13H8M16 17H8M10 9H8", color: "#f87171" };
2482
+ if (type.includes("video")) return { path: "M23 7l-7 5 7 5V7zM1 5h15a2 2 0 012 2v10a2 2 0 01-2 2H1a2 2 0 01-2-2V7a2 2 0 012-2z", color: "#34d399" };
2483
+ if (type.includes("audio")) return { path: "M9 18V5l12-2v13M9 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm12-2c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z", color: "#fbbf24" };
2484
+ return { path: "M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8zM14 2v6h6", color: "#94a3b8" };
2485
+ };
2486
+ const processFiles = (incoming) => {
2487
+ setError("");
2488
+ const valid = [];
2489
+ for (const f of incoming) {
2490
+ if (f.size > maxSizeMB * 1024 * 1024) {
2491
+ setError(`"${f.name}" exceeds ${maxSizeMB}MB limit.`);
2492
+ continue;
2493
+ }
2494
+ valid.push({ file: f, id: Math.random().toString(36).slice(2), progress: 0, done: false });
2495
+ }
2496
+ if (!valid.length) return;
2497
+ const newFiles = multiple ? [...files, ...valid] : valid;
2498
+ setFiles(newFiles);
2499
+ valid.forEach(({ id }) => {
2500
+ let p = 0;
2501
+ const t = setInterval(() => {
2502
+ p += Math.floor(Math.random() * 15) + 5;
2503
+ if (p >= 100) {
2504
+ p = 100;
2505
+ clearInterval(t);
2506
+ setFiles((prev) => prev.map((f) => f.id === id ? { ...f, progress: 100, done: true } : f));
2507
+ onUpload(id);
2508
+ } else {
2509
+ setFiles((prev) => prev.map((f) => f.id === id ? { ...f, progress: p } : f));
2510
+ }
2511
+ }, 200);
2512
+ });
2513
+ };
2514
+ const handleDrop = (e) => {
2515
+ e.preventDefault();
2516
+ setDragging(false);
2517
+ processFiles(Array.from(e.dataTransfer.files));
2518
+ };
2519
+ const removeFile = (id) => setFiles((prev) => prev.filter((f) => f.id !== id));
2520
+ return /* @__PURE__ */ React15.createElement("div", { style: { width: "320px", fontFamily: "system-ui, sans-serif" } }, /* @__PURE__ */ React15.createElement(
2521
+ "div",
2522
+ {
2523
+ onClick: () => {
2524
+ var _a;
2525
+ return (_a = inputRef.current) == null ? void 0 : _a.click();
2526
+ },
2527
+ onDragOver: (e) => {
2528
+ e.preventDefault();
2529
+ setDragging(true);
2530
+ },
2531
+ onDragLeave: () => setDragging(false),
2532
+ onDrop: handleDrop,
2533
+ style: {
2534
+ background: dragging ? alpha(accent, 0.1) : "rgba(255,255,255,0.03)",
2535
+ border: `2px dashed ${dragging ? accent : "rgba(255,255,255,0.1)"}`,
2536
+ borderRadius: radius,
2537
+ padding: "32px 20px",
2538
+ textAlign: "center",
2539
+ cursor: "pointer",
2540
+ transition: "all 0.2s"
2541
+ }
2542
+ },
2543
+ /* @__PURE__ */ React15.createElement(
2544
+ "input",
2545
+ {
2546
+ ref: inputRef,
2547
+ type: "file",
2548
+ accept,
2549
+ multiple,
2550
+ style: { display: "none" },
2551
+ onChange: (e) => processFiles(Array.from(e.target.files))
2552
+ }
2553
+ ),
2554
+ /* @__PURE__ */ React15.createElement("div", { style: {
2555
+ width: "48px",
2556
+ height: "48px",
2557
+ borderRadius: "14px",
2558
+ background: alpha(accent, 0.12),
2559
+ border: `1px solid ${alpha(accent, 0.25)}`,
2560
+ display: "flex",
2561
+ alignItems: "center",
2562
+ justifyContent: "center",
2563
+ margin: "0 auto 14px",
2564
+ transition: "all 0.2s",
2565
+ transform: dragging ? "scale(1.1)" : "scale(1)"
2566
+ } }, /* @__PURE__ */ React15.createElement(
2567
+ "svg",
2568
+ {
2569
+ width: "22",
2570
+ height: "22",
2571
+ viewBox: "0 0 24 24",
2572
+ fill: "none",
2573
+ stroke: accent,
2574
+ strokeWidth: "2",
2575
+ strokeLinecap: "round",
2576
+ strokeLinejoin: "round"
2577
+ },
2578
+ /* @__PURE__ */ React15.createElement("path", { d: "M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M17 8l-5-5-5 5M12 3v12" })
2579
+ )),
2580
+ /* @__PURE__ */ React15.createElement("p", { style: { fontSize: "13px", fontWeight: "600", color: "#fff", margin: "0 0 4px" } }, label),
2581
+ /* @__PURE__ */ React15.createElement("p", { style: { fontSize: "11px", color: "rgba(255,255,255,0.3)", margin: 0 } }, subLabel, " ", maxSizeMB, "MB")
2582
+ ), error && /* @__PURE__ */ React15.createElement("div", { style: {
2583
+ marginTop: "10px",
2584
+ padding: "9px 12px",
2585
+ borderRadius: "10px",
2586
+ background: "rgba(239,68,68,0.08)",
2587
+ border: "1px solid rgba(239,68,68,0.2)",
2588
+ display: "flex",
2589
+ alignItems: "center",
2590
+ gap: "8px"
2591
+ } }, /* @__PURE__ */ React15.createElement(
2592
+ "svg",
2593
+ {
2594
+ width: "13",
2595
+ height: "13",
2596
+ viewBox: "0 0 24 24",
2597
+ fill: "none",
2598
+ stroke: "#f87171",
2599
+ strokeWidth: "2.5",
2600
+ strokeLinecap: "round"
2601
+ },
2602
+ /* @__PURE__ */ React15.createElement("circle", { cx: "12", cy: "12", r: "10" }),
2603
+ /* @__PURE__ */ React15.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
2604
+ /* @__PURE__ */ React15.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
2605
+ ), /* @__PURE__ */ React15.createElement("span", { style: { fontSize: "11px", color: "#f87171" } }, error)), files.length > 0 && /* @__PURE__ */ React15.createElement("div", { style: { marginTop: "12px", display: "flex", flexDirection: "column", gap: "8px" } }, files.map(({ file, id, progress, done }) => {
2606
+ const icon = getIcon(file.type);
2607
+ const preview = file.type.startsWith("image/") ? URL.createObjectURL(file) : null;
2608
+ return /* @__PURE__ */ React15.createElement("div", { key: id, style: {
2609
+ background: "rgba(255,255,255,0.03)",
2610
+ border: `1px solid ${done ? alpha(accent, 0.2) : "rgba(255,255,255,0.07)"}`,
2611
+ borderRadius: "12px",
2612
+ padding: "10px 12px",
2613
+ transition: "border-color 0.3s"
2614
+ } }, /* @__PURE__ */ React15.createElement("div", { style: { display: "flex", alignItems: "center", gap: "10px" } }, /* @__PURE__ */ React15.createElement("div", { style: {
2615
+ width: "36px",
2616
+ height: "36px",
2617
+ borderRadius: "8px",
2618
+ flexShrink: 0,
2619
+ background: preview ? `url(${preview}) center/cover` : alpha(icon.color, 0.12),
2620
+ border: `1px solid ${alpha(icon.color, 0.2)}`,
2621
+ display: "flex",
2622
+ alignItems: "center",
2623
+ justifyContent: "center",
2624
+ overflow: "hidden"
2625
+ } }, !preview && /* @__PURE__ */ React15.createElement(
2626
+ "svg",
2627
+ {
2628
+ width: "16",
2629
+ height: "16",
2630
+ viewBox: "0 0 24 24",
2631
+ fill: "none",
2632
+ stroke: icon.color,
2633
+ strokeWidth: "2",
2634
+ strokeLinecap: "round",
2635
+ strokeLinejoin: "round"
2636
+ },
2637
+ /* @__PURE__ */ React15.createElement("path", { d: icon.path })
2638
+ )), /* @__PURE__ */ React15.createElement("div", { style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React15.createElement("p", { style: {
2639
+ fontSize: "12px",
2640
+ fontWeight: "600",
2641
+ color: "#fff",
2642
+ margin: "0 0 2px",
2643
+ overflow: "hidden",
2644
+ textOverflow: "ellipsis",
2645
+ whiteSpace: "nowrap"
2646
+ } }, file.name), /* @__PURE__ */ React15.createElement("p", { style: { fontSize: "10px", color: "rgba(255,255,255,0.3)", margin: 0 } }, formatSize(file.size))), done ? /* @__PURE__ */ React15.createElement("div", { style: {
2647
+ width: "22px",
2648
+ height: "22px",
2649
+ borderRadius: "50%",
2650
+ background: "rgba(16,185,129,0.15)",
2651
+ border: "1px solid rgba(16,185,129,0.3)",
2652
+ display: "flex",
2653
+ alignItems: "center",
2654
+ justifyContent: "center",
2655
+ flexShrink: 0
2656
+ } }, /* @__PURE__ */ React15.createElement(
2657
+ "svg",
2658
+ {
2659
+ width: "10",
2660
+ height: "10",
2661
+ viewBox: "0 0 24 24",
2662
+ fill: "none",
2663
+ stroke: "#34d399",
2664
+ strokeWidth: "3",
2665
+ strokeLinecap: "round"
2666
+ },
2667
+ /* @__PURE__ */ React15.createElement("polyline", { points: "20 6 9 17 4 12" })
2668
+ )) : /* @__PURE__ */ React15.createElement(
2669
+ "button",
2670
+ {
2671
+ onClick: () => removeFile(id),
2672
+ style: {
2673
+ background: "transparent",
2674
+ border: "none",
2675
+ padding: "2px",
2676
+ cursor: "pointer",
2677
+ color: "rgba(255,255,255,0.25)",
2678
+ flexShrink: 0,
2679
+ transition: "color 0.2s"
2680
+ },
2681
+ onMouseEnter: (e) => e.currentTarget.style.color = "#f87171",
2682
+ onMouseLeave: (e) => e.currentTarget.style.color = "rgba(255,255,255,0.25)"
2683
+ },
2684
+ /* @__PURE__ */ React15.createElement(
2685
+ "svg",
2686
+ {
2687
+ width: "14",
2688
+ height: "14",
2689
+ viewBox: "0 0 24 24",
2690
+ fill: "none",
2691
+ stroke: "currentColor",
2692
+ strokeWidth: "2.5",
2693
+ strokeLinecap: "round"
2694
+ },
2695
+ /* @__PURE__ */ React15.createElement("path", { d: "M18 6L6 18M6 6l12 12" })
2696
+ )
2697
+ )), !done && /* @__PURE__ */ React15.createElement("div", { style: {
2698
+ marginTop: "8px",
2699
+ height: "3px",
2700
+ background: "rgba(255,255,255,0.06)",
2701
+ borderRadius: "2px",
2702
+ overflow: "hidden"
2703
+ } }, /* @__PURE__ */ React15.createElement("div", { style: {
2704
+ height: "100%",
2705
+ borderRadius: "2px",
2706
+ width: `${progress}%`,
2707
+ background: `linear-gradient(90deg, ${accent}, ${alpha(accent, 0.6)})`,
2708
+ transition: "width 0.2s ease"
2709
+ } })));
2710
+ })));
2711
+ };
2712
+
2713
+ // src/components/ColorPicker/ColorPicker.jsx
2714
+ import React16, { useState as useState14 } from "react";
2715
+ var ColorPicker = ({
2716
+ defaultColor = "#6366f1",
2717
+ showOpacity = true,
2718
+ showEyedropper = true,
2719
+ showInput = true,
2720
+ accent = "#6366f1",
2721
+ bg = "#0f172a",
2722
+ radius = "16px",
2723
+ onChange = () => {
2724
+ },
2725
+ swatches = [
2726
+ "#6366f1",
2727
+ "#8b5cf6",
2728
+ "#a855f7",
2729
+ "#ec4899",
2730
+ "#f43f5e",
2731
+ "#ef4444",
2732
+ "#f97316",
2733
+ "#f59e0b",
2734
+ "#eab308",
2735
+ "#84cc16",
2736
+ "#22c55e",
2737
+ "#10b981",
2738
+ "#14b8a6",
2739
+ "#06b6d4",
2740
+ "#3b82f6",
2741
+ "#0ea5e9",
2742
+ "#64748b",
2743
+ "#94a3b8",
2744
+ "#ffffff",
2745
+ "#000000"
2746
+ ]
2747
+ }) => {
2748
+ const [color, setColor] = useState14(defaultColor);
2749
+ const [hex, setHex] = useState14(defaultColor);
2750
+ const [opacity, setOpacity] = useState14(100);
2751
+ const [inputErr, setInputErr] = useState14(false);
2752
+ const [copied, setCopied] = useState14(false);
2753
+ const alpha = (hexVal, op) => {
2754
+ const r = parseInt(hexVal.slice(1, 3), 16);
2755
+ const g = parseInt(hexVal.slice(3, 5), 16);
2756
+ const b = parseInt(hexVal.slice(5, 7), 16);
2757
+ return `rgba(${r},${g},${b},${op})`;
2758
+ };
2759
+ const isValidHex = (v) => /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(v);
2760
+ const applyColor = (val) => {
2761
+ if (!isValidHex(val)) {
2762
+ setInputErr(true);
2763
+ return;
2764
+ }
2765
+ setInputErr(false);
2766
+ setColor(val);
2767
+ setHex(val);
2768
+ onChange({ hex: val, opacity, rgba: alpha(val, opacity / 100) });
2769
+ };
2770
+ const pickSwatch = (val) => {
2771
+ setColor(val);
2772
+ setHex(val);
2773
+ setInputErr(false);
2774
+ onChange({ hex: val, opacity, rgba: alpha(val, opacity / 100) });
2775
+ };
2776
+ const handleOpacity = (v) => {
2777
+ setOpacity(v);
2778
+ onChange({ hex: color, opacity: v, rgba: alpha(color, v / 100) });
2779
+ };
2780
+ const copyHex = () => {
2781
+ var _a;
2782
+ (_a = navigator.clipboard) == null ? void 0 : _a.writeText(hex).catch(() => {
2783
+ });
2784
+ setCopied(true);
2785
+ setTimeout(() => setCopied(false), 1500);
2786
+ };
2787
+ const hueGradient = "linear-gradient(90deg,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)";
2788
+ return /* @__PURE__ */ React16.createElement("div", { style: {
2789
+ background: bg,
2790
+ borderRadius: radius,
2791
+ padding: "20px",
2792
+ width: "260px",
2793
+ fontFamily: "system-ui, sans-serif",
2794
+ border: "1px solid rgba(255,255,255,0.07)",
2795
+ boxShadow: "0 10px 40px rgba(0,0,0,0.4)"
2796
+ } }, /* @__PURE__ */ React16.createElement("div", { style: {
2797
+ height: "52px",
2798
+ borderRadius: "12px",
2799
+ marginBottom: "16px",
2800
+ background: alpha(color, opacity / 100),
2801
+ border: "1px solid rgba(255,255,255,0.08)",
2802
+ position: "relative",
2803
+ overflow: "hidden"
2804
+ } }, /* @__PURE__ */ React16.createElement("div", { style: {
2805
+ position: "absolute",
2806
+ inset: 0,
2807
+ zIndex: 0,
2808
+ backgroundImage: "linear-gradient(45deg,#555 25%,transparent 25%),linear-gradient(-45deg,#555 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#555 75%),linear-gradient(-45deg,transparent 75%,#555 75%)",
2809
+ backgroundSize: "10px 10px",
2810
+ backgroundPosition: "0 0,0 5px,5px -5px,-5px 0",
2811
+ opacity: 0.3
2812
+ } }), /* @__PURE__ */ React16.createElement("div", { style: { position: "absolute", inset: 0, background: alpha(color, opacity / 100) } })), /* @__PURE__ */ React16.createElement("div", { style: { position: "relative", marginBottom: "12px" } }, /* @__PURE__ */ React16.createElement(
2813
+ "input",
2814
+ {
2815
+ type: "range",
2816
+ min: "0",
2817
+ max: "360",
2818
+ defaultValue: "240",
2819
+ onChange: (e) => {
2820
+ const h = e.target.value;
2821
+ const c = `hsl(${h},80%,60%)`;
2822
+ const el = document.createElement("div");
2823
+ el.style.color = c;
2824
+ document.body.appendChild(el);
2825
+ const rgb = getComputedStyle(el).color;
2826
+ document.body.removeChild(el);
2827
+ const [r, g, b] = rgb.match(/\d+/g).map(Number);
2828
+ const hex6 = "#" + [r, g, b].map((n) => n.toString(16).padStart(2, "0")).join("");
2829
+ pickSwatch(hex6);
2830
+ },
2831
+ style: {
2832
+ width: "100%",
2833
+ height: "10px",
2834
+ borderRadius: "5px",
2835
+ appearance: "none",
2836
+ WebkitAppearance: "none",
2837
+ background: hueGradient,
2838
+ cursor: "pointer",
2839
+ outline: "none",
2840
+ border: "none"
2841
+ }
2842
+ }
2843
+ )), showOpacity && /* @__PURE__ */ React16.createElement("div", { style: { marginBottom: "16px" } }, /* @__PURE__ */ React16.createElement(
2844
+ "input",
2845
+ {
2846
+ type: "range",
2847
+ min: "0",
2848
+ max: "100",
2849
+ value: opacity,
2850
+ onChange: (e) => handleOpacity(Number(e.target.value)),
2851
+ style: {
2852
+ width: "100%",
2853
+ height: "10px",
2854
+ borderRadius: "5px",
2855
+ appearance: "none",
2856
+ WebkitAppearance: "none",
2857
+ background: `linear-gradient(90deg, transparent, ${color})`,
2858
+ cursor: "pointer",
2859
+ outline: "none",
2860
+ border: "none"
2861
+ }
2862
+ }
2863
+ ), /* @__PURE__ */ React16.createElement("div", { style: { display: "flex", justifyContent: "space-between", marginTop: "4px" } }, /* @__PURE__ */ React16.createElement("span", { style: { fontSize: "10px", color: "rgba(255,255,255,0.25)" } }, "Opacity"), /* @__PURE__ */ React16.createElement("span", { style: { fontSize: "10px", color: "rgba(255,255,255,0.45)", fontWeight: "600" } }, opacity, "%"))), showInput && /* @__PURE__ */ React16.createElement("div", { style: { display: "flex", gap: "8px", marginBottom: "16px", alignItems: "center" } }, /* @__PURE__ */ React16.createElement("div", { style: {
2864
+ width: "32px",
2865
+ height: "32px",
2866
+ borderRadius: "8px",
2867
+ flexShrink: 0,
2868
+ background: color,
2869
+ border: "1px solid rgba(255,255,255,0.1)"
2870
+ } }), /* @__PURE__ */ React16.createElement(
2871
+ "input",
2872
+ {
2873
+ value: hex,
2874
+ onChange: (e) => {
2875
+ setHex(e.target.value);
2876
+ setInputErr(false);
2877
+ },
2878
+ onBlur: (e) => applyColor(e.target.value),
2879
+ onKeyDown: (e) => e.key === "Enter" && applyColor(hex),
2880
+ placeholder: "#000000",
2881
+ style: {
2882
+ flex: 1,
2883
+ background: "rgba(255,255,255,0.05)",
2884
+ border: `1px solid ${inputErr ? "rgba(239,68,68,0.6)" : "rgba(255,255,255,0.1)"}`,
2885
+ borderRadius: "8px",
2886
+ padding: "7px 10px",
2887
+ fontSize: "12px",
2888
+ fontFamily: "monospace",
2889
+ color: inputErr ? "#f87171" : "#fff",
2890
+ outline: "none"
2891
+ }
2892
+ }
2893
+ ), /* @__PURE__ */ React16.createElement(
2894
+ "button",
2895
+ {
2896
+ onClick: copyHex,
2897
+ title: "Copy hex",
2898
+ style: {
2899
+ width: "32px",
2900
+ height: "32px",
2901
+ borderRadius: "8px",
2902
+ flexShrink: 0,
2903
+ background: copied ? "rgba(16,185,129,0.15)" : "rgba(255,255,255,0.05)",
2904
+ border: `1px solid ${copied ? "rgba(16,185,129,0.3)" : "rgba(255,255,255,0.1)"}`,
2905
+ cursor: "pointer",
2906
+ display: "flex",
2907
+ alignItems: "center",
2908
+ justifyContent: "center",
2909
+ color: copied ? "#34d399" : "rgba(255,255,255,0.4)",
2910
+ transition: "all 0.2s"
2911
+ }
2912
+ },
2913
+ copied ? /* @__PURE__ */ React16.createElement("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" }, /* @__PURE__ */ React16.createElement("polyline", { points: "20 6 9 17 4 12" })) : /* @__PURE__ */ React16.createElement("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }, /* @__PURE__ */ React16.createElement("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2" }), /* @__PURE__ */ React16.createElement("path", { d: "M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1" }))
2914
+ )), /* @__PURE__ */ React16.createElement("div", { style: { height: "1px", background: "rgba(255,255,255,0.06)", marginBottom: "14px" } }), /* @__PURE__ */ React16.createElement("div", { style: { display: "flex", flexWrap: "wrap", gap: "7px" } }, swatches.map((s) => /* @__PURE__ */ React16.createElement(
2915
+ "button",
2916
+ {
2917
+ key: s,
2918
+ onClick: () => pickSwatch(s),
2919
+ title: s,
2920
+ style: {
2921
+ width: "22px",
2922
+ height: "22px",
2923
+ borderRadius: "6px",
2924
+ background: s,
2925
+ border: `2px solid ${color === s ? "#fff" : "transparent"}`,
2926
+ cursor: "pointer",
2927
+ padding: 0,
2928
+ transition: "transform 0.15s, border-color 0.15s",
2929
+ outline: "none",
2930
+ boxShadow: s === "#ffffff" ? "inset 0 0 0 1px rgba(0,0,0,0.15)" : "none"
2931
+ },
2932
+ onMouseEnter: (e) => e.currentTarget.style.transform = "scale(1.2)",
2933
+ onMouseLeave: (e) => e.currentTarget.style.transform = "scale(1)"
2934
+ }
2935
+ ))), /* @__PURE__ */ React16.createElement("div", { style: {
2936
+ marginTop: "14px",
2937
+ padding: "8px 10px",
2938
+ borderRadius: "8px",
2939
+ background: "rgba(255,255,255,0.03)",
2940
+ border: "1px solid rgba(255,255,255,0.06)",
2941
+ display: "flex",
2942
+ justifyContent: "space-between",
2943
+ alignItems: "center"
2944
+ } }, /* @__PURE__ */ React16.createElement("span", { style: { fontSize: "10px", color: "rgba(255,255,255,0.25)", fontWeight: "600", textTransform: "uppercase", letterSpacing: "0.5px" } }, "RGBA"), /* @__PURE__ */ React16.createElement("span", { style: { fontSize: "10px", fontFamily: "monospace", color: "rgba(255,255,255,0.5)" } }, alpha(color, opacity / 100))));
2945
+ };
2946
+
2947
+ // src/components/RatingStars/RatingStars.jsx
2948
+ import React17, { useState as useState15 } from "react";
2949
+ var RatingStars = ({
2950
+ defaultRating = 0,
2951
+ total = 5,
2952
+ size = 32,
2953
+ allowHalf = true,
2954
+ showLabel = true,
2955
+ showCount = true,
2956
+ reviewCount = 0,
2957
+ readOnly = false,
2958
+ accent = "#f59e0b",
2959
+ bg = "#0f172a",
2960
+ radius = "14px",
2961
+ onChange = () => {
2962
+ }
2963
+ }) => {
2964
+ const [rating, setRating] = useState15(defaultRating);
2965
+ const [hovered, setHovered] = useState15(0);
2966
+ const labels = ["", "Terrible", "Bad", "Okay", "Good", "Excellent"];
2967
+ const halfLabels = { 0.5: "Awful", 1: "Terrible", 1.5: "Very Bad", 2: "Bad", 2.5: "Below Average", 3: "Okay", 3.5: "Above Average", 4: "Good", 4.5: "Great", 5: "Excellent" };
2968
+ const alpha = (hex, op) => {
2969
+ const r = parseInt(hex.slice(1, 3), 16);
2970
+ const g = parseInt(hex.slice(3, 5), 16);
2971
+ const b = parseInt(hex.slice(5, 7), 16);
2972
+ return `rgba(${r},${g},${b},${op})`;
2973
+ };
2974
+ const active = hovered || rating;
2975
+ const handleMouseMove = (e, i) => {
2976
+ if (readOnly) return;
2977
+ if (allowHalf) {
2978
+ const rect = e.currentTarget.getBoundingClientRect();
2979
+ const half = e.clientX - rect.left < rect.width / 2;
2980
+ setHovered(half ? i - 0.5 : i);
2981
+ } else {
2982
+ setHovered(i);
2983
+ }
2984
+ };
2985
+ const handleClick = (e, i) => {
2986
+ if (readOnly) return;
2987
+ let val;
2988
+ if (allowHalf) {
2989
+ const rect = e.currentTarget.getBoundingClientRect();
2990
+ val = e.clientX - rect.left < rect.width / 2 ? i - 0.5 : i;
2991
+ } else {
2992
+ val = i;
2993
+ }
2994
+ setRating(val);
2995
+ onChange(val);
2996
+ };
2997
+ const StarIcon = ({ index }) => {
2998
+ const fill = active >= index ? "full" : active >= index - 0.5 ? "half" : "empty";
2999
+ const id = `half-${index}`;
3000
+ return /* @__PURE__ */ React17.createElement(
3001
+ "svg",
3002
+ {
3003
+ width: size,
3004
+ height: size,
3005
+ viewBox: "0 0 24 24",
3006
+ style: { cursor: readOnly ? "default" : "pointer", transition: "transform 0.1s", flexShrink: 0 },
3007
+ onMouseMove: (e) => handleMouseMove(e, index),
3008
+ onMouseLeave: () => !readOnly && setHovered(0),
3009
+ onClick: (e) => handleClick(e, index),
3010
+ onMouseEnter: (e) => {
3011
+ if (!readOnly) e.currentTarget.style.transform = "scale(1.15)";
3012
+ }
3013
+ },
3014
+ /* @__PURE__ */ React17.createElement("defs", null, /* @__PURE__ */ React17.createElement("linearGradient", { id }, /* @__PURE__ */ React17.createElement("stop", { offset: "50%", stopColor: accent }), /* @__PURE__ */ React17.createElement("stop", { offset: "50%", stopColor: "transparent" }))),
3015
+ /* @__PURE__ */ React17.createElement(
3016
+ "polygon",
3017
+ {
3018
+ points: "12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26",
3019
+ fill: fill === "full" ? accent : fill === "half" ? `url(#${id})` : "transparent",
3020
+ stroke: fill === "empty" ? "rgba(255,255,255,0.15)" : accent,
3021
+ strokeWidth: "1.5"
3022
+ }
3023
+ )
3024
+ );
3025
+ };
3026
+ return /* @__PURE__ */ React17.createElement("div", { style: {
3027
+ background: bg,
3028
+ borderRadius: radius,
3029
+ padding: "20px 22px",
3030
+ display: "inline-flex",
3031
+ flexDirection: "column",
3032
+ alignItems: "center",
3033
+ gap: "12px",
3034
+ fontFamily: "system-ui, sans-serif",
3035
+ border: "1px solid rgba(255,255,255,0.07)",
3036
+ boxShadow: "0 10px 40px rgba(0,0,0,0.4)"
3037
+ } }, /* @__PURE__ */ React17.createElement("div", { style: { display: "flex", gap: "4px", alignItems: "center" } }, Array.from({ length: total }, (_, i) => /* @__PURE__ */ React17.createElement(StarIcon, { key: i + 1, index: i + 1 }))), showLabel && /* @__PURE__ */ React17.createElement("div", { style: {
3038
+ fontSize: "14px",
3039
+ fontWeight: "700",
3040
+ minHeight: "20px",
3041
+ color: active > 0 ? accent : "rgba(255,255,255,0.2)",
3042
+ transition: "color 0.2s"
3043
+ } }, active > 0 ? allowHalf ? halfLabels[active] : labels[Math.round(active)] : readOnly ? "Not rated" : "Rate this"), (rating > 0 || readOnly) && showCount && /* @__PURE__ */ React17.createElement("div", { style: { display: "flex", alignItems: "center", gap: "8px" } }, /* @__PURE__ */ React17.createElement("span", { style: {
3044
+ fontSize: "28px",
3045
+ fontWeight: "800",
3046
+ color: "#fff",
3047
+ lineHeight: 1
3048
+ } }, rating.toFixed(1)), /* @__PURE__ */ React17.createElement("div", null, /* @__PURE__ */ React17.createElement("div", { style: { display: "flex", gap: "1px", marginBottom: "3px" } }, Array.from({ length: total }, (_, i) => {
3049
+ const fill = rating >= i + 1 ? "full" : rating >= i + 0.5 ? "half" : "empty";
3050
+ const gid = `sm-${i}`;
3051
+ return /* @__PURE__ */ React17.createElement("svg", { key: i, width: "12", height: "12", viewBox: "0 0 24 24" }, /* @__PURE__ */ React17.createElement("defs", null, /* @__PURE__ */ React17.createElement("linearGradient", { id: gid }, /* @__PURE__ */ React17.createElement("stop", { offset: "50%", stopColor: accent }), /* @__PURE__ */ React17.createElement("stop", { offset: "50%", stopColor: "transparent" }))), /* @__PURE__ */ React17.createElement(
3052
+ "polygon",
3053
+ {
3054
+ points: "12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26",
3055
+ fill: fill === "full" ? accent : fill === "half" ? `url(#${gid})` : "transparent",
3056
+ stroke: fill === "empty" ? "rgba(255,255,255,0.15)" : accent,
3057
+ strokeWidth: "1.5"
3058
+ }
3059
+ ));
3060
+ })), reviewCount > 0 && /* @__PURE__ */ React17.createElement("span", { style: { fontSize: "11px", color: "rgba(255,255,255,0.3)" } }, reviewCount.toLocaleString(), " reviews"))), !readOnly && rating === 0 && /* @__PURE__ */ React17.createElement("p", { style: { fontSize: "11px", color: "rgba(255,255,255,0.2)", margin: 0 } }, allowHalf ? "Hover to rate \u2022 Half stars supported" : "Click to rate"));
3061
+ };
3062
+
3063
+ // src/components/StatCard/StatCard.jsx
3064
+ import React18, { useEffect as useEffect7, useRef as useRef3, useState as useState16 } from "react";
3065
+ var StatCard = ({
3066
+ title = "Active Users",
3067
+ value = "128K",
3068
+ numericValue = 128e3,
3069
+ change = "+12.4%",
3070
+ isPositive = true,
3071
+ icon = "\u{1F465}",
3072
+ bg = "#ffffff",
3073
+ accent = "#3b82f6",
3074
+ radius = "16px",
3075
+ showBadge = true,
3076
+ showIcon = true,
3077
+ barPercent = 68
3078
+ }) => {
3079
+ const [count, setCount] = useState16(0);
3080
+ const [barWidth, setBarWidth] = useState16(0);
3081
+ const [visible, setVisible] = useState16(false);
3082
+ const [entered, setEntered] = useState16(false);
3083
+ const ref = useRef3(null);
3084
+ useEffect7(() => {
3085
+ const observer = new IntersectionObserver(
3086
+ ([entry]) => {
3087
+ if (entry.isIntersecting) {
3088
+ setVisible(true);
3089
+ observer.disconnect();
3090
+ }
3091
+ },
3092
+ { threshold: 0.3 }
3093
+ );
3094
+ if (ref.current) observer.observe(ref.current);
3095
+ return () => observer.disconnect();
3096
+ }, []);
3097
+ useEffect7(() => {
3098
+ if (!visible) return;
3099
+ setEntered(true);
3100
+ const duration = 1400;
3101
+ const start = performance.now();
3102
+ const step = (now) => {
3103
+ const p = Math.min((now - start) / duration, 1);
3104
+ const eased = 1 - Math.pow(1 - p, 3);
3105
+ setCount(Math.floor(eased * numericValue));
3106
+ if (p < 1) requestAnimationFrame(step);
3107
+ };
3108
+ requestAnimationFrame(step);
3109
+ }, [visible, numericValue]);
3110
+ useEffect7(() => {
3111
+ if (!visible) return;
3112
+ const t = setTimeout(() => setBarWidth(barPercent), 200);
3113
+ return () => clearTimeout(t);
3114
+ }, [visible, barPercent]);
3115
+ const formatCount = (n) => {
3116
+ if (numericValue >= 1e6) return (n / 1e6).toFixed(1) + "M";
3117
+ if (numericValue >= 1e3) return (n / 1e3).toFixed(1) + "K";
3118
+ return n.toLocaleString();
3119
+ };
3120
+ const alpha = (hex, op) => {
3121
+ const r = parseInt(hex.slice(1, 3), 16);
3122
+ const g = parseInt(hex.slice(3, 5), 16);
3123
+ const b = parseInt(hex.slice(5, 7), 16);
3124
+ return `rgba(${r},${g},${b},${op})`;
3125
+ };
3126
+ const uid = accent.replace("#", "sc");
3127
+ return /* @__PURE__ */ React18.createElement(React18.Fragment, null, /* @__PURE__ */ React18.createElement("style", null, `
3128
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700;800&display=swap');
3129
+
3130
+ .sc-${uid} {
3131
+ font-family: 'Sora', sans-serif;
3132
+ background: ${bg};
3133
+ border-radius: ${radius};
3134
+ padding: 24px;
3135
+ display: inline-flex;
3136
+ flex-direction: column;
3137
+ gap: 14px;
3138
+ border: 1px solid rgba(0,0,0,0.07);
3139
+ box-shadow: 0 2px 16px rgba(0,0,0,0.06);
3140
+ min-width: 200px;
3141
+ position: relative;
3142
+ overflow: hidden;
3143
+ opacity: 0;
3144
+ transform: translateY(24px);
3145
+ transition: opacity 0.5s ease, transform 0.5s ease, box-shadow 0.25s ease;
3146
+ }
3147
+
3148
+ .sc-${uid}.entered {
3149
+ opacity: 1;
3150
+ transform: translateY(0);
3151
+ }
3152
+
3153
+ .sc-${uid}:hover {
3154
+ transform: translateY(-5px) !important;
3155
+ box-shadow: 0 16px 40px ${alpha(accent, 0.18)};
3156
+ }
3157
+
3158
+ /* Shimmer sweep on mount */
3159
+ .sc-${uid}::before {
3160
+ content: '';
3161
+ position: absolute;
3162
+ inset: 0;
3163
+ background: linear-gradient(105deg, transparent 40%, ${alpha(accent, 0.08)} 50%, transparent 60%);
3164
+ transform: translateX(-100%);
3165
+ transition: transform 0s;
3166
+ }
3167
+ .sc-${uid}.entered::before {
3168
+ animation: sc-shimmer-${uid} 0.9s ease 0.3s forwards;
3169
+ }
3170
+ @keyframes sc-shimmer-${uid} {
3171
+ to { transform: translateX(200%); }
3172
+ }
3173
+
3174
+ /* Pulse ring on icon */
3175
+ .sc-icon-${uid} {
3176
+ font-size: 1.3rem;
3177
+ background: ${alpha(accent, 0.1)};
3178
+ width: 42px;
3179
+ height: 42px;
3180
+ border-radius: 10px;
3181
+ display: flex;
3182
+ align-items: center;
3183
+ justify-content: center;
3184
+ position: relative;
3185
+ }
3186
+ .sc-icon-${uid}::after {
3187
+ content: '';
3188
+ position: absolute;
3189
+ inset: -4px;
3190
+ border-radius: 14px;
3191
+ border: 2px solid ${alpha(accent, 0.25)};
3192
+ animation: sc-pulse-${uid} 2s ease-in-out infinite;
3193
+ }
3194
+ @keyframes sc-pulse-${uid} {
3195
+ 0%, 100% { transform: scale(1); opacity: 0.6; }
3196
+ 50% { transform: scale(1.12); opacity: 0; }
3197
+ }
3198
+
3199
+ .sc-top-${uid} {
3200
+ display: flex;
3201
+ justify-content: space-between;
3202
+ align-items: center;
3203
+ }
3204
+
3205
+ .sc-badge-up-${uid} {
3206
+ font-size: 0.72rem;
3207
+ font-weight: 700;
3208
+ color: #16a34a;
3209
+ background: #dcfce7;
3210
+ padding: 3px 10px;
3211
+ border-radius: 999px;
3212
+ letter-spacing: 0.02em;
3213
+ animation: sc-badgepop-${uid} 0.4s cubic-bezier(.34,1.56,.64,1) 0.6s both;
3214
+ }
3215
+ .sc-badge-down-${uid} {
3216
+ font-size: 0.72rem;
3217
+ font-weight: 700;
3218
+ color: #dc2626;
3219
+ background: #fee2e2;
3220
+ padding: 3px 10px;
3221
+ border-radius: 999px;
3222
+ letter-spacing: 0.02em;
3223
+ animation: sc-badgepop-${uid} 0.4s cubic-bezier(.34,1.56,.64,1) 0.6s both;
3224
+ }
3225
+ @keyframes sc-badgepop-${uid} {
3226
+ from { transform: scale(0.5); opacity: 0; }
3227
+ to { transform: scale(1); opacity: 1; }
3228
+ }
3229
+
3230
+ .sc-value-${uid} {
3231
+ font-size: 2rem;
3232
+ font-weight: 800;
3233
+ color: #0f172a;
3234
+ line-height: 1;
3235
+ font-variant-numeric: tabular-nums;
3236
+ }
3237
+
3238
+ .sc-label-${uid} {
3239
+ font-size: 0.78rem;
3240
+ font-weight: 600;
3241
+ color: #94a3b8;
3242
+ text-transform: uppercase;
3243
+ letter-spacing: 0.07em;
3244
+ }
3245
+
3246
+ .sc-track-${uid} {
3247
+ height: 5px;
3248
+ border-radius: 999px;
3249
+ background: rgba(0,0,0,0.06);
3250
+ overflow: hidden;
3251
+ }
3252
+ .sc-fill-${uid} {
3253
+ height: 100%;
3254
+ border-radius: 999px;
3255
+ background: linear-gradient(90deg, ${alpha(accent, 0.5)}, ${accent});
3256
+ width: 0%;
3257
+ transition: width 1.2s cubic-bezier(0.22, 1, 0.36, 1) 0.4s;
3258
+ box-shadow: 0 0 8px ${alpha(accent, 0.5)};
3259
+ }
3260
+ `), /* @__PURE__ */ React18.createElement(
3261
+ "div",
3262
+ {
3263
+ ref,
3264
+ className: `sc-${uid}${entered ? " entered" : ""}`
3265
+ },
3266
+ /* @__PURE__ */ React18.createElement("div", { className: `sc-top-${uid}` }, showIcon && /* @__PURE__ */ React18.createElement("div", { className: `sc-icon-${uid}` }, icon), showBadge && /* @__PURE__ */ React18.createElement("span", { className: isPositive ? `sc-badge-up-${uid}` : `sc-badge-down-${uid}` }, isPositive ? "\u25B2" : "\u25BC", " ", change)),
3267
+ /* @__PURE__ */ React18.createElement("div", { className: `sc-value-${uid}` }, visible ? formatCount(count) : "0"),
3268
+ /* @__PURE__ */ React18.createElement("div", { className: `sc-label-${uid}` }, title),
3269
+ /* @__PURE__ */ React18.createElement("div", { className: `sc-track-${uid}` }, /* @__PURE__ */ React18.createElement(
3270
+ "div",
3271
+ {
3272
+ className: `sc-fill-${uid}`,
3273
+ style: { width: `${barWidth}%` }
3274
+ }
3275
+ ))
3276
+ ));
3277
+ };
3278
+
3279
+ // src/components/ProgressBar/ProgressBar.jsx
3280
+ import React19, { useEffect as useEffect8, useRef as useRef4, useState as useState17 } from "react";
3281
+ var ProgressBar = ({
3282
+ label = "Progress",
3283
+ percentage = 75,
3284
+ accent = "#6366f1",
3285
+ bg = "#ffffff",
3286
+ height = 12,
3287
+ showLabel = true,
3288
+ showPercent = true,
3289
+ type = "default",
3290
+ // "default" | "striped" | "circular" | "gradient" | "steps"
3291
+ steps = 5
3292
+ // only for type="steps"
3293
+ }) => {
3294
+ const [filled, setFilled] = useState17(0);
3295
+ const [visible, setVisible] = useState17(false);
3296
+ const ref = useRef4(null);
3297
+ useEffect8(() => {
3298
+ const obs = new IntersectionObserver(
3299
+ ([e]) => {
3300
+ if (e.isIntersecting) {
3301
+ setVisible(true);
3302
+ obs.disconnect();
3303
+ }
3304
+ },
3305
+ { threshold: 0.3 }
3306
+ );
3307
+ if (ref.current) obs.observe(ref.current);
3308
+ return () => obs.disconnect();
3309
+ }, []);
3310
+ useEffect8(() => {
3311
+ if (!visible) return;
3312
+ const duration = 1200;
3313
+ const start = performance.now();
3314
+ const target = Math.min(100, Math.max(0, percentage));
3315
+ const tick = (now) => {
3316
+ const p = Math.min((now - start) / duration, 1);
3317
+ const eased = 1 - Math.pow(1 - p, 4);
3318
+ setFilled(Math.round(eased * target));
3319
+ if (p < 1) requestAnimationFrame(tick);
3320
+ };
3321
+ requestAnimationFrame(tick);
3322
+ }, [visible, percentage]);
3323
+ const alpha = (hex, op) => {
3324
+ const r = parseInt(hex.slice(1, 3), 16);
3325
+ const g = parseInt(hex.slice(3, 5), 16);
3326
+ const b = parseInt(hex.slice(5, 7), 16);
3327
+ return `rgba(${r},${g},${b},${op})`;
3328
+ };
3329
+ const uid = (accent + label + type).replace(/[^a-z0-9]/gi, "x");
3330
+ const badgeColor = filled >= 80 ? "#16a34a" : filled >= 50 ? "#d97706" : "#dc2626";
3331
+ const badgeBg = filled >= 80 ? "#dcfce7" : filled >= 50 ? "#fef3c7" : "#fee2e2";
3332
+ const wrapStyle = {
3333
+ fontFamily: "'Sora', sans-serif",
3334
+ background: bg,
3335
+ borderRadius: "14px",
3336
+ padding: "20px 22px",
3337
+ display: "flex",
3338
+ flexDirection: "column",
3339
+ gap: "10px",
3340
+ border: "1px solid rgba(0,0,0,0.07)",
3341
+ boxShadow: "0 2px 12px rgba(0,0,0,0.05)",
3342
+ opacity: visible ? 1 : 0,
3343
+ transform: visible ? "translateY(0)" : "translateY(16px)",
3344
+ transition: "opacity 0.45s ease, transform 0.45s ease"
3345
+ };
3346
+ const rowStyle = { display: "flex", justifyContent: "space-between", alignItems: "center" };
3347
+ const labelEl = showLabel && /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.85rem", fontWeight: 600, color: "#334155" } }, label);
3348
+ const badgeEl = showPercent && /* @__PURE__ */ React19.createElement("span", { style: {
3349
+ fontSize: "0.72rem",
3350
+ fontWeight: 700,
3351
+ color: badgeColor,
3352
+ background: badgeBg,
3353
+ padding: "3px 10px",
3354
+ borderRadius: "999px",
3355
+ transition: "color 0.4s,background 0.4s",
3356
+ fontVariantNumeric: "tabular-nums"
3357
+ } }, filled, "%");
3358
+ if (type === "default") return /* @__PURE__ */ React19.createElement(React19.Fragment, null, /* @__PURE__ */ React19.createElement("style", null, `
3359
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&display=swap');
3360
+ @keyframes pb-pulse-${uid} {
3361
+ 0%,100%{opacity:.9;transform:translateY(-50%) scale(1)}
3362
+ 50%{opacity:.4;transform:translateY(-50%) scale(1.5)}
3363
+ }
3364
+ `), /* @__PURE__ */ React19.createElement("div", { ref, style: wrapStyle }, /* @__PURE__ */ React19.createElement("div", { style: rowStyle }, labelEl, badgeEl), /* @__PURE__ */ React19.createElement("div", { style: { width: "100%", height, borderRadius: "999px", background: "#f1f5f9", overflow: "hidden", position: "relative" } }, /* @__PURE__ */ React19.createElement("div", { style: {
3365
+ height: "100%",
3366
+ width: `${filled}%`,
3367
+ borderRadius: "999px",
3368
+ background: `linear-gradient(90deg,${alpha(accent, 0.7)},${accent})`,
3369
+ boxShadow: `0 0 10px ${alpha(accent, 0.35)}`,
3370
+ position: "relative",
3371
+ transition: "width 0.05s linear"
3372
+ } }, /* @__PURE__ */ React19.createElement("div", { style: {
3373
+ position: "absolute",
3374
+ right: 0,
3375
+ top: "50%",
3376
+ width: height + 4,
3377
+ height: height + 4,
3378
+ borderRadius: "50%",
3379
+ background: accent,
3380
+ boxShadow: `0 0 8px 2px ${alpha(accent, 0.5)}`,
3381
+ animation: `pb-pulse-${uid} 1.5s ease-in-out infinite`
3382
+ } }))), /* @__PURE__ */ React19.createElement("div", { style: rowStyle }, /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled < 100 ? `${filled} of 100 completed` : "Completed \u2713"), /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled >= 80 ? "Almost there!" : filled >= 50 ? "Halfway done" : "Just started"))));
3383
+ if (type === "striped") return /* @__PURE__ */ React19.createElement(React19.Fragment, null, /* @__PURE__ */ React19.createElement("style", null, `
3384
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&display=swap');
3385
+ @keyframes pb-stripe-${uid} { from{background-position:0 0} to{background-position:32px 0} }
3386
+ @keyframes pb-pulse-${uid} {
3387
+ 0%,100%{opacity:.9;transform:translateY(-50%) scale(1)}
3388
+ 50%{opacity:.4;transform:translateY(-50%) scale(1.5)}
3389
+ }
3390
+ `), /* @__PURE__ */ React19.createElement("div", { ref, style: wrapStyle }, /* @__PURE__ */ React19.createElement("div", { style: rowStyle }, labelEl, badgeEl), /* @__PURE__ */ React19.createElement("div", { style: { width: "100%", height, borderRadius: "999px", background: "#f1f5f9", overflow: "hidden", position: "relative" } }, /* @__PURE__ */ React19.createElement("div", { style: {
3391
+ height: "100%",
3392
+ width: `${filled}%`,
3393
+ borderRadius: "999px",
3394
+ background: `linear-gradient(90deg,${alpha(accent, 0.7)},${accent})`,
3395
+ boxShadow: `0 0 10px ${alpha(accent, 0.35)}`,
3396
+ position: "relative",
3397
+ transition: "width 0.05s linear"
3398
+ } }, /* @__PURE__ */ React19.createElement("div", { style: {
3399
+ position: "absolute",
3400
+ inset: 0,
3401
+ borderRadius: "999px",
3402
+ background: "repeating-linear-gradient(45deg,transparent,transparent 8px,rgba(255,255,255,0.18) 8px,rgba(255,255,255,0.18) 16px)",
3403
+ animation: `pb-stripe-${uid} 0.7s linear infinite`
3404
+ } }), /* @__PURE__ */ React19.createElement("div", { style: {
3405
+ position: "absolute",
3406
+ right: 0,
3407
+ top: "50%",
3408
+ width: height + 4,
3409
+ height: height + 4,
3410
+ borderRadius: "50%",
3411
+ background: accent,
3412
+ boxShadow: `0 0 8px 2px ${alpha(accent, 0.5)}`,
3413
+ animation: `pb-pulse-${uid} 1.5s ease-in-out infinite`
3414
+ } }))), /* @__PURE__ */ React19.createElement("div", { style: rowStyle }, /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled < 100 ? `${filled} of 100 completed` : "Completed \u2713"), /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled >= 80 ? "Almost there!" : filled >= 50 ? "Halfway done" : "Just started"))));
3415
+ if (type === "circular") {
3416
+ const r = 54;
3417
+ const cx = 70;
3418
+ const cy = 70;
3419
+ const circ = 2 * Math.PI * r;
3420
+ const offset = circ - filled / 100 * circ;
3421
+ return /* @__PURE__ */ React19.createElement(React19.Fragment, null, /* @__PURE__ */ React19.createElement("style", null, `
3422
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700;800&display=swap');
3423
+ @keyframes pb-spin-${uid} { from{stroke-dashoffset:${circ}} to{stroke-dashoffset:${offset}} }
3424
+ `), /* @__PURE__ */ React19.createElement("div", { ref, style: { ...wrapStyle, alignItems: "center", gap: 16 } }, /* @__PURE__ */ React19.createElement("svg", { width: "140", height: "140", viewBox: "0 0 140 140" }, /* @__PURE__ */ React19.createElement("circle", { cx, cy, r, fill: "none", stroke: "#f1f5f9", strokeWidth: "10" }), /* @__PURE__ */ React19.createElement(
3425
+ "circle",
3426
+ {
3427
+ cx,
3428
+ cy,
3429
+ r,
3430
+ fill: "none",
3431
+ stroke: accent,
3432
+ strokeWidth: "10",
3433
+ strokeLinecap: "round",
3434
+ strokeDasharray: circ,
3435
+ strokeDashoffset: offset,
3436
+ transform: `rotate(-90 ${cx} ${cy})`,
3437
+ style: { transition: "stroke-dashoffset 0.05s linear", filter: `drop-shadow(0 0 6px ${alpha(accent, 0.5)})` }
3438
+ }
3439
+ ), /* @__PURE__ */ React19.createElement(
3440
+ "text",
3441
+ {
3442
+ x: cx,
3443
+ y: cy - 8,
3444
+ textAnchor: "middle",
3445
+ dominantBaseline: "middle",
3446
+ style: { fontFamily: "'Sora',sans-serif", fontSize: "1.5rem", fontWeight: 800, fill: "#0f172a" }
3447
+ },
3448
+ filled,
3449
+ "%"
3450
+ ), /* @__PURE__ */ React19.createElement(
3451
+ "text",
3452
+ {
3453
+ x: cx,
3454
+ y: cy + 14,
3455
+ textAnchor: "middle",
3456
+ dominantBaseline: "middle",
3457
+ style: { fontFamily: "'Sora',sans-serif", fontSize: "0.68rem", fontWeight: 600, fill: "#94a3b8", letterSpacing: "0.05em" }
3458
+ },
3459
+ filled >= 80 ? "GREAT" : filled >= 50 ? "GOOD" : "LOW"
3460
+ )), showLabel && /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.85rem", fontWeight: 600, color: "#334155" } }, label)));
3461
+ }
3462
+ if (type === "gradient") {
3463
+ const colors = ["#ef4444", "#f97316", "#eab308", "#22c55e", "#6366f1"];
3464
+ const gradStr = colors.map((c, i) => `${c} ${i * 25}%`).join(",");
3465
+ return /* @__PURE__ */ React19.createElement(React19.Fragment, null, /* @__PURE__ */ React19.createElement("style", null, `
3466
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&display=swap');
3467
+ @keyframes pb-pulse-${uid} {
3468
+ 0%,100%{opacity:.9;transform:translateY(-50%) scale(1)}
3469
+ 50%{opacity:.4;transform:translateY(-50%) scale(1.5)}
3470
+ }
3471
+ `), /* @__PURE__ */ React19.createElement("div", { ref, style: wrapStyle }, /* @__PURE__ */ React19.createElement("div", { style: rowStyle }, labelEl, badgeEl), /* @__PURE__ */ React19.createElement("div", { style: { width: "100%", height, borderRadius: "999px", background: "#f1f5f9", overflow: "hidden", position: "relative" } }, /* @__PURE__ */ React19.createElement("div", { style: { position: "absolute", inset: 0, background: `linear-gradient(90deg,${gradStr})`, opacity: 0.15 } }), /* @__PURE__ */ React19.createElement("div", { style: {
3472
+ height: "100%",
3473
+ width: `${filled}%`,
3474
+ borderRadius: "999px",
3475
+ background: `linear-gradient(90deg,${gradStr})`,
3476
+ transition: "width 0.05s linear",
3477
+ position: "relative"
3478
+ } }, /* @__PURE__ */ React19.createElement("div", { style: {
3479
+ position: "absolute",
3480
+ right: 0,
3481
+ top: "50%",
3482
+ width: height + 4,
3483
+ height: height + 4,
3484
+ borderRadius: "50%",
3485
+ background: "#fff",
3486
+ border: `2px solid ${accent}`,
3487
+ animation: `pb-pulse-${uid} 1.5s ease-in-out infinite`
3488
+ } }))), /* @__PURE__ */ React19.createElement("div", { style: rowStyle }, /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled < 100 ? `${filled} of 100` : "Completed \u2713"), /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled >= 80 ? "Almost there!" : filled >= 50 ? "Halfway done" : "Just started"))));
3489
+ }
3490
+ if (type === "steps") {
3491
+ const completedSteps = Math.round(filled / 100 * steps);
3492
+ return /* @__PURE__ */ React19.createElement(React19.Fragment, null, /* @__PURE__ */ React19.createElement("style", null, `
3493
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&display=swap');
3494
+ @keyframes pb-popin-${uid} {
3495
+ from{transform:scale(0.5);opacity:0}
3496
+ to{transform:scale(1);opacity:1}
3497
+ }
3498
+ `), /* @__PURE__ */ React19.createElement("div", { ref, style: wrapStyle }, /* @__PURE__ */ React19.createElement("div", { style: rowStyle }, labelEl, badgeEl), /* @__PURE__ */ React19.createElement("div", { style: { display: "flex", alignItems: "center", gap: 0 } }, Array.from({ length: steps }, (_, i) => {
3499
+ const done = i < completedSteps;
3500
+ const active = i === completedSteps - 1;
3501
+ return /* @__PURE__ */ React19.createElement(React19.Fragment, { key: i }, /* @__PURE__ */ React19.createElement("div", { style: {
3502
+ width: 32,
3503
+ height: 32,
3504
+ borderRadius: "50%",
3505
+ background: done ? accent : "#f1f5f9",
3506
+ border: active ? `2px solid ${accent}` : done ? "none" : "2px solid #e2e8f0",
3507
+ display: "flex",
3508
+ alignItems: "center",
3509
+ justifyContent: "center",
3510
+ flexShrink: 0,
3511
+ boxShadow: active ? `0 0 12px ${alpha(accent, 0.4)}` : "none",
3512
+ transition: "background 0.3s,box-shadow 0.3s",
3513
+ animation: done ? `pb-popin-${uid} 0.3s ease ${i * 0.08}s both` : "none"
3514
+ } }, done ? /* @__PURE__ */ React19.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none" }, /* @__PURE__ */ React19.createElement("path", { d: "M2.5 7l3.5 3.5 5.5-6", stroke: "#fff", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })) : /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", fontWeight: 700, color: "#cbd5e1" } }, i + 1)), i < steps - 1 && /* @__PURE__ */ React19.createElement("div", { style: {
3515
+ flex: 1,
3516
+ height: 3,
3517
+ borderRadius: "999px",
3518
+ background: i < completedSteps - 1 ? accent : "#f1f5f9",
3519
+ transition: "background 0.3s"
3520
+ } }));
3521
+ })), /* @__PURE__ */ React19.createElement("div", { style: rowStyle }, /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, "Step ", completedSteps, " of ", steps), /* @__PURE__ */ React19.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled >= 80 ? "Almost there!" : filled >= 50 ? "Halfway done" : "Just started"))));
3522
+ }
3523
+ return null;
3524
+ };
3525
+
3526
+ // src/components/EcommerceCard/EcommerceCard.jsx
3527
+ import React20, { useState as useState18 } from "react";
3528
+ var EcommerceCard = ({
3529
+ image = "https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=600&q=80",
3530
+ title = "Wireless Headphones",
3531
+ description = "Premium noise-cancelling headphones with 40 hours battery life.",
3532
+ price = 199,
3533
+ currency = "$",
3534
+ accent = "#6366f1",
3535
+ bg = "#0f172a",
3536
+ onAddToCart = () => {
3537
+ },
3538
+ onViewDetails = () => {
3539
+ }
3540
+ }) => {
3541
+ const [hovered, setHovered] = useState18(false);
3542
+ const alpha = (hex, op) => {
3543
+ const r = parseInt(hex.slice(1, 3), 16), g = parseInt(hex.slice(3, 5), 16), b = parseInt(hex.slice(5, 7), 16);
3544
+ return "rgba(" + r + "," + g + "," + b + "," + op + ")";
3545
+ };
3546
+ return /* @__PURE__ */ React20.createElement(
3547
+ "div",
3548
+ {
3549
+ onMouseEnter: () => setHovered(true),
3550
+ onMouseLeave: () => setHovered(false),
3551
+ style: {
3552
+ background: bg,
3553
+ borderRadius: "20px",
3554
+ overflow: "hidden",
3555
+ width: "300px",
3556
+ border: "1px solid " + (hovered ? alpha(accent, 0.3) : "rgba(255,255,255,0.07)"),
3557
+ fontFamily: "system-ui,sans-serif",
3558
+ transition: "transform 0.25s, box-shadow 0.25s",
3559
+ transform: hovered ? "translateY(-4px)" : "translateY(0px)",
3560
+ boxShadow: hovered ? "0 16px 40px rgba(0,0,0,0.5)" : "0 4px 20px rgba(0,0,0,0.3)"
3561
+ }
3562
+ },
3563
+ /* @__PURE__ */ React20.createElement("div", { style: { position: "relative", width: "100%", height: "200px", overflow: "hidden" } }, /* @__PURE__ */ React20.createElement("img", { src: image, alt: title, style: { width: "100%", height: "100%", objectFit: "cover", transform: hovered ? "scale(1.05)" : "scale(1)", transition: "transform 0.4s ease" } }), /* @__PURE__ */ React20.createElement("div", { style: { position: "absolute", inset: 0, background: "linear-gradient(to top, rgba(0,0,0,0.5) 0%, transparent 60%)" } })),
3564
+ /* @__PURE__ */ React20.createElement("div", { style: { padding: "18px" } }, /* @__PURE__ */ React20.createElement("h3", { style: { fontSize: "15px", fontWeight: "700", color: "#fff", margin: "0 0 8px", lineHeight: 1.4 } }, title), /* @__PURE__ */ React20.createElement("p", { style: { fontSize: "13px", color: "rgba(255,255,255,0.45)", lineHeight: 1.65, margin: "0 0 18px" } }, description), /* @__PURE__ */ React20.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "18px" } }, /* @__PURE__ */ React20.createElement("span", { style: { fontSize: "24px", fontWeight: "800", color: "#fff" } }, currency, price), /* @__PURE__ */ React20.createElement(
3565
+ "button",
3566
+ {
3567
+ onClick: onAddToCart,
3568
+ style: { padding: "8px 16px", borderRadius: "12px", border: "none", background: accent, color: "#fff", fontSize: "13px", fontWeight: "700", cursor: "pointer", fontFamily: "inherit" }
3569
+ },
3570
+ "Add to Cart"
3571
+ )), /* @__PURE__ */ React20.createElement(
3572
+ "button",
3573
+ {
3574
+ onClick: onViewDetails,
3575
+ style: { width: "100%", padding: "11px", borderRadius: "12px", border: "1px solid " + alpha(accent, 0.3), background: "transparent", color: accent, fontSize: "13px", fontWeight: "700", cursor: "pointer", fontFamily: "inherit" }
3576
+ },
3577
+ "View Details"
3578
+ ))
3579
+ );
3580
+ };
3581
+
3582
+ // src/components/AnimatedForm/AnimatedForm.jsx
3583
+ import React21, { useState as useState19 } from "react";
3584
+ var AnimatedForm = ({
3585
+ title = "Contact Us",
3586
+ description = "We'll get back to you shortly",
3587
+ submitText = "Send Message",
3588
+ accent = "#6366f1",
3589
+ bg = "#0f172a",
3590
+ onSubmit = () => {
3591
+ }
3592
+ }) => {
3593
+ const [name, setName] = useState19("");
3594
+ const [email, setEmail] = useState19("");
3595
+ const [message, setMessage] = useState19("");
3596
+ const [hovered, setHovered] = useState19(false);
3597
+ const alpha = (hex, op) => {
3598
+ const r = parseInt(hex.slice(1, 3), 16), g = parseInt(hex.slice(3, 5), 16), b = parseInt(hex.slice(5, 7), 16);
3599
+ return "rgba(" + r + "," + g + "," + b + "," + op + ")";
3600
+ };
3601
+ return /* @__PURE__ */ React21.createElement(
3602
+ "div",
3603
+ {
3604
+ onMouseEnter: () => setHovered(true),
3605
+ onMouseLeave: () => setHovered(false),
3606
+ style: {
3607
+ background: bg,
3608
+ borderRadius: "20px",
3609
+ padding: "28px",
3610
+ width: "400px",
3611
+ border: "1px solid " + (hovered ? alpha(accent, 0.3) : "rgba(255,255,255,0.07)"),
3612
+ fontFamily: "system-ui,sans-serif",
3613
+ transition: "transform 0.25s, box-shadow 0.25s",
3614
+ transform: hovered ? "translateY(-4px)" : "translateY(0px)",
3615
+ boxShadow: hovered ? "0 16px 40px rgba(0,0,0,0.5)" : "0 4px 20px rgba(0,0,0,0.3)"
3616
+ }
3617
+ },
3618
+ /* @__PURE__ */ React21.createElement("h2", { style: { fontSize: "20px", fontWeight: "700", color: "#fff", margin: "0 0 8px" } }, title),
3619
+ /* @__PURE__ */ React21.createElement("p", { style: { fontSize: "14px", color: "rgba(255,255,255,0.45)", margin: "0 0 24px" } }, description),
3620
+ /* @__PURE__ */ React21.createElement(
3621
+ "input",
3622
+ {
3623
+ type: "text",
3624
+ placeholder: "Your Name",
3625
+ value: name,
3626
+ onChange: (e) => setName(e.target.value),
3627
+ style: {
3628
+ width: "100%",
3629
+ padding: "12px",
3630
+ borderRadius: "10px",
3631
+ border: "1px solid rgba(255,255,255,0.1)",
3632
+ background: "#1e293b",
3633
+ color: "#fff",
3634
+ fontSize: "14px",
3635
+ marginBottom: "16px",
3636
+ outline: "none",
3637
+ transition: "border-color 0.2s",
3638
+ fontFamily: "inherit"
3639
+ }
3640
+ }
3641
+ ),
3642
+ /* @__PURE__ */ React21.createElement(
3643
+ "input",
3644
+ {
3645
+ type: "email",
3646
+ placeholder: "Your Email",
3647
+ value: email,
3648
+ onChange: (e) => setEmail(e.target.value),
3649
+ style: {
3650
+ width: "100%",
3651
+ padding: "12px",
3652
+ borderRadius: "10px",
3653
+ border: "1px solid rgba(255,255,255,0.1)",
3654
+ background: "#1e293b",
3655
+ color: "#fff",
3656
+ fontSize: "14px",
3657
+ marginBottom: "16px",
3658
+ outline: "none",
3659
+ transition: "border-color 0.2s",
3660
+ fontFamily: "inherit"
3661
+ }
3662
+ }
3663
+ ),
3664
+ /* @__PURE__ */ React21.createElement(
3665
+ "textarea",
3666
+ {
3667
+ placeholder: "Your Message",
3668
+ value: message,
3669
+ onChange: (e) => setMessage(e.target.value),
3670
+ style: {
3671
+ width: "100%",
3672
+ padding: "12px",
3673
+ borderRadius: "10px",
3674
+ border: "1px solid rgba(255,255,255,0.1)",
3675
+ background: "#1e293b",
3676
+ color: "#fff",
3677
+ fontSize: "14px",
3678
+ marginBottom: "24px",
3679
+ outline: "none",
3680
+ transition: "border-color 0.2s",
3681
+ fontFamily: "inherit",
3682
+ minHeight: "120px",
3683
+ resize: "vertical"
3684
+ }
3685
+ }
3686
+ ),
3687
+ /* @__PURE__ */ React21.createElement(
3688
+ "button",
3689
+ {
3690
+ onClick: () => onSubmit({ name, email, message }),
3691
+ style: {
3692
+ width: "100%",
3693
+ padding: "13px",
3694
+ borderRadius: "12px",
3695
+ border: "none",
3696
+ background: "linear-gradient(135deg, " + accent + ", " + alpha(accent, 0.7) + ")",
3697
+ color: "#fff",
3698
+ fontSize: "14px",
3699
+ fontWeight: "700",
3700
+ cursor: "pointer",
3701
+ fontFamily: "inherit"
3702
+ }
3703
+ },
3704
+ submitText
3705
+ )
3706
+ );
3707
+ };
3708
+
3709
+ // src/components/ReviewCard/ReviewCard.jsx
3710
+ import React22 from "react";
3711
+ var ReviewCard = ({
3712
+ avatar = "https://images.unsplash.com/photo-1633332755192-727a05c4013d?w=800&q=80",
3713
+ name = "John Doe",
3714
+ rating = 4,
3715
+ review = "This product is fantastic! It exceeded my expectations in every way.",
3716
+ date = "2 days ago",
3717
+ accent = "#6366f1",
3718
+ bg = "#0f172a",
3719
+ onProfileClick = () => {
3720
+ }
3721
+ }) => {
3722
+ const alpha = (hex, op) => {
3723
+ const r = parseInt(hex.slice(1, 3), 16), g = parseInt(hex.slice(3, 5), 16), b = parseInt(hex.slice(5, 7), 16);
3724
+ return "rgba(" + r + "," + g + "," + b + "," + op + ")";
3725
+ };
3726
+ return /* @__PURE__ */ React22.createElement("div", { style: { background: bg, borderRadius: "16px", padding: "16px", width: "320px", fontFamily: "system-ui,sans-serif", border: "1px solid rgba(255,255,255,0.08)", boxShadow: "0 4px 16px rgba(0,0,0,0.3)" } }, /* @__PURE__ */ React22.createElement("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "12px" } }, /* @__PURE__ */ React22.createElement("img", { src: avatar, alt: name, onClick: onProfileClick, style: { width: "40px", height: "40px", borderRadius: "50%", cursor: "pointer" } }), /* @__PURE__ */ React22.createElement("div", { style: { display: "flex", flexDirection: "column", gap: "2px" } }, /* @__PURE__ */ React22.createElement("div", { style: { fontSize: "14px", fontWeight: "700", color: "#fff" } }, name), /* @__PURE__ */ React22.createElement("div", { style: { display: "flex", alignItems: "center", gap: "4px" } }, Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ React22.createElement("svg", { key: i, width: "14", height: "14", viewBox: "0 0 24 24", fill: i < rating ? accent : "rgba(255,255,255,0.15)", stroke: "none" }, /* @__PURE__ */ React22.createElement("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" })))))), /* @__PURE__ */ React22.createElement("div", { style: { fontSize: "13px", color: "rgba(255,255,255,0.7)", lineHeight: 1.5, marginBottom: "12px" } }, review), /* @__PURE__ */ React22.createElement("div", { style: { fontSize: "11px", color: "rgba(255,255,255,0.4)" } }, date));
3727
+ };
3728
+
3729
+ // src/components/Card/Card.jsx
3730
+ import React23, { useState as useState20 } from "react";
3731
+ var Card = ({
3732
+ title = "Performance",
3733
+ description = "Real-time metrics with live dashboard updates every second.",
3734
+ icon = "\u26A1",
3735
+ tag = "Active",
3736
+ onClick
3737
+ }) => {
3738
+ const [hovered, setHovered] = useState20(false);
3739
+ return /* @__PURE__ */ React23.createElement(
3740
+ "div",
3741
+ {
3742
+ onMouseEnter: () => setHovered(true),
3743
+ onMouseLeave: () => setHovered(false),
3744
+ onClick,
3745
+ style: {
3746
+ background: "#ffffff",
3747
+ border: `0.5px solid ${hovered ? "#00000033" : "#0000001a"}`,
3748
+ borderRadius: "12px",
3749
+ padding: "1.25rem",
3750
+ transition: "border-color 0.2s, transform 0.2s",
3751
+ transform: hovered ? "translateY(-2px)" : "translateY(0)",
3752
+ cursor: onClick ? "pointer" : "default",
3753
+ position: "relative",
3754
+ overflow: "hidden",
3755
+ fontFamily: "sans-serif",
3756
+ width: "260px"
3757
+ }
3758
+ },
3759
+ /* @__PURE__ */ React23.createElement("div", { style: {
3760
+ position: "absolute",
3761
+ top: 0,
3762
+ left: 0,
3763
+ right: 0,
3764
+ height: "3px",
3765
+ background: "#1D9E75",
3766
+ borderRadius: "12px 12px 0 0"
3767
+ } }),
3768
+ /* @__PURE__ */ React23.createElement("div", { style: {
3769
+ width: 40,
3770
+ height: 40,
3771
+ borderRadius: 8,
3772
+ background: "#E1F5EE",
3773
+ display: "flex",
3774
+ alignItems: "center",
3775
+ justifyContent: "center",
3776
+ fontSize: 18,
3777
+ marginBottom: 14
3778
+ } }, icon),
3779
+ /* @__PURE__ */ React23.createElement("p", { style: { fontSize: 15, fontWeight: 700, color: "#111", margin: "0 0 6px" } }, title),
3780
+ /* @__PURE__ */ React23.createElement("p", { style: { fontSize: 13, color: "#666", lineHeight: 1.6, margin: "0 0 16px" } }, description),
3781
+ /* @__PURE__ */ React23.createElement("div", { style: {
3782
+ display: "flex",
3783
+ alignItems: "center",
3784
+ justifyContent: "space-between",
3785
+ borderTop: "0.5px solid #0000001a",
3786
+ paddingTop: 12
3787
+ } }, /* @__PURE__ */ React23.createElement("span", { style: {
3788
+ fontSize: 11,
3789
+ fontWeight: 500,
3790
+ padding: "3px 9px",
3791
+ borderRadius: 20,
3792
+ background: "#E1F5EE",
3793
+ color: "#0F6E56"
3794
+ } }, tag), /* @__PURE__ */ React23.createElement("span", { style: {
3795
+ fontSize: 14,
3796
+ color: "#999",
3797
+ display: "inline-block",
3798
+ transition: "transform 0.2s",
3799
+ transform: hovered ? "translateX(3px)" : "translateX(0)"
3800
+ } }, "\u2192"))
3801
+ );
3802
+ };
3803
+
3804
+ // src/components/Button/Button.jsx
3805
+ import React24, { useState as useState21 } from "react";
3806
+ var Button = ({
3807
+ text = "Click Me",
3808
+ variant = "gradient",
3809
+ // primary | outline | ghost | gradient
3810
+ size = "md",
3811
+ // sm | md | lg
3812
+ icon,
3813
+ loading = false,
3814
+ disabled = false,
3815
+ onClick
3816
+ }) => {
3817
+ const [hovered, setHovered] = useState21(false);
3818
+ const variants = {
3819
+ primary: {
3820
+ background: "#2563eb",
3821
+ color: "#fff",
3822
+ border: "none"
3823
+ },
3824
+ outline: {
3825
+ background: "transparent",
3826
+ color: "#2563eb",
3827
+ border: "1px solid #2563eb"
3828
+ },
3829
+ ghost: {
3830
+ background: "transparent",
3831
+ color: "#111",
3832
+ border: "none"
3833
+ },
3834
+ gradient: {
3835
+ background: "linear-gradient(135deg, #6366f1, #06b6d4)",
3836
+ color: "#fff",
3837
+ border: "none"
3838
+ }
3839
+ };
3840
+ const sizes = {
3841
+ sm: { padding: "6px 12px", fontSize: "12px" },
3842
+ md: { padding: "10px 18px", fontSize: "14px" },
3843
+ lg: { padding: "14px 24px", fontSize: "16px" }
3844
+ };
3845
+ return /* @__PURE__ */ React24.createElement(
3846
+ "button",
3847
+ {
3848
+ onClick,
3849
+ disabled: disabled || loading,
3850
+ onMouseEnter: () => setHovered(true),
3851
+ onMouseLeave: () => setHovered(false),
3852
+ style: {
3853
+ ...variants[variant],
3854
+ ...sizes[size],
3855
+ borderRadius: "10px",
3856
+ cursor: disabled ? "not-allowed" : "pointer",
3857
+ display: "flex",
3858
+ alignItems: "center",
3859
+ gap: "8px",
3860
+ fontWeight: 600,
3861
+ fontFamily: "sans-serif",
3862
+ // 🔥 Animation
3863
+ transform: hovered ? "translateY(-2px) scale(1.02)" : "scale(1)",
3864
+ boxShadow: hovered ? "0 10px 20px rgba(0,0,0,0.15)" : "0 2px 6px rgba(0,0,0,0.1)",
3865
+ transition: "all 0.2s ease",
3866
+ opacity: disabled ? 0.6 : 1,
3867
+ position: "relative",
3868
+ overflow: "hidden"
3869
+ }
3870
+ },
3871
+ /* @__PURE__ */ React24.createElement(
3872
+ "span",
3873
+ {
3874
+ style: {
3875
+ position: "absolute",
3876
+ inset: 0,
3877
+ background: "rgba(255,255,255,0.2)",
3878
+ opacity: hovered ? 1 : 0,
3879
+ transition: "opacity 0.3s"
3880
+ }
3881
+ }
3882
+ ),
3883
+ loading ? /* @__PURE__ */ React24.createElement("span", null, "Loading...") : /* @__PURE__ */ React24.createElement(React24.Fragment, null, icon && /* @__PURE__ */ React24.createElement("span", null, icon), /* @__PURE__ */ React24.createElement("span", null, text))
3884
+ );
3885
+ };
3886
+
3887
+ // src/components/AnimatedButton/AnimatedButton.jsx
3888
+ import React25, { useState as useState22 } from "react";
3889
+ var AnimatedButton = ({
3890
+ text = "Click Me!",
3891
+ bg = "#7c3aed",
3892
+ color = "white",
3893
+ size = "md",
3894
+ width = "auto",
3895
+ radius = "12px",
3896
+ border = "none",
3897
+ weight = "600",
3898
+ shadow = "0 4px 14px rgba(124,58,237,0.4)",
3899
+ onClick
3900
+ }) => {
3901
+ const sizes = { sm: "8px 16px", md: "12px 24px", lg: "16px 32px" };
3902
+ const [hovered, setHovered] = useState22(false);
3903
+ return /* @__PURE__ */ React25.createElement(
3904
+ "button",
3905
+ {
3906
+ onClick,
3907
+ onMouseEnter: () => setHovered(true),
3908
+ onMouseLeave: () => setHovered(false),
3909
+ style: {
3910
+ background: hovered ? "#6b21a8" : bg,
3911
+ color,
3912
+ padding: sizes[size],
3913
+ width,
3914
+ border,
3915
+ borderRadius: radius,
3916
+ cursor: "pointer",
3917
+ fontWeight: weight,
3918
+ fontSize: "15px",
3919
+ boxShadow: shadow,
3920
+ transform: hovered ? "scale(1.05)" : "scale(1)",
3921
+ transition: "transform 0.2s ease, background 0.2s ease",
3922
+ display: "flex",
3923
+ alignItems: "center",
3924
+ justifyContent: "center",
3925
+ fontFamily: "system-ui, sans-serif",
3926
+ letterSpacing: "0.02em"
3927
+ }
3928
+ },
3929
+ text
3930
+ );
3931
+ };
3932
+ export {
3933
+ AnimatedButton,
3934
+ AnimatedForm,
3935
+ AvatarCard,
3936
+ BackgoundImageSlider,
3937
+ Button,
3938
+ Card,
3939
+ Charts,
3940
+ ColorPicker,
3941
+ EcommerceCard,
3942
+ FileUpload,
3943
+ Footer,
3944
+ ImageCard,
3945
+ ImageSlider,
3946
+ InvoiceCard,
3947
+ Loader,
3948
+ Navbar,
3949
+ NotificationToast,
3950
+ OTPInput,
3951
+ PageLoader,
3952
+ PricingCard,
3953
+ ProgressBar,
3954
+ RatingStars,
3955
+ ReviewCard,
3956
+ Sidebar,
3957
+ StatCard
3958
+ };