virtual-ui-lib 1.0.72 → 1.0.74

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.js CHANGED
@@ -44,8 +44,10 @@ __export(index_exports, {
44
44
  OTPInput: () => OTPInput,
45
45
  PageLoader: () => PageLoader,
46
46
  PricingCard: () => PricingCard,
47
+ ProgressBar: () => ProgressBar,
47
48
  RatingStars: () => RatingStars,
48
- Sidebar: () => Sidebar
49
+ Sidebar: () => Sidebar,
50
+ StatCard: () => StatCard
49
51
  });
50
52
  module.exports = __toCommonJS(index_exports);
51
53
 
@@ -3110,6 +3112,469 @@ var RatingStars = ({
3110
3112
  ));
3111
3113
  })), reviewCount > 0 && /* @__PURE__ */ import_react17.default.createElement("span", { style: { fontSize: "11px", color: "rgba(255,255,255,0.3)" } }, reviewCount.toLocaleString(), " reviews"))), !readOnly && rating === 0 && /* @__PURE__ */ import_react17.default.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"));
3112
3114
  };
3115
+
3116
+ // src/components/StatCard/StatCard.jsx
3117
+ var import_react18 = __toESM(require("react"));
3118
+ var StatCard = ({
3119
+ title = "Active Users",
3120
+ value = "128K",
3121
+ numericValue = 128e3,
3122
+ change = "+12.4%",
3123
+ isPositive = true,
3124
+ icon = "\u{1F465}",
3125
+ bg = "#ffffff",
3126
+ accent = "#3b82f6",
3127
+ radius = "16px",
3128
+ showBadge = true,
3129
+ showIcon = true,
3130
+ barPercent = 68
3131
+ }) => {
3132
+ const [count, setCount] = (0, import_react18.useState)(0);
3133
+ const [barWidth, setBarWidth] = (0, import_react18.useState)(0);
3134
+ const [visible, setVisible] = (0, import_react18.useState)(false);
3135
+ const [entered, setEntered] = (0, import_react18.useState)(false);
3136
+ const ref = (0, import_react18.useRef)(null);
3137
+ (0, import_react18.useEffect)(() => {
3138
+ const observer = new IntersectionObserver(
3139
+ ([entry]) => {
3140
+ if (entry.isIntersecting) {
3141
+ setVisible(true);
3142
+ observer.disconnect();
3143
+ }
3144
+ },
3145
+ { threshold: 0.3 }
3146
+ );
3147
+ if (ref.current) observer.observe(ref.current);
3148
+ return () => observer.disconnect();
3149
+ }, []);
3150
+ (0, import_react18.useEffect)(() => {
3151
+ if (!visible) return;
3152
+ setEntered(true);
3153
+ const duration = 1400;
3154
+ const start = performance.now();
3155
+ const step = (now) => {
3156
+ const p = Math.min((now - start) / duration, 1);
3157
+ const eased = 1 - Math.pow(1 - p, 3);
3158
+ setCount(Math.floor(eased * numericValue));
3159
+ if (p < 1) requestAnimationFrame(step);
3160
+ };
3161
+ requestAnimationFrame(step);
3162
+ }, [visible, numericValue]);
3163
+ (0, import_react18.useEffect)(() => {
3164
+ if (!visible) return;
3165
+ const t = setTimeout(() => setBarWidth(barPercent), 200);
3166
+ return () => clearTimeout(t);
3167
+ }, [visible, barPercent]);
3168
+ const formatCount = (n) => {
3169
+ if (numericValue >= 1e6) return (n / 1e6).toFixed(1) + "M";
3170
+ if (numericValue >= 1e3) return (n / 1e3).toFixed(1) + "K";
3171
+ return n.toLocaleString();
3172
+ };
3173
+ const alpha = (hex, op) => {
3174
+ const r = parseInt(hex.slice(1, 3), 16);
3175
+ const g = parseInt(hex.slice(3, 5), 16);
3176
+ const b = parseInt(hex.slice(5, 7), 16);
3177
+ return `rgba(${r},${g},${b},${op})`;
3178
+ };
3179
+ const uid = accent.replace("#", "sc");
3180
+ return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("style", null, `
3181
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700;800&display=swap');
3182
+
3183
+ .sc-${uid} {
3184
+ font-family: 'Sora', sans-serif;
3185
+ background: ${bg};
3186
+ border-radius: ${radius};
3187
+ padding: 24px;
3188
+ display: inline-flex;
3189
+ flex-direction: column;
3190
+ gap: 14px;
3191
+ border: 1px solid rgba(0,0,0,0.07);
3192
+ box-shadow: 0 2px 16px rgba(0,0,0,0.06);
3193
+ min-width: 200px;
3194
+ position: relative;
3195
+ overflow: hidden;
3196
+ opacity: 0;
3197
+ transform: translateY(24px);
3198
+ transition: opacity 0.5s ease, transform 0.5s ease, box-shadow 0.25s ease;
3199
+ }
3200
+
3201
+ .sc-${uid}.entered {
3202
+ opacity: 1;
3203
+ transform: translateY(0);
3204
+ }
3205
+
3206
+ .sc-${uid}:hover {
3207
+ transform: translateY(-5px) !important;
3208
+ box-shadow: 0 16px 40px ${alpha(accent, 0.18)};
3209
+ }
3210
+
3211
+ /* Shimmer sweep on mount */
3212
+ .sc-${uid}::before {
3213
+ content: '';
3214
+ position: absolute;
3215
+ inset: 0;
3216
+ background: linear-gradient(105deg, transparent 40%, ${alpha(accent, 0.08)} 50%, transparent 60%);
3217
+ transform: translateX(-100%);
3218
+ transition: transform 0s;
3219
+ }
3220
+ .sc-${uid}.entered::before {
3221
+ animation: sc-shimmer-${uid} 0.9s ease 0.3s forwards;
3222
+ }
3223
+ @keyframes sc-shimmer-${uid} {
3224
+ to { transform: translateX(200%); }
3225
+ }
3226
+
3227
+ /* Pulse ring on icon */
3228
+ .sc-icon-${uid} {
3229
+ font-size: 1.3rem;
3230
+ background: ${alpha(accent, 0.1)};
3231
+ width: 42px;
3232
+ height: 42px;
3233
+ border-radius: 10px;
3234
+ display: flex;
3235
+ align-items: center;
3236
+ justify-content: center;
3237
+ position: relative;
3238
+ }
3239
+ .sc-icon-${uid}::after {
3240
+ content: '';
3241
+ position: absolute;
3242
+ inset: -4px;
3243
+ border-radius: 14px;
3244
+ border: 2px solid ${alpha(accent, 0.25)};
3245
+ animation: sc-pulse-${uid} 2s ease-in-out infinite;
3246
+ }
3247
+ @keyframes sc-pulse-${uid} {
3248
+ 0%, 100% { transform: scale(1); opacity: 0.6; }
3249
+ 50% { transform: scale(1.12); opacity: 0; }
3250
+ }
3251
+
3252
+ .sc-top-${uid} {
3253
+ display: flex;
3254
+ justify-content: space-between;
3255
+ align-items: center;
3256
+ }
3257
+
3258
+ .sc-badge-up-${uid} {
3259
+ font-size: 0.72rem;
3260
+ font-weight: 700;
3261
+ color: #16a34a;
3262
+ background: #dcfce7;
3263
+ padding: 3px 10px;
3264
+ border-radius: 999px;
3265
+ letter-spacing: 0.02em;
3266
+ animation: sc-badgepop-${uid} 0.4s cubic-bezier(.34,1.56,.64,1) 0.6s both;
3267
+ }
3268
+ .sc-badge-down-${uid} {
3269
+ font-size: 0.72rem;
3270
+ font-weight: 700;
3271
+ color: #dc2626;
3272
+ background: #fee2e2;
3273
+ padding: 3px 10px;
3274
+ border-radius: 999px;
3275
+ letter-spacing: 0.02em;
3276
+ animation: sc-badgepop-${uid} 0.4s cubic-bezier(.34,1.56,.64,1) 0.6s both;
3277
+ }
3278
+ @keyframes sc-badgepop-${uid} {
3279
+ from { transform: scale(0.5); opacity: 0; }
3280
+ to { transform: scale(1); opacity: 1; }
3281
+ }
3282
+
3283
+ .sc-value-${uid} {
3284
+ font-size: 2rem;
3285
+ font-weight: 800;
3286
+ color: #0f172a;
3287
+ line-height: 1;
3288
+ font-variant-numeric: tabular-nums;
3289
+ }
3290
+
3291
+ .sc-label-${uid} {
3292
+ font-size: 0.78rem;
3293
+ font-weight: 600;
3294
+ color: #94a3b8;
3295
+ text-transform: uppercase;
3296
+ letter-spacing: 0.07em;
3297
+ }
3298
+
3299
+ .sc-track-${uid} {
3300
+ height: 5px;
3301
+ border-radius: 999px;
3302
+ background: rgba(0,0,0,0.06);
3303
+ overflow: hidden;
3304
+ }
3305
+ .sc-fill-${uid} {
3306
+ height: 100%;
3307
+ border-radius: 999px;
3308
+ background: linear-gradient(90deg, ${alpha(accent, 0.5)}, ${accent});
3309
+ width: 0%;
3310
+ transition: width 1.2s cubic-bezier(0.22, 1, 0.36, 1) 0.4s;
3311
+ box-shadow: 0 0 8px ${alpha(accent, 0.5)};
3312
+ }
3313
+ `), /* @__PURE__ */ import_react18.default.createElement(
3314
+ "div",
3315
+ {
3316
+ ref,
3317
+ className: `sc-${uid}${entered ? " entered" : ""}`
3318
+ },
3319
+ /* @__PURE__ */ import_react18.default.createElement("div", { className: `sc-top-${uid}` }, showIcon && /* @__PURE__ */ import_react18.default.createElement("div", { className: `sc-icon-${uid}` }, icon), showBadge && /* @__PURE__ */ import_react18.default.createElement("span", { className: isPositive ? `sc-badge-up-${uid}` : `sc-badge-down-${uid}` }, isPositive ? "\u25B2" : "\u25BC", " ", change)),
3320
+ /* @__PURE__ */ import_react18.default.createElement("div", { className: `sc-value-${uid}` }, visible ? formatCount(count) : "0"),
3321
+ /* @__PURE__ */ import_react18.default.createElement("div", { className: `sc-label-${uid}` }, title),
3322
+ /* @__PURE__ */ import_react18.default.createElement("div", { className: `sc-track-${uid}` }, /* @__PURE__ */ import_react18.default.createElement(
3323
+ "div",
3324
+ {
3325
+ className: `sc-fill-${uid}`,
3326
+ style: { width: `${barWidth}%` }
3327
+ }
3328
+ ))
3329
+ ));
3330
+ };
3331
+
3332
+ // src/components/ProgressBar/ProgressBar.jsx
3333
+ var import_react19 = __toESM(require("react"));
3334
+ var ProgressBar = ({
3335
+ label = "Progress",
3336
+ percentage = 75,
3337
+ accent = "#6366f1",
3338
+ bg = "#ffffff",
3339
+ height = 12,
3340
+ showLabel = true,
3341
+ showPercent = true,
3342
+ type = "default",
3343
+ // "default" | "striped" | "circular" | "gradient" | "steps"
3344
+ steps = 5
3345
+ // only for type="steps"
3346
+ }) => {
3347
+ const [filled, setFilled] = (0, import_react19.useState)(0);
3348
+ const [visible, setVisible] = (0, import_react19.useState)(false);
3349
+ const ref = (0, import_react19.useRef)(null);
3350
+ (0, import_react19.useEffect)(() => {
3351
+ const obs = new IntersectionObserver(
3352
+ ([e]) => {
3353
+ if (e.isIntersecting) {
3354
+ setVisible(true);
3355
+ obs.disconnect();
3356
+ }
3357
+ },
3358
+ { threshold: 0.3 }
3359
+ );
3360
+ if (ref.current) obs.observe(ref.current);
3361
+ return () => obs.disconnect();
3362
+ }, []);
3363
+ (0, import_react19.useEffect)(() => {
3364
+ if (!visible) return;
3365
+ const duration = 1200;
3366
+ const start = performance.now();
3367
+ const target = Math.min(100, Math.max(0, percentage));
3368
+ const tick = (now) => {
3369
+ const p = Math.min((now - start) / duration, 1);
3370
+ const eased = 1 - Math.pow(1 - p, 4);
3371
+ setFilled(Math.round(eased * target));
3372
+ if (p < 1) requestAnimationFrame(tick);
3373
+ };
3374
+ requestAnimationFrame(tick);
3375
+ }, [visible, percentage]);
3376
+ const alpha = (hex, op) => {
3377
+ const r = parseInt(hex.slice(1, 3), 16);
3378
+ const g = parseInt(hex.slice(3, 5), 16);
3379
+ const b = parseInt(hex.slice(5, 7), 16);
3380
+ return `rgba(${r},${g},${b},${op})`;
3381
+ };
3382
+ const uid = (accent + label + type).replace(/[^a-z0-9]/gi, "x");
3383
+ const badgeColor = filled >= 80 ? "#16a34a" : filled >= 50 ? "#d97706" : "#dc2626";
3384
+ const badgeBg = filled >= 80 ? "#dcfce7" : filled >= 50 ? "#fef3c7" : "#fee2e2";
3385
+ const wrapStyle = {
3386
+ fontFamily: "'Sora', sans-serif",
3387
+ background: bg,
3388
+ borderRadius: "14px",
3389
+ padding: "20px 22px",
3390
+ display: "flex",
3391
+ flexDirection: "column",
3392
+ gap: "10px",
3393
+ border: "1px solid rgba(0,0,0,0.07)",
3394
+ boxShadow: "0 2px 12px rgba(0,0,0,0.05)",
3395
+ opacity: visible ? 1 : 0,
3396
+ transform: visible ? "translateY(0)" : "translateY(16px)",
3397
+ transition: "opacity 0.45s ease, transform 0.45s ease"
3398
+ };
3399
+ const rowStyle = { display: "flex", justifyContent: "space-between", alignItems: "center" };
3400
+ const labelEl = showLabel && /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.85rem", fontWeight: 600, color: "#334155" } }, label);
3401
+ const badgeEl = showPercent && /* @__PURE__ */ import_react19.default.createElement("span", { style: {
3402
+ fontSize: "0.72rem",
3403
+ fontWeight: 700,
3404
+ color: badgeColor,
3405
+ background: badgeBg,
3406
+ padding: "3px 10px",
3407
+ borderRadius: "999px",
3408
+ transition: "color 0.4s,background 0.4s",
3409
+ fontVariantNumeric: "tabular-nums"
3410
+ } }, filled, "%");
3411
+ if (type === "default") return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("style", null, `
3412
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&display=swap');
3413
+ @keyframes pb-pulse-${uid} {
3414
+ 0%,100%{opacity:.9;transform:translateY(-50%) scale(1)}
3415
+ 50%{opacity:.4;transform:translateY(-50%) scale(1.5)}
3416
+ }
3417
+ `), /* @__PURE__ */ import_react19.default.createElement("div", { ref, style: wrapStyle }, /* @__PURE__ */ import_react19.default.createElement("div", { style: rowStyle }, labelEl, badgeEl), /* @__PURE__ */ import_react19.default.createElement("div", { style: { width: "100%", height, borderRadius: "999px", background: "#f1f5f9", overflow: "hidden", position: "relative" } }, /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3418
+ height: "100%",
3419
+ width: `${filled}%`,
3420
+ borderRadius: "999px",
3421
+ background: `linear-gradient(90deg,${alpha(accent, 0.7)},${accent})`,
3422
+ boxShadow: `0 0 10px ${alpha(accent, 0.35)}`,
3423
+ position: "relative",
3424
+ transition: "width 0.05s linear"
3425
+ } }, /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3426
+ position: "absolute",
3427
+ right: 0,
3428
+ top: "50%",
3429
+ width: height + 4,
3430
+ height: height + 4,
3431
+ borderRadius: "50%",
3432
+ background: accent,
3433
+ boxShadow: `0 0 8px 2px ${alpha(accent, 0.5)}`,
3434
+ animation: `pb-pulse-${uid} 1.5s ease-in-out infinite`
3435
+ } }))), /* @__PURE__ */ import_react19.default.createElement("div", { style: rowStyle }, /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled < 100 ? `${filled} of 100 completed` : "Completed \u2713"), /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled >= 80 ? "Almost there!" : filled >= 50 ? "Halfway done" : "Just started"))));
3436
+ if (type === "striped") return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("style", null, `
3437
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&display=swap');
3438
+ @keyframes pb-stripe-${uid} { from{background-position:0 0} to{background-position:32px 0} }
3439
+ @keyframes pb-pulse-${uid} {
3440
+ 0%,100%{opacity:.9;transform:translateY(-50%) scale(1)}
3441
+ 50%{opacity:.4;transform:translateY(-50%) scale(1.5)}
3442
+ }
3443
+ `), /* @__PURE__ */ import_react19.default.createElement("div", { ref, style: wrapStyle }, /* @__PURE__ */ import_react19.default.createElement("div", { style: rowStyle }, labelEl, badgeEl), /* @__PURE__ */ import_react19.default.createElement("div", { style: { width: "100%", height, borderRadius: "999px", background: "#f1f5f9", overflow: "hidden", position: "relative" } }, /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3444
+ height: "100%",
3445
+ width: `${filled}%`,
3446
+ borderRadius: "999px",
3447
+ background: `linear-gradient(90deg,${alpha(accent, 0.7)},${accent})`,
3448
+ boxShadow: `0 0 10px ${alpha(accent, 0.35)}`,
3449
+ position: "relative",
3450
+ transition: "width 0.05s linear"
3451
+ } }, /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3452
+ position: "absolute",
3453
+ inset: 0,
3454
+ borderRadius: "999px",
3455
+ background: "repeating-linear-gradient(45deg,transparent,transparent 8px,rgba(255,255,255,0.18) 8px,rgba(255,255,255,0.18) 16px)",
3456
+ animation: `pb-stripe-${uid} 0.7s linear infinite`
3457
+ } }), /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3458
+ position: "absolute",
3459
+ right: 0,
3460
+ top: "50%",
3461
+ width: height + 4,
3462
+ height: height + 4,
3463
+ borderRadius: "50%",
3464
+ background: accent,
3465
+ boxShadow: `0 0 8px 2px ${alpha(accent, 0.5)}`,
3466
+ animation: `pb-pulse-${uid} 1.5s ease-in-out infinite`
3467
+ } }))), /* @__PURE__ */ import_react19.default.createElement("div", { style: rowStyle }, /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled < 100 ? `${filled} of 100 completed` : "Completed \u2713"), /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled >= 80 ? "Almost there!" : filled >= 50 ? "Halfway done" : "Just started"))));
3468
+ if (type === "circular") {
3469
+ const r = 54;
3470
+ const cx = 70;
3471
+ const cy = 70;
3472
+ const circ = 2 * Math.PI * r;
3473
+ const offset = circ - filled / 100 * circ;
3474
+ return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("style", null, `
3475
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700;800&display=swap');
3476
+ @keyframes pb-spin-${uid} { from{stroke-dashoffset:${circ}} to{stroke-dashoffset:${offset}} }
3477
+ `), /* @__PURE__ */ import_react19.default.createElement("div", { ref, style: { ...wrapStyle, alignItems: "center", gap: 16 } }, /* @__PURE__ */ import_react19.default.createElement("svg", { width: "140", height: "140", viewBox: "0 0 140 140" }, /* @__PURE__ */ import_react19.default.createElement("circle", { cx, cy, r, fill: "none", stroke: "#f1f5f9", strokeWidth: "10" }), /* @__PURE__ */ import_react19.default.createElement(
3478
+ "circle",
3479
+ {
3480
+ cx,
3481
+ cy,
3482
+ r,
3483
+ fill: "none",
3484
+ stroke: accent,
3485
+ strokeWidth: "10",
3486
+ strokeLinecap: "round",
3487
+ strokeDasharray: circ,
3488
+ strokeDashoffset: offset,
3489
+ transform: `rotate(-90 ${cx} ${cy})`,
3490
+ style: { transition: "stroke-dashoffset 0.05s linear", filter: `drop-shadow(0 0 6px ${alpha(accent, 0.5)})` }
3491
+ }
3492
+ ), /* @__PURE__ */ import_react19.default.createElement(
3493
+ "text",
3494
+ {
3495
+ x: cx,
3496
+ y: cy - 8,
3497
+ textAnchor: "middle",
3498
+ dominantBaseline: "middle",
3499
+ style: { fontFamily: "'Sora',sans-serif", fontSize: "1.5rem", fontWeight: 800, fill: "#0f172a" }
3500
+ },
3501
+ filled,
3502
+ "%"
3503
+ ), /* @__PURE__ */ import_react19.default.createElement(
3504
+ "text",
3505
+ {
3506
+ x: cx,
3507
+ y: cy + 14,
3508
+ textAnchor: "middle",
3509
+ dominantBaseline: "middle",
3510
+ style: { fontFamily: "'Sora',sans-serif", fontSize: "0.68rem", fontWeight: 600, fill: "#94a3b8", letterSpacing: "0.05em" }
3511
+ },
3512
+ filled >= 80 ? "GREAT" : filled >= 50 ? "GOOD" : "LOW"
3513
+ )), showLabel && /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.85rem", fontWeight: 600, color: "#334155" } }, label)));
3514
+ }
3515
+ if (type === "gradient") {
3516
+ const colors = ["#ef4444", "#f97316", "#eab308", "#22c55e", "#6366f1"];
3517
+ const gradStr = colors.map((c, i) => `${c} ${i * 25}%`).join(",");
3518
+ return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("style", null, `
3519
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&display=swap');
3520
+ @keyframes pb-pulse-${uid} {
3521
+ 0%,100%{opacity:.9;transform:translateY(-50%) scale(1)}
3522
+ 50%{opacity:.4;transform:translateY(-50%) scale(1.5)}
3523
+ }
3524
+ `), /* @__PURE__ */ import_react19.default.createElement("div", { ref, style: wrapStyle }, /* @__PURE__ */ import_react19.default.createElement("div", { style: rowStyle }, labelEl, badgeEl), /* @__PURE__ */ import_react19.default.createElement("div", { style: { width: "100%", height, borderRadius: "999px", background: "#f1f5f9", overflow: "hidden", position: "relative" } }, /* @__PURE__ */ import_react19.default.createElement("div", { style: { position: "absolute", inset: 0, background: `linear-gradient(90deg,${gradStr})`, opacity: 0.15 } }), /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3525
+ height: "100%",
3526
+ width: `${filled}%`,
3527
+ borderRadius: "999px",
3528
+ background: `linear-gradient(90deg,${gradStr})`,
3529
+ transition: "width 0.05s linear",
3530
+ position: "relative"
3531
+ } }, /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3532
+ position: "absolute",
3533
+ right: 0,
3534
+ top: "50%",
3535
+ width: height + 4,
3536
+ height: height + 4,
3537
+ borderRadius: "50%",
3538
+ background: "#fff",
3539
+ border: `2px solid ${accent}`,
3540
+ animation: `pb-pulse-${uid} 1.5s ease-in-out infinite`
3541
+ } }))), /* @__PURE__ */ import_react19.default.createElement("div", { style: rowStyle }, /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled < 100 ? `${filled} of 100` : "Completed \u2713"), /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled >= 80 ? "Almost there!" : filled >= 50 ? "Halfway done" : "Just started"))));
3542
+ }
3543
+ if (type === "steps") {
3544
+ const completedSteps = Math.round(filled / 100 * steps);
3545
+ return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("style", null, `
3546
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&display=swap');
3547
+ @keyframes pb-popin-${uid} {
3548
+ from{transform:scale(0.5);opacity:0}
3549
+ to{transform:scale(1);opacity:1}
3550
+ }
3551
+ `), /* @__PURE__ */ import_react19.default.createElement("div", { ref, style: wrapStyle }, /* @__PURE__ */ import_react19.default.createElement("div", { style: rowStyle }, labelEl, badgeEl), /* @__PURE__ */ import_react19.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 0 } }, Array.from({ length: steps }, (_, i) => {
3552
+ const done = i < completedSteps;
3553
+ const active = i === completedSteps - 1;
3554
+ return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, { key: i }, /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3555
+ width: 32,
3556
+ height: 32,
3557
+ borderRadius: "50%",
3558
+ background: done ? accent : "#f1f5f9",
3559
+ border: active ? `2px solid ${accent}` : done ? "none" : "2px solid #e2e8f0",
3560
+ display: "flex",
3561
+ alignItems: "center",
3562
+ justifyContent: "center",
3563
+ flexShrink: 0,
3564
+ boxShadow: active ? `0 0 12px ${alpha(accent, 0.4)}` : "none",
3565
+ transition: "background 0.3s,box-shadow 0.3s",
3566
+ animation: done ? `pb-popin-${uid} 0.3s ease ${i * 0.08}s both` : "none"
3567
+ } }, done ? /* @__PURE__ */ import_react19.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none" }, /* @__PURE__ */ import_react19.default.createElement("path", { d: "M2.5 7l3.5 3.5 5.5-6", stroke: "#fff", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })) : /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", fontWeight: 700, color: "#cbd5e1" } }, i + 1)), i < steps - 1 && /* @__PURE__ */ import_react19.default.createElement("div", { style: {
3568
+ flex: 1,
3569
+ height: 3,
3570
+ borderRadius: "999px",
3571
+ background: i < completedSteps - 1 ? accent : "#f1f5f9",
3572
+ transition: "background 0.3s"
3573
+ } }));
3574
+ })), /* @__PURE__ */ import_react19.default.createElement("div", { style: rowStyle }, /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, "Step ", completedSteps, " of ", steps), /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontSize: "0.7rem", color: "#94a3b8" } }, filled >= 80 ? "Almost there!" : filled >= 50 ? "Halfway done" : "Just started"))));
3575
+ }
3576
+ return null;
3577
+ };
3113
3578
  // Annotate the CommonJS export names for ESM import in node:
3114
3579
  0 && (module.exports = {
3115
3580
  AvatarCard,
@@ -3127,6 +3592,8 @@ var RatingStars = ({
3127
3592
  OTPInput,
3128
3593
  PageLoader,
3129
3594
  PricingCard,
3595
+ ProgressBar,
3130
3596
  RatingStars,
3131
- Sidebar
3597
+ Sidebar,
3598
+ StatCard
3132
3599
  });