@planetaexo/design-system 0.63.0 → 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;
@@ -5542,7 +5542,7 @@ function BookingCreatedEmail({
5542
5542
  }, children: i + 1 }) }),
5543
5543
  /* @__PURE__ */ jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
5544
5544
  ] }) }) }, i)) }),
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(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: [
5546
5546
  idx === 0 ? /* @__PURE__ */ jsx("strong", { children: line }) : line,
5547
5547
  idx < arr.length - 1 ? /* @__PURE__ */ jsx("br", {}) : null
5548
5548
  ] }, idx)) })
@@ -7911,11 +7911,11 @@ function DatePickerField({
7911
7911
  fromDate,
7912
7912
  className
7913
7913
  }) {
7914
- const [open, setOpen] = React31.useState(false);
7915
- const containerRef = React31.useRef(null);
7916
- const [calendarWidth, setCalendarWidth] = React31.useState();
7914
+ const [open, setOpen] = React32.useState(false);
7915
+ const containerRef = React32.useRef(null);
7916
+ const [calendarWidth, setCalendarWidth] = React32.useState();
7917
7917
  const hasValue = !!value;
7918
- React31.useEffect(() => {
7918
+ React32.useEffect(() => {
7919
7919
  if (!containerRef.current) return;
7920
7920
  const observer = new ResizeObserver(([entry]) => {
7921
7921
  setCalendarWidth(entry.contentRect.width);
@@ -8024,7 +8024,7 @@ function BookingForm({
8024
8024
  subtitle = "Free enquiry \u2013 no commitment",
8025
8025
  className
8026
8026
  }) {
8027
- const [values, setValues] = React31.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8027
+ const [values, setValues] = React32.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8028
8028
  const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8029
8029
  const handleSubmit = (e) => {
8030
8030
  e.preventDefault();
@@ -8592,11 +8592,11 @@ function FloatingTextarea({
8592
8592
  }
8593
8593
  function SelectField({ field, value, onChange, error, disabled }) {
8594
8594
  var _a, _b, _c;
8595
- const [open, setOpen] = React31.useState(false);
8596
- const containerRef = React31.useRef(null);
8595
+ const [open, setOpen] = React32.useState(false);
8596
+ const containerRef = React32.useRef(null);
8597
8597
  const options = (_a = field.options) != null ? _a : [];
8598
8598
  const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
8599
- React31.useEffect(() => {
8599
+ React32.useEffect(() => {
8600
8600
  if (!open) return;
8601
8601
  const handleOutside = (e) => {
8602
8602
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -9064,11 +9064,11 @@ function RegistrationForm({
9064
9064
  readOnly = false
9065
9065
  }) {
9066
9066
  var _a;
9067
- const L = React31.useMemo(
9067
+ const L = React32.useMemo(
9068
9068
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
9069
9069
  [labels]
9070
9070
  );
9071
- const sortedFields = React31.useMemo(
9071
+ const sortedFields = React32.useMemo(
9072
9072
  () => [...fields].sort((a, b) => {
9073
9073
  var _a2, _b;
9074
9074
  return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
@@ -9076,7 +9076,7 @@ function RegistrationForm({
9076
9076
  [fields]
9077
9077
  );
9078
9078
  const isControlled = values !== void 0;
9079
- const [internal, setInternal] = React31.useState(
9079
+ const [internal, setInternal] = React32.useState(
9080
9080
  () => initializeValues(
9081
9081
  sortedFields,
9082
9082
  defaultValues != null ? defaultValues : {},
@@ -9084,9 +9084,9 @@ function RegistrationForm({
9084
9084
  includeTerms
9085
9085
  )
9086
9086
  );
9087
- const [submitAttempted, setSubmitAttempted] = React31.useState(false);
9088
- const [validationErrors, setValidationErrors] = React31.useState({});
9089
- React31.useEffect(() => {
9087
+ const [submitAttempted, setSubmitAttempted] = React32.useState(false);
9088
+ const [validationErrors, setValidationErrors] = React32.useState({});
9089
+ React32.useEffect(() => {
9090
9090
  if (isControlled) return;
9091
9091
  setInternal((prev) => {
9092
9092
  const next = initializeValues(
@@ -9143,7 +9143,7 @@ function RegistrationForm({
9143
9143
  const termsError = submitAttempted && termsEnabled && !termsAccepted;
9144
9144
  const firstErrorFieldId = Object.keys(fieldErrors)[0];
9145
9145
  const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
9146
- React31.useEffect(() => {
9146
+ React32.useEffect(() => {
9147
9147
  if (!submitAttempted || !scrollTargetId) return;
9148
9148
  const timer = setTimeout(() => {
9149
9149
  const elem = document.getElementById(scrollTargetId);
@@ -9596,6 +9596,281 @@ function RegistrationSuccessCard({
9596
9596
  }
9597
9597
  );
9598
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
+ }
9599
9874
  var OTPCodeInput = ({
9600
9875
  value,
9601
9876
  onChange,
@@ -9607,10 +9882,10 @@ var OTPCodeInput = ({
9607
9882
  id,
9608
9883
  required
9609
9884
  }) => {
9610
- const baseId = id != null ? id : React31.useId();
9611
- const inputRef = React31.useRef(null);
9612
- const [focused, setFocused] = React31.useState(false);
9613
- 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(() => {
9614
9889
  const arr = value.split("").slice(0, length);
9615
9890
  while (arr.length < length) arr.push("");
9616
9891
  return arr;
@@ -9723,7 +9998,7 @@ function Checkbox(_a) {
9723
9998
  })
9724
9999
  );
9725
10000
  }
9726
- var AccordionVariantContext = React31.createContext("default");
10001
+ var AccordionVariantContext = React32.createContext("default");
9727
10002
  function Accordion(_a) {
9728
10003
  var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
9729
10004
  return /* @__PURE__ */ jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(
@@ -9741,7 +10016,7 @@ function Accordion(_a) {
9741
10016
  }
9742
10017
  function AccordionItem(_a) {
9743
10018
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
9744
- const variant = React31.useContext(AccordionVariantContext);
10019
+ const variant = React32.useContext(AccordionVariantContext);
9745
10020
  return /* @__PURE__ */ jsx(
9746
10021
  Accordion$1.Item,
9747
10022
  __spreadValues({
@@ -9762,7 +10037,7 @@ function AccordionTrigger(_a) {
9762
10037
  "className",
9763
10038
  "children"
9764
10039
  ]);
9765
- const variant = React31.useContext(AccordionVariantContext);
10040
+ const variant = React32.useContext(AccordionVariantContext);
9766
10041
  return /* @__PURE__ */ jsx(Accordion$1.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
9767
10042
  Accordion$1.Trigger,
9768
10043
  __spreadProps(__spreadValues({
@@ -9816,7 +10091,7 @@ function AccordionContent(_a) {
9816
10091
  "className",
9817
10092
  "children"
9818
10093
  ]);
9819
- const variant = React31.useContext(AccordionVariantContext);
10094
+ const variant = React32.useContext(AccordionVariantContext);
9820
10095
  return /* @__PURE__ */ jsx(
9821
10096
  Accordion$1.Panel,
9822
10097
  __spreadProps(__spreadValues({
@@ -10034,15 +10309,15 @@ function FilterPanel({
10034
10309
  onSortChange
10035
10310
  }) {
10036
10311
  var _a, _b;
10037
- const resolvedGroups = React31.useMemo(() => resolveGroups(groups), [groups]);
10038
- const [internalValue, setInternalValue] = React31.useState(
10312
+ const resolvedGroups = React32.useMemo(() => resolveGroups(groups), [groups]);
10313
+ const [internalValue, setInternalValue] = React32.useState(
10039
10314
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
10040
10315
  );
10041
10316
  const selected = value != null ? value : internalValue;
10042
- const [expandedItems, setExpandedItems] = React31.useState(
10317
+ const [expandedItems, setExpandedItems] = React32.useState(
10043
10318
  () => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
10044
10319
  );
10045
- const toggleExpanded = React31.useCallback((id) => {
10320
+ const toggleExpanded = React32.useCallback((id) => {
10046
10321
  setExpandedItems((prev) => {
10047
10322
  const next = new Set(prev);
10048
10323
  if (next.has(id)) next.delete(id);
@@ -10426,11 +10701,11 @@ function FilterPanel({
10426
10701
  var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
10427
10702
  function TrustpilotEmbed({ config }) {
10428
10703
  var _a, _b, _c, _d, _e, _f;
10429
- const ref = React31.useRef(null);
10430
- const [widgetReady, setWidgetReady] = React31.useState(false);
10431
- 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);
10432
10707
  const showFallback = delayPassed && !widgetReady;
10433
- React31.useEffect(() => {
10708
+ React32.useEffect(() => {
10434
10709
  var _a2;
10435
10710
  if (typeof document === "undefined" || !ref.current) return;
10436
10711
  const node = ref.current;
@@ -10618,7 +10893,7 @@ function webpVariantUrl(src) {
10618
10893
  return `${withoutQuery}.webp${query}`;
10619
10894
  }
10620
10895
  function PictureLoader() {
10621
- const gradientId = React31.useId();
10896
+ const gradientId = React32.useId();
10622
10897
  return /* @__PURE__ */ jsx(
10623
10898
  "span",
10624
10899
  {
@@ -10688,10 +10963,10 @@ function Picture(_a) {
10688
10963
  "onError"
10689
10964
  ]);
10690
10965
  var _a2;
10691
- const ref = React31.useRef(null);
10692
- const [visible, setVisible] = React31.useState(eager);
10693
- const [loaded, setLoaded] = React31.useState(false);
10694
- 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(() => {
10695
10970
  if (eager || visible) return;
10696
10971
  const el = ref.current;
10697
10972
  if (!el || typeof IntersectionObserver === "undefined") {
@@ -10710,7 +10985,7 @@ function Picture(_a) {
10710
10985
  io.observe(el);
10711
10986
  return () => io.disconnect();
10712
10987
  }, [eager, visible, rootMargin]);
10713
- React31.useEffect(() => {
10988
+ React32.useEffect(() => {
10714
10989
  setLoaded(false);
10715
10990
  }, [src]);
10716
10991
  const webp = webpVariantUrl(src);
@@ -10838,11 +11113,11 @@ function ItineraryModal({
10838
11113
  onNext
10839
11114
  }) {
10840
11115
  var _a, _b, _c;
10841
- const [imgIndex, setImgIndex] = React31.useState(0);
11116
+ const [imgIndex, setImgIndex] = React32.useState(0);
10842
11117
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
10843
11118
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
10844
11119
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
10845
- React31.useEffect(() => {
11120
+ React32.useEffect(() => {
10846
11121
  setImgIndex(0);
10847
11122
  }, [stop == null ? void 0 : stop.dayNumber]);
10848
11123
  if (!stop) return null;
@@ -10969,8 +11244,8 @@ function ItineraryModal({
10969
11244
  ) });
10970
11245
  }
10971
11246
  function Itinerary({ title, subtitle, stops, className }) {
10972
- const [activeIndex, setActiveIndex] = React31.useState(null);
10973
- const scrollRef = React31.useRef(null);
11247
+ const [activeIndex, setActiveIndex] = React32.useState(null);
11248
+ const scrollRef = React32.useRef(null);
10974
11249
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
10975
11250
  const scrollBy = (dir) => {
10976
11251
  if (!scrollRef.current) return;
@@ -11062,18 +11337,18 @@ function Lightbox({
11062
11337
  onClose
11063
11338
  }) {
11064
11339
  var _a;
11065
- const [index, setIndex] = React31.useState(initialIndex);
11340
+ const [index, setIndex] = React32.useState(initialIndex);
11066
11341
  const total = photos.length;
11067
11342
  const photo = photos[index];
11068
- const prev = React31.useCallback(
11343
+ const prev = React32.useCallback(
11069
11344
  () => setIndex((i) => (i - 1 + total) % total),
11070
11345
  [total]
11071
11346
  );
11072
- const next = React31.useCallback(
11347
+ const next = React32.useCallback(
11073
11348
  () => setIndex((i) => (i + 1) % total),
11074
11349
  [total]
11075
11350
  );
11076
- React31.useEffect(() => {
11351
+ React32.useEffect(() => {
11077
11352
  const onKey = (e) => {
11078
11353
  if (e.key === "Escape") onClose();
11079
11354
  if (e.key === "ArrowLeft") prev();
@@ -11241,7 +11516,7 @@ function GridGallery({
11241
11516
  initialVisible,
11242
11517
  onOpen
11243
11518
  }) {
11244
- const [expanded, setExpanded] = React31.useState(false);
11519
+ const [expanded, setExpanded] = React32.useState(false);
11245
11520
  const cols = gridCols(photos.length);
11246
11521
  const hasMore = photos.length > initialVisible;
11247
11522
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -11271,7 +11546,7 @@ function CompactGridGallery({
11271
11546
  initialVisible,
11272
11547
  onOpen
11273
11548
  }) {
11274
- const [expanded, setExpanded] = React31.useState(false);
11549
+ const [expanded, setExpanded] = React32.useState(false);
11275
11550
  const hasMore = photos.length > initialVisible;
11276
11551
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
11277
11552
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -11300,7 +11575,7 @@ function MasonryGallery({
11300
11575
  initialVisible,
11301
11576
  onOpen
11302
11577
  }) {
11303
- const [expanded, setExpanded] = React31.useState(false);
11578
+ const [expanded, setExpanded] = React32.useState(false);
11304
11579
  const hasMore = photos.length > initialVisible;
11305
11580
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
11306
11581
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -11373,7 +11648,7 @@ function FeaturedGallery({
11373
11648
  photos,
11374
11649
  onOpen
11375
11650
  }) {
11376
- const [expanded, setExpanded] = React31.useState(false);
11651
+ const [expanded, setExpanded] = React32.useState(false);
11377
11652
  const featured = photos.slice(0, 3);
11378
11653
  const extra = photos.slice(3);
11379
11654
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -11571,9 +11846,9 @@ function PhotoGallery({
11571
11846
  onPhotoClick,
11572
11847
  className
11573
11848
  }) {
11574
- const [lightboxIndex, setLightboxIndex] = React31.useState(null);
11575
- const [carouselIndex, setCarouselIndex] = React31.useState(0);
11576
- 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]);
11577
11852
  const handleOpen = (index) => {
11578
11853
  setLightboxIndex(index);
11579
11854
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
@@ -11659,7 +11934,7 @@ function ItineraryDay({
11659
11934
  photoLayout = "rounded",
11660
11935
  className
11661
11936
  }) {
11662
- const photoList = React31.useMemo(() => normalisePhotos(photos), [photos]);
11937
+ const photoList = React32.useMemo(() => normalisePhotos(photos), [photos]);
11663
11938
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
11664
11939
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
11665
11940
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsx(
@@ -11714,8 +11989,8 @@ function MenuTrip({
11714
11989
  bold = true,
11715
11990
  className
11716
11991
  }) {
11717
- const scrollRef = React31.useRef(null);
11718
- React31.useEffect(() => {
11992
+ const scrollRef = React32.useRef(null);
11993
+ React32.useEffect(() => {
11719
11994
  if (!scrollRef.current || !activeSection) return;
11720
11995
  const container = scrollRef.current;
11721
11996
  const btn = container.querySelector(
@@ -11911,8 +12186,8 @@ function PricingTrip({
11911
12186
  className
11912
12187
  }) {
11913
12188
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
11914
- const [showEstimates, setShowEstimates] = React31.useState(false);
11915
- const [showPriceInfo, setShowPriceInfo] = React31.useState(false);
12189
+ const [showEstimates, setShowEstimates] = React32.useState(false);
12190
+ const [showPriceInfo, setShowPriceInfo] = React32.useState(false);
11916
12191
  if (variant === "compact") {
11917
12192
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
11918
12193
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -12352,14 +12627,14 @@ function SiteHeader({
12352
12627
  }) {
12353
12628
  const t = VARIANT[variant];
12354
12629
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
12355
- const [openMenu, setOpenMenu] = React31.useState(null);
12356
- const [langOpen, setLangOpen] = React31.useState(false);
12357
- const [mobileOpen, setMobileOpen] = React31.useState(false);
12358
- const [openMobileSection, setOpenMobileSection] = React31.useState(null);
12359
- 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);
12360
12635
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
12361
- const menuCloseTimer = React31.useRef(void 0);
12362
- const langCloseTimer = React31.useRef(void 0);
12636
+ const menuCloseTimer = React32.useRef(void 0);
12637
+ const langCloseTimer = React32.useRef(void 0);
12363
12638
  const handleMenuEnter = (label) => {
12364
12639
  clearTimeout(menuCloseTimer.current);
12365
12640
  setOpenMenu(label);
@@ -12380,7 +12655,7 @@ function SiteHeader({
12380
12655
  setOpenMenu(null);
12381
12656
  setLangOpen(false);
12382
12657
  };
12383
- React31.useEffect(() => () => {
12658
+ React32.useEffect(() => () => {
12384
12659
  clearTimeout(menuCloseTimer.current);
12385
12660
  clearTimeout(langCloseTimer.current);
12386
12661
  }, []);
@@ -12656,7 +12931,7 @@ function SiteHeader({
12656
12931
  ), children: [
12657
12932
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
12658
12933
  const isActive = lang.code === activeLang;
12659
- return /* @__PURE__ */ jsxs(React31.Fragment, { children: [
12934
+ return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
12660
12935
  i > 0 && /* @__PURE__ */ jsx("span", { className: cn(
12661
12936
  "text-xs select-none",
12662
12937
  variant === "white" ? "text-border" : "text-white/15"
@@ -12718,8 +12993,8 @@ function SiteHeader({
12718
12993
  );
12719
12994
  }
12720
12995
  function ThemeToggle({ className }) {
12721
- const [dark, setDark] = React31.useState(false);
12722
- React31.useEffect(() => {
12996
+ const [dark, setDark] = React32.useState(false);
12997
+ React32.useEffect(() => {
12723
12998
  const saved = localStorage.getItem("theme");
12724
12999
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
12725
13000
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -12769,7 +13044,7 @@ var chipVariants = cva(
12769
13044
  }
12770
13045
  }
12771
13046
  );
12772
- var Chip = React31.forwardRef(function Chip2(_a, ref) {
13047
+ var Chip = React32.forwardRef(function Chip2(_a, ref) {
12773
13048
  var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
12774
13049
  const classes = cn(chipVariants({ variant, size }), className);
12775
13050
  if (href) {
@@ -12871,7 +13146,7 @@ function TripCardEditorial(props) {
12871
13146
  tag,
12872
13147
  tagHref
12873
13148
  } = props;
12874
- const [internalFav, setInternalFav] = React31.useState(false);
13149
+ const [internalFav, setInternalFav] = React32.useState(false);
12875
13150
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
12876
13151
  const handleFav = (e) => {
12877
13152
  e.preventDefault();
@@ -13382,7 +13657,7 @@ function BlogPost({
13382
13657
  ) }),
13383
13658
  /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
13384
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: [
13385
- 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: [
13386
13661
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13387
13662
  crumb.href ? /* @__PURE__ */ jsx(
13388
13663
  "a",
@@ -13436,7 +13711,7 @@ function BlogPost({
13436
13711
  ] });
13437
13712
  }
13438
13713
  function useHlsVideo(videoRef, src) {
13439
- React31.useEffect(() => {
13714
+ React32.useEffect(() => {
13440
13715
  if (!src || !videoRef.current) return;
13441
13716
  const video = videoRef.current;
13442
13717
  if (!src.includes(".m3u8")) return;
@@ -13480,11 +13755,11 @@ function TripHeader({
13480
13755
  className
13481
13756
  }) {
13482
13757
  var _a;
13483
- const [heroIndex, setHeroIndex] = React31.useState(0);
13484
- const [videoReady, setVideoReady] = React31.useState(false);
13485
- 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);
13486
13761
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
13487
- const validImages = React31.useMemo(
13762
+ const validImages = React32.useMemo(
13488
13763
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
13489
13764
  [images]
13490
13765
  );
@@ -13499,7 +13774,7 @@ function TripHeader({
13499
13774
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
13500
13775
  const hasMeta = !!(destination || duration);
13501
13776
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13502
- React31.useEffect(() => {
13777
+ React32.useEffect(() => {
13503
13778
  if (!videoUrl) return;
13504
13779
  const el = videoRef.current;
13505
13780
  if (!el) return;
@@ -13642,7 +13917,7 @@ function TripHeader({
13642
13917
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
13643
13918
  ),
13644
13919
  children: [
13645
- 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: [
13646
13921
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13647
13922
  /* @__PURE__ */ jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
13648
13923
  ] }, i)) }),
@@ -13808,10 +14083,10 @@ function LanguagePicker({
13808
14083
  }) {
13809
14084
  var _a;
13810
14085
  const t = VARIANT2[variant];
13811
- const [open, setOpen] = React31.useState(false);
13812
- const ref = React31.useRef(null);
14086
+ const [open, setOpen] = React32.useState(false);
14087
+ const ref = React32.useRef(null);
13813
14088
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
13814
- React31.useEffect(() => {
14089
+ React32.useEffect(() => {
13815
14090
  if (!open) return;
13816
14091
  const onDocClick = (e) => {
13817
14092
  if (ref.current && !ref.current.contains(e.target)) {
@@ -14012,7 +14287,7 @@ function SiteFooter({
14012
14287
  children: wrapper
14013
14288
  },
14014
14289
  b.alt + i
14015
- ) : /* @__PURE__ */ jsx(React31.Fragment, { children: wrapper }, b.alt + i);
14290
+ ) : /* @__PURE__ */ jsx(React32.Fragment, { children: wrapper }, b.alt + i);
14016
14291
  }) })
14017
14292
  ] }),
14018
14293
  themes.length > 0 && /* @__PURE__ */ jsxs("div", { className: "lg:col-span-3", children: [
@@ -14187,10 +14462,10 @@ function TripPage({
14187
14462
  className
14188
14463
  }) {
14189
14464
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
14190
- const [activeSection, setActiveSection] = React31.useState("");
14191
- const [accordionValue, setAccordionValue] = React31.useState([]);
14192
- const [faqsExpanded, setFaqsExpanded] = React31.useState(false);
14193
- 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(
14194
14469
  () => /* @__PURE__ */ new Set([
14195
14470
  "when-it-operates",
14196
14471
  "how-to-get-there",
@@ -14204,18 +14479,18 @@ function TripPage({
14204
14479
  ]),
14205
14480
  []
14206
14481
  );
14207
- const [navFloating, setNavFloating] = React31.useState(false);
14208
- const [navHidden, setNavHidden] = React31.useState(false);
14209
- const [isFloating, setIsFloating] = React31.useState(false);
14210
- const [sidebarPos, setSidebarPos] = React31.useState(null);
14211
- const [pricingBarVisible, setPricingBarVisible] = React31.useState(false);
14212
- const navRef = React31.useRef(null);
14213
- const navSentinelRef = React31.useRef(null);
14214
- const sentinelRef = React31.useRef(null);
14215
- const sidebarPlaceholderRef = React31.useRef(null);
14216
- const pricingBarRef = React31.useRef(null);
14217
- const galleryRef = React31.useRef(null);
14218
- 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(
14219
14494
  () => {
14220
14495
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
14221
14496
  return [
@@ -14237,7 +14512,7 @@ function TripPage({
14237
14512
  // eslint-disable-next-line react-hooks/exhaustive-deps
14238
14513
  []
14239
14514
  );
14240
- React31.useEffect(() => {
14515
+ React32.useEffect(() => {
14241
14516
  const sentinel = navSentinelRef.current;
14242
14517
  if (!sentinel) return;
14243
14518
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -14245,7 +14520,7 @@ function TripPage({
14245
14520
  update();
14246
14521
  return () => document.removeEventListener("scroll", update, { capture: true });
14247
14522
  }, []);
14248
- React31.useEffect(() => {
14523
+ React32.useEffect(() => {
14249
14524
  const sentinel = sentinelRef.current;
14250
14525
  if (!sentinel) return;
14251
14526
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -14253,7 +14528,7 @@ function TripPage({
14253
14528
  update();
14254
14529
  return () => document.removeEventListener("scroll", update, { capture: true });
14255
14530
  }, []);
14256
- React31.useEffect(() => {
14531
+ React32.useEffect(() => {
14257
14532
  const measure = () => {
14258
14533
  if (!sidebarPlaceholderRef.current) return;
14259
14534
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -14263,7 +14538,7 @@ function TripPage({
14263
14538
  window.addEventListener("resize", measure);
14264
14539
  return () => window.removeEventListener("resize", measure);
14265
14540
  }, [isFloating]);
14266
- React31.useEffect(() => {
14541
+ React32.useEffect(() => {
14267
14542
  const check = () => {
14268
14543
  var _a2;
14269
14544
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -14274,7 +14549,7 @@ function TripPage({
14274
14549
  check();
14275
14550
  return () => document.removeEventListener("scroll", check, { capture: true });
14276
14551
  }, []);
14277
- React31.useEffect(() => {
14552
+ React32.useEffect(() => {
14278
14553
  const check = () => {
14279
14554
  if (!pricingBarRef.current) return;
14280
14555
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -14283,7 +14558,7 @@ function TripPage({
14283
14558
  check();
14284
14559
  return () => document.removeEventListener("scroll", check, { capture: true });
14285
14560
  }, []);
14286
- React31.useEffect(() => {
14561
+ React32.useEffect(() => {
14287
14562
  if (sections.length === 0) return;
14288
14563
  setActiveSection(sections[0].id);
14289
14564
  const update = () => {
@@ -14758,7 +15033,7 @@ function TripPage({
14758
15033
  }
14759
15034
  );
14760
15035
  }
14761
- function SectionHeading({
15036
+ function SectionHeading2({
14762
15037
  eyebrow,
14763
15038
  title,
14764
15039
  rightSlot
@@ -14808,11 +15083,11 @@ function CategoryPage2({
14808
15083
  className
14809
15084
  }) {
14810
15085
  var _a;
14811
- const [videoReady, setVideoReady] = React31.useState(false);
14812
- const videoRef = React31.useRef(null);
15086
+ const [videoReady, setVideoReady] = React32.useState(false);
15087
+ const videoRef = React32.useRef(null);
14813
15088
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
14814
15089
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
14815
- React31.useEffect(() => {
15090
+ React32.useEffect(() => {
14816
15091
  if (!videoUrl) return;
14817
15092
  const el = videoRef.current;
14818
15093
  if (!el) return;
@@ -14827,13 +15102,13 @@ function CategoryPage2({
14827
15102
  io.observe(el);
14828
15103
  return () => io.disconnect();
14829
15104
  }, [videoUrl]);
14830
- const [faqsExpanded, setFaqsExpanded] = React31.useState(false);
14831
- const [tripsExpanded, setTripsExpanded] = React31.useState(false);
14832
- const [filterValue, setFilterValue] = React31.useState({});
14833
- 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(
14834
15109
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
14835
15110
  );
14836
- const sortedTrips = React31.useMemo(() => {
15111
+ const sortedTrips = React32.useMemo(() => {
14837
15112
  const active = Object.entries(filterValue).filter(
14838
15113
  ([, vals]) => vals && vals.length > 0
14839
15114
  );
@@ -14937,7 +15212,7 @@ function CategoryPage2({
14937
15212
  /* @__PURE__ */ jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
14938
15213
  breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
14939
15214
  const isLast = i === breadcrumb.length - 1;
14940
- return /* @__PURE__ */ jsxs(React31.Fragment, { children: [
15215
+ return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
14941
15216
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
14942
15217
  crumb.href && !isLast ? /* @__PURE__ */ jsx(
14943
15218
  "a",
@@ -14967,7 +15242,7 @@ function CategoryPage2({
14967
15242
  ),
14968
15243
  popularTours && popularTours.length > 0 && /* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: [
14969
15244
  /* @__PURE__ */ jsx(
14970
- SectionHeading,
15245
+ SectionHeading2,
14971
15246
  {
14972
15247
  eyebrow: popularToursEyebrow,
14973
15248
  title: popularToursTitle
@@ -14987,7 +15262,7 @@ function CategoryPage2({
14987
15262
  }) }) })
14988
15263
  ] }),
14989
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: [
14990
- (tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsx(SectionHeading, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
15265
+ (tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
14991
15266
  filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(
14992
15267
  FilterPanel,
14993
15268
  {
@@ -15225,12 +15500,12 @@ function Toast({
15225
15500
  duration = 6e3,
15226
15501
  className
15227
15502
  }) {
15228
- const [mounted, setMounted] = React31.useState(false);
15229
- const [visible, setVisible] = React31.useState(true);
15230
- React31.useEffect(() => {
15503
+ const [mounted, setMounted] = React32.useState(false);
15504
+ const [visible, setVisible] = React32.useState(true);
15505
+ React32.useEffect(() => {
15231
15506
  setMounted(true);
15232
15507
  }, []);
15233
- React31.useEffect(() => {
15508
+ React32.useEffect(() => {
15234
15509
  if (duration === 0) return;
15235
15510
  const t = setTimeout(() => {
15236
15511
  setVisible(false);
@@ -16732,8 +17007,8 @@ function ShareWidget({
16732
17007
  title = "Invite friends & lower the price",
16733
17008
  className
16734
17009
  }) {
16735
- const [copied, setCopied] = React31.useState(false);
16736
- const [showToast, setShowToast] = React31.useState(false);
17010
+ const [copied, setCopied] = React32.useState(false);
17011
+ const [showToast, setShowToast] = React32.useState(false);
16737
17012
  const encodedUrl = encodeURIComponent(url);
16738
17013
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
16739
17014
  const channels = [
@@ -16883,6 +17158,6 @@ function StickyBookingCard({
16883
17158
  );
16884
17159
  }
16885
17160
 
16886
- 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 };
16887
17162
  //# sourceMappingURL=index.js.map
16888
17163
  //# sourceMappingURL=index.js.map