@planetaexo/design-system 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var React25 = require('react');
3
+ var React8 = require('react');
4
4
  var classVarianceAuthority = require('class-variance-authority');
5
5
  var clsx = require('clsx');
6
6
  var tailwindMerge = require('tailwind-merge');
@@ -37,7 +37,7 @@ function _interopNamespace(e) {
37
37
  return Object.freeze(n);
38
38
  }
39
39
 
40
- var React25__namespace = /*#__PURE__*/_interopNamespace(React25);
40
+ var React8__namespace = /*#__PURE__*/_interopNamespace(React8);
41
41
 
42
42
  var __defProp = Object.defineProperty;
43
43
  var __defProps = Object.defineProperties;
@@ -102,7 +102,7 @@ var buttonVariants = classVarianceAuthority.cva(
102
102
  }
103
103
  }
104
104
  );
105
- var Button = React25__namespace.forwardRef(
105
+ var Button = React8__namespace.forwardRef(
106
106
  (_a, ref) => {
107
107
  var _b = _a, { className, variant, size } = _b, props = __objRest(_b, ["className", "variant", "size"]);
108
108
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -323,10 +323,10 @@ function DialogDescription(_a) {
323
323
  }, props)
324
324
  );
325
325
  }
326
- var FloatingInput = React25__namespace.forwardRef(
326
+ var FloatingInput = React8__namespace.forwardRef(
327
327
  (_a, ref) => {
328
328
  var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
329
- const inputId = id != null ? id : React25__namespace.useId();
329
+ const inputId = id != null ? id : React8__namespace.useId();
330
330
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
331
331
  /* @__PURE__ */ jsxRuntime.jsx(
332
332
  "input",
@@ -366,10 +366,10 @@ var FloatingInput = React25__namespace.forwardRef(
366
366
  }
367
367
  );
368
368
  FloatingInput.displayName = "FloatingInput";
369
- var FloatingSelect = React25__namespace.forwardRef(
369
+ var FloatingSelect = React8__namespace.forwardRef(
370
370
  (_a, ref) => {
371
371
  var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
372
- const inputId = id != null ? id : React25__namespace.useId();
372
+ const inputId = id != null ? id : React8__namespace.useId();
373
373
  const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
374
374
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
375
375
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -633,11 +633,11 @@ function PhoneCountrySelect({
633
633
  disabled
634
634
  }) {
635
635
  var _a;
636
- const [open, setOpen] = React25__namespace.useState(false);
637
- const containerRef = React25__namespace.useRef(null);
638
- const listRef = React25__namespace.useRef(null);
636
+ const [open, setOpen] = React8__namespace.useState(false);
637
+ const containerRef = React8__namespace.useRef(null);
638
+ const listRef = React8__namespace.useRef(null);
639
639
  const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
640
- React25__namespace.useEffect(() => {
640
+ React8__namespace.useEffect(() => {
641
641
  if (!open) return;
642
642
  const handler = (e) => {
643
643
  var _a2;
@@ -648,7 +648,7 @@ function PhoneCountrySelect({
648
648
  document.addEventListener("mousedown", handler);
649
649
  return () => document.removeEventListener("mousedown", handler);
650
650
  }, [open]);
651
- React25__namespace.useEffect(() => {
651
+ React8__namespace.useEffect(() => {
652
652
  if (!open || !listRef.current) return;
653
653
  const activeEl = listRef.current.querySelector("[data-selected=true]");
654
654
  activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
@@ -918,8 +918,8 @@ function CalendarDayButton(_a) {
918
918
  "locale"
919
919
  ]);
920
920
  const defaultClassNames = reactDayPicker.getDefaultClassNames();
921
- const ref = React25__namespace.useRef(null);
922
- React25__namespace.useEffect(() => {
921
+ const ref = React8__namespace.useRef(null);
922
+ React8__namespace.useEffect(() => {
923
923
  var _a2;
924
924
  if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
925
925
  }, [modifiers.focused]);
@@ -950,16 +950,16 @@ function BirthDateField({
950
950
  className,
951
951
  disabled
952
952
  }) {
953
- const [open, setOpen] = React25__namespace.useState(false);
954
- const [text, setText] = React25__namespace.useState(
953
+ const [open, setOpen] = React8__namespace.useState(false);
954
+ const [text, setText] = React8__namespace.useState(
955
955
  value ? dateFns.format(value, "dd/MM/yyyy") : ""
956
956
  );
957
- const containerRef = React25__namespace.useRef(null);
958
- const inputId = React25__namespace.useId();
959
- React25__namespace.useEffect(() => {
957
+ const containerRef = React8__namespace.useRef(null);
958
+ const inputId = React8__namespace.useId();
959
+ React8__namespace.useEffect(() => {
960
960
  setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
961
961
  }, [value]);
962
- React25__namespace.useEffect(() => {
962
+ React8__namespace.useEffect(() => {
963
963
  if (!open) return;
964
964
  const handler = (e) => {
965
965
  var _a;
@@ -1168,14 +1168,14 @@ function CountrySearchField({
1168
1168
  }) {
1169
1169
  var _a;
1170
1170
  const list = countries != null ? countries : COUNTRIES;
1171
- const [query, setQuery] = React25__namespace.useState("");
1172
- const [open, setOpen] = React25__namespace.useState(false);
1173
- const containerRef = React25__namespace.useRef(null);
1174
- const searchRef = React25__namespace.useRef(null);
1171
+ const [query, setQuery] = React8__namespace.useState("");
1172
+ const [open, setOpen] = React8__namespace.useState(false);
1173
+ const containerRef = React8__namespace.useRef(null);
1174
+ const searchRef = React8__namespace.useRef(null);
1175
1175
  const selected = list.find((c) => c.code === value);
1176
1176
  const isFloated = open || !!selected;
1177
1177
  const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
1178
- React25__namespace.useEffect(() => {
1178
+ React8__namespace.useEffect(() => {
1179
1179
  if (!open) return;
1180
1180
  const handler = (e) => {
1181
1181
  var _a2;
@@ -1289,7 +1289,7 @@ function AdventureCard({
1289
1289
  }) {
1290
1290
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
1291
1291
  const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
1292
- const [checkedInternal, setCheckedInternal] = React25__namespace.useState(
1292
+ const [checkedInternal, setCheckedInternal] = React8__namespace.useState(
1293
1293
  new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
1294
1294
  );
1295
1295
  const isChecked = (opt) => {
@@ -1687,7 +1687,7 @@ function BookingShell({
1687
1687
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
1688
1688
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
1689
1689
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
1690
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React25__namespace.Fragment, { children: [
1690
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React8__namespace.Fragment, { children: [
1691
1691
  /* @__PURE__ */ jsxRuntime.jsx(
1692
1692
  "span",
1693
1693
  {
@@ -1886,7 +1886,7 @@ function TermsSection({
1886
1886
  termsContent
1887
1887
  }) {
1888
1888
  var _a;
1889
- const [modalOpen, setModalOpen] = React25__namespace.useState(false);
1889
+ const [modalOpen, setModalOpen] = React8__namespace.useState(false);
1890
1890
  const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
1891
1891
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
1892
1892
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
@@ -2024,9 +2024,9 @@ function BookingWizard({
2024
2024
  }) {
2025
2025
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T;
2026
2026
  const wizardSteps = WIZARD_STEPS_FN(labels);
2027
- const [step, setStep] = React25__namespace.useState("responsible");
2028
- const [error, setError] = React25__namespace.useState(null);
2029
- const [responsible, setResponsible] = React25__namespace.useState({
2027
+ const [step, setStep] = React8__namespace.useState("responsible");
2028
+ const [error, setError] = React8__namespace.useState(null);
2029
+ const [responsible, setResponsible] = React8__namespace.useState({
2030
2030
  firstName: "",
2031
2031
  lastName: "",
2032
2032
  email: "",
@@ -2045,7 +2045,7 @@ function BookingWizard({
2045
2045
  return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
2046
2046
  }, 0);
2047
2047
  const totalPax = totalAdults + totalChildren;
2048
- const [travellers, setTravellers] = React25__namespace.useState(
2048
+ const [travellers, setTravellers] = React8__namespace.useState(
2049
2049
  Array.from({ length: Math.max(totalPax, 1) }, () => ({
2050
2050
  firstName: "",
2051
2051
  lastName: "",
@@ -2053,9 +2053,9 @@ function BookingWizard({
2053
2053
  email: ""
2054
2054
  }))
2055
2055
  );
2056
- const [payAmount, setPayAmount] = React25__namespace.useState("full");
2057
- const [payMethod, setPayMethod] = React25__namespace.useState("stripe");
2058
- const [termsAccepted, setTermsAccepted] = React25__namespace.useState(false);
2056
+ const [payAmount, setPayAmount] = React8__namespace.useState("full");
2057
+ const [payMethod, setPayMethod] = React8__namespace.useState("stripe");
2058
+ const [termsAccepted, setTermsAccepted] = React8__namespace.useState(false);
2059
2059
  const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
2060
2060
  const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
2061
2061
  const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
@@ -2282,7 +2282,7 @@ function Offer({
2282
2282
  className
2283
2283
  }) {
2284
2284
  var _a, _b, _c;
2285
- const [showBooking, setShowBooking] = React25__namespace.useState(false);
2285
+ const [showBooking, setShowBooking] = React8__namespace.useState(false);
2286
2286
  const isShowingCheckout = !confirmedState && (!!checkoutSlot || showBooking);
2287
2287
  const handleBook = () => {
2288
2288
  if (!checkoutSlot && !externalBookingFlow) setShowBooking(true);
@@ -2633,17 +2633,21 @@ function AdventureSection({
2633
2633
  onAddTraveller,
2634
2634
  onUnassignFromAdventure,
2635
2635
  onCopyFormLink,
2636
+ onResendInvite,
2637
+ resendingInviteTravellerIds,
2638
+ resendInviteAriaLabel,
2636
2639
  hasSubmitAddTraveller,
2637
2640
  hasSubmitEditTraveller,
2638
2641
  hasConfirmRemoveTraveller,
2639
2642
  onRequestOpenAddModal,
2640
2643
  onRequestOpenEditModal,
2641
2644
  onRequestOpenDeleteModal,
2645
+ onRequestOpenResendInviteDialog,
2642
2646
  cannotRemoveLastTravellerLabel,
2643
2647
  labels
2644
2648
  }) {
2645
2649
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
2646
- const [detailsOpen, setDetailsOpen] = React25__namespace.useState(false);
2650
+ const [detailsOpen, setDetailsOpen] = React8__namespace.useState(false);
2647
2651
  const handleCopyUrl = (url) => {
2648
2652
  if (onCopyFormLink) {
2649
2653
  onCopyFormLink(url);
@@ -2889,6 +2893,24 @@ function AdventureSection({
2889
2893
  }
2890
2894
  ),
2891
2895
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [
2896
+ onResendInvite && t.status === "pending" && t.email && /* @__PURE__ */ jsxRuntime.jsx(
2897
+ "button",
2898
+ {
2899
+ type: "button",
2900
+ onClick: () => {
2901
+ if (onRequestOpenResendInviteDialog) {
2902
+ onRequestOpenResendInviteDialog(t);
2903
+ } else {
2904
+ onResendInvite(t.id);
2905
+ }
2906
+ },
2907
+ disabled: resendingInviteTravellerIds == null ? void 0 : resendingInviteTravellerIds.has(t.id),
2908
+ className: "flex h-8 w-8 sm:h-7 sm:w-7 items-center justify-center rounded-lg text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:pointer-events-none",
2909
+ "aria-label": resendInviteAriaLabel != null ? resendInviteAriaLabel : "Resend registration invite",
2910
+ title: resendInviteAriaLabel != null ? resendInviteAriaLabel : "Resend registration invite",
2911
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SendIcon, { className: "w-3.5 h-3.5" })
2912
+ }
2913
+ ),
2892
2914
  (onEditTraveller || hasSubmitEditTraveller) && /* @__PURE__ */ jsxRuntime.jsx(
2893
2915
  "button",
2894
2916
  {
@@ -3137,8 +3159,8 @@ function AddTravellerDialog({
3137
3159
  errorMessage
3138
3160
  }) {
3139
3161
  var _a, _b, _c, _d, _e;
3140
- const [form, setForm] = React25__namespace.useState(() => createInitialAddFormData(config));
3141
- React25__namespace.useEffect(() => {
3162
+ const [form, setForm] = React8__namespace.useState(() => createInitialAddFormData(config));
3163
+ React8__namespace.useEffect(() => {
3142
3164
  if (open) {
3143
3165
  setForm(createInitialAddFormData(config));
3144
3166
  }
@@ -3198,7 +3220,7 @@ function EditTravellerDialog({
3198
3220
  errorMessage
3199
3221
  }) {
3200
3222
  var _a, _b, _c, _d, _e;
3201
- const [form, setForm] = React25__namespace.useState(() => ({
3223
+ const [form, setForm] = React8__namespace.useState(() => ({
3202
3224
  firstName: "",
3203
3225
  lastName: "",
3204
3226
  email: "",
@@ -3207,7 +3229,7 @@ function EditTravellerDialog({
3207
3229
  birthDate: "",
3208
3230
  personType: "ADULT"
3209
3231
  }));
3210
- React25__namespace.useEffect(() => {
3232
+ React8__namespace.useEffect(() => {
3211
3233
  var _a2, _b2, _c2, _d2, _e2, _f;
3212
3234
  if (open && traveller) {
3213
3235
  setForm({
@@ -3317,6 +3339,58 @@ function DeleteTravellerDialog({
3317
3339
  }
3318
3340
  );
3319
3341
  }
3342
+ function ResendInviteConfirmDialog({
3343
+ open,
3344
+ travellerName: _travellerName,
3345
+ onClose,
3346
+ onConfirm,
3347
+ labels,
3348
+ submitting
3349
+ }) {
3350
+ var _a, _b, _c, _d, _e;
3351
+ return /* @__PURE__ */ jsxRuntime.jsx(
3352
+ Dialog,
3353
+ {
3354
+ open,
3355
+ onOpenChange: (o) => {
3356
+ if (!o) onClose();
3357
+ },
3358
+ children: /* @__PURE__ */ jsxRuntime.jsxs(DialogContent, { className: "sm:max-w-sm", children: [
3359
+ /* @__PURE__ */ jsxRuntime.jsxs(DialogHeader, { children: [
3360
+ /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { children: (_a = labels == null ? void 0 : labels.title) != null ? _a : "Resend registration invite?" }),
3361
+ /* @__PURE__ */ jsxRuntime.jsx(DialogDescription, { children: (_b = labels == null ? void 0 : labels.body) != null ? _b : "The traveller will receive the registration form link again. This action cannot be undone." })
3362
+ ] }),
3363
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 rounded-lg bg-amber-500/10 border border-amber-500/30 px-3 py-2", children: [
3364
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangleIcon, { className: "h-4 w-4 text-amber-600 mt-0.5 shrink-0" }),
3365
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: (_c = labels == null ? void 0 : labels.warning) != null ? _c : "After resending, you will need to wait 60 seconds to send again." })
3366
+ ] }),
3367
+ /* @__PURE__ */ jsxRuntime.jsxs(DialogFooter, { children: [
3368
+ /* @__PURE__ */ jsxRuntime.jsx(
3369
+ Button,
3370
+ {
3371
+ type: "button",
3372
+ variant: "outline",
3373
+ size: "sm",
3374
+ onClick: onClose,
3375
+ disabled: submitting,
3376
+ children: (_d = labels == null ? void 0 : labels.cancel) != null ? _d : "Cancel"
3377
+ }
3378
+ ),
3379
+ /* @__PURE__ */ jsxRuntime.jsx(
3380
+ Button,
3381
+ {
3382
+ type: "button",
3383
+ size: "sm",
3384
+ disabled: submitting,
3385
+ onClick: () => void onConfirm(),
3386
+ children: (_e = labels == null ? void 0 : labels.confirm) != null ? _e : "Resend invite"
3387
+ }
3388
+ )
3389
+ ] })
3390
+ ] })
3391
+ }
3392
+ );
3393
+ }
3320
3394
  function OrderSummary({
3321
3395
  adventures,
3322
3396
  summaryLineItems,
@@ -3465,6 +3539,9 @@ function BookingDetails({
3465
3539
  onAddTraveller,
3466
3540
  onUnassignFromAdventure,
3467
3541
  onCopyFormLink,
3542
+ onResendInvite,
3543
+ resendingInviteTravellerIds,
3544
+ resendInviteAriaLabel,
3468
3545
  onSubmitAddTraveller,
3469
3546
  onSubmitEditTraveller,
3470
3547
  onConfirmRemoveTraveller,
@@ -3482,43 +3559,53 @@ function BookingDetails({
3482
3559
  labels,
3483
3560
  className
3484
3561
  }) {
3485
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F;
3562
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H;
3486
3563
  const people = totalPeople(adventures);
3487
3564
  const hasSubmitAddTraveller = !!onSubmitAddTraveller;
3488
3565
  const hasSubmitEditTraveller = !!onSubmitEditTraveller;
3489
3566
  const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
3490
- const [addModalState, setAddModalState] = React25__namespace.useState({
3567
+ const [addModalState, setAddModalState] = React8__namespace.useState({
3491
3568
  open: false,
3492
3569
  adventureId: null
3493
3570
  });
3494
- const [editModalState, setEditModalState] = React25__namespace.useState({ open: false, adventureId: null, traveller: null });
3495
- const [deleteModalState, setDeleteModalState] = React25__namespace.useState({ open: false, adventureId: null, traveller: null });
3496
- const handleRequestOpenAddModal = React25__namespace.useCallback((adventureId) => {
3571
+ const [editModalState, setEditModalState] = React8__namespace.useState({ open: false, adventureId: null, traveller: null });
3572
+ const [deleteModalState, setDeleteModalState] = React8__namespace.useState({ open: false, adventureId: null, traveller: null });
3573
+ const [resendInviteDialogState, setResendInviteDialogState] = React8__namespace.useState({ open: false, traveller: null });
3574
+ const handleRequestOpenAddModal = React8__namespace.useCallback((adventureId) => {
3497
3575
  setAddModalState({ open: true, adventureId });
3498
3576
  }, []);
3499
- const handleRequestOpenEditModal = React25__namespace.useCallback(
3577
+ const handleRequestOpenEditModal = React8__namespace.useCallback(
3500
3578
  (adventureId, traveller) => {
3501
3579
  setEditModalState({ open: true, adventureId, traveller });
3502
3580
  },
3503
3581
  []
3504
3582
  );
3505
- const handleRequestOpenDeleteModal = React25__namespace.useCallback(
3583
+ const handleRequestOpenDeleteModal = React8__namespace.useCallback(
3506
3584
  (adventureId, traveller) => {
3507
3585
  setDeleteModalState({ open: true, adventureId, traveller });
3508
3586
  },
3509
3587
  []
3510
3588
  );
3511
- const closeAddModal = React25__namespace.useCallback(() => {
3589
+ const handleRequestOpenResendInviteDialog = React8__namespace.useCallback(
3590
+ (traveller) => {
3591
+ setResendInviteDialogState({ open: true, traveller });
3592
+ },
3593
+ []
3594
+ );
3595
+ const closeAddModal = React8__namespace.useCallback(() => {
3512
3596
  setAddModalState({ open: false, adventureId: null });
3513
3597
  }, []);
3514
- const closeEditModal = React25__namespace.useCallback(() => {
3598
+ const closeEditModal = React8__namespace.useCallback(() => {
3515
3599
  setEditModalState({ open: false, adventureId: null, traveller: null });
3516
3600
  }, []);
3517
- const closeDeleteModal = React25__namespace.useCallback(() => {
3601
+ const closeDeleteModal = React8__namespace.useCallback(() => {
3518
3602
  setDeleteModalState({ open: false, adventureId: null, traveller: null });
3519
3603
  }, []);
3520
- const submitInFlightRef = React25__namespace.useRef(false);
3521
- const handleAddSubmit = React25__namespace.useCallback(
3604
+ const closeResendInviteDialog = React8__namespace.useCallback(() => {
3605
+ setResendInviteDialogState({ open: false, traveller: null });
3606
+ }, []);
3607
+ const submitInFlightRef = React8__namespace.useRef(false);
3608
+ const handleAddSubmit = React8__namespace.useCallback(
3522
3609
  async (adventureId, data) => {
3523
3610
  if (!onSubmitAddTraveller) return;
3524
3611
  if (submitInFlightRef.current) return;
@@ -3533,7 +3620,7 @@ function BookingDetails({
3533
3620
  },
3534
3621
  [onSubmitAddTraveller, closeAddModal]
3535
3622
  );
3536
- const handleEditSubmit = React25__namespace.useCallback(
3623
+ const handleEditSubmit = React8__namespace.useCallback(
3537
3624
  async (adventureId, travellerId, data) => {
3538
3625
  if (!onSubmitEditTraveller) return;
3539
3626
  if (submitInFlightRef.current) return;
@@ -3548,7 +3635,7 @@ function BookingDetails({
3548
3635
  },
3549
3636
  [onSubmitEditTraveller, closeEditModal]
3550
3637
  );
3551
- const handleDeleteConfirm = React25__namespace.useCallback(
3638
+ const handleDeleteConfirm = React8__namespace.useCallback(
3552
3639
  async (adventureId, travellerId) => {
3553
3640
  if (!onConfirmRemoveTraveller) return;
3554
3641
  if (submitInFlightRef.current) return;
@@ -3653,12 +3740,16 @@ function BookingDetails({
3653
3740
  onAddTraveller,
3654
3741
  onUnassignFromAdventure,
3655
3742
  onCopyFormLink,
3743
+ onResendInvite,
3744
+ resendingInviteTravellerIds,
3745
+ resendInviteAriaLabel,
3656
3746
  hasSubmitAddTraveller,
3657
3747
  hasSubmitEditTraveller,
3658
3748
  hasConfirmRemoveTraveller,
3659
3749
  onRequestOpenAddModal: handleRequestOpenAddModal,
3660
3750
  onRequestOpenEditModal: handleRequestOpenEditModal,
3661
3751
  onRequestOpenDeleteModal: handleRequestOpenDeleteModal,
3752
+ onRequestOpenResendInviteDialog: handleRequestOpenResendInviteDialog,
3662
3753
  cannotRemoveLastTravellerLabel,
3663
3754
  labels
3664
3755
  },
@@ -3791,6 +3882,23 @@ function BookingDetails({
3791
3882
  saving: removeTravellerSaving,
3792
3883
  errorMessage: deleteModalState.open ? travellerFormError : null
3793
3884
  }
3885
+ ),
3886
+ onResendInvite && /* @__PURE__ */ jsxRuntime.jsx(
3887
+ ResendInviteConfirmDialog,
3888
+ {
3889
+ open: resendInviteDialogState.open,
3890
+ travellerName: resendInviteDialogState.traveller ? `${(_G = resendInviteDialogState.traveller.firstName) != null ? _G : ""} ${(_H = resendInviteDialogState.traveller.lastName) != null ? _H : ""}`.trim() : "",
3891
+ onClose: closeResendInviteDialog,
3892
+ onConfirm: () => {
3893
+ const traveller = resendInviteDialogState.traveller;
3894
+ if (traveller) {
3895
+ onResendInvite(traveller.id);
3896
+ }
3897
+ closeResendInviteDialog();
3898
+ },
3899
+ labels: labels == null ? void 0 : labels.resendInviteDialog,
3900
+ submitting: resendInviteDialogState.traveller ? resendingInviteTravellerIds == null ? void 0 : resendingInviteTravellerIds.has(resendInviteDialogState.traveller.id) : false
3901
+ }
3794
3902
  )
3795
3903
  ] });
3796
3904
  }
@@ -5001,7 +5109,7 @@ function BookingCreatedEmail({
5001
5109
  }, children: i + 1 }) }),
5002
5110
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
5003
5111
  ] }) }) }, i)) }),
5004
- nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxRuntime.jsxs(React25__namespace.Fragment, { children: [
5112
+ nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxRuntime.jsxs(React8__namespace.Fragment, { children: [
5005
5113
  idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
5006
5114
  idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
5007
5115
  ] }, idx)) })
@@ -6370,11 +6478,11 @@ function DatePickerField({
6370
6478
  fromDate,
6371
6479
  className
6372
6480
  }) {
6373
- const [open, setOpen] = React25__namespace.useState(false);
6374
- const containerRef = React25__namespace.useRef(null);
6375
- const [calendarWidth, setCalendarWidth] = React25__namespace.useState();
6481
+ const [open, setOpen] = React8__namespace.useState(false);
6482
+ const containerRef = React8__namespace.useRef(null);
6483
+ const [calendarWidth, setCalendarWidth] = React8__namespace.useState();
6376
6484
  const hasValue = !!value;
6377
- React25__namespace.useEffect(() => {
6485
+ React8__namespace.useEffect(() => {
6378
6486
  if (!containerRef.current) return;
6379
6487
  const observer = new ResizeObserver(([entry]) => {
6380
6488
  setCalendarWidth(entry.contentRect.width);
@@ -6483,7 +6591,7 @@ function BookingForm({
6483
6591
  subtitle = "Free enquiry \u2013 no commitment",
6484
6592
  className
6485
6593
  }) {
6486
- const [values, setValues] = React25__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
6594
+ const [values, setValues] = React8__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
6487
6595
  const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
6488
6596
  const handleSubmit = (e) => {
6489
6597
  e.preventDefault();
@@ -7020,11 +7128,11 @@ function FloatingTextarea({
7020
7128
  }
7021
7129
  function SelectField({ field, value, onChange, error, disabled }) {
7022
7130
  var _a, _b, _c;
7023
- const [open, setOpen] = React25__namespace.useState(false);
7024
- const containerRef = React25__namespace.useRef(null);
7131
+ const [open, setOpen] = React8__namespace.useState(false);
7132
+ const containerRef = React8__namespace.useRef(null);
7025
7133
  const options = (_a = field.options) != null ? _a : [];
7026
7134
  const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
7027
- React25__namespace.useEffect(() => {
7135
+ React8__namespace.useEffect(() => {
7028
7136
  if (!open) return;
7029
7137
  const handleOutside = (e) => {
7030
7138
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -7413,11 +7521,11 @@ function RegistrationForm({
7413
7521
  readOnly = false
7414
7522
  }) {
7415
7523
  var _a;
7416
- const L = React25__namespace.useMemo(
7524
+ const L = React8__namespace.useMemo(
7417
7525
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS9), labels != null ? labels : {}),
7418
7526
  [labels]
7419
7527
  );
7420
- const sortedFields = React25__namespace.useMemo(
7528
+ const sortedFields = React8__namespace.useMemo(
7421
7529
  () => [...fields].sort((a, b) => {
7422
7530
  var _a2, _b;
7423
7531
  return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
@@ -7425,7 +7533,7 @@ function RegistrationForm({
7425
7533
  [fields]
7426
7534
  );
7427
7535
  const isControlled = values !== void 0;
7428
- const [internal, setInternal] = React25__namespace.useState(
7536
+ const [internal, setInternal] = React8__namespace.useState(
7429
7537
  () => initializeValues(
7430
7538
  sortedFields,
7431
7539
  defaultValues != null ? defaultValues : {},
@@ -7433,9 +7541,9 @@ function RegistrationForm({
7433
7541
  includeTerms
7434
7542
  )
7435
7543
  );
7436
- const [submitAttempted, setSubmitAttempted] = React25__namespace.useState(false);
7437
- const [validationErrors, setValidationErrors] = React25__namespace.useState({});
7438
- React25__namespace.useEffect(() => {
7544
+ const [submitAttempted, setSubmitAttempted] = React8__namespace.useState(false);
7545
+ const [validationErrors, setValidationErrors] = React8__namespace.useState({});
7546
+ React8__namespace.useEffect(() => {
7439
7547
  if (isControlled) return;
7440
7548
  setInternal((prev) => {
7441
7549
  const next = initializeValues(
@@ -7492,7 +7600,7 @@ function RegistrationForm({
7492
7600
  const termsError = submitAttempted && termsEnabled && !termsAccepted;
7493
7601
  const firstErrorFieldId = Object.keys(fieldErrors)[0];
7494
7602
  const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
7495
- React25__namespace.useEffect(() => {
7603
+ React8__namespace.useEffect(() => {
7496
7604
  if (!submitAttempted || !scrollTargetId) return;
7497
7605
  const timer = setTimeout(() => {
7498
7606
  const elem = document.getElementById(scrollTargetId);
@@ -7954,10 +8062,10 @@ var OTPCodeInput = ({
7954
8062
  id,
7955
8063
  required
7956
8064
  }) => {
7957
- const baseId = id != null ? id : React25__namespace.useId();
7958
- const inputRef = React25__namespace.useRef(null);
7959
- const [focused, setFocused] = React25__namespace.useState(false);
7960
- const digits = React25__namespace.useMemo(() => {
8065
+ const baseId = id != null ? id : React8__namespace.useId();
8066
+ const inputRef = React8__namespace.useRef(null);
8067
+ const [focused, setFocused] = React8__namespace.useState(false);
8068
+ const digits = React8__namespace.useMemo(() => {
7961
8069
  const arr = value.split("").slice(0, length);
7962
8070
  while (arr.length < length) arr.push("");
7963
8071
  return arr;
@@ -8073,7 +8181,7 @@ function Checkbox(_a) {
8073
8181
  })
8074
8182
  );
8075
8183
  }
8076
- var AccordionVariantContext = React25__namespace.createContext("default");
8184
+ var AccordionVariantContext = React8__namespace.createContext("default");
8077
8185
  function Accordion(_a) {
8078
8186
  var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
8079
8187
  return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -8091,7 +8199,7 @@ function Accordion(_a) {
8091
8199
  }
8092
8200
  function AccordionItem(_a) {
8093
8201
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
8094
- const variant = React25__namespace.useContext(AccordionVariantContext);
8202
+ const variant = React8__namespace.useContext(AccordionVariantContext);
8095
8203
  return /* @__PURE__ */ jsxRuntime.jsx(
8096
8204
  accordion.Accordion.Item,
8097
8205
  __spreadValues({
@@ -8112,7 +8220,7 @@ function AccordionTrigger(_a) {
8112
8220
  "className",
8113
8221
  "children"
8114
8222
  ]);
8115
- const variant = React25__namespace.useContext(AccordionVariantContext);
8223
+ const variant = React8__namespace.useContext(AccordionVariantContext);
8116
8224
  return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
8117
8225
  accordion.Accordion.Trigger,
8118
8226
  __spreadProps(__spreadValues({
@@ -8166,7 +8274,7 @@ function AccordionContent(_a) {
8166
8274
  "className",
8167
8275
  "children"
8168
8276
  ]);
8169
- const variant = React25__namespace.useContext(AccordionVariantContext);
8277
+ const variant = React8__namespace.useContext(AccordionVariantContext);
8170
8278
  return /* @__PURE__ */ jsxRuntime.jsx(
8171
8279
  accordion.Accordion.Panel,
8172
8280
  __spreadProps(__spreadValues({
@@ -8198,7 +8306,7 @@ function FilterPanel({
8198
8306
  title = "Filters",
8199
8307
  className
8200
8308
  }) {
8201
- const [internalValue, setInternalValue] = React25__namespace.useState(
8309
+ const [internalValue, setInternalValue] = React8__namespace.useState(
8202
8310
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
8203
8311
  );
8204
8312
  const selected = value != null ? value : internalValue;
@@ -8297,8 +8405,8 @@ function FilterPanel({
8297
8405
  var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
8298
8406
  function TrustpilotEmbed({ config }) {
8299
8407
  var _a, _b, _c, _d, _e, _f;
8300
- const ref = React25__namespace.useRef(null);
8301
- React25__namespace.useEffect(() => {
8408
+ const ref = React8__namespace.useRef(null);
8409
+ React8__namespace.useEffect(() => {
8302
8410
  if (typeof document === "undefined" || !ref.current) return;
8303
8411
  let cancelled = false;
8304
8412
  const initWidget = () => {
@@ -8430,11 +8538,11 @@ function ItineraryModal({
8430
8538
  onNext
8431
8539
  }) {
8432
8540
  var _a, _b, _c;
8433
- const [imgIndex, setImgIndex] = React25__namespace.useState(0);
8541
+ const [imgIndex, setImgIndex] = React8__namespace.useState(0);
8434
8542
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
8435
8543
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
8436
8544
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
8437
- React25__namespace.useEffect(() => {
8545
+ React8__namespace.useEffect(() => {
8438
8546
  setImgIndex(0);
8439
8547
  }, [stop == null ? void 0 : stop.dayNumber]);
8440
8548
  if (!stop) return null;
@@ -8561,8 +8669,8 @@ function ItineraryModal({
8561
8669
  ) });
8562
8670
  }
8563
8671
  function Itinerary({ title, subtitle, stops, className }) {
8564
- const [activeIndex, setActiveIndex] = React25__namespace.useState(null);
8565
- const scrollRef = React25__namespace.useRef(null);
8672
+ const [activeIndex, setActiveIndex] = React8__namespace.useState(null);
8673
+ const scrollRef = React8__namespace.useRef(null);
8566
8674
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
8567
8675
  const scrollBy = (dir) => {
8568
8676
  if (!scrollRef.current) return;
@@ -8654,18 +8762,18 @@ function Lightbox({
8654
8762
  onClose
8655
8763
  }) {
8656
8764
  var _a;
8657
- const [index, setIndex] = React25__namespace.useState(initialIndex);
8765
+ const [index, setIndex] = React8__namespace.useState(initialIndex);
8658
8766
  const total = photos.length;
8659
8767
  const photo = photos[index];
8660
- const prev = React25__namespace.useCallback(
8768
+ const prev = React8__namespace.useCallback(
8661
8769
  () => setIndex((i) => (i - 1 + total) % total),
8662
8770
  [total]
8663
8771
  );
8664
- const next = React25__namespace.useCallback(
8772
+ const next = React8__namespace.useCallback(
8665
8773
  () => setIndex((i) => (i + 1) % total),
8666
8774
  [total]
8667
8775
  );
8668
- React25__namespace.useEffect(() => {
8776
+ React8__namespace.useEffect(() => {
8669
8777
  const onKey = (e) => {
8670
8778
  if (e.key === "Escape") onClose();
8671
8779
  if (e.key === "ArrowLeft") prev();
@@ -8831,7 +8939,7 @@ function GridGallery({
8831
8939
  initialVisible,
8832
8940
  onOpen
8833
8941
  }) {
8834
- const [expanded, setExpanded] = React25__namespace.useState(false);
8942
+ const [expanded, setExpanded] = React8__namespace.useState(false);
8835
8943
  const cols = gridCols(photos.length);
8836
8944
  const hasMore = photos.length > initialVisible;
8837
8945
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -8861,7 +8969,7 @@ function MasonryGallery({
8861
8969
  initialVisible,
8862
8970
  onOpen
8863
8971
  }) {
8864
- const [expanded, setExpanded] = React25__namespace.useState(false);
8972
+ const [expanded, setExpanded] = React8__namespace.useState(false);
8865
8973
  const hasMore = photos.length > initialVisible;
8866
8974
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
8867
8975
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -8934,7 +9042,7 @@ function FeaturedGallery({
8934
9042
  photos,
8935
9043
  onOpen
8936
9044
  }) {
8937
- const [expanded, setExpanded] = React25__namespace.useState(false);
9045
+ const [expanded, setExpanded] = React8__namespace.useState(false);
8938
9046
  const featured = photos.slice(0, 3);
8939
9047
  const extra = photos.slice(3);
8940
9048
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -9101,9 +9209,9 @@ function PhotoGallery({
9101
9209
  onPhotoClick,
9102
9210
  className
9103
9211
  }) {
9104
- const [lightboxIndex, setLightboxIndex] = React25__namespace.useState(null);
9105
- const [carouselIndex, setCarouselIndex] = React25__namespace.useState(0);
9106
- const normalised = React25__namespace.useMemo(() => photos.map(normalise), [photos]);
9212
+ const [lightboxIndex, setLightboxIndex] = React8__namespace.useState(null);
9213
+ const [carouselIndex, setCarouselIndex] = React8__namespace.useState(0);
9214
+ const normalised = React8__namespace.useMemo(() => photos.map(normalise), [photos]);
9107
9215
  const handleOpen = (index) => {
9108
9216
  setLightboxIndex(index);
9109
9217
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
@@ -9179,7 +9287,7 @@ function ItineraryDay({
9179
9287
  photoLayout = "rounded",
9180
9288
  className
9181
9289
  }) {
9182
- const photoList = React25__namespace.useMemo(() => normalisePhotos(photos), [photos]);
9290
+ const photoList = React8__namespace.useMemo(() => normalisePhotos(photos), [photos]);
9183
9291
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
9184
9292
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
9185
9293
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
@@ -9231,8 +9339,8 @@ function MenuTrip({
9231
9339
  bold = true,
9232
9340
  className
9233
9341
  }) {
9234
- const scrollRef = React25__namespace.useRef(null);
9235
- React25__namespace.useEffect(() => {
9342
+ const scrollRef = React8__namespace.useRef(null);
9343
+ React8__namespace.useEffect(() => {
9236
9344
  if (!scrollRef.current || !activeSection) return;
9237
9345
  const container = scrollRef.current;
9238
9346
  const btn = container.querySelector(
@@ -9423,8 +9531,8 @@ function PricingTrip({
9423
9531
  className
9424
9532
  }) {
9425
9533
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
9426
- const [showEstimates, setShowEstimates] = React25__namespace.useState(false);
9427
- const [showPriceInfo, setShowPriceInfo] = React25__namespace.useState(false);
9534
+ const [showEstimates, setShowEstimates] = React8__namespace.useState(false);
9535
+ const [showPriceInfo, setShowPriceInfo] = React8__namespace.useState(false);
9428
9536
  if (variant === "compact") {
9429
9537
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
9430
9538
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -9864,14 +9972,14 @@ function SiteHeader({
9864
9972
  className
9865
9973
  }) {
9866
9974
  const t = VARIANT[variant];
9867
- const [openMenu, setOpenMenu] = React25__namespace.useState(null);
9868
- const [langOpen, setLangOpen] = React25__namespace.useState(false);
9869
- const [mobileOpen, setMobileOpen] = React25__namespace.useState(false);
9870
- const [openMobileSection, setOpenMobileSection] = React25__namespace.useState(null);
9871
- const [activeLang, setActiveLang] = React25__namespace.useState(currentLanguage);
9975
+ const [openMenu, setOpenMenu] = React8__namespace.useState(null);
9976
+ const [langOpen, setLangOpen] = React8__namespace.useState(false);
9977
+ const [mobileOpen, setMobileOpen] = React8__namespace.useState(false);
9978
+ const [openMobileSection, setOpenMobileSection] = React8__namespace.useState(null);
9979
+ const [activeLang, setActiveLang] = React8__namespace.useState(currentLanguage);
9872
9980
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
9873
- const menuCloseTimer = React25__namespace.useRef(void 0);
9874
- const langCloseTimer = React25__namespace.useRef(void 0);
9981
+ const menuCloseTimer = React8__namespace.useRef(void 0);
9982
+ const langCloseTimer = React8__namespace.useRef(void 0);
9875
9983
  const handleMenuEnter = (label) => {
9876
9984
  clearTimeout(menuCloseTimer.current);
9877
9985
  setOpenMenu(label);
@@ -9892,7 +10000,7 @@ function SiteHeader({
9892
10000
  setOpenMenu(null);
9893
10001
  setLangOpen(false);
9894
10002
  };
9895
- React25__namespace.useEffect(() => () => {
10003
+ React8__namespace.useEffect(() => () => {
9896
10004
  clearTimeout(menuCloseTimer.current);
9897
10005
  clearTimeout(langCloseTimer.current);
9898
10006
  }, []);
@@ -10157,7 +10265,7 @@ function SiteHeader({
10157
10265
  ), children: [
10158
10266
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
10159
10267
  const isActive = lang.code === activeLang;
10160
- return /* @__PURE__ */ jsxRuntime.jsxs(React25__namespace.Fragment, { children: [
10268
+ return /* @__PURE__ */ jsxRuntime.jsxs(React8__namespace.Fragment, { children: [
10161
10269
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
10162
10270
  "text-xs select-none",
10163
10271
  variant === "white" ? "text-border" : "text-white/15"
@@ -10219,8 +10327,8 @@ function SiteHeader({
10219
10327
  );
10220
10328
  }
10221
10329
  function ThemeToggle({ className }) {
10222
- const [dark, setDark] = React25__namespace.useState(false);
10223
- React25__namespace.useEffect(() => {
10330
+ const [dark, setDark] = React8__namespace.useState(false);
10331
+ React8__namespace.useEffect(() => {
10224
10332
  const saved = localStorage.getItem("theme");
10225
10333
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
10226
10334
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -10371,7 +10479,7 @@ function TripCard({
10371
10479
  );
10372
10480
  }
10373
10481
  function useHlsVideo(videoRef, src) {
10374
- React25__namespace.useEffect(() => {
10482
+ React8__namespace.useEffect(() => {
10375
10483
  if (!src || !videoRef.current) return;
10376
10484
  const video = videoRef.current;
10377
10485
  if (!src.includes(".m3u8")) return;
@@ -10414,11 +10522,11 @@ function TripHeader({
10414
10522
  className
10415
10523
  }) {
10416
10524
  var _a;
10417
- const [heroIndex, setHeroIndex] = React25__namespace.useState(0);
10418
- const [videoReady, setVideoReady] = React25__namespace.useState(false);
10419
- const videoRef = React25__namespace.useRef(null);
10525
+ const [heroIndex, setHeroIndex] = React8__namespace.useState(0);
10526
+ const [videoReady, setVideoReady] = React8__namespace.useState(false);
10527
+ const videoRef = React8__namespace.useRef(null);
10420
10528
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
10421
- const validImages = React25__namespace.useMemo(
10529
+ const validImages = React8__namespace.useMemo(
10422
10530
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
10423
10531
  [images]
10424
10532
  );
@@ -10433,7 +10541,7 @@ function TripHeader({
10433
10541
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
10434
10542
  const hasMeta = !!(destination || duration);
10435
10543
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
10436
- React25__namespace.useEffect(() => {
10544
+ React8__namespace.useEffect(() => {
10437
10545
  if (!videoUrl) return;
10438
10546
  const el = videoRef.current;
10439
10547
  if (!el) return;
@@ -10575,7 +10683,7 @@ function TripHeader({
10575
10683
  siteHeader ? "-mt-44" : "-mt-36"
10576
10684
  ),
10577
10685
  children: [
10578
- breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React25__namespace.Fragment, { children: [
10686
+ breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React8__namespace.Fragment, { children: [
10579
10687
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
10580
10688
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
10581
10689
  ] }, i)) }),
@@ -10691,9 +10799,9 @@ function TripPage({
10691
10799
  features,
10692
10800
  className
10693
10801
  }) {
10694
- const [activeSection, setActiveSection] = React25__namespace.useState("");
10695
- const [accordionValue, setAccordionValue] = React25__namespace.useState([]);
10696
- const accordionSectionIds = React25__namespace.useMemo(
10802
+ const [activeSection, setActiveSection] = React8__namespace.useState("");
10803
+ const [accordionValue, setAccordionValue] = React8__namespace.useState([]);
10804
+ const accordionSectionIds = React8__namespace.useMemo(
10697
10805
  () => /* @__PURE__ */ new Set([
10698
10806
  "key-info",
10699
10807
  "what-to-bring",
@@ -10706,18 +10814,18 @@ function TripPage({
10706
10814
  ]),
10707
10815
  []
10708
10816
  );
10709
- const [navFloating, setNavFloating] = React25__namespace.useState(false);
10710
- const [navHidden, setNavHidden] = React25__namespace.useState(false);
10711
- const [isFloating, setIsFloating] = React25__namespace.useState(false);
10712
- const [sidebarPos, setSidebarPos] = React25__namespace.useState(null);
10713
- const [pricingBarVisible, setPricingBarVisible] = React25__namespace.useState(false);
10714
- const navRef = React25__namespace.useRef(null);
10715
- const navSentinelRef = React25__namespace.useRef(null);
10716
- const sentinelRef = React25__namespace.useRef(null);
10717
- const sidebarPlaceholderRef = React25__namespace.useRef(null);
10718
- const pricingBarRef = React25__namespace.useRef(null);
10719
- const galleryRef = React25__namespace.useRef(null);
10720
- const sections = React25__namespace.useMemo(
10817
+ const [navFloating, setNavFloating] = React8__namespace.useState(false);
10818
+ const [navHidden, setNavHidden] = React8__namespace.useState(false);
10819
+ const [isFloating, setIsFloating] = React8__namespace.useState(false);
10820
+ const [sidebarPos, setSidebarPos] = React8__namespace.useState(null);
10821
+ const [pricingBarVisible, setPricingBarVisible] = React8__namespace.useState(false);
10822
+ const navRef = React8__namespace.useRef(null);
10823
+ const navSentinelRef = React8__namespace.useRef(null);
10824
+ const sentinelRef = React8__namespace.useRef(null);
10825
+ const sidebarPlaceholderRef = React8__namespace.useRef(null);
10826
+ const pricingBarRef = React8__namespace.useRef(null);
10827
+ const galleryRef = React8__namespace.useRef(null);
10828
+ const sections = React8__namespace.useMemo(
10721
10829
  () => [
10722
10830
  { id: "overview", label: "Overview", show: !!(overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) },
10723
10831
  {
@@ -10735,7 +10843,7 @@ function TripPage({
10735
10843
  // eslint-disable-next-line react-hooks/exhaustive-deps
10736
10844
  []
10737
10845
  );
10738
- React25__namespace.useEffect(() => {
10846
+ React8__namespace.useEffect(() => {
10739
10847
  const sentinel = navSentinelRef.current;
10740
10848
  if (!sentinel) return;
10741
10849
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -10743,7 +10851,7 @@ function TripPage({
10743
10851
  update();
10744
10852
  return () => document.removeEventListener("scroll", update, { capture: true });
10745
10853
  }, []);
10746
- React25__namespace.useEffect(() => {
10854
+ React8__namespace.useEffect(() => {
10747
10855
  const sentinel = sentinelRef.current;
10748
10856
  if (!sentinel) return;
10749
10857
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -10751,7 +10859,7 @@ function TripPage({
10751
10859
  update();
10752
10860
  return () => document.removeEventListener("scroll", update, { capture: true });
10753
10861
  }, []);
10754
- React25__namespace.useEffect(() => {
10862
+ React8__namespace.useEffect(() => {
10755
10863
  const measure = () => {
10756
10864
  if (!sidebarPlaceholderRef.current) return;
10757
10865
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -10761,7 +10869,7 @@ function TripPage({
10761
10869
  window.addEventListener("resize", measure);
10762
10870
  return () => window.removeEventListener("resize", measure);
10763
10871
  }, [isFloating]);
10764
- React25__namespace.useEffect(() => {
10872
+ React8__namespace.useEffect(() => {
10765
10873
  const check = () => {
10766
10874
  var _a;
10767
10875
  const target = (_a = galleryRef.current) != null ? _a : pricingBarRef.current;
@@ -10772,7 +10880,7 @@ function TripPage({
10772
10880
  check();
10773
10881
  return () => document.removeEventListener("scroll", check, { capture: true });
10774
10882
  }, []);
10775
- React25__namespace.useEffect(() => {
10883
+ React8__namespace.useEffect(() => {
10776
10884
  const check = () => {
10777
10885
  if (!pricingBarRef.current) return;
10778
10886
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -10781,7 +10889,7 @@ function TripPage({
10781
10889
  check();
10782
10890
  return () => document.removeEventListener("scroll", check, { capture: true });
10783
10891
  }, []);
10784
- React25__namespace.useEffect(() => {
10892
+ React8__namespace.useEffect(() => {
10785
10893
  if (sections.length === 0) return;
10786
10894
  setActiveSection(sections[0].id);
10787
10895
  const update = () => {
@@ -11303,12 +11411,12 @@ function Toast({
11303
11411
  duration = 6e3,
11304
11412
  className
11305
11413
  }) {
11306
- const [mounted, setMounted] = React25__namespace.useState(false);
11307
- const [visible, setVisible] = React25__namespace.useState(true);
11308
- React25__namespace.useEffect(() => {
11414
+ const [mounted, setMounted] = React8__namespace.useState(false);
11415
+ const [visible, setVisible] = React8__namespace.useState(true);
11416
+ React8__namespace.useEffect(() => {
11309
11417
  setMounted(true);
11310
11418
  }, []);
11311
- React25__namespace.useEffect(() => {
11419
+ React8__namespace.useEffect(() => {
11312
11420
  if (duration === 0) return;
11313
11421
  const t = setTimeout(() => {
11314
11422
  setVisible(false);
@@ -11715,21 +11823,21 @@ function LeadCapturePopup({
11715
11823
  }) {
11716
11824
  var _a;
11717
11825
  const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
11718
- const [open, setOpen] = React25.useState(false);
11719
- const [closing, setClosing] = React25.useState(false);
11720
- const [submitted, setSubmitted] = React25.useState(false);
11721
- const [submitting, setSubmitting] = React25.useState(false);
11722
- const [error, setError] = React25.useState(null);
11723
- const [name, setName] = React25.useState("");
11724
- const [email, setEmail] = React25.useState("");
11725
- const [travelDate, setTravelDate] = React25.useState("");
11726
- const panelRef = React25.useRef(null);
11727
- const nameRef = React25.useRef(null);
11728
- const show = React25.useCallback(() => {
11826
+ const [open, setOpen] = React8.useState(false);
11827
+ const [closing, setClosing] = React8.useState(false);
11828
+ const [submitted, setSubmitted] = React8.useState(false);
11829
+ const [submitting, setSubmitting] = React8.useState(false);
11830
+ const [error, setError] = React8.useState(null);
11831
+ const [name, setName] = React8.useState("");
11832
+ const [email, setEmail] = React8.useState("");
11833
+ const [travelDate, setTravelDate] = React8.useState("");
11834
+ const panelRef = React8.useRef(null);
11835
+ const nameRef = React8.useRef(null);
11836
+ const show = React8.useCallback(() => {
11729
11837
  if (isDismissed()) return;
11730
11838
  setOpen(true);
11731
11839
  }, []);
11732
- React25.useEffect(() => {
11840
+ React8.useEffect(() => {
11733
11841
  var _a2;
11734
11842
  if (isDismissed()) return;
11735
11843
  if (config.trigger === "delay") {
@@ -11756,7 +11864,7 @@ function LeadCapturePopup({
11756
11864
  return () => window.removeEventListener("scroll", handler);
11757
11865
  }
11758
11866
  }, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
11759
- React25.useEffect(() => {
11867
+ React8.useEffect(() => {
11760
11868
  if (open && !submitted) {
11761
11869
  requestAnimationFrame(() => {
11762
11870
  var _a2;
@@ -11764,7 +11872,7 @@ function LeadCapturePopup({
11764
11872
  });
11765
11873
  }
11766
11874
  }, [open, submitted]);
11767
- const close = React25.useCallback(() => {
11875
+ const close = React8.useCallback(() => {
11768
11876
  setClosing(true);
11769
11877
  setDismissed(config.dismissDays);
11770
11878
  setTimeout(() => {
@@ -11772,7 +11880,7 @@ function LeadCapturePopup({
11772
11880
  setClosing(false);
11773
11881
  }, 250);
11774
11882
  }, [config.dismissDays]);
11775
- React25.useEffect(() => {
11883
+ React8.useEffect(() => {
11776
11884
  if (!open) return;
11777
11885
  const handler = (e) => {
11778
11886
  if (e.key === "Escape") close();
@@ -11780,7 +11888,7 @@ function LeadCapturePopup({
11780
11888
  document.addEventListener("keydown", handler);
11781
11889
  return () => document.removeEventListener("keydown", handler);
11782
11890
  }, [open, close]);
11783
- const onOverlayClick = React25.useCallback(
11891
+ const onOverlayClick = React8.useCallback(
11784
11892
  (e) => {
11785
11893
  if (panelRef.current && !panelRef.current.contains(e.target)) {
11786
11894
  close();