@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.js CHANGED
@@ -1,4 +1,4 @@
1
- import * as React25 from 'react';
1
+ import * as React8 from 'react';
2
2
  import { useState, useRef, useCallback, useEffect } from 'react';
3
3
  import { cva } from 'class-variance-authority';
4
4
  import { clsx } from 'clsx';
@@ -81,7 +81,7 @@ var buttonVariants = cva(
81
81
  }
82
82
  }
83
83
  );
84
- var Button = React25.forwardRef(
84
+ var Button = React8.forwardRef(
85
85
  (_a, ref) => {
86
86
  var _b = _a, { className, variant, size } = _b, props = __objRest(_b, ["className", "variant", "size"]);
87
87
  return /* @__PURE__ */ jsx(
@@ -302,10 +302,10 @@ function DialogDescription(_a) {
302
302
  }, props)
303
303
  );
304
304
  }
305
- var FloatingInput = React25.forwardRef(
305
+ var FloatingInput = React8.forwardRef(
306
306
  (_a, ref) => {
307
307
  var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
308
- const inputId = id != null ? id : React25.useId();
308
+ const inputId = id != null ? id : React8.useId();
309
309
  return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
310
310
  /* @__PURE__ */ jsx(
311
311
  "input",
@@ -345,10 +345,10 @@ var FloatingInput = React25.forwardRef(
345
345
  }
346
346
  );
347
347
  FloatingInput.displayName = "FloatingInput";
348
- var FloatingSelect = React25.forwardRef(
348
+ var FloatingSelect = React8.forwardRef(
349
349
  (_a, ref) => {
350
350
  var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
351
- const inputId = id != null ? id : React25.useId();
351
+ const inputId = id != null ? id : React8.useId();
352
352
  const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
353
353
  return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
354
354
  /* @__PURE__ */ jsx(
@@ -612,11 +612,11 @@ function PhoneCountrySelect({
612
612
  disabled
613
613
  }) {
614
614
  var _a;
615
- const [open, setOpen] = React25.useState(false);
616
- const containerRef = React25.useRef(null);
617
- const listRef = React25.useRef(null);
615
+ const [open, setOpen] = React8.useState(false);
616
+ const containerRef = React8.useRef(null);
617
+ const listRef = React8.useRef(null);
618
618
  const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
619
- React25.useEffect(() => {
619
+ React8.useEffect(() => {
620
620
  if (!open) return;
621
621
  const handler = (e) => {
622
622
  var _a2;
@@ -627,7 +627,7 @@ function PhoneCountrySelect({
627
627
  document.addEventListener("mousedown", handler);
628
628
  return () => document.removeEventListener("mousedown", handler);
629
629
  }, [open]);
630
- React25.useEffect(() => {
630
+ React8.useEffect(() => {
631
631
  if (!open || !listRef.current) return;
632
632
  const activeEl = listRef.current.querySelector("[data-selected=true]");
633
633
  activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
@@ -897,8 +897,8 @@ function CalendarDayButton(_a) {
897
897
  "locale"
898
898
  ]);
899
899
  const defaultClassNames = getDefaultClassNames();
900
- const ref = React25.useRef(null);
901
- React25.useEffect(() => {
900
+ const ref = React8.useRef(null);
901
+ React8.useEffect(() => {
902
902
  var _a2;
903
903
  if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
904
904
  }, [modifiers.focused]);
@@ -929,16 +929,16 @@ function BirthDateField({
929
929
  className,
930
930
  disabled
931
931
  }) {
932
- const [open, setOpen] = React25.useState(false);
933
- const [text, setText] = React25.useState(
932
+ const [open, setOpen] = React8.useState(false);
933
+ const [text, setText] = React8.useState(
934
934
  value ? format(value, "dd/MM/yyyy") : ""
935
935
  );
936
- const containerRef = React25.useRef(null);
937
- const inputId = React25.useId();
938
- React25.useEffect(() => {
936
+ const containerRef = React8.useRef(null);
937
+ const inputId = React8.useId();
938
+ React8.useEffect(() => {
939
939
  setText(value ? format(value, "dd/MM/yyyy") : "");
940
940
  }, [value]);
941
- React25.useEffect(() => {
941
+ React8.useEffect(() => {
942
942
  if (!open) return;
943
943
  const handler = (e) => {
944
944
  var _a;
@@ -1147,14 +1147,14 @@ function CountrySearchField({
1147
1147
  }) {
1148
1148
  var _a;
1149
1149
  const list = countries != null ? countries : COUNTRIES;
1150
- const [query, setQuery] = React25.useState("");
1151
- const [open, setOpen] = React25.useState(false);
1152
- const containerRef = React25.useRef(null);
1153
- const searchRef = React25.useRef(null);
1150
+ const [query, setQuery] = React8.useState("");
1151
+ const [open, setOpen] = React8.useState(false);
1152
+ const containerRef = React8.useRef(null);
1153
+ const searchRef = React8.useRef(null);
1154
1154
  const selected = list.find((c) => c.code === value);
1155
1155
  const isFloated = open || !!selected;
1156
1156
  const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
1157
- React25.useEffect(() => {
1157
+ React8.useEffect(() => {
1158
1158
  if (!open) return;
1159
1159
  const handler = (e) => {
1160
1160
  var _a2;
@@ -1268,7 +1268,7 @@ function AdventureCard({
1268
1268
  }) {
1269
1269
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
1270
1270
  const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
1271
- const [checkedInternal, setCheckedInternal] = React25.useState(
1271
+ const [checkedInternal, setCheckedInternal] = React8.useState(
1272
1272
  new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
1273
1273
  );
1274
1274
  const isChecked = (opt) => {
@@ -1666,7 +1666,7 @@ function BookingShell({
1666
1666
  return /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
1667
1667
  /* @__PURE__ */ jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
1668
1668
  /* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
1669
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(React25.Fragment, { children: [
1669
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(React8.Fragment, { children: [
1670
1670
  /* @__PURE__ */ jsx(
1671
1671
  "span",
1672
1672
  {
@@ -1865,7 +1865,7 @@ function TermsSection({
1865
1865
  termsContent
1866
1866
  }) {
1867
1867
  var _a;
1868
- const [modalOpen, setModalOpen] = React25.useState(false);
1868
+ const [modalOpen, setModalOpen] = React8.useState(false);
1869
1869
  const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
1870
1870
  return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
1871
1871
  /* @__PURE__ */ jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
@@ -2003,9 +2003,9 @@ function BookingWizard({
2003
2003
  }) {
2004
2004
  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;
2005
2005
  const wizardSteps = WIZARD_STEPS_FN(labels);
2006
- const [step, setStep] = React25.useState("responsible");
2007
- const [error, setError] = React25.useState(null);
2008
- const [responsible, setResponsible] = React25.useState({
2006
+ const [step, setStep] = React8.useState("responsible");
2007
+ const [error, setError] = React8.useState(null);
2008
+ const [responsible, setResponsible] = React8.useState({
2009
2009
  firstName: "",
2010
2010
  lastName: "",
2011
2011
  email: "",
@@ -2024,7 +2024,7 @@ function BookingWizard({
2024
2024
  return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
2025
2025
  }, 0);
2026
2026
  const totalPax = totalAdults + totalChildren;
2027
- const [travellers, setTravellers] = React25.useState(
2027
+ const [travellers, setTravellers] = React8.useState(
2028
2028
  Array.from({ length: Math.max(totalPax, 1) }, () => ({
2029
2029
  firstName: "",
2030
2030
  lastName: "",
@@ -2032,9 +2032,9 @@ function BookingWizard({
2032
2032
  email: ""
2033
2033
  }))
2034
2034
  );
2035
- const [payAmount, setPayAmount] = React25.useState("full");
2036
- const [payMethod, setPayMethod] = React25.useState("stripe");
2037
- const [termsAccepted, setTermsAccepted] = React25.useState(false);
2035
+ const [payAmount, setPayAmount] = React8.useState("full");
2036
+ const [payMethod, setPayMethod] = React8.useState("stripe");
2037
+ const [termsAccepted, setTermsAccepted] = React8.useState(false);
2038
2038
  const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
2039
2039
  const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
2040
2040
  const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
@@ -2261,7 +2261,7 @@ function Offer({
2261
2261
  className
2262
2262
  }) {
2263
2263
  var _a, _b, _c;
2264
- const [showBooking, setShowBooking] = React25.useState(false);
2264
+ const [showBooking, setShowBooking] = React8.useState(false);
2265
2265
  const isShowingCheckout = !confirmedState && (!!checkoutSlot || showBooking);
2266
2266
  const handleBook = () => {
2267
2267
  if (!checkoutSlot && !externalBookingFlow) setShowBooking(true);
@@ -2612,17 +2612,21 @@ function AdventureSection({
2612
2612
  onAddTraveller,
2613
2613
  onUnassignFromAdventure,
2614
2614
  onCopyFormLink,
2615
+ onResendInvite,
2616
+ resendingInviteTravellerIds,
2617
+ resendInviteAriaLabel,
2615
2618
  hasSubmitAddTraveller,
2616
2619
  hasSubmitEditTraveller,
2617
2620
  hasConfirmRemoveTraveller,
2618
2621
  onRequestOpenAddModal,
2619
2622
  onRequestOpenEditModal,
2620
2623
  onRequestOpenDeleteModal,
2624
+ onRequestOpenResendInviteDialog,
2621
2625
  cannotRemoveLastTravellerLabel,
2622
2626
  labels
2623
2627
  }) {
2624
2628
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
2625
- const [detailsOpen, setDetailsOpen] = React25.useState(false);
2629
+ const [detailsOpen, setDetailsOpen] = React8.useState(false);
2626
2630
  const handleCopyUrl = (url) => {
2627
2631
  if (onCopyFormLink) {
2628
2632
  onCopyFormLink(url);
@@ -2868,6 +2872,24 @@ function AdventureSection({
2868
2872
  }
2869
2873
  ),
2870
2874
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [
2875
+ onResendInvite && t.status === "pending" && t.email && /* @__PURE__ */ jsx(
2876
+ "button",
2877
+ {
2878
+ type: "button",
2879
+ onClick: () => {
2880
+ if (onRequestOpenResendInviteDialog) {
2881
+ onRequestOpenResendInviteDialog(t);
2882
+ } else {
2883
+ onResendInvite(t.id);
2884
+ }
2885
+ },
2886
+ disabled: resendingInviteTravellerIds == null ? void 0 : resendingInviteTravellerIds.has(t.id),
2887
+ 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",
2888
+ "aria-label": resendInviteAriaLabel != null ? resendInviteAriaLabel : "Resend registration invite",
2889
+ title: resendInviteAriaLabel != null ? resendInviteAriaLabel : "Resend registration invite",
2890
+ children: /* @__PURE__ */ jsx(SendIcon, { className: "w-3.5 h-3.5" })
2891
+ }
2892
+ ),
2871
2893
  (onEditTraveller || hasSubmitEditTraveller) && /* @__PURE__ */ jsx(
2872
2894
  "button",
2873
2895
  {
@@ -3116,8 +3138,8 @@ function AddTravellerDialog({
3116
3138
  errorMessage
3117
3139
  }) {
3118
3140
  var _a, _b, _c, _d, _e;
3119
- const [form, setForm] = React25.useState(() => createInitialAddFormData(config));
3120
- React25.useEffect(() => {
3141
+ const [form, setForm] = React8.useState(() => createInitialAddFormData(config));
3142
+ React8.useEffect(() => {
3121
3143
  if (open) {
3122
3144
  setForm(createInitialAddFormData(config));
3123
3145
  }
@@ -3177,7 +3199,7 @@ function EditTravellerDialog({
3177
3199
  errorMessage
3178
3200
  }) {
3179
3201
  var _a, _b, _c, _d, _e;
3180
- const [form, setForm] = React25.useState(() => ({
3202
+ const [form, setForm] = React8.useState(() => ({
3181
3203
  firstName: "",
3182
3204
  lastName: "",
3183
3205
  email: "",
@@ -3186,7 +3208,7 @@ function EditTravellerDialog({
3186
3208
  birthDate: "",
3187
3209
  personType: "ADULT"
3188
3210
  }));
3189
- React25.useEffect(() => {
3211
+ React8.useEffect(() => {
3190
3212
  var _a2, _b2, _c2, _d2, _e2, _f;
3191
3213
  if (open && traveller) {
3192
3214
  setForm({
@@ -3296,6 +3318,58 @@ function DeleteTravellerDialog({
3296
3318
  }
3297
3319
  );
3298
3320
  }
3321
+ function ResendInviteConfirmDialog({
3322
+ open,
3323
+ travellerName: _travellerName,
3324
+ onClose,
3325
+ onConfirm,
3326
+ labels,
3327
+ submitting
3328
+ }) {
3329
+ var _a, _b, _c, _d, _e;
3330
+ return /* @__PURE__ */ jsx(
3331
+ Dialog,
3332
+ {
3333
+ open,
3334
+ onOpenChange: (o) => {
3335
+ if (!o) onClose();
3336
+ },
3337
+ children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-sm", children: [
3338
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
3339
+ /* @__PURE__ */ jsx(DialogTitle, { children: (_a = labels == null ? void 0 : labels.title) != null ? _a : "Resend registration invite?" }),
3340
+ /* @__PURE__ */ 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." })
3341
+ ] }),
3342
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 rounded-lg bg-amber-500/10 border border-amber-500/30 px-3 py-2", children: [
3343
+ /* @__PURE__ */ jsx(AlertTriangleIcon, { className: "h-4 w-4 text-amber-600 mt-0.5 shrink-0" }),
3344
+ /* @__PURE__ */ 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." })
3345
+ ] }),
3346
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [
3347
+ /* @__PURE__ */ jsx(
3348
+ Button,
3349
+ {
3350
+ type: "button",
3351
+ variant: "outline",
3352
+ size: "sm",
3353
+ onClick: onClose,
3354
+ disabled: submitting,
3355
+ children: (_d = labels == null ? void 0 : labels.cancel) != null ? _d : "Cancel"
3356
+ }
3357
+ ),
3358
+ /* @__PURE__ */ jsx(
3359
+ Button,
3360
+ {
3361
+ type: "button",
3362
+ size: "sm",
3363
+ disabled: submitting,
3364
+ onClick: () => void onConfirm(),
3365
+ children: (_e = labels == null ? void 0 : labels.confirm) != null ? _e : "Resend invite"
3366
+ }
3367
+ )
3368
+ ] })
3369
+ ] })
3370
+ }
3371
+ );
3372
+ }
3299
3373
  function OrderSummary({
3300
3374
  adventures,
3301
3375
  summaryLineItems,
@@ -3444,6 +3518,9 @@ function BookingDetails({
3444
3518
  onAddTraveller,
3445
3519
  onUnassignFromAdventure,
3446
3520
  onCopyFormLink,
3521
+ onResendInvite,
3522
+ resendingInviteTravellerIds,
3523
+ resendInviteAriaLabel,
3447
3524
  onSubmitAddTraveller,
3448
3525
  onSubmitEditTraveller,
3449
3526
  onConfirmRemoveTraveller,
@@ -3461,43 +3538,53 @@ function BookingDetails({
3461
3538
  labels,
3462
3539
  className
3463
3540
  }) {
3464
- 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;
3541
+ 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;
3465
3542
  const people = totalPeople(adventures);
3466
3543
  const hasSubmitAddTraveller = !!onSubmitAddTraveller;
3467
3544
  const hasSubmitEditTraveller = !!onSubmitEditTraveller;
3468
3545
  const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
3469
- const [addModalState, setAddModalState] = React25.useState({
3546
+ const [addModalState, setAddModalState] = React8.useState({
3470
3547
  open: false,
3471
3548
  adventureId: null
3472
3549
  });
3473
- const [editModalState, setEditModalState] = React25.useState({ open: false, adventureId: null, traveller: null });
3474
- const [deleteModalState, setDeleteModalState] = React25.useState({ open: false, adventureId: null, traveller: null });
3475
- const handleRequestOpenAddModal = React25.useCallback((adventureId) => {
3550
+ const [editModalState, setEditModalState] = React8.useState({ open: false, adventureId: null, traveller: null });
3551
+ const [deleteModalState, setDeleteModalState] = React8.useState({ open: false, adventureId: null, traveller: null });
3552
+ const [resendInviteDialogState, setResendInviteDialogState] = React8.useState({ open: false, traveller: null });
3553
+ const handleRequestOpenAddModal = React8.useCallback((adventureId) => {
3476
3554
  setAddModalState({ open: true, adventureId });
3477
3555
  }, []);
3478
- const handleRequestOpenEditModal = React25.useCallback(
3556
+ const handleRequestOpenEditModal = React8.useCallback(
3479
3557
  (adventureId, traveller) => {
3480
3558
  setEditModalState({ open: true, adventureId, traveller });
3481
3559
  },
3482
3560
  []
3483
3561
  );
3484
- const handleRequestOpenDeleteModal = React25.useCallback(
3562
+ const handleRequestOpenDeleteModal = React8.useCallback(
3485
3563
  (adventureId, traveller) => {
3486
3564
  setDeleteModalState({ open: true, adventureId, traveller });
3487
3565
  },
3488
3566
  []
3489
3567
  );
3490
- const closeAddModal = React25.useCallback(() => {
3568
+ const handleRequestOpenResendInviteDialog = React8.useCallback(
3569
+ (traveller) => {
3570
+ setResendInviteDialogState({ open: true, traveller });
3571
+ },
3572
+ []
3573
+ );
3574
+ const closeAddModal = React8.useCallback(() => {
3491
3575
  setAddModalState({ open: false, adventureId: null });
3492
3576
  }, []);
3493
- const closeEditModal = React25.useCallback(() => {
3577
+ const closeEditModal = React8.useCallback(() => {
3494
3578
  setEditModalState({ open: false, adventureId: null, traveller: null });
3495
3579
  }, []);
3496
- const closeDeleteModal = React25.useCallback(() => {
3580
+ const closeDeleteModal = React8.useCallback(() => {
3497
3581
  setDeleteModalState({ open: false, adventureId: null, traveller: null });
3498
3582
  }, []);
3499
- const submitInFlightRef = React25.useRef(false);
3500
- const handleAddSubmit = React25.useCallback(
3583
+ const closeResendInviteDialog = React8.useCallback(() => {
3584
+ setResendInviteDialogState({ open: false, traveller: null });
3585
+ }, []);
3586
+ const submitInFlightRef = React8.useRef(false);
3587
+ const handleAddSubmit = React8.useCallback(
3501
3588
  async (adventureId, data) => {
3502
3589
  if (!onSubmitAddTraveller) return;
3503
3590
  if (submitInFlightRef.current) return;
@@ -3512,7 +3599,7 @@ function BookingDetails({
3512
3599
  },
3513
3600
  [onSubmitAddTraveller, closeAddModal]
3514
3601
  );
3515
- const handleEditSubmit = React25.useCallback(
3602
+ const handleEditSubmit = React8.useCallback(
3516
3603
  async (adventureId, travellerId, data) => {
3517
3604
  if (!onSubmitEditTraveller) return;
3518
3605
  if (submitInFlightRef.current) return;
@@ -3527,7 +3614,7 @@ function BookingDetails({
3527
3614
  },
3528
3615
  [onSubmitEditTraveller, closeEditModal]
3529
3616
  );
3530
- const handleDeleteConfirm = React25.useCallback(
3617
+ const handleDeleteConfirm = React8.useCallback(
3531
3618
  async (adventureId, travellerId) => {
3532
3619
  if (!onConfirmRemoveTraveller) return;
3533
3620
  if (submitInFlightRef.current) return;
@@ -3632,12 +3719,16 @@ function BookingDetails({
3632
3719
  onAddTraveller,
3633
3720
  onUnassignFromAdventure,
3634
3721
  onCopyFormLink,
3722
+ onResendInvite,
3723
+ resendingInviteTravellerIds,
3724
+ resendInviteAriaLabel,
3635
3725
  hasSubmitAddTraveller,
3636
3726
  hasSubmitEditTraveller,
3637
3727
  hasConfirmRemoveTraveller,
3638
3728
  onRequestOpenAddModal: handleRequestOpenAddModal,
3639
3729
  onRequestOpenEditModal: handleRequestOpenEditModal,
3640
3730
  onRequestOpenDeleteModal: handleRequestOpenDeleteModal,
3731
+ onRequestOpenResendInviteDialog: handleRequestOpenResendInviteDialog,
3641
3732
  cannotRemoveLastTravellerLabel,
3642
3733
  labels
3643
3734
  },
@@ -3770,6 +3861,23 @@ function BookingDetails({
3770
3861
  saving: removeTravellerSaving,
3771
3862
  errorMessage: deleteModalState.open ? travellerFormError : null
3772
3863
  }
3864
+ ),
3865
+ onResendInvite && /* @__PURE__ */ jsx(
3866
+ ResendInviteConfirmDialog,
3867
+ {
3868
+ open: resendInviteDialogState.open,
3869
+ travellerName: resendInviteDialogState.traveller ? `${(_G = resendInviteDialogState.traveller.firstName) != null ? _G : ""} ${(_H = resendInviteDialogState.traveller.lastName) != null ? _H : ""}`.trim() : "",
3870
+ onClose: closeResendInviteDialog,
3871
+ onConfirm: () => {
3872
+ const traveller = resendInviteDialogState.traveller;
3873
+ if (traveller) {
3874
+ onResendInvite(traveller.id);
3875
+ }
3876
+ closeResendInviteDialog();
3877
+ },
3878
+ labels: labels == null ? void 0 : labels.resendInviteDialog,
3879
+ submitting: resendInviteDialogState.traveller ? resendingInviteTravellerIds == null ? void 0 : resendingInviteTravellerIds.has(resendInviteDialogState.traveller.id) : false
3880
+ }
3773
3881
  )
3774
3882
  ] });
3775
3883
  }
@@ -4980,7 +5088,7 @@ function BookingCreatedEmail({
4980
5088
  }, children: i + 1 }) }),
4981
5089
  /* @__PURE__ */ jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
4982
5090
  ] }) }) }, i)) }),
4983
- nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxs(React25.Fragment, { children: [
5091
+ nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxs(React8.Fragment, { children: [
4984
5092
  idx === 0 ? /* @__PURE__ */ jsx("strong", { children: line }) : line,
4985
5093
  idx < arr.length - 1 ? /* @__PURE__ */ jsx("br", {}) : null
4986
5094
  ] }, idx)) })
@@ -6349,11 +6457,11 @@ function DatePickerField({
6349
6457
  fromDate,
6350
6458
  className
6351
6459
  }) {
6352
- const [open, setOpen] = React25.useState(false);
6353
- const containerRef = React25.useRef(null);
6354
- const [calendarWidth, setCalendarWidth] = React25.useState();
6460
+ const [open, setOpen] = React8.useState(false);
6461
+ const containerRef = React8.useRef(null);
6462
+ const [calendarWidth, setCalendarWidth] = React8.useState();
6355
6463
  const hasValue = !!value;
6356
- React25.useEffect(() => {
6464
+ React8.useEffect(() => {
6357
6465
  if (!containerRef.current) return;
6358
6466
  const observer = new ResizeObserver(([entry]) => {
6359
6467
  setCalendarWidth(entry.contentRect.width);
@@ -6462,7 +6570,7 @@ function BookingForm({
6462
6570
  subtitle = "Free enquiry \u2013 no commitment",
6463
6571
  className
6464
6572
  }) {
6465
- const [values, setValues] = React25.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
6573
+ const [values, setValues] = React8.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
6466
6574
  const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
6467
6575
  const handleSubmit = (e) => {
6468
6576
  e.preventDefault();
@@ -6999,11 +7107,11 @@ function FloatingTextarea({
6999
7107
  }
7000
7108
  function SelectField({ field, value, onChange, error, disabled }) {
7001
7109
  var _a, _b, _c;
7002
- const [open, setOpen] = React25.useState(false);
7003
- const containerRef = React25.useRef(null);
7110
+ const [open, setOpen] = React8.useState(false);
7111
+ const containerRef = React8.useRef(null);
7004
7112
  const options = (_a = field.options) != null ? _a : [];
7005
7113
  const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
7006
- React25.useEffect(() => {
7114
+ React8.useEffect(() => {
7007
7115
  if (!open) return;
7008
7116
  const handleOutside = (e) => {
7009
7117
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -7392,11 +7500,11 @@ function RegistrationForm({
7392
7500
  readOnly = false
7393
7501
  }) {
7394
7502
  var _a;
7395
- const L = React25.useMemo(
7503
+ const L = React8.useMemo(
7396
7504
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS9), labels != null ? labels : {}),
7397
7505
  [labels]
7398
7506
  );
7399
- const sortedFields = React25.useMemo(
7507
+ const sortedFields = React8.useMemo(
7400
7508
  () => [...fields].sort((a, b) => {
7401
7509
  var _a2, _b;
7402
7510
  return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
@@ -7404,7 +7512,7 @@ function RegistrationForm({
7404
7512
  [fields]
7405
7513
  );
7406
7514
  const isControlled = values !== void 0;
7407
- const [internal, setInternal] = React25.useState(
7515
+ const [internal, setInternal] = React8.useState(
7408
7516
  () => initializeValues(
7409
7517
  sortedFields,
7410
7518
  defaultValues != null ? defaultValues : {},
@@ -7412,9 +7520,9 @@ function RegistrationForm({
7412
7520
  includeTerms
7413
7521
  )
7414
7522
  );
7415
- const [submitAttempted, setSubmitAttempted] = React25.useState(false);
7416
- const [validationErrors, setValidationErrors] = React25.useState({});
7417
- React25.useEffect(() => {
7523
+ const [submitAttempted, setSubmitAttempted] = React8.useState(false);
7524
+ const [validationErrors, setValidationErrors] = React8.useState({});
7525
+ React8.useEffect(() => {
7418
7526
  if (isControlled) return;
7419
7527
  setInternal((prev) => {
7420
7528
  const next = initializeValues(
@@ -7471,7 +7579,7 @@ function RegistrationForm({
7471
7579
  const termsError = submitAttempted && termsEnabled && !termsAccepted;
7472
7580
  const firstErrorFieldId = Object.keys(fieldErrors)[0];
7473
7581
  const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
7474
- React25.useEffect(() => {
7582
+ React8.useEffect(() => {
7475
7583
  if (!submitAttempted || !scrollTargetId) return;
7476
7584
  const timer = setTimeout(() => {
7477
7585
  const elem = document.getElementById(scrollTargetId);
@@ -7933,10 +8041,10 @@ var OTPCodeInput = ({
7933
8041
  id,
7934
8042
  required
7935
8043
  }) => {
7936
- const baseId = id != null ? id : React25.useId();
7937
- const inputRef = React25.useRef(null);
7938
- const [focused, setFocused] = React25.useState(false);
7939
- const digits = React25.useMemo(() => {
8044
+ const baseId = id != null ? id : React8.useId();
8045
+ const inputRef = React8.useRef(null);
8046
+ const [focused, setFocused] = React8.useState(false);
8047
+ const digits = React8.useMemo(() => {
7940
8048
  const arr = value.split("").slice(0, length);
7941
8049
  while (arr.length < length) arr.push("");
7942
8050
  return arr;
@@ -8052,7 +8160,7 @@ function Checkbox(_a) {
8052
8160
  })
8053
8161
  );
8054
8162
  }
8055
- var AccordionVariantContext = React25.createContext("default");
8163
+ var AccordionVariantContext = React8.createContext("default");
8056
8164
  function Accordion(_a) {
8057
8165
  var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
8058
8166
  return /* @__PURE__ */ jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(
@@ -8070,7 +8178,7 @@ function Accordion(_a) {
8070
8178
  }
8071
8179
  function AccordionItem(_a) {
8072
8180
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
8073
- const variant = React25.useContext(AccordionVariantContext);
8181
+ const variant = React8.useContext(AccordionVariantContext);
8074
8182
  return /* @__PURE__ */ jsx(
8075
8183
  Accordion$1.Item,
8076
8184
  __spreadValues({
@@ -8091,7 +8199,7 @@ function AccordionTrigger(_a) {
8091
8199
  "className",
8092
8200
  "children"
8093
8201
  ]);
8094
- const variant = React25.useContext(AccordionVariantContext);
8202
+ const variant = React8.useContext(AccordionVariantContext);
8095
8203
  return /* @__PURE__ */ jsx(Accordion$1.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
8096
8204
  Accordion$1.Trigger,
8097
8205
  __spreadProps(__spreadValues({
@@ -8145,7 +8253,7 @@ function AccordionContent(_a) {
8145
8253
  "className",
8146
8254
  "children"
8147
8255
  ]);
8148
- const variant = React25.useContext(AccordionVariantContext);
8256
+ const variant = React8.useContext(AccordionVariantContext);
8149
8257
  return /* @__PURE__ */ jsx(
8150
8258
  Accordion$1.Panel,
8151
8259
  __spreadProps(__spreadValues({
@@ -8177,7 +8285,7 @@ function FilterPanel({
8177
8285
  title = "Filters",
8178
8286
  className
8179
8287
  }) {
8180
- const [internalValue, setInternalValue] = React25.useState(
8288
+ const [internalValue, setInternalValue] = React8.useState(
8181
8289
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
8182
8290
  );
8183
8291
  const selected = value != null ? value : internalValue;
@@ -8276,8 +8384,8 @@ function FilterPanel({
8276
8384
  var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
8277
8385
  function TrustpilotEmbed({ config }) {
8278
8386
  var _a, _b, _c, _d, _e, _f;
8279
- const ref = React25.useRef(null);
8280
- React25.useEffect(() => {
8387
+ const ref = React8.useRef(null);
8388
+ React8.useEffect(() => {
8281
8389
  if (typeof document === "undefined" || !ref.current) return;
8282
8390
  let cancelled = false;
8283
8391
  const initWidget = () => {
@@ -8409,11 +8517,11 @@ function ItineraryModal({
8409
8517
  onNext
8410
8518
  }) {
8411
8519
  var _a, _b, _c;
8412
- const [imgIndex, setImgIndex] = React25.useState(0);
8520
+ const [imgIndex, setImgIndex] = React8.useState(0);
8413
8521
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
8414
8522
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
8415
8523
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
8416
- React25.useEffect(() => {
8524
+ React8.useEffect(() => {
8417
8525
  setImgIndex(0);
8418
8526
  }, [stop == null ? void 0 : stop.dayNumber]);
8419
8527
  if (!stop) return null;
@@ -8540,8 +8648,8 @@ function ItineraryModal({
8540
8648
  ) });
8541
8649
  }
8542
8650
  function Itinerary({ title, subtitle, stops, className }) {
8543
- const [activeIndex, setActiveIndex] = React25.useState(null);
8544
- const scrollRef = React25.useRef(null);
8651
+ const [activeIndex, setActiveIndex] = React8.useState(null);
8652
+ const scrollRef = React8.useRef(null);
8545
8653
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
8546
8654
  const scrollBy = (dir) => {
8547
8655
  if (!scrollRef.current) return;
@@ -8633,18 +8741,18 @@ function Lightbox({
8633
8741
  onClose
8634
8742
  }) {
8635
8743
  var _a;
8636
- const [index, setIndex] = React25.useState(initialIndex);
8744
+ const [index, setIndex] = React8.useState(initialIndex);
8637
8745
  const total = photos.length;
8638
8746
  const photo = photos[index];
8639
- const prev = React25.useCallback(
8747
+ const prev = React8.useCallback(
8640
8748
  () => setIndex((i) => (i - 1 + total) % total),
8641
8749
  [total]
8642
8750
  );
8643
- const next = React25.useCallback(
8751
+ const next = React8.useCallback(
8644
8752
  () => setIndex((i) => (i + 1) % total),
8645
8753
  [total]
8646
8754
  );
8647
- React25.useEffect(() => {
8755
+ React8.useEffect(() => {
8648
8756
  const onKey = (e) => {
8649
8757
  if (e.key === "Escape") onClose();
8650
8758
  if (e.key === "ArrowLeft") prev();
@@ -8810,7 +8918,7 @@ function GridGallery({
8810
8918
  initialVisible,
8811
8919
  onOpen
8812
8920
  }) {
8813
- const [expanded, setExpanded] = React25.useState(false);
8921
+ const [expanded, setExpanded] = React8.useState(false);
8814
8922
  const cols = gridCols(photos.length);
8815
8923
  const hasMore = photos.length > initialVisible;
8816
8924
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -8840,7 +8948,7 @@ function MasonryGallery({
8840
8948
  initialVisible,
8841
8949
  onOpen
8842
8950
  }) {
8843
- const [expanded, setExpanded] = React25.useState(false);
8951
+ const [expanded, setExpanded] = React8.useState(false);
8844
8952
  const hasMore = photos.length > initialVisible;
8845
8953
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
8846
8954
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -8913,7 +9021,7 @@ function FeaturedGallery({
8913
9021
  photos,
8914
9022
  onOpen
8915
9023
  }) {
8916
- const [expanded, setExpanded] = React25.useState(false);
9024
+ const [expanded, setExpanded] = React8.useState(false);
8917
9025
  const featured = photos.slice(0, 3);
8918
9026
  const extra = photos.slice(3);
8919
9027
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -9080,9 +9188,9 @@ function PhotoGallery({
9080
9188
  onPhotoClick,
9081
9189
  className
9082
9190
  }) {
9083
- const [lightboxIndex, setLightboxIndex] = React25.useState(null);
9084
- const [carouselIndex, setCarouselIndex] = React25.useState(0);
9085
- const normalised = React25.useMemo(() => photos.map(normalise), [photos]);
9191
+ const [lightboxIndex, setLightboxIndex] = React8.useState(null);
9192
+ const [carouselIndex, setCarouselIndex] = React8.useState(0);
9193
+ const normalised = React8.useMemo(() => photos.map(normalise), [photos]);
9086
9194
  const handleOpen = (index) => {
9087
9195
  setLightboxIndex(index);
9088
9196
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
@@ -9158,7 +9266,7 @@ function ItineraryDay({
9158
9266
  photoLayout = "rounded",
9159
9267
  className
9160
9268
  }) {
9161
- const photoList = React25.useMemo(() => normalisePhotos(photos), [photos]);
9269
+ const photoList = React8.useMemo(() => normalisePhotos(photos), [photos]);
9162
9270
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
9163
9271
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
9164
9272
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsx(
@@ -9210,8 +9318,8 @@ function MenuTrip({
9210
9318
  bold = true,
9211
9319
  className
9212
9320
  }) {
9213
- const scrollRef = React25.useRef(null);
9214
- React25.useEffect(() => {
9321
+ const scrollRef = React8.useRef(null);
9322
+ React8.useEffect(() => {
9215
9323
  if (!scrollRef.current || !activeSection) return;
9216
9324
  const container = scrollRef.current;
9217
9325
  const btn = container.querySelector(
@@ -9402,8 +9510,8 @@ function PricingTrip({
9402
9510
  className
9403
9511
  }) {
9404
9512
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
9405
- const [showEstimates, setShowEstimates] = React25.useState(false);
9406
- const [showPriceInfo, setShowPriceInfo] = React25.useState(false);
9513
+ const [showEstimates, setShowEstimates] = React8.useState(false);
9514
+ const [showPriceInfo, setShowPriceInfo] = React8.useState(false);
9407
9515
  if (variant === "compact") {
9408
9516
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
9409
9517
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -9843,14 +9951,14 @@ function SiteHeader({
9843
9951
  className
9844
9952
  }) {
9845
9953
  const t = VARIANT[variant];
9846
- const [openMenu, setOpenMenu] = React25.useState(null);
9847
- const [langOpen, setLangOpen] = React25.useState(false);
9848
- const [mobileOpen, setMobileOpen] = React25.useState(false);
9849
- const [openMobileSection, setOpenMobileSection] = React25.useState(null);
9850
- const [activeLang, setActiveLang] = React25.useState(currentLanguage);
9954
+ const [openMenu, setOpenMenu] = React8.useState(null);
9955
+ const [langOpen, setLangOpen] = React8.useState(false);
9956
+ const [mobileOpen, setMobileOpen] = React8.useState(false);
9957
+ const [openMobileSection, setOpenMobileSection] = React8.useState(null);
9958
+ const [activeLang, setActiveLang] = React8.useState(currentLanguage);
9851
9959
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
9852
- const menuCloseTimer = React25.useRef(void 0);
9853
- const langCloseTimer = React25.useRef(void 0);
9960
+ const menuCloseTimer = React8.useRef(void 0);
9961
+ const langCloseTimer = React8.useRef(void 0);
9854
9962
  const handleMenuEnter = (label) => {
9855
9963
  clearTimeout(menuCloseTimer.current);
9856
9964
  setOpenMenu(label);
@@ -9871,7 +9979,7 @@ function SiteHeader({
9871
9979
  setOpenMenu(null);
9872
9980
  setLangOpen(false);
9873
9981
  };
9874
- React25.useEffect(() => () => {
9982
+ React8.useEffect(() => () => {
9875
9983
  clearTimeout(menuCloseTimer.current);
9876
9984
  clearTimeout(langCloseTimer.current);
9877
9985
  }, []);
@@ -10136,7 +10244,7 @@ function SiteHeader({
10136
10244
  ), children: [
10137
10245
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
10138
10246
  const isActive = lang.code === activeLang;
10139
- return /* @__PURE__ */ jsxs(React25.Fragment, { children: [
10247
+ return /* @__PURE__ */ jsxs(React8.Fragment, { children: [
10140
10248
  i > 0 && /* @__PURE__ */ jsx("span", { className: cn(
10141
10249
  "text-xs select-none",
10142
10250
  variant === "white" ? "text-border" : "text-white/15"
@@ -10198,8 +10306,8 @@ function SiteHeader({
10198
10306
  );
10199
10307
  }
10200
10308
  function ThemeToggle({ className }) {
10201
- const [dark, setDark] = React25.useState(false);
10202
- React25.useEffect(() => {
10309
+ const [dark, setDark] = React8.useState(false);
10310
+ React8.useEffect(() => {
10203
10311
  const saved = localStorage.getItem("theme");
10204
10312
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
10205
10313
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -10350,7 +10458,7 @@ function TripCard({
10350
10458
  );
10351
10459
  }
10352
10460
  function useHlsVideo(videoRef, src) {
10353
- React25.useEffect(() => {
10461
+ React8.useEffect(() => {
10354
10462
  if (!src || !videoRef.current) return;
10355
10463
  const video = videoRef.current;
10356
10464
  if (!src.includes(".m3u8")) return;
@@ -10393,11 +10501,11 @@ function TripHeader({
10393
10501
  className
10394
10502
  }) {
10395
10503
  var _a;
10396
- const [heroIndex, setHeroIndex] = React25.useState(0);
10397
- const [videoReady, setVideoReady] = React25.useState(false);
10398
- const videoRef = React25.useRef(null);
10504
+ const [heroIndex, setHeroIndex] = React8.useState(0);
10505
+ const [videoReady, setVideoReady] = React8.useState(false);
10506
+ const videoRef = React8.useRef(null);
10399
10507
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
10400
- const validImages = React25.useMemo(
10508
+ const validImages = React8.useMemo(
10401
10509
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
10402
10510
  [images]
10403
10511
  );
@@ -10412,7 +10520,7 @@ function TripHeader({
10412
10520
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
10413
10521
  const hasMeta = !!(destination || duration);
10414
10522
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
10415
- React25.useEffect(() => {
10523
+ React8.useEffect(() => {
10416
10524
  if (!videoUrl) return;
10417
10525
  const el = videoRef.current;
10418
10526
  if (!el) return;
@@ -10554,7 +10662,7 @@ function TripHeader({
10554
10662
  siteHeader ? "-mt-44" : "-mt-36"
10555
10663
  ),
10556
10664
  children: [
10557
- breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(React25.Fragment, { children: [
10665
+ breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(React8.Fragment, { children: [
10558
10666
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
10559
10667
  /* @__PURE__ */ jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
10560
10668
  ] }, i)) }),
@@ -10670,9 +10778,9 @@ function TripPage({
10670
10778
  features,
10671
10779
  className
10672
10780
  }) {
10673
- const [activeSection, setActiveSection] = React25.useState("");
10674
- const [accordionValue, setAccordionValue] = React25.useState([]);
10675
- const accordionSectionIds = React25.useMemo(
10781
+ const [activeSection, setActiveSection] = React8.useState("");
10782
+ const [accordionValue, setAccordionValue] = React8.useState([]);
10783
+ const accordionSectionIds = React8.useMemo(
10676
10784
  () => /* @__PURE__ */ new Set([
10677
10785
  "key-info",
10678
10786
  "what-to-bring",
@@ -10685,18 +10793,18 @@ function TripPage({
10685
10793
  ]),
10686
10794
  []
10687
10795
  );
10688
- const [navFloating, setNavFloating] = React25.useState(false);
10689
- const [navHidden, setNavHidden] = React25.useState(false);
10690
- const [isFloating, setIsFloating] = React25.useState(false);
10691
- const [sidebarPos, setSidebarPos] = React25.useState(null);
10692
- const [pricingBarVisible, setPricingBarVisible] = React25.useState(false);
10693
- const navRef = React25.useRef(null);
10694
- const navSentinelRef = React25.useRef(null);
10695
- const sentinelRef = React25.useRef(null);
10696
- const sidebarPlaceholderRef = React25.useRef(null);
10697
- const pricingBarRef = React25.useRef(null);
10698
- const galleryRef = React25.useRef(null);
10699
- const sections = React25.useMemo(
10796
+ const [navFloating, setNavFloating] = React8.useState(false);
10797
+ const [navHidden, setNavHidden] = React8.useState(false);
10798
+ const [isFloating, setIsFloating] = React8.useState(false);
10799
+ const [sidebarPos, setSidebarPos] = React8.useState(null);
10800
+ const [pricingBarVisible, setPricingBarVisible] = React8.useState(false);
10801
+ const navRef = React8.useRef(null);
10802
+ const navSentinelRef = React8.useRef(null);
10803
+ const sentinelRef = React8.useRef(null);
10804
+ const sidebarPlaceholderRef = React8.useRef(null);
10805
+ const pricingBarRef = React8.useRef(null);
10806
+ const galleryRef = React8.useRef(null);
10807
+ const sections = React8.useMemo(
10700
10808
  () => [
10701
10809
  { id: "overview", label: "Overview", show: !!(overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) },
10702
10810
  {
@@ -10714,7 +10822,7 @@ function TripPage({
10714
10822
  // eslint-disable-next-line react-hooks/exhaustive-deps
10715
10823
  []
10716
10824
  );
10717
- React25.useEffect(() => {
10825
+ React8.useEffect(() => {
10718
10826
  const sentinel = navSentinelRef.current;
10719
10827
  if (!sentinel) return;
10720
10828
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -10722,7 +10830,7 @@ function TripPage({
10722
10830
  update();
10723
10831
  return () => document.removeEventListener("scroll", update, { capture: true });
10724
10832
  }, []);
10725
- React25.useEffect(() => {
10833
+ React8.useEffect(() => {
10726
10834
  const sentinel = sentinelRef.current;
10727
10835
  if (!sentinel) return;
10728
10836
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -10730,7 +10838,7 @@ function TripPage({
10730
10838
  update();
10731
10839
  return () => document.removeEventListener("scroll", update, { capture: true });
10732
10840
  }, []);
10733
- React25.useEffect(() => {
10841
+ React8.useEffect(() => {
10734
10842
  const measure = () => {
10735
10843
  if (!sidebarPlaceholderRef.current) return;
10736
10844
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -10740,7 +10848,7 @@ function TripPage({
10740
10848
  window.addEventListener("resize", measure);
10741
10849
  return () => window.removeEventListener("resize", measure);
10742
10850
  }, [isFloating]);
10743
- React25.useEffect(() => {
10851
+ React8.useEffect(() => {
10744
10852
  const check = () => {
10745
10853
  var _a;
10746
10854
  const target = (_a = galleryRef.current) != null ? _a : pricingBarRef.current;
@@ -10751,7 +10859,7 @@ function TripPage({
10751
10859
  check();
10752
10860
  return () => document.removeEventListener("scroll", check, { capture: true });
10753
10861
  }, []);
10754
- React25.useEffect(() => {
10862
+ React8.useEffect(() => {
10755
10863
  const check = () => {
10756
10864
  if (!pricingBarRef.current) return;
10757
10865
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -10760,7 +10868,7 @@ function TripPage({
10760
10868
  check();
10761
10869
  return () => document.removeEventListener("scroll", check, { capture: true });
10762
10870
  }, []);
10763
- React25.useEffect(() => {
10871
+ React8.useEffect(() => {
10764
10872
  if (sections.length === 0) return;
10765
10873
  setActiveSection(sections[0].id);
10766
10874
  const update = () => {
@@ -11282,12 +11390,12 @@ function Toast({
11282
11390
  duration = 6e3,
11283
11391
  className
11284
11392
  }) {
11285
- const [mounted, setMounted] = React25.useState(false);
11286
- const [visible, setVisible] = React25.useState(true);
11287
- React25.useEffect(() => {
11393
+ const [mounted, setMounted] = React8.useState(false);
11394
+ const [visible, setVisible] = React8.useState(true);
11395
+ React8.useEffect(() => {
11288
11396
  setMounted(true);
11289
11397
  }, []);
11290
- React25.useEffect(() => {
11398
+ React8.useEffect(() => {
11291
11399
  if (duration === 0) return;
11292
11400
  const t = setTimeout(() => {
11293
11401
  setVisible(false);