@planetaexo/design-system 0.62.1 → 0.64.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 React31 from 'react';
1
+ import * as React32 from 'react';
2
2
  import { useState, useRef, useCallback, useEffect, useId } 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 = React31.forwardRef(
84
+ var Button = React32.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(
@@ -310,10 +310,10 @@ function DialogDescription(_a) {
310
310
  }, props)
311
311
  );
312
312
  }
313
- var FloatingInput = React31.forwardRef(
313
+ var FloatingInput = React32.forwardRef(
314
314
  (_a, ref) => {
315
315
  var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
316
- const inputId = id != null ? id : React31.useId();
316
+ const inputId = id != null ? id : React32.useId();
317
317
  return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
318
318
  /* @__PURE__ */ jsx(
319
319
  "input",
@@ -353,10 +353,10 @@ var FloatingInput = React31.forwardRef(
353
353
  }
354
354
  );
355
355
  FloatingInput.displayName = "FloatingInput";
356
- var FloatingSelect = React31.forwardRef(
356
+ var FloatingSelect = React32.forwardRef(
357
357
  (_a, ref) => {
358
358
  var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
359
- const inputId = id != null ? id : React31.useId();
359
+ const inputId = id != null ? id : React32.useId();
360
360
  const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
361
361
  return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
362
362
  /* @__PURE__ */ jsx(
@@ -620,11 +620,11 @@ function PhoneCountrySelect({
620
620
  disabled
621
621
  }) {
622
622
  var _a;
623
- const [open, setOpen] = React31.useState(false);
624
- const containerRef = React31.useRef(null);
625
- const listRef = React31.useRef(null);
623
+ const [open, setOpen] = React32.useState(false);
624
+ const containerRef = React32.useRef(null);
625
+ const listRef = React32.useRef(null);
626
626
  const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
627
- React31.useEffect(() => {
627
+ React32.useEffect(() => {
628
628
  if (!open) return;
629
629
  const handler = (e) => {
630
630
  var _a2;
@@ -635,7 +635,7 @@ function PhoneCountrySelect({
635
635
  document.addEventListener("mousedown", handler);
636
636
  return () => document.removeEventListener("mousedown", handler);
637
637
  }, [open]);
638
- React31.useEffect(() => {
638
+ React32.useEffect(() => {
639
639
  if (!open || !listRef.current) return;
640
640
  const activeEl = listRef.current.querySelector("[data-selected=true]");
641
641
  activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
@@ -905,8 +905,8 @@ function CalendarDayButton(_a) {
905
905
  "locale"
906
906
  ]);
907
907
  const defaultClassNames = getDefaultClassNames();
908
- const ref = React31.useRef(null);
909
- React31.useEffect(() => {
908
+ const ref = React32.useRef(null);
909
+ React32.useEffect(() => {
910
910
  var _a2;
911
911
  if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
912
912
  }, [modifiers.focused]);
@@ -937,16 +937,16 @@ function BirthDateField({
937
937
  className,
938
938
  disabled
939
939
  }) {
940
- const [open, setOpen] = React31.useState(false);
941
- const [text, setText] = React31.useState(
940
+ const [open, setOpen] = React32.useState(false);
941
+ const [text, setText] = React32.useState(
942
942
  value ? format(value, "dd/MM/yyyy") : ""
943
943
  );
944
- const containerRef = React31.useRef(null);
945
- const inputId = React31.useId();
946
- React31.useEffect(() => {
944
+ const containerRef = React32.useRef(null);
945
+ const inputId = React32.useId();
946
+ React32.useEffect(() => {
947
947
  setText(value ? format(value, "dd/MM/yyyy") : "");
948
948
  }, [value]);
949
- React31.useEffect(() => {
949
+ React32.useEffect(() => {
950
950
  if (!open) return;
951
951
  const handler = (e) => {
952
952
  var _a;
@@ -1155,14 +1155,14 @@ function CountrySearchField({
1155
1155
  }) {
1156
1156
  var _a;
1157
1157
  const list = countries != null ? countries : COUNTRIES;
1158
- const [query, setQuery] = React31.useState("");
1159
- const [open, setOpen] = React31.useState(false);
1160
- const containerRef = React31.useRef(null);
1161
- const searchRef = React31.useRef(null);
1158
+ const [query, setQuery] = React32.useState("");
1159
+ const [open, setOpen] = React32.useState(false);
1160
+ const containerRef = React32.useRef(null);
1161
+ const searchRef = React32.useRef(null);
1162
1162
  const selected = list.find((c) => c.code === value);
1163
1163
  const isFloated = open || !!selected;
1164
1164
  const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
1165
- React31.useEffect(() => {
1165
+ React32.useEffect(() => {
1166
1166
  if (!open) return;
1167
1167
  const handler = (e) => {
1168
1168
  var _a2;
@@ -1307,10 +1307,10 @@ function AdventureCard({
1307
1307
  }) {
1308
1308
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
1309
1309
  const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
1310
- const [checkedInternal, setCheckedInternal] = React31.useState(
1310
+ const [checkedInternal, setCheckedInternal] = React32.useState(
1311
1311
  new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
1312
1312
  );
1313
- const [openDescriptionId, setOpenDescriptionId] = React31.useState(null);
1313
+ const [openDescriptionId, setOpenDescriptionId] = React32.useState(null);
1314
1314
  const openDescriptionOptional = openDescriptionId ? (_e = adventure.optionals) == null ? void 0 : _e.find((o) => o.id === openDescriptionId) : void 0;
1315
1315
  const isChecked = (opt) => {
1316
1316
  var _a2;
@@ -1766,7 +1766,7 @@ function BookingShell({
1766
1766
  return /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
1767
1767
  /* @__PURE__ */ jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
1768
1768
  /* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
1769
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(React31.Fragment, { children: [
1769
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
1770
1770
  /* @__PURE__ */ jsx(
1771
1771
  "span",
1772
1772
  {
@@ -1965,7 +1965,7 @@ function TermsSection({
1965
1965
  termsContent
1966
1966
  }) {
1967
1967
  var _a;
1968
- const [modalOpen, setModalOpen] = React31.useState(false);
1968
+ const [modalOpen, setModalOpen] = React32.useState(false);
1969
1969
  const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
1970
1970
  return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
1971
1971
  /* @__PURE__ */ jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
@@ -2103,9 +2103,9 @@ function BookingWizard({
2103
2103
  }) {
2104
2104
  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;
2105
2105
  const wizardSteps = WIZARD_STEPS_FN(labels);
2106
- const [step, setStep] = React31.useState("responsible");
2107
- const [error, setError] = React31.useState(null);
2108
- const [responsible, setResponsible] = React31.useState({
2106
+ const [step, setStep] = React32.useState("responsible");
2107
+ const [error, setError] = React32.useState(null);
2108
+ const [responsible, setResponsible] = React32.useState({
2109
2109
  firstName: "",
2110
2110
  lastName: "",
2111
2111
  email: "",
@@ -2124,7 +2124,7 @@ function BookingWizard({
2124
2124
  return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
2125
2125
  }, 0);
2126
2126
  const totalPax = totalAdults + totalChildren;
2127
- const [travellers, setTravellers] = React31.useState(
2127
+ const [travellers, setTravellers] = React32.useState(
2128
2128
  Array.from({ length: Math.max(totalPax, 1) }, () => ({
2129
2129
  firstName: "",
2130
2130
  lastName: "",
@@ -2132,9 +2132,9 @@ function BookingWizard({
2132
2132
  email: ""
2133
2133
  }))
2134
2134
  );
2135
- const [payAmount, setPayAmount] = React31.useState("full");
2136
- const [payMethod, setPayMethod] = React31.useState("stripe");
2137
- const [termsAccepted, setTermsAccepted] = React31.useState(false);
2135
+ const [payAmount, setPayAmount] = React32.useState("full");
2136
+ const [payMethod, setPayMethod] = React32.useState("stripe");
2137
+ const [termsAccepted, setTermsAccepted] = React32.useState(false);
2138
2138
  const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
2139
2139
  const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
2140
2140
  const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
@@ -2362,7 +2362,7 @@ function Offer({
2362
2362
  className
2363
2363
  }) {
2364
2364
  var _a, _b, _c;
2365
- const [showBooking, setShowBooking] = React31.useState(false);
2365
+ const [showBooking, setShowBooking] = React32.useState(false);
2366
2366
  const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
2367
2367
  const handleBook = () => {
2368
2368
  if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
@@ -2729,7 +2729,7 @@ function AdventureSection({
2729
2729
  labels
2730
2730
  }) {
2731
2731
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
2732
- const [detailsOpen, setDetailsOpen] = React31.useState(false);
2732
+ const [detailsOpen, setDetailsOpen] = React32.useState(false);
2733
2733
  const handleCopyUrl = (url) => {
2734
2734
  if (onCopyFormLink) {
2735
2735
  onCopyFormLink(url);
@@ -3268,8 +3268,8 @@ function AddTravellerDialog({
3268
3268
  errorMessage
3269
3269
  }) {
3270
3270
  var _a, _b, _c, _d, _e;
3271
- const [form, setForm] = React31.useState(() => createInitialAddFormData(config));
3272
- React31.useEffect(() => {
3271
+ const [form, setForm] = React32.useState(() => createInitialAddFormData(config));
3272
+ React32.useEffect(() => {
3273
3273
  if (open) {
3274
3274
  setForm(createInitialAddFormData(config));
3275
3275
  }
@@ -3329,7 +3329,7 @@ function EditTravellerDialog({
3329
3329
  errorMessage
3330
3330
  }) {
3331
3331
  var _a, _b, _c, _d, _e;
3332
- const [form, setForm] = React31.useState(() => ({
3332
+ const [form, setForm] = React32.useState(() => ({
3333
3333
  firstName: "",
3334
3334
  lastName: "",
3335
3335
  email: "",
@@ -3338,7 +3338,7 @@ function EditTravellerDialog({
3338
3338
  birthDate: "",
3339
3339
  personType: "ADULT"
3340
3340
  }));
3341
- React31.useEffect(() => {
3341
+ React32.useEffect(() => {
3342
3342
  var _a2, _b2, _c2, _d2, _e2, _f;
3343
3343
  if (open && traveller) {
3344
3344
  setForm({
@@ -3674,48 +3674,48 @@ function BookingDetails({
3674
3674
  const hasSubmitAddTraveller = !!onSubmitAddTraveller;
3675
3675
  const hasSubmitEditTraveller = !!onSubmitEditTraveller;
3676
3676
  const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
3677
- const [addModalState, setAddModalState] = React31.useState({
3677
+ const [addModalState, setAddModalState] = React32.useState({
3678
3678
  open: false,
3679
3679
  adventureId: null
3680
3680
  });
3681
- const [editModalState, setEditModalState] = React31.useState({ open: false, adventureId: null, traveller: null });
3682
- const [deleteModalState, setDeleteModalState] = React31.useState({ open: false, adventureId: null, traveller: null });
3683
- const [resendInviteDialogState, setResendInviteDialogState] = React31.useState({ open: false, traveller: null });
3684
- const handleRequestOpenAddModal = React31.useCallback((adventureId) => {
3681
+ const [editModalState, setEditModalState] = React32.useState({ open: false, adventureId: null, traveller: null });
3682
+ const [deleteModalState, setDeleteModalState] = React32.useState({ open: false, adventureId: null, traveller: null });
3683
+ const [resendInviteDialogState, setResendInviteDialogState] = React32.useState({ open: false, traveller: null });
3684
+ const handleRequestOpenAddModal = React32.useCallback((adventureId) => {
3685
3685
  setAddModalState({ open: true, adventureId });
3686
3686
  }, []);
3687
- const handleRequestOpenEditModal = React31.useCallback(
3687
+ const handleRequestOpenEditModal = React32.useCallback(
3688
3688
  (adventureId, traveller) => {
3689
3689
  setEditModalState({ open: true, adventureId, traveller });
3690
3690
  },
3691
3691
  []
3692
3692
  );
3693
- const handleRequestOpenDeleteModal = React31.useCallback(
3693
+ const handleRequestOpenDeleteModal = React32.useCallback(
3694
3694
  (adventureId, traveller) => {
3695
3695
  setDeleteModalState({ open: true, adventureId, traveller });
3696
3696
  },
3697
3697
  []
3698
3698
  );
3699
- const handleRequestOpenResendInviteDialog = React31.useCallback(
3699
+ const handleRequestOpenResendInviteDialog = React32.useCallback(
3700
3700
  (traveller) => {
3701
3701
  setResendInviteDialogState({ open: true, traveller });
3702
3702
  },
3703
3703
  []
3704
3704
  );
3705
- const closeAddModal = React31.useCallback(() => {
3705
+ const closeAddModal = React32.useCallback(() => {
3706
3706
  setAddModalState({ open: false, adventureId: null });
3707
3707
  }, []);
3708
- const closeEditModal = React31.useCallback(() => {
3708
+ const closeEditModal = React32.useCallback(() => {
3709
3709
  setEditModalState({ open: false, adventureId: null, traveller: null });
3710
3710
  }, []);
3711
- const closeDeleteModal = React31.useCallback(() => {
3711
+ const closeDeleteModal = React32.useCallback(() => {
3712
3712
  setDeleteModalState({ open: false, adventureId: null, traveller: null });
3713
3713
  }, []);
3714
- const closeResendInviteDialog = React31.useCallback(() => {
3714
+ const closeResendInviteDialog = React32.useCallback(() => {
3715
3715
  setResendInviteDialogState({ open: false, traveller: null });
3716
3716
  }, []);
3717
- const submitInFlightRef = React31.useRef(false);
3718
- const handleAddSubmit = React31.useCallback(
3717
+ const submitInFlightRef = React32.useRef(false);
3718
+ const handleAddSubmit = React32.useCallback(
3719
3719
  async (adventureId, data) => {
3720
3720
  if (!onSubmitAddTraveller) return;
3721
3721
  if (submitInFlightRef.current) return;
@@ -3730,7 +3730,7 @@ function BookingDetails({
3730
3730
  },
3731
3731
  [onSubmitAddTraveller, closeAddModal]
3732
3732
  );
3733
- const handleEditSubmit = React31.useCallback(
3733
+ const handleEditSubmit = React32.useCallback(
3734
3734
  async (adventureId, travellerId, data) => {
3735
3735
  if (!onSubmitEditTraveller) return;
3736
3736
  if (submitInFlightRef.current) return;
@@ -3745,7 +3745,7 @@ function BookingDetails({
3745
3745
  },
3746
3746
  [onSubmitEditTraveller, closeEditModal]
3747
3747
  );
3748
- const handleDeleteConfirm = React31.useCallback(
3748
+ const handleDeleteConfirm = React32.useCallback(
3749
3749
  async (adventureId, travellerId) => {
3750
3750
  if (!onConfirmRemoveTraveller) return;
3751
3751
  if (submitInFlightRef.current) return;
@@ -4146,6 +4146,7 @@ function BookingAdventureCard({
4146
4146
  imageAlt,
4147
4147
  location,
4148
4148
  destination,
4149
+ partner,
4149
4150
  included,
4150
4151
  notIncluded,
4151
4152
  lineItems,
@@ -4404,6 +4405,39 @@ function BookingAdventureCard({
4404
4405
  ] }) })
4405
4406
  }
4406
4407
  ),
4408
+ partner && /* @__PURE__ */ jsx(
4409
+ "table",
4410
+ {
4411
+ cellPadding: 0,
4412
+ cellSpacing: 0,
4413
+ style: { borderCollapse: "collapse", marginBottom: "10px" },
4414
+ children: /* @__PURE__ */ jsx("tbody", { children: /* @__PURE__ */ jsxs("tr", { children: [
4415
+ /* @__PURE__ */ jsx(
4416
+ "td",
4417
+ {
4418
+ style: {
4419
+ verticalAlign: "middle",
4420
+ paddingRight: "6px",
4421
+ width: "16px"
4422
+ },
4423
+ children: /* @__PURE__ */ jsx("span", { style: { display: "inline-block", fontSize: "14px", lineHeight: "1" }, children: "\u{1F91D}" })
4424
+ }
4425
+ ),
4426
+ /* @__PURE__ */ jsx(
4427
+ "td",
4428
+ {
4429
+ style: {
4430
+ verticalAlign: "middle",
4431
+ fontSize: "14px",
4432
+ color: emailTokens.mutedForeground,
4433
+ lineHeight: "1"
4434
+ },
4435
+ children: partner
4436
+ }
4437
+ )
4438
+ ] }) })
4439
+ }
4440
+ ),
4407
4441
  hasTravellers && /* @__PURE__ */ jsxs("div", { style: { marginTop: "4px" }, children: [
4408
4442
  /* @__PURE__ */ jsx(
4409
4443
  "hr",
@@ -5280,6 +5314,7 @@ function BookingPaymentConfirmationEmail({
5280
5314
  imageAlt: adventure.imageAlt,
5281
5315
  location: locationToPass,
5282
5316
  destination: destinationToPass,
5317
+ partner: adventure.partnerName,
5283
5318
  included: adventure.included,
5284
5319
  notIncluded: adventure.notIncluded,
5285
5320
  lineItems: lineItemsToPass,
@@ -5507,7 +5542,7 @@ function BookingCreatedEmail({
5507
5542
  }, children: i + 1 }) }),
5508
5543
  /* @__PURE__ */ jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
5509
5544
  ] }) }) }, i)) }),
5510
- 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(React31.Fragment, { children: [
5545
+ 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(React32.Fragment, { children: [
5511
5546
  idx === 0 ? /* @__PURE__ */ jsx("strong", { children: line }) : line,
5512
5547
  idx < arr.length - 1 ? /* @__PURE__ */ jsx("br", {}) : null
5513
5548
  ] }, idx)) })
@@ -6443,6 +6478,8 @@ var DEFAULT_LABELS8 = {
6443
6478
  adventureLabel: "Adventure",
6444
6479
  datesLabel: "Dates",
6445
6480
  partnerLabel: "Partner",
6481
+ bookingPersonLabel: "Booking person",
6482
+ passportLabel: "Passport",
6446
6483
  expectationsHeading: "Travellers Expectations",
6447
6484
  expectationsEmptyNote: "No expectations were collected for this adventure.",
6448
6485
  expectationsEmptyAnswer: "\u2014",
@@ -6470,6 +6507,8 @@ function PartnerRegistrationCompleteEmail({
6470
6507
  bookingNumber,
6471
6508
  adventureName,
6472
6509
  dateRange,
6510
+ bookingPersonName,
6511
+ bookingPersonPassport,
6473
6512
  travellersCount,
6474
6513
  expectations,
6475
6514
  pdfAttached,
@@ -6483,7 +6522,9 @@ function PartnerRegistrationCompleteEmail({
6483
6522
  { label: l.bookingNumberLabel, value: `#${bookingNumber}`, valueColor: emailTokens.primary },
6484
6523
  { label: l.adventureLabel, value: adventureName },
6485
6524
  { label: l.datesLabel, value: dateRange },
6486
- { label: l.partnerLabel, value: partnerName }
6525
+ { label: l.partnerLabel, value: partnerName },
6526
+ ...hasText4(bookingPersonName) ? [{ label: l.bookingPersonLabel, value: bookingPersonName }] : [],
6527
+ ...hasText4(bookingPersonPassport) ? [{ label: l.passportLabel, value: bookingPersonPassport }] : []
6487
6528
  ];
6488
6529
  const sectionDivider = /* @__PURE__ */ jsx(
6489
6530
  "hr",
@@ -6799,6 +6840,7 @@ var DEFAULT_LABELS10 = {
6799
6840
  interestSurchargeLabel: "Interest / surcharge",
6800
6841
  statusLabel: "Status",
6801
6842
  travellersLabel: "Travellers",
6843
+ passportLabel: "Passport",
6802
6844
  summaryHeading: "Booking summary",
6803
6845
  totalOrderLabel: "Total order",
6804
6846
  totalPaidLabel: "Total paid",
@@ -6817,6 +6859,7 @@ function PaymentReceiptEmail({
6817
6859
  chargedAmount,
6818
6860
  statusLabel,
6819
6861
  travellers,
6862
+ passport,
6820
6863
  totalOrderAmount,
6821
6864
  totalPaidCumulative,
6822
6865
  remainingBalance,
@@ -6837,7 +6880,8 @@ function PaymentReceiptEmail({
6837
6880
  { label: l.amountLabel, value: amount },
6838
6881
  ...interestRow ? [{ label: l.chargedAmountLabel, value: chargedAmount }] : [],
6839
6882
  { label: l.statusLabel, value: statusLabel },
6840
- ...travellersLine.length > 0 ? [{ label: l.travellersLabel, value: travellersLine }] : []
6883
+ ...travellersLine.length > 0 ? [{ label: l.travellersLabel, value: travellersLine }] : [],
6884
+ ...passport && passport.trim().length > 0 ? [{ label: l.passportLabel, value: passport.trim() }] : []
6841
6885
  ];
6842
6886
  const summaryRows = [
6843
6887
  { label: l.totalOrderLabel, value: totalOrderAmount },
@@ -7867,11 +7911,11 @@ function DatePickerField({
7867
7911
  fromDate,
7868
7912
  className
7869
7913
  }) {
7870
- const [open, setOpen] = React31.useState(false);
7871
- const containerRef = React31.useRef(null);
7872
- const [calendarWidth, setCalendarWidth] = React31.useState();
7914
+ const [open, setOpen] = React32.useState(false);
7915
+ const containerRef = React32.useRef(null);
7916
+ const [calendarWidth, setCalendarWidth] = React32.useState();
7873
7917
  const hasValue = !!value;
7874
- React31.useEffect(() => {
7918
+ React32.useEffect(() => {
7875
7919
  if (!containerRef.current) return;
7876
7920
  const observer = new ResizeObserver(([entry]) => {
7877
7921
  setCalendarWidth(entry.contentRect.width);
@@ -7980,7 +8024,7 @@ function BookingForm({
7980
8024
  subtitle = "Free enquiry \u2013 no commitment",
7981
8025
  className
7982
8026
  }) {
7983
- const [values, setValues] = React31.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8027
+ const [values, setValues] = React32.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
7984
8028
  const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
7985
8029
  const handleSubmit = (e) => {
7986
8030
  e.preventDefault();
@@ -8548,11 +8592,11 @@ function FloatingTextarea({
8548
8592
  }
8549
8593
  function SelectField({ field, value, onChange, error, disabled }) {
8550
8594
  var _a, _b, _c;
8551
- const [open, setOpen] = React31.useState(false);
8552
- const containerRef = React31.useRef(null);
8595
+ const [open, setOpen] = React32.useState(false);
8596
+ const containerRef = React32.useRef(null);
8553
8597
  const options = (_a = field.options) != null ? _a : [];
8554
8598
  const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
8555
- React31.useEffect(() => {
8599
+ React32.useEffect(() => {
8556
8600
  if (!open) return;
8557
8601
  const handleOutside = (e) => {
8558
8602
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -9020,11 +9064,11 @@ function RegistrationForm({
9020
9064
  readOnly = false
9021
9065
  }) {
9022
9066
  var _a;
9023
- const L = React31.useMemo(
9067
+ const L = React32.useMemo(
9024
9068
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
9025
9069
  [labels]
9026
9070
  );
9027
- const sortedFields = React31.useMemo(
9071
+ const sortedFields = React32.useMemo(
9028
9072
  () => [...fields].sort((a, b) => {
9029
9073
  var _a2, _b;
9030
9074
  return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
@@ -9032,7 +9076,7 @@ function RegistrationForm({
9032
9076
  [fields]
9033
9077
  );
9034
9078
  const isControlled = values !== void 0;
9035
- const [internal, setInternal] = React31.useState(
9079
+ const [internal, setInternal] = React32.useState(
9036
9080
  () => initializeValues(
9037
9081
  sortedFields,
9038
9082
  defaultValues != null ? defaultValues : {},
@@ -9040,9 +9084,9 @@ function RegistrationForm({
9040
9084
  includeTerms
9041
9085
  )
9042
9086
  );
9043
- const [submitAttempted, setSubmitAttempted] = React31.useState(false);
9044
- const [validationErrors, setValidationErrors] = React31.useState({});
9045
- React31.useEffect(() => {
9087
+ const [submitAttempted, setSubmitAttempted] = React32.useState(false);
9088
+ const [validationErrors, setValidationErrors] = React32.useState({});
9089
+ React32.useEffect(() => {
9046
9090
  if (isControlled) return;
9047
9091
  setInternal((prev) => {
9048
9092
  const next = initializeValues(
@@ -9099,7 +9143,7 @@ function RegistrationForm({
9099
9143
  const termsError = submitAttempted && termsEnabled && !termsAccepted;
9100
9144
  const firstErrorFieldId = Object.keys(fieldErrors)[0];
9101
9145
  const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
9102
- React31.useEffect(() => {
9146
+ React32.useEffect(() => {
9103
9147
  if (!submitAttempted || !scrollTargetId) return;
9104
9148
  const timer = setTimeout(() => {
9105
9149
  const elem = document.getElementById(scrollTargetId);
@@ -9552,6 +9596,281 @@ function RegistrationSuccessCard({
9552
9596
  }
9553
9597
  );
9554
9598
  }
9599
+ var OTHER = "OTHER";
9600
+ function SectionHeading({ children }) {
9601
+ return /* @__PURE__ */ jsx("h2", { className: "text-lg font-heading font-bold text-foreground mb-3", children });
9602
+ }
9603
+ function FieldError({ children }) {
9604
+ if (!children) return null;
9605
+ return /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children });
9606
+ }
9607
+ function CancellationForm({
9608
+ adventures,
9609
+ identity,
9610
+ labels,
9611
+ onSubmit,
9612
+ submitting = false,
9613
+ error,
9614
+ className
9615
+ }) {
9616
+ var _a, _b, _c;
9617
+ const [selectedAdventureIds, setSelectedAdventureIds] = React32.useState(/* @__PURE__ */ new Set());
9618
+ const [participantsByAdventure, setParticipantsByAdventure] = React32.useState({});
9619
+ const [reasonCode, setReasonCode] = React32.useState("");
9620
+ const [reasonOther, setReasonOther] = React32.useState("");
9621
+ const [refundPreference, setRefundPreference] = React32.useState("");
9622
+ const [refundOther, setRefundOther] = React32.useState("");
9623
+ const [agreedToPolicy, setAgreedToPolicy] = React32.useState(false);
9624
+ const [contactName, setContactName] = React32.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
9625
+ const [contactEmail, setContactEmail] = React32.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
9626
+ const [contactPhone, setContactPhone] = React32.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
9627
+ const [errors, setErrors] = React32.useState({});
9628
+ const allParticipantsOf = React32.useCallback(
9629
+ (advId) => {
9630
+ var _a2, _b2;
9631
+ return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
9632
+ },
9633
+ [adventures]
9634
+ );
9635
+ function toggleAdventure(advId, on) {
9636
+ setSelectedAdventureIds((prev) => {
9637
+ const next = new Set(prev);
9638
+ if (on) next.add(advId);
9639
+ else next.delete(advId);
9640
+ return next;
9641
+ });
9642
+ setParticipantsByAdventure((prev) => {
9643
+ const next = __spreadValues({}, prev);
9644
+ if (on) next[advId] = allParticipantsOf(advId);
9645
+ else delete next[advId];
9646
+ return next;
9647
+ });
9648
+ }
9649
+ function toggleParticipant(advId, travellerId, on) {
9650
+ setParticipantsByAdventure((prev) => {
9651
+ var _a2;
9652
+ const set = new Set((_a2 = prev[advId]) != null ? _a2 : []);
9653
+ if (on) set.add(travellerId);
9654
+ else set.delete(travellerId);
9655
+ return __spreadProps(__spreadValues({}, prev), { [advId]: set });
9656
+ });
9657
+ }
9658
+ function selectAll() {
9659
+ const allAdv = new Set(adventures.map((a) => a.id));
9660
+ const byAdv = {};
9661
+ for (const a of adventures) byAdv[a.id] = new Set(a.participants.map((p) => p.id));
9662
+ setSelectedAdventureIds(allAdv);
9663
+ setParticipantsByAdventure(byAdv);
9664
+ }
9665
+ const allSelected = adventures.length > 0 && adventures.every((a) => selectedAdventureIds.has(a.id));
9666
+ function validate() {
9667
+ var _a2;
9668
+ const next = {};
9669
+ const selAdvIds = adventures.filter((a) => selectedAdventureIds.has(a.id)).map((a) => a.id);
9670
+ if (selAdvIds.length === 0) next.adventures = labels.errorSelectAdventure;
9671
+ for (const advId of selAdvIds) {
9672
+ const set = participantsByAdventure[advId];
9673
+ if (!set || set.size === 0) next.participants = labels.errorSelectParticipants;
9674
+ }
9675
+ if (!reasonCode) next.reason = labels.errorReasonRequired;
9676
+ else if (reasonCode === OTHER && !reasonOther.trim()) next.reason = labels.errorReasonOtherRequired;
9677
+ if (!refundPreference) next.refund = labels.errorRefundRequired;
9678
+ else if (refundPreference === OTHER && !refundOther.trim())
9679
+ next.refund = labels.errorRefundOtherRequired;
9680
+ if (!agreedToPolicy) next.agreement = labels.errorAgreementRequired;
9681
+ setErrors(next);
9682
+ if (Object.keys(next).length > 0) return { ok: false };
9683
+ const travellerIds = /* @__PURE__ */ new Set();
9684
+ for (const advId of selAdvIds) {
9685
+ for (const tid of (_a2 = participantsByAdventure[advId]) != null ? _a2 : []) travellerIds.add(tid);
9686
+ }
9687
+ return {
9688
+ ok: true,
9689
+ values: {
9690
+ selectedBookingAdventureIds: selAdvIds,
9691
+ selectedTravellerIds: [...travellerIds],
9692
+ reasonCode,
9693
+ reasonOther: reasonCode === OTHER ? reasonOther.trim() : "",
9694
+ refundPreference,
9695
+ refundOther: refundPreference === OTHER ? refundOther.trim() : "",
9696
+ agreedToPolicy,
9697
+ contact: { name: contactName.trim(), email: contactEmail.trim(), phone: contactPhone.trim() }
9698
+ }
9699
+ };
9700
+ }
9701
+ function handleSubmit(e) {
9702
+ e.preventDefault();
9703
+ const r = validate();
9704
+ if (r.ok && r.values) void onSubmit(r.values);
9705
+ }
9706
+ return /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: cn("space-y-8", className), noValidate: true, children: [
9707
+ /* @__PURE__ */ jsxs("section", { children: [
9708
+ /* @__PURE__ */ jsx(SectionHeading, { children: labels.identityHeading }),
9709
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-3", children: [
9710
+ /* @__PURE__ */ jsx(
9711
+ FloatingInput,
9712
+ {
9713
+ label: labels.contactNameLabel,
9714
+ value: contactName,
9715
+ onChange: (e) => setContactName(e.target.value)
9716
+ }
9717
+ ),
9718
+ /* @__PURE__ */ jsx(
9719
+ FloatingInput,
9720
+ {
9721
+ label: labels.contactEmailLabel,
9722
+ type: "email",
9723
+ value: contactEmail,
9724
+ onChange: (e) => setContactEmail(e.target.value)
9725
+ }
9726
+ ),
9727
+ /* @__PURE__ */ jsx(
9728
+ FloatingInput,
9729
+ {
9730
+ label: labels.contactPhoneLabel,
9731
+ value: contactPhone,
9732
+ onChange: (e) => setContactPhone(e.target.value)
9733
+ }
9734
+ )
9735
+ ] })
9736
+ ] }),
9737
+ /* @__PURE__ */ jsxs("section", { children: [
9738
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 mb-3", children: [
9739
+ /* @__PURE__ */ jsx(SectionHeading, { children: labels.adventuresHeading }),
9740
+ adventures.length > 1 && /* @__PURE__ */ jsx(Button, { type: "button", variant: "link", size: "sm", onClick: selectAll, disabled: allSelected, children: labels.selectAllLabel })
9741
+ ] }),
9742
+ labels.adventuresHint && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-3", children: labels.adventuresHint }),
9743
+ /* @__PURE__ */ jsx("div", { className: "space-y-3", children: adventures.map((adv) => {
9744
+ var _a2;
9745
+ const selected = selectedAdventureIds.has(adv.id);
9746
+ const partSet = (_a2 = participantsByAdventure[adv.id]) != null ? _a2 : /* @__PURE__ */ new Set();
9747
+ return /* @__PURE__ */ jsxs(
9748
+ "div",
9749
+ {
9750
+ className: cn(
9751
+ "rounded-lg border p-4 transition-colors",
9752
+ selected ? "border-primary bg-primary/5" : "border-border bg-card"
9753
+ ),
9754
+ children: [
9755
+ /* @__PURE__ */ jsxs("label", { className: "flex items-start gap-3 cursor-pointer", children: [
9756
+ /* @__PURE__ */ jsx(
9757
+ "input",
9758
+ {
9759
+ type: "checkbox",
9760
+ className: "mt-1 h-4 w-4 accent-primary",
9761
+ checked: selected,
9762
+ onChange: (e) => toggleAdventure(adv.id, e.target.checked)
9763
+ }
9764
+ ),
9765
+ /* @__PURE__ */ jsxs("span", { className: "flex-1", children: [
9766
+ /* @__PURE__ */ jsx("span", { className: "block font-ui font-medium text-foreground", children: adv.name }),
9767
+ adv.dateRange && /* @__PURE__ */ jsx("span", { className: "block text-sm text-muted-foreground", children: adv.dateRange })
9768
+ ] })
9769
+ ] }),
9770
+ selected && /* @__PURE__ */ jsxs("div", { className: "mt-4 pl-7 space-y-4", children: [
9771
+ adv.cancellationPolicy && /* @__PURE__ */ jsxs("div", { className: "rounded-md bg-muted/50 border border-border p-3", children: [
9772
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-ui font-semibold uppercase tracking-wide text-muted-foreground mb-1", children: labels.policyHeading }),
9773
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-foreground whitespace-pre-line", children: adv.cancellationPolicy })
9774
+ ] }),
9775
+ adv.participants.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
9776
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-ui font-semibold uppercase tracking-wide text-muted-foreground mb-2", children: labels.participantsHeading }),
9777
+ /* @__PURE__ */ jsx("div", { className: "space-y-1.5", children: adv.participants.map((p) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
9778
+ /* @__PURE__ */ jsx(
9779
+ "input",
9780
+ {
9781
+ type: "checkbox",
9782
+ className: "h-4 w-4 accent-primary",
9783
+ checked: partSet.has(p.id),
9784
+ onChange: (e) => toggleParticipant(adv.id, p.id, e.target.checked)
9785
+ }
9786
+ ),
9787
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: p.name })
9788
+ ] }, p.id)) })
9789
+ ] })
9790
+ ] })
9791
+ ]
9792
+ },
9793
+ adv.id
9794
+ );
9795
+ }) }),
9796
+ /* @__PURE__ */ jsx(FieldError, { children: errors.adventures }),
9797
+ /* @__PURE__ */ jsx(FieldError, { children: errors.participants })
9798
+ ] }),
9799
+ /* @__PURE__ */ jsxs("section", { children: [
9800
+ /* @__PURE__ */ jsx(SectionHeading, { children: labels.reasonHeading }),
9801
+ /* @__PURE__ */ jsx("div", { className: "space-y-2", children: labels.reasonOptions.map((opt) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
9802
+ /* @__PURE__ */ jsx(
9803
+ "input",
9804
+ {
9805
+ type: "radio",
9806
+ name: "cancellation-reason",
9807
+ className: "h-4 w-4 accent-primary",
9808
+ checked: reasonCode === opt.value,
9809
+ onChange: () => setReasonCode(opt.value)
9810
+ }
9811
+ ),
9812
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: opt.label })
9813
+ ] }, opt.value)) }),
9814
+ reasonCode === OTHER && /* @__PURE__ */ jsx(
9815
+ "textarea",
9816
+ {
9817
+ className: "mt-3 w-full rounded-lg border border-border bg-background px-3 py-2 text-base text-foreground font-ui focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
9818
+ rows: 3,
9819
+ placeholder: labels.reasonOtherLabel,
9820
+ value: reasonOther,
9821
+ onChange: (e) => setReasonOther(e.target.value),
9822
+ maxLength: 1e3
9823
+ }
9824
+ ),
9825
+ /* @__PURE__ */ jsx(FieldError, { children: errors.reason })
9826
+ ] }),
9827
+ /* @__PURE__ */ jsxs("section", { children: [
9828
+ /* @__PURE__ */ jsx(SectionHeading, { children: labels.refundHeading }),
9829
+ /* @__PURE__ */ jsx("div", { className: "space-y-2", children: labels.refundOptions.map((opt) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
9830
+ /* @__PURE__ */ jsx(
9831
+ "input",
9832
+ {
9833
+ type: "radio",
9834
+ name: "cancellation-refund",
9835
+ className: "h-4 w-4 accent-primary",
9836
+ checked: refundPreference === opt.value,
9837
+ onChange: () => setRefundPreference(opt.value)
9838
+ }
9839
+ ),
9840
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: opt.label })
9841
+ ] }, opt.value)) }),
9842
+ refundPreference === OTHER && /* @__PURE__ */ jsx(
9843
+ "textarea",
9844
+ {
9845
+ className: "mt-3 w-full rounded-lg border border-border bg-background px-3 py-2 text-base text-foreground font-ui focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
9846
+ rows: 3,
9847
+ placeholder: labels.refundOtherLabel,
9848
+ value: refundOther,
9849
+ onChange: (e) => setRefundOther(e.target.value),
9850
+ maxLength: 1e3
9851
+ }
9852
+ ),
9853
+ /* @__PURE__ */ jsx(FieldError, { children: errors.refund })
9854
+ ] }),
9855
+ /* @__PURE__ */ jsxs("section", { children: [
9856
+ /* @__PURE__ */ jsxs("label", { className: "flex items-start gap-3 cursor-pointer", children: [
9857
+ /* @__PURE__ */ jsx(
9858
+ "input",
9859
+ {
9860
+ type: "checkbox",
9861
+ className: "mt-1 h-4 w-4 accent-primary",
9862
+ checked: agreedToPolicy,
9863
+ onChange: (e) => setAgreedToPolicy(e.target.checked)
9864
+ }
9865
+ ),
9866
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: labels.agreementLabel })
9867
+ ] }),
9868
+ /* @__PURE__ */ jsx(FieldError, { children: errors.agreement })
9869
+ ] }),
9870
+ error && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive font-ui", role: "alert", children: error }),
9871
+ /* @__PURE__ */ jsx(Button, { type: "submit", variant: "destructive", size: "lg", disabled: submitting, className: "w-full", children: submitting ? labels.submittingLabel : labels.submitLabel })
9872
+ ] });
9873
+ }
9555
9874
  var OTPCodeInput = ({
9556
9875
  value,
9557
9876
  onChange,
@@ -9563,10 +9882,10 @@ var OTPCodeInput = ({
9563
9882
  id,
9564
9883
  required
9565
9884
  }) => {
9566
- const baseId = id != null ? id : React31.useId();
9567
- const inputRef = React31.useRef(null);
9568
- const [focused, setFocused] = React31.useState(false);
9569
- const digits = React31.useMemo(() => {
9885
+ const baseId = id != null ? id : React32.useId();
9886
+ const inputRef = React32.useRef(null);
9887
+ const [focused, setFocused] = React32.useState(false);
9888
+ const digits = React32.useMemo(() => {
9570
9889
  const arr = value.split("").slice(0, length);
9571
9890
  while (arr.length < length) arr.push("");
9572
9891
  return arr;
@@ -9679,7 +9998,7 @@ function Checkbox(_a) {
9679
9998
  })
9680
9999
  );
9681
10000
  }
9682
- var AccordionVariantContext = React31.createContext("default");
10001
+ var AccordionVariantContext = React32.createContext("default");
9683
10002
  function Accordion(_a) {
9684
10003
  var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
9685
10004
  return /* @__PURE__ */ jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(
@@ -9697,7 +10016,7 @@ function Accordion(_a) {
9697
10016
  }
9698
10017
  function AccordionItem(_a) {
9699
10018
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
9700
- const variant = React31.useContext(AccordionVariantContext);
10019
+ const variant = React32.useContext(AccordionVariantContext);
9701
10020
  return /* @__PURE__ */ jsx(
9702
10021
  Accordion$1.Item,
9703
10022
  __spreadValues({
@@ -9718,7 +10037,7 @@ function AccordionTrigger(_a) {
9718
10037
  "className",
9719
10038
  "children"
9720
10039
  ]);
9721
- const variant = React31.useContext(AccordionVariantContext);
10040
+ const variant = React32.useContext(AccordionVariantContext);
9722
10041
  return /* @__PURE__ */ jsx(Accordion$1.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
9723
10042
  Accordion$1.Trigger,
9724
10043
  __spreadProps(__spreadValues({
@@ -9772,7 +10091,7 @@ function AccordionContent(_a) {
9772
10091
  "className",
9773
10092
  "children"
9774
10093
  ]);
9775
- const variant = React31.useContext(AccordionVariantContext);
10094
+ const variant = React32.useContext(AccordionVariantContext);
9776
10095
  return /* @__PURE__ */ jsx(
9777
10096
  Accordion$1.Panel,
9778
10097
  __spreadProps(__spreadValues({
@@ -9990,15 +10309,15 @@ function FilterPanel({
9990
10309
  onSortChange
9991
10310
  }) {
9992
10311
  var _a, _b;
9993
- const resolvedGroups = React31.useMemo(() => resolveGroups(groups), [groups]);
9994
- const [internalValue, setInternalValue] = React31.useState(
10312
+ const resolvedGroups = React32.useMemo(() => resolveGroups(groups), [groups]);
10313
+ const [internalValue, setInternalValue] = React32.useState(
9995
10314
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
9996
10315
  );
9997
10316
  const selected = value != null ? value : internalValue;
9998
- const [expandedItems, setExpandedItems] = React31.useState(
10317
+ const [expandedItems, setExpandedItems] = React32.useState(
9999
10318
  () => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
10000
10319
  );
10001
- const toggleExpanded = React31.useCallback((id) => {
10320
+ const toggleExpanded = React32.useCallback((id) => {
10002
10321
  setExpandedItems((prev) => {
10003
10322
  const next = new Set(prev);
10004
10323
  if (next.has(id)) next.delete(id);
@@ -10382,11 +10701,11 @@ function FilterPanel({
10382
10701
  var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
10383
10702
  function TrustpilotEmbed({ config }) {
10384
10703
  var _a, _b, _c, _d, _e, _f;
10385
- const ref = React31.useRef(null);
10386
- const [widgetReady, setWidgetReady] = React31.useState(false);
10387
- const [delayPassed, setDelayPassed] = React31.useState(false);
10704
+ const ref = React32.useRef(null);
10705
+ const [widgetReady, setWidgetReady] = React32.useState(false);
10706
+ const [delayPassed, setDelayPassed] = React32.useState(false);
10388
10707
  const showFallback = delayPassed && !widgetReady;
10389
- React31.useEffect(() => {
10708
+ React32.useEffect(() => {
10390
10709
  var _a2;
10391
10710
  if (typeof document === "undefined" || !ref.current) return;
10392
10711
  const node = ref.current;
@@ -10574,7 +10893,7 @@ function webpVariantUrl(src) {
10574
10893
  return `${withoutQuery}.webp${query}`;
10575
10894
  }
10576
10895
  function PictureLoader() {
10577
- const gradientId = React31.useId();
10896
+ const gradientId = React32.useId();
10578
10897
  return /* @__PURE__ */ jsx(
10579
10898
  "span",
10580
10899
  {
@@ -10644,10 +10963,10 @@ function Picture(_a) {
10644
10963
  "onError"
10645
10964
  ]);
10646
10965
  var _a2;
10647
- const ref = React31.useRef(null);
10648
- const [visible, setVisible] = React31.useState(eager);
10649
- const [loaded, setLoaded] = React31.useState(false);
10650
- React31.useEffect(() => {
10966
+ const ref = React32.useRef(null);
10967
+ const [visible, setVisible] = React32.useState(eager);
10968
+ const [loaded, setLoaded] = React32.useState(false);
10969
+ React32.useEffect(() => {
10651
10970
  if (eager || visible) return;
10652
10971
  const el = ref.current;
10653
10972
  if (!el || typeof IntersectionObserver === "undefined") {
@@ -10666,7 +10985,7 @@ function Picture(_a) {
10666
10985
  io.observe(el);
10667
10986
  return () => io.disconnect();
10668
10987
  }, [eager, visible, rootMargin]);
10669
- React31.useEffect(() => {
10988
+ React32.useEffect(() => {
10670
10989
  setLoaded(false);
10671
10990
  }, [src]);
10672
10991
  const webp = webpVariantUrl(src);
@@ -10794,11 +11113,11 @@ function ItineraryModal({
10794
11113
  onNext
10795
11114
  }) {
10796
11115
  var _a, _b, _c;
10797
- const [imgIndex, setImgIndex] = React31.useState(0);
11116
+ const [imgIndex, setImgIndex] = React32.useState(0);
10798
11117
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
10799
11118
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
10800
11119
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
10801
- React31.useEffect(() => {
11120
+ React32.useEffect(() => {
10802
11121
  setImgIndex(0);
10803
11122
  }, [stop == null ? void 0 : stop.dayNumber]);
10804
11123
  if (!stop) return null;
@@ -10925,8 +11244,8 @@ function ItineraryModal({
10925
11244
  ) });
10926
11245
  }
10927
11246
  function Itinerary({ title, subtitle, stops, className }) {
10928
- const [activeIndex, setActiveIndex] = React31.useState(null);
10929
- const scrollRef = React31.useRef(null);
11247
+ const [activeIndex, setActiveIndex] = React32.useState(null);
11248
+ const scrollRef = React32.useRef(null);
10930
11249
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
10931
11250
  const scrollBy = (dir) => {
10932
11251
  if (!scrollRef.current) return;
@@ -11018,18 +11337,18 @@ function Lightbox({
11018
11337
  onClose
11019
11338
  }) {
11020
11339
  var _a;
11021
- const [index, setIndex] = React31.useState(initialIndex);
11340
+ const [index, setIndex] = React32.useState(initialIndex);
11022
11341
  const total = photos.length;
11023
11342
  const photo = photos[index];
11024
- const prev = React31.useCallback(
11343
+ const prev = React32.useCallback(
11025
11344
  () => setIndex((i) => (i - 1 + total) % total),
11026
11345
  [total]
11027
11346
  );
11028
- const next = React31.useCallback(
11347
+ const next = React32.useCallback(
11029
11348
  () => setIndex((i) => (i + 1) % total),
11030
11349
  [total]
11031
11350
  );
11032
- React31.useEffect(() => {
11351
+ React32.useEffect(() => {
11033
11352
  const onKey = (e) => {
11034
11353
  if (e.key === "Escape") onClose();
11035
11354
  if (e.key === "ArrowLeft") prev();
@@ -11197,7 +11516,7 @@ function GridGallery({
11197
11516
  initialVisible,
11198
11517
  onOpen
11199
11518
  }) {
11200
- const [expanded, setExpanded] = React31.useState(false);
11519
+ const [expanded, setExpanded] = React32.useState(false);
11201
11520
  const cols = gridCols(photos.length);
11202
11521
  const hasMore = photos.length > initialVisible;
11203
11522
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -11227,7 +11546,7 @@ function CompactGridGallery({
11227
11546
  initialVisible,
11228
11547
  onOpen
11229
11548
  }) {
11230
- const [expanded, setExpanded] = React31.useState(false);
11549
+ const [expanded, setExpanded] = React32.useState(false);
11231
11550
  const hasMore = photos.length > initialVisible;
11232
11551
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
11233
11552
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -11256,7 +11575,7 @@ function MasonryGallery({
11256
11575
  initialVisible,
11257
11576
  onOpen
11258
11577
  }) {
11259
- const [expanded, setExpanded] = React31.useState(false);
11578
+ const [expanded, setExpanded] = React32.useState(false);
11260
11579
  const hasMore = photos.length > initialVisible;
11261
11580
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
11262
11581
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -11329,7 +11648,7 @@ function FeaturedGallery({
11329
11648
  photos,
11330
11649
  onOpen
11331
11650
  }) {
11332
- const [expanded, setExpanded] = React31.useState(false);
11651
+ const [expanded, setExpanded] = React32.useState(false);
11333
11652
  const featured = photos.slice(0, 3);
11334
11653
  const extra = photos.slice(3);
11335
11654
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -11527,9 +11846,9 @@ function PhotoGallery({
11527
11846
  onPhotoClick,
11528
11847
  className
11529
11848
  }) {
11530
- const [lightboxIndex, setLightboxIndex] = React31.useState(null);
11531
- const [carouselIndex, setCarouselIndex] = React31.useState(0);
11532
- const normalised = React31.useMemo(() => photos.map(normalise), [photos]);
11849
+ const [lightboxIndex, setLightboxIndex] = React32.useState(null);
11850
+ const [carouselIndex, setCarouselIndex] = React32.useState(0);
11851
+ const normalised = React32.useMemo(() => photos.map(normalise), [photos]);
11533
11852
  const handleOpen = (index) => {
11534
11853
  setLightboxIndex(index);
11535
11854
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
@@ -11615,7 +11934,7 @@ function ItineraryDay({
11615
11934
  photoLayout = "rounded",
11616
11935
  className
11617
11936
  }) {
11618
- const photoList = React31.useMemo(() => normalisePhotos(photos), [photos]);
11937
+ const photoList = React32.useMemo(() => normalisePhotos(photos), [photos]);
11619
11938
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
11620
11939
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
11621
11940
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsx(
@@ -11670,8 +11989,8 @@ function MenuTrip({
11670
11989
  bold = true,
11671
11990
  className
11672
11991
  }) {
11673
- const scrollRef = React31.useRef(null);
11674
- React31.useEffect(() => {
11992
+ const scrollRef = React32.useRef(null);
11993
+ React32.useEffect(() => {
11675
11994
  if (!scrollRef.current || !activeSection) return;
11676
11995
  const container = scrollRef.current;
11677
11996
  const btn = container.querySelector(
@@ -11867,8 +12186,8 @@ function PricingTrip({
11867
12186
  className
11868
12187
  }) {
11869
12188
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
11870
- const [showEstimates, setShowEstimates] = React31.useState(false);
11871
- const [showPriceInfo, setShowPriceInfo] = React31.useState(false);
12189
+ const [showEstimates, setShowEstimates] = React32.useState(false);
12190
+ const [showPriceInfo, setShowPriceInfo] = React32.useState(false);
11872
12191
  if (variant === "compact") {
11873
12192
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
11874
12193
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -12308,14 +12627,14 @@ function SiteHeader({
12308
12627
  }) {
12309
12628
  const t = VARIANT[variant];
12310
12629
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
12311
- const [openMenu, setOpenMenu] = React31.useState(null);
12312
- const [langOpen, setLangOpen] = React31.useState(false);
12313
- const [mobileOpen, setMobileOpen] = React31.useState(false);
12314
- const [openMobileSection, setOpenMobileSection] = React31.useState(null);
12315
- const [activeLang, setActiveLang] = React31.useState(currentLanguage);
12630
+ const [openMenu, setOpenMenu] = React32.useState(null);
12631
+ const [langOpen, setLangOpen] = React32.useState(false);
12632
+ const [mobileOpen, setMobileOpen] = React32.useState(false);
12633
+ const [openMobileSection, setOpenMobileSection] = React32.useState(null);
12634
+ const [activeLang, setActiveLang] = React32.useState(currentLanguage);
12316
12635
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
12317
- const menuCloseTimer = React31.useRef(void 0);
12318
- const langCloseTimer = React31.useRef(void 0);
12636
+ const menuCloseTimer = React32.useRef(void 0);
12637
+ const langCloseTimer = React32.useRef(void 0);
12319
12638
  const handleMenuEnter = (label) => {
12320
12639
  clearTimeout(menuCloseTimer.current);
12321
12640
  setOpenMenu(label);
@@ -12336,7 +12655,7 @@ function SiteHeader({
12336
12655
  setOpenMenu(null);
12337
12656
  setLangOpen(false);
12338
12657
  };
12339
- React31.useEffect(() => () => {
12658
+ React32.useEffect(() => () => {
12340
12659
  clearTimeout(menuCloseTimer.current);
12341
12660
  clearTimeout(langCloseTimer.current);
12342
12661
  }, []);
@@ -12612,7 +12931,7 @@ function SiteHeader({
12612
12931
  ), children: [
12613
12932
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
12614
12933
  const isActive = lang.code === activeLang;
12615
- return /* @__PURE__ */ jsxs(React31.Fragment, { children: [
12934
+ return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
12616
12935
  i > 0 && /* @__PURE__ */ jsx("span", { className: cn(
12617
12936
  "text-xs select-none",
12618
12937
  variant === "white" ? "text-border" : "text-white/15"
@@ -12674,8 +12993,8 @@ function SiteHeader({
12674
12993
  );
12675
12994
  }
12676
12995
  function ThemeToggle({ className }) {
12677
- const [dark, setDark] = React31.useState(false);
12678
- React31.useEffect(() => {
12996
+ const [dark, setDark] = React32.useState(false);
12997
+ React32.useEffect(() => {
12679
12998
  const saved = localStorage.getItem("theme");
12680
12999
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
12681
13000
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -12725,7 +13044,7 @@ var chipVariants = cva(
12725
13044
  }
12726
13045
  }
12727
13046
  );
12728
- var Chip = React31.forwardRef(function Chip2(_a, ref) {
13047
+ var Chip = React32.forwardRef(function Chip2(_a, ref) {
12729
13048
  var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
12730
13049
  const classes = cn(chipVariants({ variant, size }), className);
12731
13050
  if (href) {
@@ -12827,7 +13146,7 @@ function TripCardEditorial(props) {
12827
13146
  tag,
12828
13147
  tagHref
12829
13148
  } = props;
12830
- const [internalFav, setInternalFav] = React31.useState(false);
13149
+ const [internalFav, setInternalFav] = React32.useState(false);
12831
13150
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
12832
13151
  const handleFav = (e) => {
12833
13152
  e.preventDefault();
@@ -13338,7 +13657,7 @@ function BlogPost({
13338
13657
  ) }),
13339
13658
  /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
13340
13659
  /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-3xl px-6 sm:px-8 pb-9 sm:pb-11", children: [
13341
- 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(React31.Fragment, { children: [
13660
+ 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(React32.Fragment, { children: [
13342
13661
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13343
13662
  crumb.href ? /* @__PURE__ */ jsx(
13344
13663
  "a",
@@ -13392,7 +13711,7 @@ function BlogPost({
13392
13711
  ] });
13393
13712
  }
13394
13713
  function useHlsVideo(videoRef, src) {
13395
- React31.useEffect(() => {
13714
+ React32.useEffect(() => {
13396
13715
  if (!src || !videoRef.current) return;
13397
13716
  const video = videoRef.current;
13398
13717
  if (!src.includes(".m3u8")) return;
@@ -13436,11 +13755,11 @@ function TripHeader({
13436
13755
  className
13437
13756
  }) {
13438
13757
  var _a;
13439
- const [heroIndex, setHeroIndex] = React31.useState(0);
13440
- const [videoReady, setVideoReady] = React31.useState(false);
13441
- const videoRef = React31.useRef(null);
13758
+ const [heroIndex, setHeroIndex] = React32.useState(0);
13759
+ const [videoReady, setVideoReady] = React32.useState(false);
13760
+ const videoRef = React32.useRef(null);
13442
13761
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
13443
- const validImages = React31.useMemo(
13762
+ const validImages = React32.useMemo(
13444
13763
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
13445
13764
  [images]
13446
13765
  );
@@ -13455,7 +13774,7 @@ function TripHeader({
13455
13774
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
13456
13775
  const hasMeta = !!(destination || duration);
13457
13776
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13458
- React31.useEffect(() => {
13777
+ React32.useEffect(() => {
13459
13778
  if (!videoUrl) return;
13460
13779
  const el = videoRef.current;
13461
13780
  if (!el) return;
@@ -13598,7 +13917,7 @@ function TripHeader({
13598
13917
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
13599
13918
  ),
13600
13919
  children: [
13601
- 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(React31.Fragment, { children: [
13920
+ 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(React32.Fragment, { children: [
13602
13921
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13603
13922
  /* @__PURE__ */ jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
13604
13923
  ] }, i)) }),
@@ -13764,10 +14083,10 @@ function LanguagePicker({
13764
14083
  }) {
13765
14084
  var _a;
13766
14085
  const t = VARIANT2[variant];
13767
- const [open, setOpen] = React31.useState(false);
13768
- const ref = React31.useRef(null);
14086
+ const [open, setOpen] = React32.useState(false);
14087
+ const ref = React32.useRef(null);
13769
14088
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
13770
- React31.useEffect(() => {
14089
+ React32.useEffect(() => {
13771
14090
  if (!open) return;
13772
14091
  const onDocClick = (e) => {
13773
14092
  if (ref.current && !ref.current.contains(e.target)) {
@@ -13968,7 +14287,7 @@ function SiteFooter({
13968
14287
  children: wrapper
13969
14288
  },
13970
14289
  b.alt + i
13971
- ) : /* @__PURE__ */ jsx(React31.Fragment, { children: wrapper }, b.alt + i);
14290
+ ) : /* @__PURE__ */ jsx(React32.Fragment, { children: wrapper }, b.alt + i);
13972
14291
  }) })
13973
14292
  ] }),
13974
14293
  themes.length > 0 && /* @__PURE__ */ jsxs("div", { className: "lg:col-span-3", children: [
@@ -14143,10 +14462,10 @@ function TripPage({
14143
14462
  className
14144
14463
  }) {
14145
14464
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
14146
- const [activeSection, setActiveSection] = React31.useState("");
14147
- const [accordionValue, setAccordionValue] = React31.useState([]);
14148
- const [faqsExpanded, setFaqsExpanded] = React31.useState(false);
14149
- const accordionSectionIds = React31.useMemo(
14465
+ const [activeSection, setActiveSection] = React32.useState("");
14466
+ const [accordionValue, setAccordionValue] = React32.useState([]);
14467
+ const [faqsExpanded, setFaqsExpanded] = React32.useState(false);
14468
+ const accordionSectionIds = React32.useMemo(
14150
14469
  () => /* @__PURE__ */ new Set([
14151
14470
  "when-it-operates",
14152
14471
  "how-to-get-there",
@@ -14160,18 +14479,18 @@ function TripPage({
14160
14479
  ]),
14161
14480
  []
14162
14481
  );
14163
- const [navFloating, setNavFloating] = React31.useState(false);
14164
- const [navHidden, setNavHidden] = React31.useState(false);
14165
- const [isFloating, setIsFloating] = React31.useState(false);
14166
- const [sidebarPos, setSidebarPos] = React31.useState(null);
14167
- const [pricingBarVisible, setPricingBarVisible] = React31.useState(false);
14168
- const navRef = React31.useRef(null);
14169
- const navSentinelRef = React31.useRef(null);
14170
- const sentinelRef = React31.useRef(null);
14171
- const sidebarPlaceholderRef = React31.useRef(null);
14172
- const pricingBarRef = React31.useRef(null);
14173
- const galleryRef = React31.useRef(null);
14174
- const sections = React31.useMemo(
14482
+ const [navFloating, setNavFloating] = React32.useState(false);
14483
+ const [navHidden, setNavHidden] = React32.useState(false);
14484
+ const [isFloating, setIsFloating] = React32.useState(false);
14485
+ const [sidebarPos, setSidebarPos] = React32.useState(null);
14486
+ const [pricingBarVisible, setPricingBarVisible] = React32.useState(false);
14487
+ const navRef = React32.useRef(null);
14488
+ const navSentinelRef = React32.useRef(null);
14489
+ const sentinelRef = React32.useRef(null);
14490
+ const sidebarPlaceholderRef = React32.useRef(null);
14491
+ const pricingBarRef = React32.useRef(null);
14492
+ const galleryRef = React32.useRef(null);
14493
+ const sections = React32.useMemo(
14175
14494
  () => {
14176
14495
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
14177
14496
  return [
@@ -14193,7 +14512,7 @@ function TripPage({
14193
14512
  // eslint-disable-next-line react-hooks/exhaustive-deps
14194
14513
  []
14195
14514
  );
14196
- React31.useEffect(() => {
14515
+ React32.useEffect(() => {
14197
14516
  const sentinel = navSentinelRef.current;
14198
14517
  if (!sentinel) return;
14199
14518
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -14201,7 +14520,7 @@ function TripPage({
14201
14520
  update();
14202
14521
  return () => document.removeEventListener("scroll", update, { capture: true });
14203
14522
  }, []);
14204
- React31.useEffect(() => {
14523
+ React32.useEffect(() => {
14205
14524
  const sentinel = sentinelRef.current;
14206
14525
  if (!sentinel) return;
14207
14526
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -14209,7 +14528,7 @@ function TripPage({
14209
14528
  update();
14210
14529
  return () => document.removeEventListener("scroll", update, { capture: true });
14211
14530
  }, []);
14212
- React31.useEffect(() => {
14531
+ React32.useEffect(() => {
14213
14532
  const measure = () => {
14214
14533
  if (!sidebarPlaceholderRef.current) return;
14215
14534
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -14219,7 +14538,7 @@ function TripPage({
14219
14538
  window.addEventListener("resize", measure);
14220
14539
  return () => window.removeEventListener("resize", measure);
14221
14540
  }, [isFloating]);
14222
- React31.useEffect(() => {
14541
+ React32.useEffect(() => {
14223
14542
  const check = () => {
14224
14543
  var _a2;
14225
14544
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -14230,7 +14549,7 @@ function TripPage({
14230
14549
  check();
14231
14550
  return () => document.removeEventListener("scroll", check, { capture: true });
14232
14551
  }, []);
14233
- React31.useEffect(() => {
14552
+ React32.useEffect(() => {
14234
14553
  const check = () => {
14235
14554
  if (!pricingBarRef.current) return;
14236
14555
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -14239,7 +14558,7 @@ function TripPage({
14239
14558
  check();
14240
14559
  return () => document.removeEventListener("scroll", check, { capture: true });
14241
14560
  }, []);
14242
- React31.useEffect(() => {
14561
+ React32.useEffect(() => {
14243
14562
  if (sections.length === 0) return;
14244
14563
  setActiveSection(sections[0].id);
14245
14564
  const update = () => {
@@ -14714,7 +15033,7 @@ function TripPage({
14714
15033
  }
14715
15034
  );
14716
15035
  }
14717
- function SectionHeading({
15036
+ function SectionHeading2({
14718
15037
  eyebrow,
14719
15038
  title,
14720
15039
  rightSlot
@@ -14764,11 +15083,11 @@ function CategoryPage2({
14764
15083
  className
14765
15084
  }) {
14766
15085
  var _a;
14767
- const [videoReady, setVideoReady] = React31.useState(false);
14768
- const videoRef = React31.useRef(null);
15086
+ const [videoReady, setVideoReady] = React32.useState(false);
15087
+ const videoRef = React32.useRef(null);
14769
15088
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
14770
15089
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
14771
- React31.useEffect(() => {
15090
+ React32.useEffect(() => {
14772
15091
  if (!videoUrl) return;
14773
15092
  const el = videoRef.current;
14774
15093
  if (!el) return;
@@ -14783,13 +15102,13 @@ function CategoryPage2({
14783
15102
  io.observe(el);
14784
15103
  return () => io.disconnect();
14785
15104
  }, [videoUrl]);
14786
- const [faqsExpanded, setFaqsExpanded] = React31.useState(false);
14787
- const [tripsExpanded, setTripsExpanded] = React31.useState(false);
14788
- const [filterValue, setFilterValue] = React31.useState({});
14789
- const [sort, setSort] = React31.useState(
15105
+ const [faqsExpanded, setFaqsExpanded] = React32.useState(false);
15106
+ const [tripsExpanded, setTripsExpanded] = React32.useState(false);
15107
+ const [filterValue, setFilterValue] = React32.useState({});
15108
+ const [sort, setSort] = React32.useState(
14790
15109
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
14791
15110
  );
14792
- const sortedTrips = React31.useMemo(() => {
15111
+ const sortedTrips = React32.useMemo(() => {
14793
15112
  const active = Object.entries(filterValue).filter(
14794
15113
  ([, vals]) => vals && vals.length > 0
14795
15114
  );
@@ -14893,7 +15212,7 @@ function CategoryPage2({
14893
15212
  /* @__PURE__ */ jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
14894
15213
  breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
14895
15214
  const isLast = i === breadcrumb.length - 1;
14896
- return /* @__PURE__ */ jsxs(React31.Fragment, { children: [
15215
+ return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
14897
15216
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
14898
15217
  crumb.href && !isLast ? /* @__PURE__ */ jsx(
14899
15218
  "a",
@@ -14923,7 +15242,7 @@ function CategoryPage2({
14923
15242
  ),
14924
15243
  popularTours && popularTours.length > 0 && /* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: [
14925
15244
  /* @__PURE__ */ jsx(
14926
- SectionHeading,
15245
+ SectionHeading2,
14927
15246
  {
14928
15247
  eyebrow: popularToursEyebrow,
14929
15248
  title: popularToursTitle
@@ -14943,7 +15262,7 @@ function CategoryPage2({
14943
15262
  }) }) })
14944
15263
  ] }),
14945
15264
  /* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 pt-6 sm:pt-8 pb-12", children: [
14946
- (tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsx(SectionHeading, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
15265
+ (tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
14947
15266
  filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(
14948
15267
  FilterPanel,
14949
15268
  {
@@ -15181,12 +15500,12 @@ function Toast({
15181
15500
  duration = 6e3,
15182
15501
  className
15183
15502
  }) {
15184
- const [mounted, setMounted] = React31.useState(false);
15185
- const [visible, setVisible] = React31.useState(true);
15186
- React31.useEffect(() => {
15503
+ const [mounted, setMounted] = React32.useState(false);
15504
+ const [visible, setVisible] = React32.useState(true);
15505
+ React32.useEffect(() => {
15187
15506
  setMounted(true);
15188
15507
  }, []);
15189
- React31.useEffect(() => {
15508
+ React32.useEffect(() => {
15190
15509
  if (duration === 0) return;
15191
15510
  const t = setTimeout(() => {
15192
15511
  setVisible(false);
@@ -16688,8 +17007,8 @@ function ShareWidget({
16688
17007
  title = "Invite friends & lower the price",
16689
17008
  className
16690
17009
  }) {
16691
- const [copied, setCopied] = React31.useState(false);
16692
- const [showToast, setShowToast] = React31.useState(false);
17010
+ const [copied, setCopied] = React32.useState(false);
17011
+ const [showToast, setShowToast] = React32.useState(false);
16693
17012
  const encodedUrl = encodeURIComponent(url);
16694
17013
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
16695
17014
  const channels = [
@@ -16839,6 +17158,6 @@ function StickyBookingCard({
16839
17158
  );
16840
17159
  }
16841
17160
 
16842
- export { ActivityCard, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CategoryPage2, CounterField, CountrySearchField, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, ShareWidget, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
17161
+ export { ActivityCard, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CancellationForm, CategoryPage2, CounterField, CountrySearchField, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, ShareWidget, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
16843
17162
  //# sourceMappingURL=index.js.map
16844
17163
  //# sourceMappingURL=index.js.map