virtual-ui-lib 1.0.36 → 1.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +80 -1144
  2. package/dist/index.mjs +80 -1122
  3. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,1138 +1,96 @@
1
- // src/components/AlertBanner/AlertBanner.jsx
2
- import React, { useState, useEffect } from "react";
3
- var AlertBanner = ({
4
- message = "This is an alert message.",
5
- type = "info",
6
- onDismiss
7
- }) => {
8
- const [visible, setVisible] = useState(true);
9
- const [fade, setFade] = useState(false);
10
- const colors = {
11
- success: { background: "#059669", color: "white" },
12
- error: { background: "#dc2626", color: "white" },
13
- warning: { background: "#f59e0b", color: "black" },
14
- info: { background: "#2563eb", color: "white" }
15
- };
1
+ // src/components/ToastNotification/ToastNotification.jsx
2
+ import React, { useEffect, useState } from "react";
3
+ var ToastNotification = ({
4
+ type = "success",
5
+ title = "Success",
6
+ message = "Your action was successful!",
7
+ duration = 4e3,
8
+ onClose
9
+ }) => {
10
+ const [visible, setVisible] = useState(false);
11
+ const [progress, setProgress] = useState(0);
16
12
  useEffect(() => {
17
- if (!visible) {
18
- setFade(true);
19
- const timeout = setTimeout(() => onDismiss && onDismiss(), 300);
20
- return () => clearTimeout(timeout);
21
- }
22
- }, [visible, onDismiss]);
23
- return /* @__PURE__ */ React.createElement("div", { style: {
24
- position: "relative",
25
- width: "100%",
26
- background: colors[type].background,
27
- color: colors[type].color,
28
- padding: "16px 24px",
29
- borderRadius: "8px",
30
- boxShadow: "0 2px 10px rgba(0,0,0,0.2)",
31
- transition: "opacity 0.3s ease, transform 0.3s ease",
32
- transform: `translateY(${visible ? "0" : "-20px"})`,
33
- opacity: fade ? 0 : 1,
34
- zIndex: 1e3
35
- }, className: visible ? "slide-down" : "fade-out" }, message, /* @__PURE__ */ React.createElement("button", { onClick: () => setVisible(false), style: {
36
- position: "absolute",
37
- top: "10px",
38
- right: "10px",
39
- background: "transparent",
40
- color: "inherit",
41
- border: "none",
42
- cursor: "pointer",
43
- fontSize: "16px"
44
- } }, "\u2715"));
45
- };
46
-
47
- // src/components/Button/Button.jsx
48
- import React2 from "react";
49
- var Button = ({
50
- text = "Button",
51
- variant = "primary",
52
- color = "white",
53
- bg = "#2563eb",
54
- outlineColor = "#2563eb",
55
- ghostColor = "#2563eb",
56
- width = "auto",
57
- radius = "8px",
58
- weight = "600",
59
- iconLeft = null,
60
- iconRight = null,
61
- onClick,
62
- loading = false,
63
- disabled = false
64
- }) => {
65
- const variants = {
66
- primary: { background: bg, color, border: "none" },
67
- secondary: { background: "#7c3aed", color, border: "none" },
68
- outline: { background: "transparent", color, border: `2px solid ${outlineColor}` },
69
- ghost: { background: "transparent", color: ghostColor, border: "none" }
70
- };
71
- const { background, border } = variants[variant];
72
- return /* @__PURE__ */ React2.createElement(
73
- "button",
74
- {
75
- onClick,
76
- disabled: disabled || loading,
77
- style: {
78
- background,
79
- color: variants[variant].color,
80
- width,
81
- border,
82
- borderRadius: radius,
83
- cursor: disabled ? "not-allowed" : "pointer",
84
- fontWeight: weight,
85
- padding: "10px 20px",
86
- opacity: disabled ? 0.6 : 1,
87
- transition: "transform 0.2s ease, background 0.2s ease"
88
- },
89
- onMouseEnter: (e) => e.currentTarget.style.transform = "scale(1.05)",
90
- onMouseLeave: (e) => e.currentTarget.style.transform = "scale(1)",
91
- onMouseDown: (e) => e.currentTarget.style.transform = "scale(0.95)",
92
- onMouseUp: (e) => e.currentTarget.style.transform = "scale(1)"
93
- },
94
- loading ? "Loading..." : /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(React2.Fragment, null, iconLeft, text, iconRight))
95
- );
96
- };
97
-
98
- // src/components/Card/Card.jsx
99
- import React3 from "react";
100
- var Card = ({
101
- image = "https://via.placeholder.com/300x200",
102
- title = "Card Title",
103
- description = "This is a description of the card content. It should be concise and informative.",
104
- onClick,
105
- loading = false,
106
- disabled = false,
107
- bg = "#f9fafb",
108
- textColor = "#0f172a",
109
- hoverBg = "#e5e7eb",
110
- radius = "12px",
111
- shadow = "0 4px 14px rgba(0,0,0,0.1)",
112
- hoverShadow = "0 8px 28px rgba(0,0,0,0.2)",
113
- transition = "transform 0.3s, box-shadow 0.3s"
114
- }) => {
115
- return /* @__PURE__ */ React3.createElement(
116
- "div",
117
- {
118
- style: {
119
- background: bg,
120
- borderRadius: radius,
121
- boxShadow: shadow,
122
- padding: "16px",
123
- transition,
124
- cursor: disabled ? "not-allowed" : "pointer",
125
- opacity: disabled ? 0.6 : 1,
126
- position: "relative",
127
- overflow: "hidden"
128
- },
129
- onClick: disabled ? null : onClick,
130
- onMouseEnter: (e) => {
131
- e.currentTarget.style.boxShadow = hoverShadow;
132
- e.currentTarget.style.transform = "translateY(-4px)";
133
- },
134
- onMouseLeave: (e) => {
135
- e.currentTarget.style.boxShadow = shadow;
136
- e.currentTarget.style.transform = "translateY(0)";
137
- }
138
- },
139
- loading ? /* @__PURE__ */ React3.createElement("div", { style: {
140
- background: "#e0e0e0",
141
- height: "200px",
142
- borderRadius: radius,
143
- marginBottom: "12px"
144
- } }) : /* @__PURE__ */ React3.createElement("img", { src: image, alt: title, style: { width: "100%", borderRadius: radius } }),
145
- /* @__PURE__ */ React3.createElement("h3", { style: { margin: "12px 0 4px", fontSize: "16px", color: textColor } }, title),
146
- /* @__PURE__ */ React3.createElement("p", { style: { margin: "0 0 12px", fontSize: "14px", color: "#374151" } }, description),
147
- /* @__PURE__ */ React3.createElement(
148
- "button",
149
- {
150
- style: {
151
- padding: "10px 16px",
152
- background: "#2563eb",
153
- color: "white",
154
- border: "none",
155
- borderRadius: "8px",
156
- cursor: "pointer",
157
- fontWeight: "600",
158
- transition: "background 0.3s"
159
- },
160
- onClick,
161
- disabled
162
- },
163
- "Action"
164
- )
165
- );
166
- };
167
-
168
- // src/components/Dropdown/Dropdown.jsx
169
- import React4, { useRef, useState as useState2, useEffect as useEffect2 } from "react";
170
- var Dropdown = ({
171
- options = ["Option 1", "Option 2", "Option 3"],
172
- defaultValue = "Option 1",
173
- bg = "#1e293b",
174
- accent = "#7c3aed",
175
- textColor = "#f1f5f9",
176
- borderColor = "rgba(255,255,255,0.1)",
177
- radius = "10px",
178
- onSelect
179
- }) => {
180
- const [open, setOpen] = useState2(false);
181
- const [selected, setSelected] = useState2(defaultValue);
182
- const dropdownRef = useRef(null);
183
- const handleClickOutside = (event) => {
184
- if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
185
- setOpen(false);
186
- }
187
- };
188
- const handleKeyDown = (event) => {
189
- if (event.key === "ArrowDown") {
190
- }
191
- };
192
- useEffect2(() => {
193
- document.addEventListener("mousedown", handleClickOutside);
194
- document.addEventListener("keydown", handleKeyDown);
195
- return () => {
196
- document.removeEventListener("mousedown", handleClickOutside);
197
- document.removeEventListener("keydown", handleKeyDown);
198
- };
199
- });
200
- const handleOptionSelect = (option) => {
201
- setSelected(option);
202
- onSelect && onSelect(option);
203
- setOpen(false);
204
- };
205
- return /* @__PURE__ */ React4.createElement("div", { style: { position: "relative", display: "inline-block", fontFamily: "system-ui, sans-serif" }, ref: dropdownRef }, /* @__PURE__ */ React4.createElement("button", { onClick: () => setOpen((prev) => !prev), style: {
206
- background: bg,
207
- color: textColor,
208
- border: `1px solid ${borderColor}`,
209
- borderRadius: radius,
210
- padding: "10px 16px",
211
- cursor: "pointer",
212
- fontSize: "16px",
213
- display: "flex",
214
- alignItems: "center",
215
- gap: "5px"
216
- } }, selected, " ", /* @__PURE__ */ React4.createElement("span", { style: { marginLeft: "auto" } }, "\u25BC")), open && /* @__PURE__ */ React4.createElement("div", { style: {
217
- position: "absolute",
218
- top: "100%",
219
- left: 0,
220
- right: 0,
221
- background: bg,
222
- border: `1px solid ${borderColor}`,
223
- borderRadius: radius,
224
- boxShadow: "0 4px 10px rgba(0,0,0,0.2)",
225
- zIndex: 100,
226
- marginTop: "4px",
227
- animation: "fadeIn 0.3s ease, slideDown 0.3s ease"
228
- } }, options.map((option) => /* @__PURE__ */ React4.createElement("div", { key: option, onClick: () => handleOptionSelect(option), style: {
229
- padding: "10px 15px",
230
- color: option === selected ? accent : textColor,
231
- background: option === selected ? "rgba(124,58,237,0.1)" : "transparent",
232
- borderRadius: radius,
233
- cursor: "pointer",
234
- transition: "background 0.2s"
235
- }, onMouseEnter: (e) => e.currentTarget.style.background = "rgba(124,58,237,0.05)", onMouseLeave: (e) => e.currentTarget.style.background = "transparent" }, option))));
236
- };
237
-
238
- // src/components/EmptyState/EmptyState.jsx
239
- import React5, { useEffect as useEffect3, useState as useState3 } from "react";
240
- var EmptyState = ({
241
- mode = "default",
242
- icon = "https://i.imgur.com/E9Gdppt.png",
243
- message = "No data available. Please check back later.",
244
- actionText = "Try Again",
245
- onAction
246
- }) => {
247
- const [isVisible, setIsVisible] = useState3(false);
248
- useEffect3(() => {
249
- setIsVisible(true);
250
- }, []);
251
- const renderModeContent = () => {
252
- switch (mode) {
253
- case "action available":
254
- return /* @__PURE__ */ React5.createElement("div", { style: { textAlign: "center" } }, /* @__PURE__ */ React5.createElement("img", { src: icon, alt: "Empty State Icon", style: { width: "60px", marginBottom: "16px" } }), /* @__PURE__ */ React5.createElement("p", { style: { fontSize: "16px", color: "#64748b", margin: 0 } }, message), /* @__PURE__ */ React5.createElement("button", { onClick: onAction, style: {
255
- marginTop: "20px",
256
- padding: "10px 20px",
257
- background: "#7c3aed",
258
- color: "white",
259
- border: "none",
260
- borderRadius: "8px",
261
- cursor: "pointer",
262
- fontSize: "14px",
263
- fontWeight: "600",
264
- transition: "background 0.3s ease, transform 0.3s ease",
265
- boxShadow: "0 4px 14px rgba(124,58,237,0.4)"
266
- }, onMouseEnter: (e) => e.currentTarget.style.background = "#6d28d9", onMouseLeave: (e) => e.currentTarget.style.background = "#7c3aed" }, actionText));
267
- case "illustration mode":
268
- return /* @__PURE__ */ React5.createElement("div", { style: { textAlign: "center" } }, /* @__PURE__ */ React5.createElement("img", { src: icon, alt: "Illustration", style: { width: "80px", marginBottom: "16px" } }), /* @__PURE__ */ React5.createElement("p", { style: { fontSize: "16px", color: "#64748b", margin: 0 } }, message));
13
+ setVisible(true);
14
+ const interval = setInterval(() => {
15
+ setProgress((prev) => {
16
+ if (prev >= 100) {
17
+ clearInterval(interval);
18
+ onClose();
19
+ return 100;
20
+ }
21
+ return prev + 100 / (duration / 100);
22
+ });
23
+ }, 100);
24
+ return () => clearInterval(interval);
25
+ }, [duration, onClose]);
26
+ const getStyles = () => {
27
+ let bg, icon;
28
+ switch (type) {
29
+ case "success":
30
+ bg = "#059669";
31
+ icon = "\u2713";
32
+ break;
33
+ case "error":
34
+ bg = "#dc2626";
35
+ icon = "\u2716";
36
+ break;
37
+ case "warning":
38
+ bg = "#eab308";
39
+ icon = "\u26A0\uFE0F";
40
+ break;
41
+ case "info":
42
+ bg = "#2563eb";
43
+ icon = "\u2139\uFE0F";
44
+ break;
269
45
  default:
270
- return /* @__PURE__ */ React5.createElement("div", { style: { textAlign: "center" } }, /* @__PURE__ */ React5.createElement("img", { src: icon, alt: "Default Icon", style: { width: "60px", marginBottom: "16px" } }), /* @__PURE__ */ React5.createElement("p", { style: { fontSize: "16px", color: "#64748b", margin: 0 } }, message));
46
+ bg = "#059669";
47
+ icon = "\u2713";
271
48
  }
49
+ return { background: bg, icon };
272
50
  };
273
- return /* @__PURE__ */ React5.createElement("div", { style: {
274
- display: "flex",
275
- justifyContent: "center",
276
- alignItems: "center",
277
- height: "100vh",
278
- opacity: isVisible ? 1 : 0,
279
- transition: "opacity 0.5s ease-in-out"
280
- } }, renderModeContent());
281
- };
282
-
283
- // src/components/FormInput/FormInput.jsx
284
- import React6, { useState as useState4 } from "react";
285
- var FormInput = ({
286
- label = "Input Label",
287
- type = "text",
288
- value = "",
289
- placeholder = "Enter text...",
290
- errorMessage = "This field is required.",
291
- isError = false,
292
- isSuccess = false,
293
- isDisabled = false,
294
- onChange
295
- }) => {
296
- const [isFocused, setIsFocused] = useState4(false);
297
- const handleFocus = () => setIsFocused(true);
298
- const handleBlur = () => setIsFocused(false);
299
- return /* @__PURE__ */ React6.createElement("div", { style: { marginBottom: "20px", fontFamily: "system-ui, sans-serif" } }, /* @__PURE__ */ React6.createElement("label", { style: { display: "block", marginBottom: "8px", fontSize: "14px", color: isError ? "#ef4444" : "#64748b" } }, label), /* @__PURE__ */ React6.createElement(
300
- "input",
301
- {
302
- type,
303
- value,
304
- placeholder,
305
- onFocus: handleFocus,
306
- onBlur: handleBlur,
307
- onChange,
308
- disabled: isDisabled,
309
- style: {
310
- width: "100%",
311
- padding: "12px 16px",
312
- border: `2px solid ${isError ? "#ef4444" : isSuccess ? "#22c55e" : isFocused ? "#2563eb" : "#d1d5db"}`,
313
- borderRadius: "8px",
314
- boxShadow: isFocused ? "0 4px 14px rgba(37,99,235,0.3)" : "none",
315
- outline: "none",
316
- transition: "border-color 0.3s, box-shadow 0.3s",
317
- fontSize: "16px",
318
- color: "#0f172a"
319
- }
320
- }
321
- ), isError && /* @__PURE__ */ React6.createElement("p", { style: { marginTop: "8px", color: "#ef4444", fontSize: "12px", opacity: 0, animation: "fadeIn 0.3s forwards" } }, errorMessage), isSuccess && /* @__PURE__ */ React6.createElement("p", { style: { marginTop: "8px", color: "#22c55e", fontSize: "12px" } }, "Input is valid!"), /* @__PURE__ */ React6.createElement("style", null, `@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }`));
322
- };
323
-
324
- // src/components/GridLayout/GridLayout.jsx
325
- import React7 from "react";
326
- var GridLayout = ({
327
- items = [],
328
- cols = 3,
329
- loading = false,
330
- emptyMessage = "No items available",
331
- itemBg = "#1f2937",
332
- itemColor = "#f1f5f9",
333
- spacing = "16px",
334
- radius = "8px"
335
- }) => {
336
- const renderItem = (item, index) => /* @__PURE__ */ React7.createElement("div", { key: index, style: {
337
- background: itemBg,
338
- color: itemColor,
339
- borderRadius: radius,
51
+ return /* @__PURE__ */ React.createElement("div", { style: {
52
+ position: "fixed",
53
+ bottom: "20px",
54
+ right: "20px",
55
+ opacity: visible ? 1 : 0,
56
+ transform: visible ? "translateY(0)" : "translateY(20px)",
57
+ transition: "opacity 0.3s, transform 0.3s",
58
+ background: getStyles().background,
59
+ borderRadius: "12px",
340
60
  padding: "16px",
341
- margin: spacing,
342
- transition: "transform 0.3s, box-shadow 0.3s",
343
- boxShadow: "0 2px 10px rgba(0, 0, 0, 0.15)",
344
- display: "flex",
345
- justifyContent: "center",
346
- alignItems: "center",
347
- cursor: "pointer"
348
- }, onMouseEnter: (e) => {
349
- e.currentTarget.style.transform = "scale(1.05)";
350
- }, onMouseLeave: (e) => {
351
- e.currentTarget.style.transform = "scale(1)";
352
- } }, item);
353
- if (loading) {
354
- return /* @__PURE__ */ React7.createElement("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: spacing } }, Array.from({ length: cols * 3 }).map((_, index) => /* @__PURE__ */ React7.createElement("div", { key: index, style: { background: "#334155", height: "100px", borderRadius: radius } })));
355
- }
356
- if (items.length === 0) {
357
- return /* @__PURE__ */ React7.createElement("div", { style: { color: itemColor, textAlign: "center", padding: "20px" } }, emptyMessage);
358
- }
359
- return /* @__PURE__ */ React7.createElement("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: spacing } }, items.map(renderItem));
360
- };
361
-
362
- // src/components/ImageUploadPreview/ImageUploadPreview.jsx
363
- import React8, { useState as useState5 } from "react";
364
- var ImageUploadPreview = ({
365
- width = "300px",
366
- height = "200px",
367
- bg = "#1e293b",
368
- borderColor = "#7c3aed",
369
- errorColor = "#dc2626",
370
- borderRadius = "12px",
371
- onImageChange
372
- }) => {
373
- const [image, setImage] = useState5(null);
374
- const [error, setError] = useState5(false);
375
- const handleImageChange = (e) => {
376
- const file = e.target.files[0];
377
- const validTypes = ["image/png", "image/jpeg", "image/jpg"];
378
- if (validTypes.includes(file.type)) {
379
- setError(false);
380
- const reader = new FileReader();
381
- reader.onload = () => {
382
- setImage(reader.result);
383
- if (onImageChange) onImageChange(reader.result);
384
- };
385
- reader.readAsDataURL(file);
386
- } else {
387
- setError(true);
388
- }
389
- };
390
- const handleRemove = () => {
391
- setImage(null);
392
- setError(false);
393
- };
394
- return /* @__PURE__ */ React8.createElement("div", { style: {
395
- display: "flex",
396
- justifyContent: "center",
397
- alignItems: "center",
398
- width,
399
- height,
400
- background: bg,
401
- border: `2px solid ${error ? errorColor : borderColor}`,
402
- borderRadius,
403
- position: "relative",
404
- overflow: "hidden",
405
- transition: "border-color 0.3s"
406
- } }, !image && !error && /* @__PURE__ */ React8.createElement("input", { type: "file", onChange: handleImageChange, style: { display: "none" }, id: "file-input" }), !image && !error && /* @__PURE__ */ React8.createElement("label", { htmlFor: "file-input", style: { color: "#f1f5f9", cursor: "pointer", textAlign: "center" } }, "Upload Image"), error && /* @__PURE__ */ React8.createElement("p", { style: { color: errorColor, fontSize: "14px", textAlign: "center" } }, "Invalid image type!"), image && /* @__PURE__ */ React8.createElement("div", { style: {
407
- position: "absolute",
408
- top: 0,
409
- left: 0,
410
- right: 0,
411
- bottom: 0,
412
- display: "flex",
413
- justifyContent: "center",
414
- alignItems: "center",
415
- background: "rgba(0,0,0,0.6)",
416
- transition: "opacity 0.3s",
417
- opacity: 1
418
- } }, /* @__PURE__ */ React8.createElement("img", { src: image, alt: "Preview", style: {
419
- maxWidth: "100%",
420
- maxHeight: "100%",
421
- objectFit: "cover",
422
- transition: "transform 0.3s",
423
- borderRadius,
424
- cursor: "zoom-in"
425
- }, onMouseEnter: (e) => e.currentTarget.style.transform = "scale(1.05)", onMouseLeave: (e) => e.currentTarget.style.transform = "scale(1)" })), image && /* @__PURE__ */ React8.createElement("button", { onClick: handleRemove, style: {
426
- position: "absolute",
427
- top: "10px",
428
- right: "10px",
429
- background: "rgba(255,255,255,0.8)",
430
- color: "#dc2626",
431
- border: "none",
61
+ width: "300px",
62
+ boxShadow: "0 4px 20px rgba(0,0,0,0.2)",
63
+ fontFamily: "system-ui, sans-serif",
64
+ zIndex: 9999
65
+ } }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center", marginBottom: "8px" } }, /* @__PURE__ */ React.createElement("div", { style: {
66
+ width: "24px",
67
+ height: "24px",
432
68
  borderRadius: "50%",
433
- width: "30px",
434
- height: "30px",
435
- cursor: "pointer",
436
- fontSize: "16px",
437
- transition: "background 0.3s"
438
- }, onMouseEnter: (e) => e.currentTarget.style.background = "rgba(255,255,255,1)", onMouseLeave: (e) => e.currentTarget.style.background = "rgba(255,255,255,0.8)" }, "\xD7"));
439
- };
440
-
441
- // src/components/CopyButton/CopyButton.jsx
442
- import React9, { useState as useState6 } from "react";
443
- var CopyButton = ({
444
- text = "Copy",
445
- bg = "#2563eb",
446
- color = "white",
447
- radius = "8px",
448
- icon = /* @__PURE__ */ React9.createElement("span", { role: "img", "aria-label": "copy" }, "\u{1F4CB}"),
449
- padding = "10px 15px",
450
- shadow = "0 4px 14px rgba(37,99,235,0.4)"
451
- }) => {
452
- const [copied, setCopied] = useState6(false);
453
- const handleCopy = () => {
454
- navigator.clipboard.writeText(text);
455
- setCopied(true);
456
- setTimeout(() => setCopied(false), 2e3);
457
- };
458
- return /* @__PURE__ */ React9.createElement(
459
- "button",
460
- {
461
- onClick: handleCopy,
462
- style: {
463
- background: bg,
464
- color,
465
- border: "none",
466
- borderRadius: radius,
467
- padding,
468
- cursor: "pointer",
469
- fontWeight: "600",
470
- boxShadow: shadow,
471
- display: "flex",
472
- alignItems: "center",
473
- gap: "8px",
474
- transition: "background 0.3s"
475
- }
476
- },
477
- icon,
478
- copied ? "Copied!" : text
479
- );
480
- };
481
-
482
- // src/components/Loader/Loader.jsx
483
- import React10, { useEffect as useEffect4, useState as useState7 } from "react";
484
- var Loader = ({
485
- size = "medium",
486
- fullScreen = false,
487
- color = "#7c3aed",
488
- backgroundColor = "#0f172a",
489
- duration = "1s"
490
- }) => {
491
- const sizes = { small: "40px", medium: "60px", large: "80px" };
492
- const [fadeIn, setFadeIn] = useState7(false);
493
- useEffect4(() => {
494
- setFadeIn(true);
495
- }, []);
496
- return /* @__PURE__ */ React10.createElement(
497
- "div",
498
- {
499
- style: {
500
- display: "flex",
501
- justifyContent: "center",
502
- alignItems: "center",
503
- height: fullScreen ? "100vh" : "auto",
504
- background: fullScreen ? backgroundColor : "transparent",
505
- transition: "opacity 0.5s",
506
- opacity: fadeIn ? 1 : 0
507
- }
508
- },
509
- /* @__PURE__ */ React10.createElement(
510
- "div",
511
- {
512
- style: {
513
- width: sizes[size],
514
- height: sizes[size],
515
- border: `8px solid ${color}`,
516
- borderTop: `8px solid transparent`,
517
- borderRadius: "50%",
518
- animation: `spin ${duration} linear infinite`
519
- }
520
- }
521
- ),
522
- /* @__PURE__ */ React10.createElement("style", null, `
523
- @keyframes spin {
524
- 0% { transform: rotate(0deg); }
525
- 100% { transform: rotate(360deg); }
526
- }
527
- `)
528
- );
529
- };
530
-
531
- // src/components/OTPInput/OTPInput.jsx
532
- import React11, { useEffect as useEffect5, useRef as useRef2, useState as useState8 } from "react";
533
- var OTPInput = ({
534
- length = 4,
535
- bg = "#0f172a",
536
- borderColorDefault = "#4b5563",
537
- borderColorFocus = "#2563eb",
538
- borderColorError = "#e11d48",
539
- borderColorSuccess = "#059669",
540
- color = "#f1f5f9",
541
- radius = "8px",
542
- onChange,
543
- error = false,
544
- success = false
545
- }) => {
546
- const [otp, setOtp] = useState8(Array(length).fill(""));
547
- const inputRefs = useRef2(Array(length).fill().map(() => React11.createRef()));
548
- useEffect5(() => {
549
- inputRefs.current[0].current.focus();
550
- }, []);
551
- const handleChange = (index, value) => {
552
- if (/[^0-9]/.test(value)) return;
553
- const newOtp = [...otp];
554
- newOtp[index] = value;
555
- setOtp(newOtp);
556
- onChange(newOtp.join(""));
557
- if (value && index < length - 1) {
558
- inputRefs.current[index + 1].current.focus();
559
- }
560
- };
561
- const handleKeyDown = (index, event) => {
562
- if (event.key === "Backspace" && !otp[index] && index > 0) {
563
- inputRefs.current[index - 1].current.focus();
564
- }
565
- };
566
- const handlePaste = (event) => {
567
- const pastedData = event.clipboardData.getData("text").split("").slice(0, length);
568
- const newOtp = pastedData.map((char, index) => char.match(/\d/) ? char : "");
569
- setOtp(newOtp);
570
- newOtp.forEach((_, index) => {
571
- if (inputRefs.current[index]) {
572
- inputRefs.current[index].current.focus();
573
- }
574
- });
575
- onChange(newOtp.join(""));
576
- event.preventDefault();
577
- };
578
- return /* @__PURE__ */ React11.createElement("div", { style: { display: "flex", justifyContent: "center", gap: "10px" }, onPaste: handlePaste }, otp.map((value, index) => /* @__PURE__ */ React11.createElement(
579
- "input",
580
- {
581
- key: index,
582
- ref: inputRefs.current[index],
583
- value,
584
- onChange: (e) => handleChange(index, e.target.value),
585
- onKeyDown: (event) => handleKeyDown(index, event),
586
- style: {
587
- width: "40px",
588
- height: "50px",
589
- borderRadius: radius,
590
- border: `2px solid ${error ? borderColorError : success ? borderColorSuccess : index === otp.findIndex((v) => v !== "") ? borderColorFocus : borderColorDefault}`,
591
- background: bg,
592
- color,
593
- fontSize: "20px",
594
- textAlign: "center",
595
- outline: "none",
596
- transition: "border-color 0.3s ease, transform 0.2s ease",
597
- transform: `scale(${index === otp.findIndex((v) => v !== "") ? 1.05 : 1})`
598
- },
599
- autoFocus: index === 0
600
- }
601
- )));
602
- };
603
-
604
- // src/components/RatingStars/RatingStars.jsx
605
- import React12, { useState as useState9 } from "react";
606
- var RatingStars = ({
607
- totalStars = 5,
608
- selectedColor = "#ffc107",
609
- defaultColor = "#e4e5e9",
610
- size = "24px",
611
- onSelect
612
- }) => {
613
- const [hovered, setHovered] = useState9(0);
614
- const [selected, setSelected] = useState9(0);
615
- const handleMouseEnter = (index) => {
616
- setHovered(index + 1);
617
- };
618
- const handleMouseLeave = () => {
619
- setHovered(0);
620
- };
621
- const handleClick = (index) => {
622
- setSelected(index + 1);
623
- if (onSelect) onSelect(index + 1);
624
- };
625
- return /* @__PURE__ */ React12.createElement("div", { style: { display: "flex", gap: "4px" } }, [...Array(totalStars)].map((_, index) => /* @__PURE__ */ React12.createElement(
626
- "svg",
627
- {
628
- key: index,
629
- width: size,
630
- height: size,
631
- viewBox: "0 0 24 24",
632
- fill: "none",
633
- stroke: index < (hovered || selected) ? selectedColor : defaultColor,
634
- strokeWidth: "1.5",
635
- strokeLinecap: "round",
636
- strokeLinejoin: "round",
637
- onMouseEnter: () => handleMouseEnter(index),
638
- onMouseLeave: handleMouseLeave,
639
- onClick: () => handleClick(index),
640
- style: { transition: "color 0.2s ease" }
641
- },
642
- /* @__PURE__ */ React12.createElement("polygon", { points: "12 2 15.09 8.26 22 9.27 17 14.14 18.18 21 12 17.77 5.82 21 7 14.14 2 9.27 8.91 8.26 12 2" })
643
- )));
644
- };
645
-
646
- // src/components/UserAvatar/UserAvatar.jsx
647
- import React13 from "react";
648
- var UserAvatar = ({
649
- size = "50px",
650
- src = "",
651
- initials = "AB",
652
- online = false,
653
- busy = false,
654
- showStatus = true,
655
- bgColor = "#1e293b",
656
- textColor = "#f1f5f9",
657
- statusColor = "#22c55e",
658
- borderColor = "#7c3aed"
659
- }) => {
660
- return /* @__PURE__ */ React13.createElement(
661
- "div",
662
- {
663
- style: {
664
- position: "relative",
665
- width: size,
666
- height: size,
667
- borderRadius: "50%",
668
- backgroundColor: bgColor,
669
- display: "flex",
670
- alignItems: "center",
671
- justifyContent: "center",
672
- transition: "transform 0.2s",
673
- cursor: "pointer",
674
- overflow: "hidden",
675
- boxShadow: "0 4px 14px rgba(0, 0, 0, 0.2)"
676
- },
677
- onMouseEnter: (e) => {
678
- e.currentTarget.style.transform = "scale(1.1)";
679
- },
680
- onMouseLeave: (e) => {
681
- e.currentTarget.style.transform = "scale(1)";
682
- }
683
- },
684
- src ? /* @__PURE__ */ React13.createElement("img", { src, alt: initials, style: {
685
- width: "100%",
686
- height: "100%",
687
- borderRadius: "50%",
688
- objectFit: "cover"
689
- } }) : /* @__PURE__ */ React13.createElement("span", { style: {
690
- color: textColor,
691
- fontSize: "20px",
692
- fontWeight: "700"
693
- } }, initials),
694
- showStatus && /* @__PURE__ */ React13.createElement("span", { style: {
695
- position: "absolute",
696
- bottom: "0",
697
- right: "0",
698
- width: "12px",
699
- height: "12px",
700
- borderRadius: "50%",
701
- backgroundColor: busy ? "#fbbf24" : online ? statusColor : "#9ca3af",
702
- border: "2px solid " + borderColor
703
- } })
704
- );
705
- };
706
-
707
- // src/components/Navbar/Navbar.jsx
708
- import React14, { useState as useState10, useEffect as useEffect6 } from "react";
709
- var Navbar = ({
710
- logo = "https://via.placeholder.com/150",
711
- links = [{ name: "Home", href: "#" }, { name: "About", href: "#" }, { name: "Services", href: "#" }, { name: "Contact", href: "#" }],
712
- bgColor = "#0f172a",
713
- textColor = "#f1f5f9",
714
- linkColor = "#7c3aed",
715
- hoverColor = "#818cf8",
716
- sticky = false,
717
- radius = "8px"
718
- }) => {
719
- const [scrolled, setScrolled] = useState10(false);
720
- const [isOpen, setIsOpen] = useState10(false);
721
- useEffect6(() => {
722
- const handleScroll = () => {
723
- setScrolled(window.scrollY > 50);
724
- };
725
- window.addEventListener("scroll", handleScroll);
726
- return () => window.removeEventListener("scroll", handleScroll);
727
- }, []);
728
- return /* @__PURE__ */ React14.createElement("nav", { style: {
729
- position: sticky || scrolled ? "sticky" : "relative",
730
- top: 0,
731
- background: bgColor,
732
- padding: "10px 20px",
733
- borderRadius: radius,
734
- boxShadow: scrolled ? "0 4px 10px rgba(0,0,0,0.2)" : "none",
69
+ background: "white",
735
70
  display: "flex",
736
- justifyContent: "space-between",
737
71
  alignItems: "center",
738
- transition: "box-shadow 0.3s ease"
739
- } }, /* @__PURE__ */ React14.createElement("img", { src: logo, alt: "Logo", style: { width: "120px" } }), /* @__PURE__ */ React14.createElement("div", { style: { display: "none", gap: "20px", fontFamily: "system-ui, sans-serif", color: textColor, fontSize: "16px", cursor: "pointer" }, id: "nav-links" }, links.map((link) => /* @__PURE__ */ React14.createElement("a", { key: link.name, href: link.href, style: {
740
- color: textColor,
741
- textDecoration: "none",
742
- position: "relative"
743
- }, onMouseEnter: (e) => e.target.style.color = hoverColor, onMouseLeave: (e) => e.target.style.color = textColor }, link.name, /* @__PURE__ */ React14.createElement("span", { style: {
744
- position: "absolute",
745
- width: "100%",
746
- height: "2px",
747
- background: hoverColor,
748
- bottom: "-4px",
749
- left: 0,
750
- transform: "scaleX(0)",
751
- transition: "transform 0.3s ease"
752
- }, className: "underline" })))), /* @__PURE__ */ React14.createElement("div", { style: { display: "flex", alignItems: "center" } }, /* @__PURE__ */ React14.createElement("button", { onClick: () => setIsOpen(true), style: {
72
+ justifyContent: "center",
73
+ marginRight: "8px"
74
+ } }, /* @__PURE__ */ React.createElement("span", { style: { color: getStyles().background, fontSize: "16px" } }, getStyles().icon)), /* @__PURE__ */ React.createElement("h4", { style: { margin: 0, fontSize: "16px", fontWeight: "600", color: "white" } }, title)), /* @__PURE__ */ React.createElement("p", { style: { margin: "0 0 12px", fontSize: "14px", color: "#f1f5f9" } }, message), /* @__PURE__ */ React.createElement("button", { onClick: onClose, style: {
753
75
  background: "transparent",
76
+ color: "white",
754
77
  border: "none",
755
- color: textColor,
756
78
  cursor: "pointer",
757
- fontSize: "16px"
758
- } }, "\u2630")), isOpen && /* @__PURE__ */ React14.createElement("div", { style: {
759
- position: "fixed",
760
- top: 0,
761
- right: 0,
762
- width: "250px",
763
- height: "100%",
764
- background: bgColor,
765
- transform: isOpen ? "translateX(0)" : "translateX(100%)",
766
- transition: "transform 0.3s ease",
767
- padding: "20px",
768
- boxShadow: "-3px 0 10px rgba(0,0,0,0.5)",
769
- zIndex: 1e3
770
- } }, /* @__PURE__ */ React14.createElement("button", { onClick: () => setIsOpen(false), style: {
771
- color: textColor,
772
- background: "none",
773
- border: "none",
774
- fontSize: "24px",
775
- cursor: "pointer"
776
- } }, "\u2716"), /* @__PURE__ */ React14.createElement("div", { style: { marginTop: "30px" } }, links.map((link) => /* @__PURE__ */ React14.createElement("a", { key: link.name, href: link.href, style: {
777
- display: "block",
778
- color: textColor,
779
- textDecoration: "none",
780
- margin: "15px 0"
781
- } }, link.name)))));
782
- };
783
-
784
- // src/components/WishlistButton/WishlistButton.jsx
785
- import React15, { useState as useState11 } from "react";
786
- var WishlistButton = ({
787
- isActive = false,
788
- size = "40px",
789
- inactiveColor = "#d1d5db",
790
- activeColor = "#ff3e30",
791
- onToggle
792
- }) => {
793
- const [active, setActive] = useState11(isActive);
794
- const handleClick = () => {
795
- setActive((prev) => !prev);
796
- if (onToggle) onToggle(!active);
797
- };
798
- return /* @__PURE__ */ React15.createElement("div", { onClick: handleClick, style: { cursor: "pointer", width: size, height: size, display: "flex", alignItems: "center", justifyContent: "center" } }, /* @__PURE__ */ React15.createElement(
799
- "svg",
800
- {
801
- width: "100%",
802
- height: "100%",
803
- viewBox: "0 0 24 24",
804
- fill: "none",
805
- xmlns: "http://www.w3.org/2000/svg",
806
- style: {
807
- transition: "transform 0.2s",
808
- transform: active ? "scale(1.2)" : "scale(1)",
809
- fill: active ? activeColor : inactiveColor
810
- }
811
- },
812
- /* @__PURE__ */ React15.createElement("path", { d: "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" })
813
- ));
814
- };
815
-
816
- // src/components/Footer/Footer.jsx
817
- import React16 from "react";
818
- var Footer = ({
819
- bg = "#1e293b",
820
- textColor = "#f1f5f9",
821
- links = [{ text: "Home", url: "/" }, { text: "About", url: "/about" }, { text: "Services", url: "/services" }, { text: "Contact", url: "/contact" }],
822
- brandTitle = "Company Name",
823
- description = "Your reliable partner in success.",
824
- socialLinks = [{ icon: "\u{1F3E0}", url: "https://facebook.com" }, { icon: "\u{1F426}", url: "https://twitter.com" }, { icon: "\u{1F4F8}", url: "https://instagram.com" }]
825
- }) => {
826
- return /* @__PURE__ */ React16.createElement("footer", { style: { background: bg, color: textColor, padding: "20px 40px", fontFamily: "system-ui, sans-serif" } }, /* @__PURE__ */ React16.createElement("div", { style: { display: "flex", flexDirection: "column", alignItems: "center" } }, /* @__PURE__ */ React16.createElement("h2", { style: { margin: "0 0 10px", fontSize: "24px", fontWeight: "700" } }, brandTitle), /* @__PURE__ */ React16.createElement("p", { style: { margin: "0 0 20px", fontSize: "14px", textAlign: "center" } }, description), /* @__PURE__ */ React16.createElement("nav", { style: { display: "flex", justifyContent: "center", gap: "20px", marginBottom: "20px" } }, links.map((link) => /* @__PURE__ */ React16.createElement("a", { key: link.text, href: link.url, style: { color: textColor, textDecoration: "none", fontSize: "16px", transition: "color 0.3s" }, onMouseOver: (e) => e.currentTarget.style.color = "#7c3aed", onMouseOut: (e) => e.currentTarget.style.color = textColor }, link.text))), /* @__PURE__ */ React16.createElement("div", { style: { display: "flex", gap: "20px" } }, socialLinks.map((social) => /* @__PURE__ */ React16.createElement("a", { key: social.url, href: social.url, style: { color: textColor, fontSize: "24px", textDecoration: "none", transition: "color 0.3s" }, onMouseOver: (e) => e.currentTarget.style.color = "#7c3aed", onMouseOut: (e) => e.currentTarget.style.color = textColor }, social.icon)))), /* @__PURE__ */ React16.createElement("div", { style: { marginTop: "20px", fontSize: "12px", textAlign: "center", color: "#94a3b8" } }, "\xA9 ", (/* @__PURE__ */ new Date()).getFullYear(), " ", brandTitle, ". All rights reserved."));
827
- };
828
-
829
- // src/components/AnimatedProgressBar/AnimatedProgressBar.jsx
830
- import React17 from "react";
831
- var AnimatedProgressBar = ({
832
- percentage = 75,
833
- bgColor = "linear-gradient(135deg, #2563eb, #7c3aed)",
834
- height = "24px",
835
- borderRadius = "12px",
836
- textColor = "#ffffff",
837
- fontSize = "14px"
838
- }) => {
839
- return /* @__PURE__ */ React17.createElement("div", { style: { width: "100%", background: "#e5e7eb", borderRadius, overflow: "hidden", position: "relative" } }, /* @__PURE__ */ React17.createElement("div", { style: {
840
- width: percentage + "%",
841
- height,
842
- background: bgColor,
843
- borderRadius,
844
- transition: "width 0.5s ease-in-out"
845
- } }), /* @__PURE__ */ React17.createElement("span", { style: {
846
- position: "absolute",
847
- top: "50%",
848
- left: "50%",
849
- transform: "translate(-50%, -50%)",
850
- color: textColor,
851
- fontSize,
79
+ fontSize: "14px",
852
80
  fontWeight: "600"
853
- } }, percentage, "%"));
854
- };
855
-
856
- // src/components/MultiStepProgress/MultiStepProgress.jsx
857
- import React18, { useState as useState12 } from "react";
858
- var MultiStepProgress = ({
859
- steps = ["Step 1", "Step 2", "Step 3"],
860
- activeStep = 0,
861
- onStepChange
862
- }) => {
863
- const [currentStep, setCurrentStep] = useState12(activeStep);
864
- const handleNext = () => {
865
- if (currentStep < steps.length - 1) {
866
- setCurrentStep((prev) => prev + 1);
867
- if (onStepChange) onStepChange(currentStep + 1);
868
- }
869
- };
870
- const handlePrevious = () => {
871
- if (currentStep > 0) {
872
- setCurrentStep((prev) => prev - 1);
873
- if (onStepChange) onStepChange(currentStep - 1);
874
- }
875
- };
876
- return /* @__PURE__ */ React18.createElement("div", { style: { fontFamily: "system-ui, sans-serif", width: "100%", maxWidth: "700px", margin: "0 auto" } }, /* @__PURE__ */ React18.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: "16px" } }, steps.map((step, index) => /* @__PURE__ */ React18.createElement("div", { key: index, style: { flex: 1, textAlign: "center" } }, /* @__PURE__ */ React18.createElement("div", { style: {
877
- width: "40px",
878
- height: "40px",
879
- margin: "0 auto",
880
- borderRadius: "50%",
881
- background: index < currentStep ? "#059669" : index === currentStep ? "#2563eb" : "#cbd5e1",
882
- color: index <= currentStep ? "white" : "#0f172a",
883
- display: "flex",
884
- alignItems: "center",
885
- justifyContent: "center",
886
- fontWeight: "bold"
887
- } }, index + 1), /* @__PURE__ */ React18.createElement("p", { style: { color: index <= currentStep ? "#f1f5f9" : "#64748b", marginTop: "8px", fontSize: "14px" } }, step)))), /* @__PURE__ */ React18.createElement("div", { style: { display: "flex", position: "relative", height: "4px", background: "#cbd5e1", borderRadius: "2px" } }, /* @__PURE__ */ React18.createElement(
888
- "div",
889
- {
890
- style: {
891
- height: "100%",
892
- width: currentStep / (steps.length - 1) * 100 + "%",
893
- background: "#2563eb",
894
- borderRadius: "2px"
895
- }
896
- }
897
- )), /* @__PURE__ */ React18.createElement("div", { style: { display: "flex", justifyContent: "space-between", marginTop: "24px" } }, /* @__PURE__ */ React18.createElement("button", { onClick: handlePrevious, disabled: currentStep === 0, style: {
898
- padding: "10px 20px",
899
- borderRadius: "8px",
900
- background: currentStep === 0 ? "#cbd5e1" : "#7c3aed",
901
- color: "white",
902
- border: "none",
903
- cursor: currentStep === 0 ? "not-allowed" : "pointer"
904
- } }, "Previous"), /* @__PURE__ */ React18.createElement("button", { onClick: handleNext, disabled: currentStep === steps.length - 1, style: {
905
- padding: "10px 20px",
81
+ } }, "Close"), /* @__PURE__ */ React.createElement("div", { style: {
82
+ height: "4px",
83
+ background: "rgba(255, 255, 255, 0.3)",
906
84
  borderRadius: "8px",
907
- background: currentStep === steps.length - 1 ? "#cbd5e1" : "#7c3aed",
908
- color: "white",
909
- border: "none",
910
- cursor: currentStep === steps.length - 1 ? "not-allowed" : "pointer"
911
- } }, "Next")));
912
- };
913
-
914
- // src/components/DateRangePicker/DateRangePicker.jsx
915
- import React19, { useState as useState13 } from "react";
916
- var DateRangePicker = ({
917
- startDate = /* @__PURE__ */ new Date(),
918
- endDate = new Date((/* @__PURE__ */ new Date()).setDate((/* @__PURE__ */ new Date()).getDate() + 7)),
919
- onChange,
920
- bg = "#0f172a",
921
- highlightColor = "#2563eb",
922
- borderColor = "#7c3aed",
923
- borderRadius = "12px",
924
- textColor = "#f1f5f9"
925
- }) => {
926
- const [selectedStart, setSelectedStart] = useState13(startDate);
927
- const [selectedEnd, setSelectedEnd] = useState13(endDate);
928
- const daysArray = Array.from({ length: 30 }, (_, i) => new Date((/* @__PURE__ */ new Date()).setDate((/* @__PURE__ */ new Date()).getDate() + i)));
929
- const handleSelect = (date) => {
930
- if (!selectedStart || selectedEnd && date < selectedStart) {
931
- setSelectedStart(date);
932
- setSelectedEnd(null);
933
- } else {
934
- setSelectedEnd(date);
935
- }
936
- onChange && onChange(selectedStart, selectedEnd);
937
- };
938
- return /* @__PURE__ */ React19.createElement("div", { style: { display: "flex", flexDirection: "column", background: bg, padding: "16px", borderRadius, border: `1px solid ${borderColor}`, boxShadow: "0 4px 20px rgba(0, 0, 0, 0.2)", fontFamily: "system-ui, sans-serif" } }, /* @__PURE__ */ React19.createElement("h3", { style: { color: textColor, margin: "0 0 12px", fontSize: "16px", fontWeight: "600" } }, "Select Date Range"), /* @__PURE__ */ React19.createElement("div", { style: { display: "grid", gridTemplateColumns: "repeat(7, 1fr)", gap: "8px" } }, daysArray.map((date, index) => /* @__PURE__ */ React19.createElement("button", { key: index, onClick: () => handleSelect(date), style: {
939
- background: date >= selectedStart && date <= selectedEnd ? highlightColor : "#334155",
940
- color: textColor,
941
- padding: "10px 0",
942
- borderRadius,
943
- border: "none",
944
- cursor: "pointer",
945
- transition: "background 0.3s",
946
- fontSize: "14px"
947
- } }, date.getDate()))));
948
- };
949
-
950
- // src/components/LoadingSkeleton/LoadingSkeleton.jsx
951
- import React20 from "react";
952
- var LoadingSkeleton = ({
953
- type = "card",
954
- width = "300px",
955
- height = "200px",
956
- bg = "#334155",
957
- shimmerColor = "#7c3aed",
958
- radius = "12px",
959
- speed = "1.5s"
960
- }) => {
961
- const shimmer = {
962
- background: `linear-gradient(90deg, ${shimmerColor} 25%, rgba(255, 255, 255, 0.2) 50%, ${shimmerColor} 75%)`,
963
- backgroundSize: "200% 100%",
964
- animation: `shimmer ${speed} infinite`
965
- };
966
- return /* @__PURE__ */ React20.createElement("div", { style: { width, height, borderRadius: radius, position: "relative", overflow: "hidden", background: bg } }, /* @__PURE__ */ React20.createElement("div", { style: { width: "100%", height: "100%", ...shimmer } }), /* @__PURE__ */ React20.createElement("style", null, `@keyframes shimmer { 0% { background-position: 200% 0%; } 100% { background-position: 0% 0%; } }`));
967
- };
968
-
969
- // src/components/Rating/Rating.jsx
970
- import React21, { useState as useState14 } from "react";
971
- var Rating = ({
972
- value = 3.5,
973
- count = 5,
974
- size = 24,
975
- activeColor = "#fbbf24",
976
- inactiveColor = "#374151",
977
- spacing = 4,
978
- onSelect
979
- }) => {
980
- const [hoverValue, setHoverValue] = useState14(null);
981
- const [selectedValue, setSelectedValue] = useState14(value);
982
- const handleClick = (val) => {
983
- setSelectedValue(val);
984
- if (onSelect) onSelect(val);
985
- };
986
- return /* @__PURE__ */ React21.createElement("div", { style: { display: "flex", gap: spacing } }, [...Array(count)].map((_, i) => {
987
- const starValue = i + 1;
988
- const isActive = hoverValue ? hoverValue >= starValue : selectedValue >= starValue;
989
- const isHalf = hoverValue === null && selectedValue + 0.5 >= starValue && selectedValue < starValue;
990
- return /* @__PURE__ */ React21.createElement(
991
- "div",
992
- {
993
- key: i,
994
- style: { position: "relative", cursor: "pointer" },
995
- onClick: () => handleClick(starValue),
996
- onMouseEnter: () => setHoverValue(starValue),
997
- onMouseLeave: () => setHoverValue(null)
998
- },
999
- /* @__PURE__ */ React21.createElement(
1000
- "svg",
1001
- {
1002
- xmlns: "http://www.w3.org/2000/svg",
1003
- viewBox: "0 0 24 24",
1004
- fill: isActive ? activeColor : inactiveColor,
1005
- width: size,
1006
- height: size
1007
- },
1008
- /* @__PURE__ */ React21.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" })
1009
- ),
1010
- isHalf && /* @__PURE__ */ React21.createElement("div", { style: { position: "absolute", top: 0, left: 0, width: size / 2, height: size, overflow: "hidden" } }, /* @__PURE__ */ React21.createElement(
1011
- "svg",
1012
- {
1013
- xmlns: "http://www.w3.org/2000/svg",
1014
- viewBox: "0 0 24 24",
1015
- fill: activeColor,
1016
- width: size,
1017
- height: size
1018
- },
1019
- /* @__PURE__ */ React21.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" })
1020
- ))
1021
- );
1022
- }));
1023
- };
1024
-
1025
- // src/components/AnimatedNavbar/AnimatedNavbar.jsx
1026
- import React22 from "react";
1027
- var AnimatedNavbar = ({
1028
- logo = "https://via.placeholder.com/100",
1029
- links = [{ text: "Home", href: "#" }, { text: "About", href: "#" }, { text: "Services", href: "#" }, { text: "Contact", href: "#" }],
1030
- bgColor = "#0f172a",
1031
- textColor = "#f1f5f9",
1032
- accentColor = "#7c3aed",
1033
- radius = "8px"
1034
- }) => {
1035
- const [isOpen, setIsOpen] = React22.useState(false);
1036
- return /* @__PURE__ */ React22.createElement("nav", { style: {
1037
- background: bgColor,
1038
- display: "flex",
1039
- justifyContent: "space-between",
1040
- alignItems: "center",
1041
- padding: "10px 20px",
1042
- borderRadius: radius,
1043
- position: "relative",
1044
- boxShadow: "0 4px 10px rgba(0,0,0,0.2)",
1045
- transition: "background 0.3s"
1046
- } }, /* @__PURE__ */ React22.createElement("img", { src: logo, alt: "Logo", style: { width: "100px" } }), /* @__PURE__ */ React22.createElement("div", { style: { display: "flex", alignItems: "center", gap: "15px" } }, /* @__PURE__ */ React22.createElement("button", { onClick: () => setIsOpen(!isOpen), style: {
1047
- background: accentColor,
1048
- color: textColor,
1049
- border: "none",
1050
- borderRadius: radius,
1051
- padding: "8px 16px",
1052
- fontWeight: "600",
1053
- transition: "background 0.3s"
1054
- } }, "Menu")), isOpen && /* @__PURE__ */ React22.createElement("div", { style: {
1055
- position: "absolute",
1056
- top: "100%",
1057
- right: "0",
1058
- background: bgColor,
1059
- borderRadius: radius,
1060
- boxShadow: "0 4px 10px rgba(0,0,0,0.2)",
1061
- zIndex: 10,
1062
- display: "flex",
1063
- flexDirection: "column",
1064
- gap: "10px",
1065
- padding: "10px"
1066
- } }, links.map((link) => /* @__PURE__ */ React22.createElement("a", { key: link.text, href: link.href, style: {
1067
- color: textColor,
1068
- textDecoration: "none",
1069
- padding: "8px 12px",
1070
- borderRadius: radius,
1071
- transition: "background 0.3s"
1072
- }, onMouseEnter: (e) => e.currentTarget.style.background = accentColor, onMouseLeave: (e) => e.currentTarget.style.background = "transparent" }, link.text))));
1073
- };
1074
-
1075
- // src/components/StatCard/StatCard.jsx
1076
- import React23, { useEffect as useEffect7, useState as useState15 } from "react";
1077
- var StatCard = ({
1078
- title = "Total Sales",
1079
- value = 1e3,
1080
- change = 5,
1081
- bg = "#0f172a",
1082
- accent = "#0f766e",
1083
- negativeAccent = "#dc2626",
1084
- radius = "16px"
1085
- }) => {
1086
- const [count, setCount] = useState15(0);
1087
- useEffect7(() => {
1088
- let start = 0;
1089
- const end = value;
1090
- const duration = 2;
1091
- const increment = end / (duration * 60);
1092
- const timer = setInterval(() => {
1093
- start += increment;
1094
- if (start >= end) {
1095
- clearInterval(timer);
1096
- setCount(end);
1097
- } else {
1098
- setCount(Math.floor(start));
1099
- }
1100
- }, 1e3 / 60);
1101
- return () => clearInterval(timer);
1102
- }, [value]);
1103
- return /* @__PURE__ */ React23.createElement("div", { style: { background: bg, borderRadius: radius, padding: "24px", width: "280px", fontFamily: "system-ui, sans-serif", color: "#f1f5f9", position: "relative", boxShadow: "0 10px 30px rgba(0,0,0,0.5)" } }, /* @__PURE__ */ React23.createElement("h3", { style: { margin: "0 0 12px", fontSize: "16px", fontWeight: "600" } }, title), /* @__PURE__ */ React23.createElement("div", { style: { fontSize: "40px", fontWeight: "700", margin: "0 0 8px" } }, count), /* @__PURE__ */ React23.createElement("span", { style: {
1104
- background: change >= 0 ? accent : negativeAccent,
1105
- color: "white",
1106
- padding: "4px 8px",
1107
- borderRadius: "12px",
1108
- fontSize: "12px",
1109
- position: "absolute",
1110
- top: "24px",
1111
- right: "24px"
1112
- } }, change >= 0 ? "+" + change + "%" : change + "%"), /* @__PURE__ */ React23.createElement("svg", { width: "100%", height: "20", viewBox: "0 0 100 20", style: { marginTop: "10px" } }, /* @__PURE__ */ React23.createElement("polyline", { points: "0,15 20,10 40,12 60,5 80,8 100,0", stroke: accent, fill: "none", strokeWidth: "2" })));
85
+ overflow: "hidden",
86
+ marginTop: "12px"
87
+ } }, /* @__PURE__ */ React.createElement("div", { style: {
88
+ width: progress + "%",
89
+ height: "100%",
90
+ background: "white",
91
+ transition: "width 0.1s linear"
92
+ } })));
1113
93
  };
1114
94
  export {
1115
- AlertBanner,
1116
- AnimatedNavbar,
1117
- AnimatedProgressBar,
1118
- Button,
1119
- Card,
1120
- CopyButton,
1121
- DateRangePicker,
1122
- Dropdown,
1123
- EmptyState,
1124
- Footer,
1125
- FormInput,
1126
- GridLayout,
1127
- ImageUploadPreview,
1128
- Loader,
1129
- LoadingSkeleton,
1130
- MultiStepProgress,
1131
- Navbar,
1132
- OTPInput,
1133
- Rating,
1134
- RatingStars,
1135
- StatCard,
1136
- UserAvatar,
1137
- WishlistButton
95
+ ToastNotification
1138
96
  };