@levo-so/site-runtime 0.3.27 → 0.3.29

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/CHANGELOG.md +28 -1
  2. package/index.js +142 -117
  3. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,12 +1,39 @@
1
1
  # @levo-so/site-runtime
2
2
 
3
+ ## 0.3.29
4
+
5
+ ### Patch Changes
6
+
7
+ - Verification-code boxes built on `useLevoOtpInput` no longer jump back after a digit. Typing a digit moved focus to the next box, but that box still saw the code from before the digit and sent focus back to the box just filled, selected, so the next digit typed over it. Focus now moves forward one box per digit, as it should. Pasting a code, backspace and the arrow keys behave as before. Nothing to change in site code.
8
+ - The multi-ticket cart (`LevoEventRegister` with `enableMultipleTicketBooking`) respects a ticket's per-account registration limit within the order. When one email repeats on a ticket more often than its `max_registrations_per_account` allows, the extra attendee's email field shows "This ticket allows N per email. Use a different email." and the order cannot go on until it changes. Before, the order went through to Pay and the server refused it there.
9
+
10
+ - Emails are compared ignoring case and surrounding spaces, as the server does.
11
+ - The first N attendees on a ticket stay valid and only the extras are flagged, so the error lands on the entry just typed.
12
+ - An email that is missing or malformed keeps that error first.
13
+ - Only this order is counted. Registrations made earlier are still checked by the server at Pay ("Registration limit reached").
14
+ - A ticket with no limit is never flagged. The one-ticket sheet is unchanged.
15
+
16
+ Nothing to change in site code.
17
+
18
+ - Updated dependencies
19
+ - @levo-so/core@0.3.29
20
+ - @levo-so/insights@0.3.29
21
+
22
+ ## 0.3.28
23
+
24
+ ### Patch Changes
25
+
26
+ - Collection field public visibility flags synced with backend architecture
27
+ - @levo-so/core@0.3.28
28
+ - @levo-so/insights@0.3.28
29
+
3
30
  ## 0.3.27
4
31
 
5
32
  ### Patch Changes
6
33
 
7
34
  - Event registration suggests the event's public coupons and applies the best one on its own. It works in both the one-ticket sheet and the multi-ticket cart, and needs no new props or backend change: it uses the existing public-coupon list and coupon validation. **A visible change on every site that sells paid tickets.** Nothing to change in site code.
8
35
 
9
- - **The best public coupon is already applied when the price appears.** A green banner shows the code and the saving, with "Finding your best offer…" while it validates. A failed auto-apply stays silent and leaves the price as it was.
36
+ - **The best public coupon applies on its own once the server accepts it.** "Finding your best offer…" holds its place while it validates, then a green banner shows the code and the saving. A failed auto-apply stays silent and leaves the price as it was.
10
37
  - **The other public coupons the order qualifies for show as cards with their saving worked out**, e.g. "Save ₹300 · 10% off, up to ₹300". With nothing applied, the top card is marked "Best". Once a coupon is applied, the rest fold under "N more offers", and "Switch" moves to one of them.
11
38
  - **Only coupons the order qualifies for are offered.** Archived, not-yet-started, expired and fully redeemed coupons are left out, as are coupons whose minimum order is not met and coupons that cover none of the chosen tickets. Offers are ranked by estimated saving, capped at the coupon's maximum discount. The applied banner always shows the server's figure, not the estimate.
12
39
  - **Typing a code still works**, under "Have a code?", or "Have a different code?" once a coupon is applied. It is the only way to use a private code. A code that fails shows an inline error and leaves the applied coupon in place. Codes are upper-cased before they are checked.
package/index.js CHANGED
@@ -666,78 +666,83 @@ var q = ["levo-auth", "session"], nt = () => {
666
666
  }, kt = (e) => /^\+[1-9]\d{7,14}$/.test(Ot(e)), At = ({ value: e, onChange: t, length: n = 4, onComplete: r, autoFocus: i, disabled: a }) => {
667
667
  let o = k([]), [s, c] = A(null), l = k(r);
668
668
  l.current = r;
669
- let u = Array.from({ length: n }, (t, n) => e[n] ?? ""), d = w((e) => {
669
+ let u = k(e);
670
+ D(() => {
671
+ u.current = e;
672
+ });
673
+ let d = Array.from({ length: n }, (t, n) => e[n] ?? ""), f = w((e) => {
670
674
  let t = Math.max(0, Math.min(n - 1, e)), r = o.current[t];
671
675
  r?.focus(), r?.select();
672
676
  }, [n]);
673
677
  E(() => {
674
- i && !a && d(0);
678
+ i && !a && f(0);
675
679
  }, [
676
680
  i,
677
681
  a,
678
- d
682
+ f
679
683
  ]);
680
- let f = w((e, r) => {
684
+ let p = w((e, r) => {
681
685
  let i = e.slice(0, n);
682
- t(i), d(r), i.length === n && l.current?.(i);
686
+ u.current = i, t(i), f(r), i.length === n && l.current?.(i);
683
687
  }, [
684
688
  n,
685
689
  t,
686
- d
687
- ]), p = (t, r) => {
690
+ f
691
+ ]), m = (t, r) => {
688
692
  let i = r.replace(/\D/g, "");
689
693
  if (!i) return;
690
694
  if (i.length > 1) {
691
695
  let r = (e.slice(0, t) + i).slice(0, n);
692
- f(r, r.length);
696
+ p(r, r.length);
693
697
  return;
694
698
  }
695
- let a = [...u];
696
- a[t] = i, f(a.join("").slice(0, Math.max(t + 1, e.length)), t + 1);
697
- }, m = (t, n) => {
699
+ let a = [...d];
700
+ a[t] = i, p(a.join("").slice(0, Math.max(t + 1, e.length)), t + 1);
701
+ }, h = (t, n) => {
698
702
  if (n.key === "Backspace") {
699
703
  n.preventDefault();
700
- let r = u[t] ? t : t - 1;
704
+ let r = d[t] ? t : t - 1;
701
705
  if (r < 0) return;
702
- f(e.slice(0, r), r);
706
+ p(e.slice(0, r), r);
703
707
  return;
704
708
  }
705
709
  if (n.key === "ArrowLeft") {
706
- n.preventDefault(), d(t - 1);
710
+ n.preventDefault(), f(t - 1);
707
711
  return;
708
712
  }
709
- n.key === "ArrowRight" && (n.preventDefault(), d(Math.min(t + 1, e.length)));
710
- }, h = (e) => {
713
+ n.key === "ArrowRight" && (n.preventDefault(), f(Math.min(t + 1, e.length)));
714
+ }, g = (e) => {
711
715
  e.preventDefault();
712
716
  let t = e.clipboardData.getData("text").replace(/\D/g, "");
713
717
  if (!t) return;
714
718
  let r = t.slice(0, n);
715
- f(r, r.length);
719
+ p(r, r.length);
716
720
  };
717
721
  return {
718
- slots: u.map((t, r) => ({
719
- char: t,
720
- isActive: s === r,
722
+ slots: d.map((e, t) => ({
723
+ char: e,
724
+ isActive: s === t,
721
725
  inputProps: {
722
726
  ref: (e) => {
723
- o.current[r] = e;
727
+ o.current[t] = e;
724
728
  },
725
- value: t,
729
+ value: e,
726
730
  inputMode: "numeric",
727
- autoComplete: r === 0 ? "one-time-code" : "off",
731
+ autoComplete: t === 0 ? "one-time-code" : "off",
728
732
  type: "text",
729
- "aria-label": `Digit ${r + 1} of ${n}`,
730
- onChange: (e) => p(r, e.target.value),
731
- onKeyDown: (e) => m(r, e),
732
- onPaste: h,
733
+ "aria-label": `Digit ${t + 1} of ${n}`,
734
+ onChange: (e) => m(t, e.target.value),
735
+ onKeyDown: (e) => h(t, e),
736
+ onPaste: g,
733
737
  onFocus: () => {
734
- if (r > e.length) {
735
- d(e.length);
738
+ let e = u.current;
739
+ if (t > e.length) {
740
+ f(e.length);
736
741
  return;
737
742
  }
738
- c(r);
743
+ c(t);
739
744
  },
740
- onBlur: () => c((e) => e === r ? null : e),
745
+ onBlur: () => c((e) => e === t ? null : e),
741
746
  disabled: a
742
747
  }
743
748
  })),
@@ -745,7 +750,7 @@ var q = ["levo-auth", "session"], nt = () => {
745
750
  role: "group",
746
751
  "aria-label": `${n}-digit verification code`
747
752
  },
748
- clear: w(() => f("", 0), [f])
753
+ clear: w(() => p("", 0), [p])
749
754
  };
750
755
  }, jt = C(() => import("./kbChat-eFsau7hG.js")), Mt = ({ site: e, path: t }) => {
751
756
  let n = K(), r = e.workspace_id || void 0;
@@ -3158,12 +3163,21 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3158
3163
  ];
3159
3164
  for (let [e, i] of r) t[e] !== "off" && i && (n[e] = i);
3160
3165
  return n;
3161
- }, vi = (e, t) => {
3166
+ }, vi = (e) => {
3167
+ let t = {}, n = /* @__PURE__ */ new Map();
3168
+ for (let r of e) {
3169
+ let e = r.ticket.max_registrations_per_account, i = r.email.trim().toLowerCase();
3170
+ if (!e || !i) continue;
3171
+ let a = `${r.ticket._id}|${i}`, o = (n.get(a) ?? 0) + 1;
3172
+ n.set(a, o), o > e && (t[r.key] = `This ticket allows ${e} per email. Use a different email.`);
3173
+ }
3174
+ return t;
3175
+ }, yi = (e, t) => {
3162
3176
  let n = {};
3163
3177
  e.name.trim() || (n.name = "Please enter your name"), t.email !== "off" && (e.email.trim() ? /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(e.email.trim()) || (n.email = "That email address doesn't look right") : t.email === "required" && (n.email = "Please enter your email")), t.mobile !== "off" && (e.mobile.trim() ? gi(e.mobile) || (n.mobile = "That doesn't look like a valid phone number") : t.mobile === "required" && (n.mobile = "Please enter your phone number"));
3164
3178
  for (let r of ["organization", "designation"]) t[r] === "required" && !e[r].trim() && (n[r] = `Please enter your ${r}`);
3165
3179
  return n;
3166
- }, yi = (e) => e.quantity === null || e.quantity === void 0 ? 10 : Math.max(0, Math.min(10, e.quantity - (e.sale_count ?? 0))), bi = "inline-flex size-8 items-center justify-center rounded-full border border-border text-ink transition hover:border-brand hover:text-brand active:scale-95 disabled:pointer-events-none disabled:opacity-35", xi = ({ tickets: e, counts: t, onChange: n, error: r }) => /* @__PURE__ */ N("fieldset", {
3180
+ }, bi = (e) => e.quantity === null || e.quantity === void 0 ? 10 : Math.max(0, Math.min(10, e.quantity - (e.sale_count ?? 0))), xi = "inline-flex size-8 items-center justify-center rounded-full border border-border text-ink transition hover:border-brand hover:text-brand active:scale-95 disabled:pointer-events-none disabled:opacity-35", Si = ({ tickets: e, counts: t, onChange: n, error: r }) => /* @__PURE__ */ N("fieldset", {
3167
3181
  className: "m-0 flex min-w-0 flex-col gap-2 border-0 p-0",
3168
3182
  children: [
3169
3183
  /* @__PURE__ */ M("legend", {
@@ -3171,7 +3185,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3171
3185
  children: "Choose your tickets"
3172
3186
  }),
3173
3187
  e.map((e) => {
3174
- let r = t[e._id] ?? 0, i = yi(e), a = i === 0, o = Br(e);
3188
+ let r = t[e._id] ?? 0, i = bi(e), a = i === 0, o = Br(e);
3175
3189
  return /* @__PURE__ */ N("div", {
3176
3190
  className: X("flex w-full items-start gap-3 rounded-xl border px-3.5 py-3 transition", r > 0 ? "border-brand bg-brand/5" : "border-border", a && "opacity-60"),
3177
3191
  children: [/* @__PURE__ */ N("div", {
@@ -3207,7 +3221,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3207
3221
  "aria-label": `Remove one ${e.title} ticket`,
3208
3222
  disabled: r === 0,
3209
3223
  onClick: () => n(e._id, r - 1),
3210
- className: bi,
3224
+ className: xi,
3211
3225
  children: /* @__PURE__ */ M(le, { className: "size-3.5" })
3212
3226
  }),
3213
3227
  /* @__PURE__ */ N("span", {
@@ -3223,7 +3237,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3223
3237
  "aria-label": `Add one ${e.title} ticket`,
3224
3238
  disabled: r >= i,
3225
3239
  onClick: () => n(e._id, r + 1),
3226
- className: bi,
3240
+ className: xi,
3227
3241
  children: /* @__PURE__ */ M(ue, { className: "size-3.5" })
3228
3242
  })
3229
3243
  ]
@@ -3262,13 +3276,13 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3262
3276
  country: ""
3263
3277
  }
3264
3278
  }
3265
- }, Si = {
3279
+ }, Ci = {
3266
3280
  name: !0,
3267
3281
  email: !0,
3268
3282
  mobile: !0,
3269
3283
  organization: !0,
3270
3284
  designation: !0
3271
- }, Ci = (e, t) => {
3285
+ }, wi = (e, t) => {
3272
3286
  let [n, r] = A(Q), [i, a] = A({}), [o, s] = A(!1), c = k(!1);
3273
3287
  E(() => {
3274
3288
  c.current || !e || (c.current = !0, r((t) => ({
@@ -3277,7 +3291,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3277
3291
  email: t.email || e.email || ""
3278
3292
  })));
3279
3293
  }, [e]);
3280
- let l = vi(n, t), u = w((e, t) => r((n) => ({
3294
+ let l = yi(n, t), u = w((e, t) => r((n) => ({
3281
3295
  ...n,
3282
3296
  [e]: t
3283
3297
  })), []), d = w((e) => a((t) => ({
@@ -3298,9 +3312,9 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3298
3312
  touchField: d,
3299
3313
  reset: f,
3300
3314
  resetValidationDisplay: p,
3301
- touched: o ? Si : i
3315
+ touched: o ? Ci : i
3302
3316
  };
3303
- }, wi = (e, t, n) => {
3317
+ }, Ti = (e, t, n) => {
3304
3318
  let [r, i] = A({}), [a, o] = A({}), [s, c] = A({
3305
3319
  is_business_purchase: Q.is_business_purchase,
3306
3320
  billing_details: Q.billing_details
@@ -3324,7 +3338,16 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3324
3338
  }, [e, p]);
3325
3339
  let m = (e) => r[e] ?? Q, h = O(() => {
3326
3340
  let e = {};
3327
- for (let t of f) e[t.key] = vi(r[t.key] ?? Q, t.rules);
3341
+ for (let t of f) e[t.key] = yi(r[t.key] ?? Q, t.rules);
3342
+ let t = vi(f.map((e) => ({
3343
+ key: e.key,
3344
+ ticket: e.ticket,
3345
+ email: (r[e.key] ?? Q).email
3346
+ })));
3347
+ for (let [n, r] of Object.entries(t)) {
3348
+ let t = e[n];
3349
+ t && !t.email && (t.email = r);
3350
+ }
3328
3351
  return e;
3329
3352
  }, [f, r]), g = (e) => Object.keys(h[e] ?? {}).length === 0, _ = w((e, t, n) => i((r) => ({
3330
3353
  ...r,
@@ -3340,7 +3363,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3340
3363
  }
3341
3364
  })), []), y = w((e) => o((t) => ({
3342
3365
  ...t,
3343
- [e]: Si
3366
+ [e]: Ci
3344
3367
  })), []), b = w((e, t) => c((n) => ({
3345
3368
  ...n,
3346
3369
  [e]: t
@@ -3358,7 +3381,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3358
3381
  errors: h,
3359
3382
  isSlotValid: g,
3360
3383
  isValid: f.every((e) => g(e.key)),
3361
- getTouched: (e) => l ? Si : a[e] ?? {},
3384
+ getTouched: (e) => l ? Ci : a[e] ?? {},
3362
3385
  isSlotVisited: (e) => l || !!a[e],
3363
3386
  submitAttempted: l,
3364
3387
  markSubmitted: () => u(!0),
@@ -3370,20 +3393,20 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3370
3393
  reset: x,
3371
3394
  resetValidationDisplay: S
3372
3395
  };
3373
- }, Ti = (e) => typeof e == "string" ? e : e._id, Ei = (e) => e.reduce((e, t) => e + (t.unit_amount ?? 0), 0), Di = (e, t, n = Date.now()) => e.flatMap((e) => {
3374
- if (e.status === "archived" || e.starts_at && new Date(e.starts_at).getTime() > n || e.expires_at && new Date(e.expires_at).getTime() < n || e.max_redemptions && e.redeem_count >= e.max_redemptions || e.min_trnx_amount && Ei(t) < e.min_trnx_amount) return [];
3375
- let r = e.tickets.map(Ti), i = Ei(t.filter((e) => r.includes(e._id))), a = e.kind === "percent" ? Math.round(i * (e.percent_off ?? 0) / 100) : Math.min(e.amount_off ?? 0, i), o = e.max_amount_off ? Math.min(a, e.max_amount_off) : a;
3396
+ }, Ei = (e) => typeof e == "string" ? e : e._id, Di = (e) => e.reduce((e, t) => e + (t.unit_amount ?? 0), 0), Oi = (e, t, n = Date.now()) => e.flatMap((e) => {
3397
+ if (e.status === "archived" || e.starts_at && new Date(e.starts_at).getTime() > n || e.expires_at && new Date(e.expires_at).getTime() < n || e.max_redemptions && e.redeem_count >= e.max_redemptions || e.min_trnx_amount && Di(t) < e.min_trnx_amount) return [];
3398
+ let r = e.tickets.map(Ei), i = Di(t.filter((e) => r.includes(e._id))), a = e.kind === "percent" ? Math.round(i * (e.percent_off ?? 0) / 100) : Math.min(e.amount_off ?? 0, i), o = e.max_amount_off ? Math.min(a, e.max_amount_off) : a;
3376
3399
  return o > 0 ? [{
3377
3400
  coupon: e,
3378
3401
  saving: o
3379
3402
  }] : [];
3380
- }).sort((e, t) => t.saving - e.saving), Oi = ({ eventID: e, tickets: t, enabled: n }) => {
3381
- let r = i(), a = t.map((e) => e._id).join(","), [o, s] = A(null), [c, l] = A(null), [u, d] = A(null), [f, p] = A([]), m = k(0), h = k(null), g = Di(f, t), _ = g[0]?.coupon.code;
3403
+ }).sort((e, t) => t.saving - e.saving), ki = ({ eventID: e, tickets: t, enabled: n }) => {
3404
+ let r = i(), a = t.map((e) => e._id).join(","), [o, s] = A(null), [c, l] = A(null), [u, d] = A(null), [f, p] = A(null), m = k(0), h = k(null), g = Oi(f ?? [], t), _ = g[0]?.coupon.code;
3382
3405
  E(() => {
3383
3406
  !n || !e || !r || r.fetch?.url(`/v1/event/event/${e}/coupon/list-public-coupons`)?.get().json().then((e) => {
3384
- e?.status && e?.content?.data && p(e.content.data);
3407
+ p(e?.status ? e.content?.data ?? [] : []);
3385
3408
  }).catch((e) => {
3386
- r.logger?.error("Failed to fetch public coupons", { exception: b(e) });
3409
+ p([]), r.logger?.error("Failed to fetch public coupons", { exception: b(e) });
3387
3410
  });
3388
3411
  }, [
3389
3412
  n,
@@ -3433,8 +3456,8 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3433
3456
  a,
3434
3457
  v
3435
3458
  ]);
3436
- let y = w(() => {
3437
- m.current += 1, l(null), s(null), d(null);
3459
+ let y = w(({ rearm: e = !1 } = {}) => {
3460
+ e && (h.current = null), m.current += 1, l(null), s(null), d(null);
3438
3461
  }, []);
3439
3462
  return {
3440
3463
  applied: o,
@@ -3442,16 +3465,17 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3442
3465
  pending: c,
3443
3466
  error: u,
3444
3467
  offers: g,
3468
+ isFindingBestOffer: n && !!e && !!r && (f === null || !!c?.auto),
3445
3469
  apply: v,
3446
3470
  reset: y
3447
3471
  };
3448
- }, ki = async (e, t) => {
3472
+ }, Ai = async (e, t) => {
3449
3473
  let n = new URLSearchParams();
3450
3474
  return n.append("query", JSON.stringify({ where: { status: "active" } })), (await e.fetch?.url(`/v1/event/event/${t}/ticket/query?${n.toString()}`).get().json())?.content?.data ?? [];
3451
- }, Ai = ({ eventID: e, external: t }) => {
3475
+ }, ji = ({ eventID: e, external: t }) => {
3452
3476
  let n = i(), [r, a] = A([]), [o, s] = A(!t), [c, l] = A(!1), [u, d] = A(null);
3453
3477
  return E(() => {
3454
- t || !e || !n || (s(!0), l(!1), ki(n, e).then((e) => {
3478
+ t || !e || !n || (s(!0), l(!1), Ai(n, e).then((e) => {
3455
3479
  a(e), e.length === 1 && d(e[0] ?? null);
3456
3480
  }).catch((e) => {
3457
3481
  l(!0), n.logger?.error("Failed to load event tickets", { exception: b(e) });
@@ -3467,7 +3491,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3467
3491
  selectedTicket: u,
3468
3492
  selectTicket: d
3469
3493
  };
3470
- }, ji = async (e) => {
3494
+ }, Mi = async (e) => {
3471
3495
  let { payment_session_id: t, order_id: n } = e;
3472
3496
  if (!t || !n) throw Error("Cashfree payment session missing");
3473
3497
  let { load: r } = await import("./script.esm-D4nvz3-k.js"), i = await r({ mode: e.environment || "production" });
@@ -3483,7 +3507,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3483
3507
  status: "closed",
3484
3508
  message: a.error?.message
3485
3509
  };
3486
- }, Mi = () => typeof window < "u" && "Razorpay" in window, Ni = ({ order: e, onSettled: t, onError: n }) => {
3510
+ }, Ni = () => typeof window < "u" && "Razorpay" in window, Pi = ({ order: e, onSettled: t, onError: n }) => {
3487
3511
  let { Razorpay: r, isLoading: i, error: a } = fe(), o = k({
3488
3512
  onSettled: t,
3489
3513
  onError: n
@@ -3499,7 +3523,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3499
3523
  s.current = !0, o.current.onError(Error(a));
3500
3524
  return;
3501
3525
  }
3502
- if (!r || !Mi()) return;
3526
+ if (!r || !Ni()) return;
3503
3527
  s.current = !0;
3504
3528
  let t;
3505
3529
  try {
@@ -3537,7 +3561,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3537
3561
  a,
3538
3562
  e
3539
3563
  ]), null;
3540
- }, Pi = ({ stripePromise: e, clientSecret: t, onClose: n, onComplete: r }) => {
3564
+ }, Fi = ({ stripePromise: e, clientSecret: t, onClose: n, onComplete: r }) => {
3541
3565
  let i = k(r);
3542
3566
  i.current = r;
3543
3567
  let a = O(() => ({
@@ -3565,9 +3589,9 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3565
3589
  })]
3566
3590
  })] })
3567
3591
  });
3568
- }, Fi = () => {
3592
+ }, Ii = () => {
3569
3593
  let [e, t] = A(null), n = w(async (e, n) => {
3570
- if (e.provider === "cashfree") return ji(e);
3594
+ if (e.provider === "cashfree") return Mi(e);
3571
3595
  if (e.provider === "stripe") {
3572
3596
  let { client_secret: n, session_id: r } = e;
3573
3597
  if (!n || !r) throw Error("Stripe checkout session missing");
@@ -3601,7 +3625,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3601
3625
  }, []), r = (e, n) => {
3602
3626
  t(null), n instanceof Error ? e.settle.reject(n) : e.settle.resolve(n);
3603
3627
  }, i = null;
3604
- return e?.provider === "stripe" ? i = /* @__PURE__ */ M(Pi, {
3628
+ return e?.provider === "stripe" ? i = /* @__PURE__ */ M(Fi, {
3605
3629
  stripePromise: e.stripePromise,
3606
3630
  clientSecret: e.clientSecret,
3607
3631
  onComplete: () => r(e, {
@@ -3609,7 +3633,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3609
3633
  confirmation: { session_id: e.sessionId }
3610
3634
  }),
3611
3635
  onClose: () => r(e, { status: "closed" })
3612
- }) : e?.provider === "razorpay" && (i = /* @__PURE__ */ M(Ni, {
3636
+ }) : e?.provider === "razorpay" && (i = /* @__PURE__ */ M(Pi, {
3613
3637
  order: e.order,
3614
3638
  onSettled: (t) => r(e, t),
3615
3639
  onError: (t) => r(e, t)
@@ -3623,8 +3647,8 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3623
3647
  providerUnreachable: "We couldn't reach the payment provider. Check your connection and try again.",
3624
3648
  confirmationFailed: "We couldn't confirm your payment. Your details are saved — try again.",
3625
3649
  generic: "Something went wrong. Please try again."
3626
- }, Ii = (e) => !!e && e.status !== "requires_payment", Li = ({ eventID: e, details: t, onConfirmed: n }) => {
3627
- let r = i(), a = Fi(), [o, s] = A({ kind: "idle" }), c = k({
3650
+ }, Li = (e) => !!e && e.status !== "requires_payment", Ri = ({ eventID: e, details: t, onConfirmed: n }) => {
3651
+ let r = i(), a = Ii(), [o, s] = A({ kind: "idle" }), c = k({
3628
3652
  details: t,
3629
3653
  onConfirmed: n
3630
3654
  });
@@ -3640,7 +3664,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3640
3664
  message: t
3641
3665
  }), d = async (e, t) => {
3642
3666
  if (!t?.key) {
3643
- Ii(e) ? l(e) : s({
3667
+ Li(e) ? l(e) : s({
3644
3668
  kind: "failed",
3645
3669
  message: $.registrationFailed
3646
3670
  });
@@ -3674,7 +3698,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3674
3698
  }
3675
3699
  try {
3676
3700
  let t = (await r?.fetch?.url(`/v1/event/booking/${e._id}/confirm-booking`)?.post(n.confirmation)?.json())?.content?.data;
3677
- Ii(t) ? l(t) : u(e._id, $.paymentAbandoned);
3701
+ Li(t) ? l(t) : u(e._id, $.paymentAbandoned);
3678
3702
  } catch (t) {
3679
3703
  r?.logger?.error("Failed to confirm booking after payment", { exception: b(t) }), u(e._id, $.confirmationFailed);
3680
3704
  }
@@ -3713,67 +3737,67 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3713
3737
  },
3714
3738
  reset: () => s({ kind: "idle" })
3715
3739
  };
3716
- }, Ri = (e) => `levo:event-registration:${e}`, zi = (e) => {
3740
+ }, zi = (e) => `levo:event-registration:${e}`, Bi = (e) => {
3717
3741
  if (typeof window > "u") return null;
3718
3742
  try {
3719
- let t = window.localStorage.getItem(Ri(e));
3743
+ let t = window.localStorage.getItem(zi(e));
3720
3744
  return t ? JSON.parse(t) : null;
3721
3745
  } catch {
3722
3746
  return null;
3723
3747
  }
3724
- }, Bi = (e, t) => {
3748
+ }, Vi = (e, t) => {
3725
3749
  if (!(typeof window > "u")) try {
3726
- window.localStorage.setItem(Ri(e), JSON.stringify(t));
3750
+ window.localStorage.setItem(zi(e), JSON.stringify(t));
3727
3751
  } catch {}
3728
- }, Vi = (e) => {
3752
+ }, Hi = (e) => {
3729
3753
  if (!(typeof window > "u")) try {
3730
- window.localStorage.removeItem(Ri(e));
3754
+ window.localStorage.removeItem(zi(e));
3731
3755
  } catch {}
3732
- }, Hi = (e) => {
3756
+ }, Ui = (e) => {
3733
3757
  let [t, n] = A(null), [r, i] = A(null);
3734
3758
  return E(() => {
3735
- let t = zi(e);
3759
+ let t = Bi(e);
3736
3760
  t && i(t.email);
3737
3761
  }, [e]), {
3738
3762
  booking: t,
3739
3763
  registeredEmail: r,
3740
3764
  complete: (t, r) => {
3741
- n(t), i(r), Bi(e, {
3765
+ n(t), i(r), Vi(e, {
3742
3766
  bookingId: t._id,
3743
3767
  email: r,
3744
3768
  at: (/* @__PURE__ */ new Date()).toISOString()
3745
3769
  });
3746
3770
  },
3747
3771
  clear: () => {
3748
- Vi(e), i(null), n(null);
3772
+ Hi(e), i(null), n(null);
3749
3773
  }
3750
3774
  };
3751
- }, Ui = "register", Wi = () => {
3775
+ }, Wi = "register", Gi = () => {
3752
3776
  if (typeof window > "u") return !1;
3753
- let e = new URLSearchParams(window.location.search).get(Ui);
3777
+ let e = new URLSearchParams(window.location.search).get(Wi);
3754
3778
  return e !== null && e !== "0" && e !== "false";
3755
- }, Gi = ({ canAutoOpen: e }) => {
3779
+ }, Ki = ({ canAutoOpen: e }) => {
3756
3780
  let [t, n] = A(!1), r = k(!1), i = w(() => n(!0), []), a = w(() => n(!1), []);
3757
3781
  return E(() => {
3758
- r.current || !e || !Wi() || (r.current = !0, n(!0));
3782
+ r.current || !e || !Gi() || (r.current = !0, n(!0));
3759
3783
  }, [e]), {
3760
3784
  isOpen: t,
3761
3785
  open: i,
3762
3786
  close: a
3763
3787
  };
3764
- }, Ki = (e, t) => `${e} ${t}${e === 1 ? "" : "s"}`, qi = ({ eventID: e, title: t, buttonText: n = "Register Now", startsAt: r, endsAt: i, eventUrl: a }) => {
3765
- let { account: o } = nt(), s = cr(), c = Ai({ eventID: e }), [l, u] = A({}), [d, f] = A("tickets"), [p, m] = A(!1), [h, g] = A(null), _ = c.tickets.length === 1 ? c.tickets[0]?._id : void 0;
3788
+ }, qi = (e, t) => `${e} ${t}${e === 1 ? "" : "s"}`, Ji = ({ eventID: e, title: t, buttonText: n = "Register Now", startsAt: r, endsAt: i, eventUrl: a }) => {
3789
+ let { account: o } = nt(), s = cr(), c = ji({ eventID: e }), [l, u] = A({}), [d, f] = A("tickets"), [p, m] = A(!1), [h, g] = A(null), _ = c.tickets.length === 1 ? c.tickets[0]?._id : void 0;
3766
3790
  E(() => {
3767
3791
  _ && u((e) => ({ [_]: e[_] || 1 }));
3768
3792
  }, [_]);
3769
3793
  let v = O(() => c.tickets.map((e) => ({
3770
3794
  ticket: e,
3771
3795
  count: l[e._id] ?? 0
3772
- })).filter((e) => e.count > 0), [c.tickets, l]), y = v.reduce((e, t) => e + t.count, 0), b = wi(o, c.tickets, l), x = b.slots[0] ? b.getValues(b.slots[0].key) : null, S = Hi(e), { booking: C } = S, w = Gi({ canAutoOpen: !c.isLoading && c.tickets.length > 0 && !S.registeredEmail }), T = v.some((e) => Ur(e.ticket, null) > 0), D = Oi({
3796
+ })).filter((e) => e.count > 0), [c.tickets, l]), y = v.reduce((e, t) => e + t.count, 0), b = Ti(o, c.tickets, l), x = b.slots[0] ? b.getValues(b.slots[0].key) : null, S = Ui(e), { booking: C } = S, w = Ki({ canAutoOpen: !c.isLoading && c.tickets.length > 0 && !S.registeredEmail }), T = v.some((e) => Ur(e.ticket, null) > 0), D = ki({
3773
3797
  eventID: e,
3774
3798
  tickets: b.slots.map((e) => e.ticket),
3775
3799
  enabled: w.isOpen && T && d === "review"
3776
- }), k = Jr(v, D.discount), ee = !!k && !k.isFree, P = O(() => ei(r, i), [r, i]), F = t || "this event", I = Li({
3800
+ }), k = Jr(v, D.discount), ee = !!k && !k.isFree, P = O(() => ei(r, i), [r, i]), F = t || "this event", I = Ri({
3777
3801
  eventID: e,
3778
3802
  details: {
3779
3803
  merchantName: s?.name || t || "",
@@ -3791,7 +3815,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3791
3815
  [e]: t
3792
3816
  }));
3793
3817
  }, R = () => {
3794
- S.clear(), I.reset(), D.reset(), b.reset(), u(_ ? { [_]: 1 } : {}), f("tickets"), g(null);
3818
+ S.clear(), I.reset(), D.reset({ rearm: !0 }), b.reset(), u(_ ? { [_]: 1 } : {}), f("tickets"), g(null);
3795
3819
  }, te = (t) => {
3796
3820
  if (t.preventDefault(), d === "tickets") {
3797
3821
  if (y === 0) {
@@ -3811,7 +3835,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3811
3835
  return;
3812
3836
  }
3813
3837
  }
3814
- I.register({
3838
+ D.isFindingBestOffer || I.register({
3815
3839
  event: e,
3816
3840
  coupon: D.applied?.code ?? "",
3817
3841
  attendees: b.slots.map((e) => {
@@ -3848,7 +3872,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3848
3872
  className: "min-w-0 flex-1",
3849
3873
  children: [/* @__PURE__ */ M("span", {
3850
3874
  className: "block font-semibold text-[15px] text-ink tabular-nums",
3851
- children: y === 0 ? "No tickets yet" : Ki(y, "ticket")
3875
+ children: y === 0 ? "No tickets yet" : qi(y, "ticket")
3852
3876
  }), y > 0 && /* @__PURE__ */ M("span", {
3853
3877
  className: "block text-[12.5px] text-ink-soft tabular-nums",
3854
3878
  children: z ?? "Free"
@@ -3870,7 +3894,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3870
3894
  payment: I,
3871
3895
  label: ne,
3872
3896
  isPaid: ee,
3873
- blockedReason: d === "details" ? V : void 0
3897
+ blockedReason: d === "details" ? V : D.isFindingBestOffer ? "Finding your best offer…" : void 0
3874
3898
  });
3875
3899
  return /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ M(ci, {
3876
3900
  buttonText: n,
@@ -3904,7 +3928,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3904
3928
  attendeeCount: b.slots.length,
3905
3929
  onClose: w.close,
3906
3930
  onRegisterAnother: R
3907
- }) : d === "tickets" ? /* @__PURE__ */ M(xi, {
3931
+ }) : d === "tickets" ? /* @__PURE__ */ M(Si, {
3908
3932
  tickets: c.tickets,
3909
3933
  counts: l,
3910
3934
  onChange: L,
@@ -3948,7 +3972,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
3948
3972
  ]
3949
3973
  })
3950
3974
  })] });
3951
- }, Ji = ({ selectedTicket: e, discount: t }) => {
3975
+ }, Yi = ({ selectedTicket: e, discount: t }) => {
3952
3976
  let [n, r] = A(!1), i = e?.currency, a = Ur(e, t), o = Gr(e, t), s = Kr(e, t), c = t?.discount ?? 0, l = s.length > 0 || c > 0 || o !== a, u = /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ N("span", {
3953
3977
  className: "inline-flex items-center gap-1.5",
3954
3978
  children: ["Total", l && /* @__PURE__ */ M(oe, { className: X("size-4 text-ink-muted transition-transform", n && "rotate-180") })]
@@ -4006,7 +4030,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4006
4030
  })
4007
4031
  })]
4008
4032
  });
4009
- }, Yi = ({ tickets: e, selectedTicket: t, onSelect: n, error: r }) => {
4033
+ }, Xi = ({ tickets: e, selectedTicket: t, onSelect: n, error: r }) => {
4010
4034
  let [i, a] = A(!t);
4011
4035
  return /* @__PURE__ */ N("fieldset", {
4012
4036
  className: "m-0 flex min-w-0 flex-col gap-2 border-0 p-0",
@@ -4083,15 +4107,15 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4083
4107
  })
4084
4108
  ]
4085
4109
  });
4086
- }, Xi = (e) => e.enableMultipleTicketBooking && !e.external ? /* @__PURE__ */ M(qi, { ...e }, e.eventID) : /* @__PURE__ */ M(Zi, { ...e }, e.eventID), Zi = ({ eventID: e, title: t, external: n, buttonText: r = "Register Now", startsAt: i, endsAt: a, eventUrl: o }) => {
4087
- let { account: s } = nt(), c = cr(), l = Ai({
4110
+ }, Zi = (e) => e.enableMultipleTicketBooking && !e.external ? /* @__PURE__ */ M(Ji, { ...e }, e.eventID) : /* @__PURE__ */ M(Qi, { ...e }, e.eventID), Qi = ({ eventID: e, title: t, external: n, buttonText: r = "Register Now", startsAt: i, endsAt: a, eventUrl: o }) => {
4111
+ let { account: s } = nt(), c = cr(), l = ji({
4088
4112
  eventID: e,
4089
4113
  external: n
4090
- }), u = l.selectedTicket?.registration_fields ?? mi, d = Ci(s, u), f = Wr(l.selectedTicket, null)?.isFree === !1, p = Hi(e), { booking: m } = p, h = Gi({ canAutoOpen: !n && !l.isLoading && l.tickets.length > 0 && !p.registeredEmail }), g = k(null), _ = Oi({
4114
+ }), u = l.selectedTicket?.registration_fields ?? mi, d = wi(s, u), f = Wr(l.selectedTicket, null)?.isFree === !1, p = Ui(e), { booking: m } = p, h = Ki({ canAutoOpen: !n && !l.isLoading && l.tickets.length > 0 && !p.registeredEmail }), g = k(null), _ = ki({
4091
4115
  eventID: e,
4092
4116
  tickets: l.selectedTicket ? [l.selectedTicket] : [],
4093
4117
  enabled: h.isOpen && f
4094
- }), v = Wr(l.selectedTicket, _.discount), y = !!v && !v.isFree, b = l.tickets.length > 1, x = O(() => ei(i, a), [i, a]), S = t || "this event", C = b || f, w = Li({
4118
+ }), v = Wr(l.selectedTicket, _.discount), y = !!v && !v.isFree, b = l.tickets.length > 1, x = O(() => ei(i, a), [i, a]), S = t || "this event", C = b || f, w = Ri({
4095
4119
  eventID: e,
4096
4120
  details: {
4097
4121
  merchantName: c?.name || t || "",
@@ -4108,7 +4132,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4108
4132
  }, E = () => {
4109
4133
  p.clear(), w.reset(), d.reset();
4110
4134
  }, D = (t) => {
4111
- t.preventDefault(), d.markSubmitted(), !(!l.selectedTicket || !d.isValid) && w.register({
4135
+ t.preventDefault(), d.markSubmitted(), !(!l.selectedTicket || !d.isValid || _.isFindingBestOffer) && w.register({
4112
4136
  event: e,
4113
4137
  coupon: _.applied?.code ?? "",
4114
4138
  attendees: [{
@@ -4160,7 +4184,8 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4160
4184
  footer: m ? void 0 : /* @__PURE__ */ M(Xr, {
4161
4185
  payment: w,
4162
4186
  label: A,
4163
- isPaid: y
4187
+ isPaid: y,
4188
+ blockedReason: _.isFindingBestOffer ? "Finding your best offer…" : void 0
4164
4189
  }),
4165
4190
  children: m ? /* @__PURE__ */ M(pi, {
4166
4191
  email: d.values.email.trim(),
@@ -4177,13 +4202,13 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4177
4202
  }) : /* @__PURE__ */ N("div", {
4178
4203
  className: "flex flex-col gap-4",
4179
4204
  children: [
4180
- b && /* @__PURE__ */ M(Yi, {
4205
+ b && /* @__PURE__ */ M(Xi, {
4181
4206
  tickets: l.tickets,
4182
4207
  selectedTicket: l.selectedTicket,
4183
4208
  onSelect: T,
4184
4209
  error: d.submitAttempted && !l.selectedTicket ? "Choose a ticket to continue" : void 0
4185
4210
  }),
4186
- f && /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ M(Ji, {
4211
+ f && /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ M(Yi, {
4187
4212
  selectedTicket: l.selectedTicket,
4188
4213
  discount: _.discount
4189
4214
  }), /* @__PURE__ */ M(Qr, {
@@ -4214,7 +4239,7 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4214
4239
  ]
4215
4240
  })
4216
4241
  })] });
4217
- }, Qi = (e) => e.length > 1 ? e.replace(/\/+$/, "") : e, $i = (e) => typeof e == "string" && e.trim() ? e : void 0, ea = (e) => typeof e == "string" ? e : e?.location ?? void 0, ta = (e, t) => {
4242
+ }, $i = (e) => e.length > 1 ? e.replace(/\/+$/, "") : e, ea = (e) => typeof e == "string" && e.trim() ? e : void 0, ta = (e) => typeof e == "string" ? e : e?.location ?? void 0, na = (e, t) => {
4218
4243
  let n = e.meta ?? {}, r = e.title && t ? `${e.title} | ${t}` : e.title || t || void 0;
4219
4244
  return {
4220
4245
  title: n.meta_title || r,
@@ -4224,32 +4249,32 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4224
4249
  og: {
4225
4250
  title: n.og_title || void 0,
4226
4251
  description: n.og_description || void 0,
4227
- image: ea(n.og_image),
4252
+ image: ta(n.og_image),
4228
4253
  url: n.og_url || void 0
4229
4254
  },
4230
4255
  twitter: { card: n.twitter_card || void 0 },
4231
4256
  ldJson: n.ld_json || void 0,
4232
4257
  customHead: n.head_code || void 0
4233
4258
  };
4234
- }, na = (e) => ({
4259
+ }, ra = (e) => ({
4235
4260
  description: e.description || void 0,
4236
4261
  customHead: e.settings?.head_code || void 0
4237
- }), ra = (e) => (t = {}, n) => (r) => {
4238
- let i = ta(t, e.name);
4262
+ }), ia = (e) => (t = {}, n) => (r) => {
4263
+ let i = na(t, e.name);
4239
4264
  if (n) {
4240
4265
  let t = r?.loaderData?.[n.source];
4241
4266
  if (t) {
4242
- let r = n.title ? $i(t[n.title]) : void 0;
4267
+ let r = n.title ? ea(t[n.title]) : void 0;
4243
4268
  r && (i.title = e.name ? `${r} | ${e.name}` : r, i.og = {
4244
4269
  ...i.og,
4245
4270
  title: r
4246
4271
  });
4247
- let a = n.description ? $i(t[n.description]) : void 0;
4272
+ let a = n.description ? ea(t[n.description]) : void 0;
4248
4273
  a && (i.description = a, i.og = {
4249
4274
  ...i.og,
4250
4275
  description: a
4251
4276
  });
4252
- let o = n.image ? ea(t[n.image]) : void 0;
4277
+ let o = n.image ? ta(t[n.image]) : void 0;
4253
4278
  o && (i.og = {
4254
4279
  ...i.og,
4255
4280
  image: o
@@ -4258,14 +4283,14 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4258
4283
  }
4259
4284
  if (!i.canonical) {
4260
4285
  let t = r?.match?.pathname, n = (e.domain || "").trim();
4261
- n && t?.startsWith("/") && (i.canonical = (/^https?:\/\//.test(n) ? n : `https://${n}`).replace(/\/+$/, "") + Qi(t));
4286
+ n && t?.startsWith("/") && (i.canonical = (/^https?:\/\//.test(n) ? n : `https://${n}`).replace(/\/+$/, "") + $i(t));
4262
4287
  }
4263
- let a = Dr(i, na(e)), o = t.id?.trim();
4288
+ let a = Dr(i, ra(e)), o = t.id?.trim();
4264
4289
  return o && a.meta.push({
4265
4290
  name: nr,
4266
4291
  content: o
4267
4292
  }), a;
4268
- }, ia = (e) => e.params, aa = (e) => {
4293
+ }, aa = (e) => e.params, oa = (e) => {
4269
4294
  let t = Ne(e);
4270
4295
  return (e, n) => {
4271
4296
  let { rules: r, invalid: i } = Te(n?.access), a = r.length > 0 || i;
@@ -4273,16 +4298,16 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4273
4298
  queryClient: n.context.queryClient,
4274
4299
  config: t,
4275
4300
  sources: e,
4276
- params: ia(n)
4301
+ params: aa(n)
4277
4302
  });
4278
4303
  };
4279
- }, oa = 2, sa = (e) => {
4304
+ }, sa = 2, ca = (e) => {
4280
4305
  let { limit: t = 20, debounceMs: n = 300, hotkey: r = !0 } = e ?? {}, a = i(), o = cr(), s = K(), [c, l] = A(""), [u, d] = A(!1), [f, p] = A("");
4281
4306
  E(() => {
4282
4307
  let e = setTimeout(() => p(c.trim()), n);
4283
4308
  return () => clearTimeout(e);
4284
4309
  }, [c, n]);
4285
- let m = f.length >= oa, h = L({
4310
+ let m = f.length >= sa, h = L({
4286
4311
  queryKey: [
4287
4312
  "levo-search",
4288
4313
  o?.id ?? null,
@@ -4331,4 +4356,4 @@ var X = (...e) => e.filter(Boolean).join(" "), kr = ({ open: e, className: t, ch
4331
4356
  };
4332
4357
  };
4333
4358
  //#endregion
4334
- export { Bt as ColorModeProvider, Zn as Inspector, _e as LEVO_AUTH_METHODS, q as LEVO_AUTH_QUERY_KEY, ge as LEVO_OAUTH_METHODS, Tt as LEVO_OTP_LENGTH, ht as LEVO_PENDING_APPROVAL_CODE, he as LEVO_PRIMARY_AUTH_METHODS, m as LOCALE_COOKIE, l as LOCALE_REDIRECT_CACHE_CONTROL, Mt as LevoChat, Ut as LevoEditForm, rt as LevoEntryForm, Xi as LevoEventRegister, Wt as LevoForm, gr as LevoLink, ar as LevoPopups, ct as LevoProfileForm, dr as LevoSiteProvider, _r as LocaleHreflang, yr as LocaleProvider, nr as PAGE_ID_META, Or as PageHead, Sr as SiteLocaleProvider, hr as buildHreflangLinks, ra as createLevoHead, aa as createLevoLoader, _ as createRouteTreeMatcher, Me as createSiteClient, je as decideAccess, v as extractGeoAndLanguageData, gt as isPendingApprovalError, Et as isValidEmail, Dt as isValidOtp, kt as isValidPhone, ze as levoParams, fr as localeBeforeLoad, p as localePath, d as localeRedirectResponse, Ot as normalizePhone, Dr as pageHead, Te as parseAccess, Er as parseRawHead, $e as prefetchLevoSources, pr as readLocaleConfig, rr as readPageId, Ee as resolveAuthMethods, g as resolveLocale, u as resolveLocaleRedirect, s as resolveLocaleRequest, Ne as siteConfigFromJson, f as splitLocalePrefix, Vt as useColorMode, Cr as useLanguageOptions, mt as useLevoAccess, nt as useLevoAuth, Ze as useLevoForm, ur as useLevoInsights, yt as useLevoLogin, wt as useLevoOAuth, At as useLevoOtpInput, Xe as useLevoRecord, sa as useLevoSearch, lr as useLevoSite, Ye as useLevoSource, br as useLocale, xr as useUrlLocale };
4359
+ export { Bt as ColorModeProvider, Zn as Inspector, _e as LEVO_AUTH_METHODS, q as LEVO_AUTH_QUERY_KEY, ge as LEVO_OAUTH_METHODS, Tt as LEVO_OTP_LENGTH, ht as LEVO_PENDING_APPROVAL_CODE, he as LEVO_PRIMARY_AUTH_METHODS, m as LOCALE_COOKIE, l as LOCALE_REDIRECT_CACHE_CONTROL, Mt as LevoChat, Ut as LevoEditForm, rt as LevoEntryForm, Zi as LevoEventRegister, Wt as LevoForm, gr as LevoLink, ar as LevoPopups, ct as LevoProfileForm, dr as LevoSiteProvider, _r as LocaleHreflang, yr as LocaleProvider, nr as PAGE_ID_META, Or as PageHead, Sr as SiteLocaleProvider, hr as buildHreflangLinks, ia as createLevoHead, oa as createLevoLoader, _ as createRouteTreeMatcher, Me as createSiteClient, je as decideAccess, v as extractGeoAndLanguageData, gt as isPendingApprovalError, Et as isValidEmail, Dt as isValidOtp, kt as isValidPhone, ze as levoParams, fr as localeBeforeLoad, p as localePath, d as localeRedirectResponse, Ot as normalizePhone, Dr as pageHead, Te as parseAccess, Er as parseRawHead, $e as prefetchLevoSources, pr as readLocaleConfig, rr as readPageId, Ee as resolveAuthMethods, g as resolveLocale, u as resolveLocaleRedirect, s as resolveLocaleRequest, Ne as siteConfigFromJson, f as splitLocalePrefix, Vt as useColorMode, Cr as useLanguageOptions, mt as useLevoAccess, nt as useLevoAuth, Ze as useLevoForm, ur as useLevoInsights, yt as useLevoLogin, wt as useLevoOAuth, At as useLevoOtpInput, Xe as useLevoRecord, ca as useLevoSearch, lr as useLevoSite, Ye as useLevoSource, br as useLocale, xr as useUrlLocale };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@levo-so/site-runtime",
3
- "version": "0.3.27",
3
+ "version": "0.3.29",
4
4
  "description": "Runtime for Levo Studio v3 sites — the editor preview inspector, page head metadata, and the Levo data client.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -82,8 +82,8 @@
82
82
  "@assistant-ui/store": "0.3.13",
83
83
  "@assistant-ui/tap": "0.9.17",
84
84
  "remark-gfm": "4.0.1",
85
- "@levo-so/core": "0.3.27",
86
- "@levo-so/insights": "0.3.27",
85
+ "@levo-so/core": "0.3.29",
86
+ "@levo-so/insights": "0.3.29",
87
87
  "@stripe/react-stripe-js": "3.1.1",
88
88
  "@stripe/stripe-js": "5.5.0",
89
89
  "react-razorpay": "3.0.1"