@planetaexo/design-system 0.56.0 → 0.57.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var React29 = require('react');
3
+ var React30 = require('react');
4
4
  var classVarianceAuthority = require('class-variance-authority');
5
5
  var clsx = require('clsx');
6
6
  var tailwindMerge = require('tailwind-merge');
@@ -37,7 +37,7 @@ function _interopNamespace(e) {
37
37
  return Object.freeze(n);
38
38
  }
39
39
 
40
- var React29__namespace = /*#__PURE__*/_interopNamespace(React29);
40
+ var React30__namespace = /*#__PURE__*/_interopNamespace(React30);
41
41
 
42
42
  var __defProp = Object.defineProperty;
43
43
  var __defProps = Object.defineProperties;
@@ -102,7 +102,7 @@ var buttonVariants = classVarianceAuthority.cva(
102
102
  }
103
103
  }
104
104
  );
105
- var Button = React29__namespace.forwardRef(
105
+ var Button = React30__namespace.forwardRef(
106
106
  (_a, ref) => {
107
107
  var _b = _a, { className, variant, size } = _b, props = __objRest(_b, ["className", "variant", "size"]);
108
108
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -331,10 +331,10 @@ function DialogDescription(_a) {
331
331
  }, props)
332
332
  );
333
333
  }
334
- var FloatingInput = React29__namespace.forwardRef(
334
+ var FloatingInput = React30__namespace.forwardRef(
335
335
  (_a, ref) => {
336
336
  var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
337
- const inputId = id != null ? id : React29__namespace.useId();
337
+ const inputId = id != null ? id : React30__namespace.useId();
338
338
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
339
339
  /* @__PURE__ */ jsxRuntime.jsx(
340
340
  "input",
@@ -374,10 +374,10 @@ var FloatingInput = React29__namespace.forwardRef(
374
374
  }
375
375
  );
376
376
  FloatingInput.displayName = "FloatingInput";
377
- var FloatingSelect = React29__namespace.forwardRef(
377
+ var FloatingSelect = React30__namespace.forwardRef(
378
378
  (_a, ref) => {
379
379
  var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
380
- const inputId = id != null ? id : React29__namespace.useId();
380
+ const inputId = id != null ? id : React30__namespace.useId();
381
381
  const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
382
382
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
383
383
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -641,11 +641,11 @@ function PhoneCountrySelect({
641
641
  disabled
642
642
  }) {
643
643
  var _a;
644
- const [open, setOpen] = React29__namespace.useState(false);
645
- const containerRef = React29__namespace.useRef(null);
646
- const listRef = React29__namespace.useRef(null);
644
+ const [open, setOpen] = React30__namespace.useState(false);
645
+ const containerRef = React30__namespace.useRef(null);
646
+ const listRef = React30__namespace.useRef(null);
647
647
  const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
648
- React29__namespace.useEffect(() => {
648
+ React30__namespace.useEffect(() => {
649
649
  if (!open) return;
650
650
  const handler = (e) => {
651
651
  var _a2;
@@ -656,7 +656,7 @@ function PhoneCountrySelect({
656
656
  document.addEventListener("mousedown", handler);
657
657
  return () => document.removeEventListener("mousedown", handler);
658
658
  }, [open]);
659
- React29__namespace.useEffect(() => {
659
+ React30__namespace.useEffect(() => {
660
660
  if (!open || !listRef.current) return;
661
661
  const activeEl = listRef.current.querySelector("[data-selected=true]");
662
662
  activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
@@ -926,8 +926,8 @@ function CalendarDayButton(_a) {
926
926
  "locale"
927
927
  ]);
928
928
  const defaultClassNames = reactDayPicker.getDefaultClassNames();
929
- const ref = React29__namespace.useRef(null);
930
- React29__namespace.useEffect(() => {
929
+ const ref = React30__namespace.useRef(null);
930
+ React30__namespace.useEffect(() => {
931
931
  var _a2;
932
932
  if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
933
933
  }, [modifiers.focused]);
@@ -958,16 +958,16 @@ function BirthDateField({
958
958
  className,
959
959
  disabled
960
960
  }) {
961
- const [open, setOpen] = React29__namespace.useState(false);
962
- const [text, setText] = React29__namespace.useState(
961
+ const [open, setOpen] = React30__namespace.useState(false);
962
+ const [text, setText] = React30__namespace.useState(
963
963
  value ? dateFns.format(value, "dd/MM/yyyy") : ""
964
964
  );
965
- const containerRef = React29__namespace.useRef(null);
966
- const inputId = React29__namespace.useId();
967
- React29__namespace.useEffect(() => {
965
+ const containerRef = React30__namespace.useRef(null);
966
+ const inputId = React30__namespace.useId();
967
+ React30__namespace.useEffect(() => {
968
968
  setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
969
969
  }, [value]);
970
- React29__namespace.useEffect(() => {
970
+ React30__namespace.useEffect(() => {
971
971
  if (!open) return;
972
972
  const handler = (e) => {
973
973
  var _a;
@@ -1176,14 +1176,14 @@ function CountrySearchField({
1176
1176
  }) {
1177
1177
  var _a;
1178
1178
  const list = countries != null ? countries : COUNTRIES;
1179
- const [query, setQuery] = React29__namespace.useState("");
1180
- const [open, setOpen] = React29__namespace.useState(false);
1181
- const containerRef = React29__namespace.useRef(null);
1182
- const searchRef = React29__namespace.useRef(null);
1179
+ const [query, setQuery] = React30__namespace.useState("");
1180
+ const [open, setOpen] = React30__namespace.useState(false);
1181
+ const containerRef = React30__namespace.useRef(null);
1182
+ const searchRef = React30__namespace.useRef(null);
1183
1183
  const selected = list.find((c) => c.code === value);
1184
1184
  const isFloated = open || !!selected;
1185
1185
  const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
1186
- React29__namespace.useEffect(() => {
1186
+ React30__namespace.useEffect(() => {
1187
1187
  if (!open) return;
1188
1188
  const handler = (e) => {
1189
1189
  var _a2;
@@ -1328,10 +1328,10 @@ function AdventureCard({
1328
1328
  }) {
1329
1329
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
1330
1330
  const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
1331
- const [checkedInternal, setCheckedInternal] = React29__namespace.useState(
1331
+ const [checkedInternal, setCheckedInternal] = React30__namespace.useState(
1332
1332
  new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
1333
1333
  );
1334
- const [openDescriptionId, setOpenDescriptionId] = React29__namespace.useState(null);
1334
+ const [openDescriptionId, setOpenDescriptionId] = React30__namespace.useState(null);
1335
1335
  const openDescriptionOptional = openDescriptionId ? (_e = adventure.optionals) == null ? void 0 : _e.find((o) => o.id === openDescriptionId) : void 0;
1336
1336
  const isChecked = (opt) => {
1337
1337
  var _a2;
@@ -1761,7 +1761,7 @@ function BookingShell({
1761
1761
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
1762
1762
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
1763
1763
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
1764
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React29__namespace.Fragment, { children: [
1764
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
1765
1765
  /* @__PURE__ */ jsxRuntime.jsx(
1766
1766
  "span",
1767
1767
  {
@@ -1960,7 +1960,7 @@ function TermsSection({
1960
1960
  termsContent
1961
1961
  }) {
1962
1962
  var _a;
1963
- const [modalOpen, setModalOpen] = React29__namespace.useState(false);
1963
+ const [modalOpen, setModalOpen] = React30__namespace.useState(false);
1964
1964
  const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
1965
1965
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
1966
1966
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
@@ -2098,9 +2098,9 @@ function BookingWizard({
2098
2098
  }) {
2099
2099
  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;
2100
2100
  const wizardSteps = WIZARD_STEPS_FN(labels);
2101
- const [step, setStep] = React29__namespace.useState("responsible");
2102
- const [error, setError] = React29__namespace.useState(null);
2103
- const [responsible, setResponsible] = React29__namespace.useState({
2101
+ const [step, setStep] = React30__namespace.useState("responsible");
2102
+ const [error, setError] = React30__namespace.useState(null);
2103
+ const [responsible, setResponsible] = React30__namespace.useState({
2104
2104
  firstName: "",
2105
2105
  lastName: "",
2106
2106
  email: "",
@@ -2119,7 +2119,7 @@ function BookingWizard({
2119
2119
  return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
2120
2120
  }, 0);
2121
2121
  const totalPax = totalAdults + totalChildren;
2122
- const [travellers, setTravellers] = React29__namespace.useState(
2122
+ const [travellers, setTravellers] = React30__namespace.useState(
2123
2123
  Array.from({ length: Math.max(totalPax, 1) }, () => ({
2124
2124
  firstName: "",
2125
2125
  lastName: "",
@@ -2127,9 +2127,9 @@ function BookingWizard({
2127
2127
  email: ""
2128
2128
  }))
2129
2129
  );
2130
- const [payAmount, setPayAmount] = React29__namespace.useState("full");
2131
- const [payMethod, setPayMethod] = React29__namespace.useState("stripe");
2132
- const [termsAccepted, setTermsAccepted] = React29__namespace.useState(false);
2130
+ const [payAmount, setPayAmount] = React30__namespace.useState("full");
2131
+ const [payMethod, setPayMethod] = React30__namespace.useState("stripe");
2132
+ const [termsAccepted, setTermsAccepted] = React30__namespace.useState(false);
2133
2133
  const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
2134
2134
  const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
2135
2135
  const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
@@ -2357,7 +2357,7 @@ function Offer({
2357
2357
  className
2358
2358
  }) {
2359
2359
  var _a, _b, _c;
2360
- const [showBooking, setShowBooking] = React29__namespace.useState(false);
2360
+ const [showBooking, setShowBooking] = React30__namespace.useState(false);
2361
2361
  const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
2362
2362
  const handleBook = () => {
2363
2363
  if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
@@ -2724,7 +2724,7 @@ function AdventureSection({
2724
2724
  labels
2725
2725
  }) {
2726
2726
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
2727
- const [detailsOpen, setDetailsOpen] = React29__namespace.useState(false);
2727
+ const [detailsOpen, setDetailsOpen] = React30__namespace.useState(false);
2728
2728
  const handleCopyUrl = (url) => {
2729
2729
  if (onCopyFormLink) {
2730
2730
  onCopyFormLink(url);
@@ -3237,8 +3237,8 @@ function AddTravellerDialog({
3237
3237
  errorMessage
3238
3238
  }) {
3239
3239
  var _a, _b, _c, _d, _e;
3240
- const [form, setForm] = React29__namespace.useState(() => createInitialAddFormData(config));
3241
- React29__namespace.useEffect(() => {
3240
+ const [form, setForm] = React30__namespace.useState(() => createInitialAddFormData(config));
3241
+ React30__namespace.useEffect(() => {
3242
3242
  if (open) {
3243
3243
  setForm(createInitialAddFormData(config));
3244
3244
  }
@@ -3298,7 +3298,7 @@ function EditTravellerDialog({
3298
3298
  errorMessage
3299
3299
  }) {
3300
3300
  var _a, _b, _c, _d, _e;
3301
- const [form, setForm] = React29__namespace.useState(() => ({
3301
+ const [form, setForm] = React30__namespace.useState(() => ({
3302
3302
  firstName: "",
3303
3303
  lastName: "",
3304
3304
  email: "",
@@ -3307,7 +3307,7 @@ function EditTravellerDialog({
3307
3307
  birthDate: "",
3308
3308
  personType: "ADULT"
3309
3309
  }));
3310
- React29__namespace.useEffect(() => {
3310
+ React30__namespace.useEffect(() => {
3311
3311
  var _a2, _b2, _c2, _d2, _e2, _f;
3312
3312
  if (open && traveller) {
3313
3313
  setForm({
@@ -3643,48 +3643,48 @@ function BookingDetails({
3643
3643
  const hasSubmitAddTraveller = !!onSubmitAddTraveller;
3644
3644
  const hasSubmitEditTraveller = !!onSubmitEditTraveller;
3645
3645
  const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
3646
- const [addModalState, setAddModalState] = React29__namespace.useState({
3646
+ const [addModalState, setAddModalState] = React30__namespace.useState({
3647
3647
  open: false,
3648
3648
  adventureId: null
3649
3649
  });
3650
- const [editModalState, setEditModalState] = React29__namespace.useState({ open: false, adventureId: null, traveller: null });
3651
- const [deleteModalState, setDeleteModalState] = React29__namespace.useState({ open: false, adventureId: null, traveller: null });
3652
- const [resendInviteDialogState, setResendInviteDialogState] = React29__namespace.useState({ open: false, traveller: null });
3653
- const handleRequestOpenAddModal = React29__namespace.useCallback((adventureId) => {
3650
+ const [editModalState, setEditModalState] = React30__namespace.useState({ open: false, adventureId: null, traveller: null });
3651
+ const [deleteModalState, setDeleteModalState] = React30__namespace.useState({ open: false, adventureId: null, traveller: null });
3652
+ const [resendInviteDialogState, setResendInviteDialogState] = React30__namespace.useState({ open: false, traveller: null });
3653
+ const handleRequestOpenAddModal = React30__namespace.useCallback((adventureId) => {
3654
3654
  setAddModalState({ open: true, adventureId });
3655
3655
  }, []);
3656
- const handleRequestOpenEditModal = React29__namespace.useCallback(
3656
+ const handleRequestOpenEditModal = React30__namespace.useCallback(
3657
3657
  (adventureId, traveller) => {
3658
3658
  setEditModalState({ open: true, adventureId, traveller });
3659
3659
  },
3660
3660
  []
3661
3661
  );
3662
- const handleRequestOpenDeleteModal = React29__namespace.useCallback(
3662
+ const handleRequestOpenDeleteModal = React30__namespace.useCallback(
3663
3663
  (adventureId, traveller) => {
3664
3664
  setDeleteModalState({ open: true, adventureId, traveller });
3665
3665
  },
3666
3666
  []
3667
3667
  );
3668
- const handleRequestOpenResendInviteDialog = React29__namespace.useCallback(
3668
+ const handleRequestOpenResendInviteDialog = React30__namespace.useCallback(
3669
3669
  (traveller) => {
3670
3670
  setResendInviteDialogState({ open: true, traveller });
3671
3671
  },
3672
3672
  []
3673
3673
  );
3674
- const closeAddModal = React29__namespace.useCallback(() => {
3674
+ const closeAddModal = React30__namespace.useCallback(() => {
3675
3675
  setAddModalState({ open: false, adventureId: null });
3676
3676
  }, []);
3677
- const closeEditModal = React29__namespace.useCallback(() => {
3677
+ const closeEditModal = React30__namespace.useCallback(() => {
3678
3678
  setEditModalState({ open: false, adventureId: null, traveller: null });
3679
3679
  }, []);
3680
- const closeDeleteModal = React29__namespace.useCallback(() => {
3680
+ const closeDeleteModal = React30__namespace.useCallback(() => {
3681
3681
  setDeleteModalState({ open: false, adventureId: null, traveller: null });
3682
3682
  }, []);
3683
- const closeResendInviteDialog = React29__namespace.useCallback(() => {
3683
+ const closeResendInviteDialog = React30__namespace.useCallback(() => {
3684
3684
  setResendInviteDialogState({ open: false, traveller: null });
3685
3685
  }, []);
3686
- const submitInFlightRef = React29__namespace.useRef(false);
3687
- const handleAddSubmit = React29__namespace.useCallback(
3686
+ const submitInFlightRef = React30__namespace.useRef(false);
3687
+ const handleAddSubmit = React30__namespace.useCallback(
3688
3688
  async (adventureId, data) => {
3689
3689
  if (!onSubmitAddTraveller) return;
3690
3690
  if (submitInFlightRef.current) return;
@@ -3699,7 +3699,7 @@ function BookingDetails({
3699
3699
  },
3700
3700
  [onSubmitAddTraveller, closeAddModal]
3701
3701
  );
3702
- const handleEditSubmit = React29__namespace.useCallback(
3702
+ const handleEditSubmit = React30__namespace.useCallback(
3703
3703
  async (adventureId, travellerId, data) => {
3704
3704
  if (!onSubmitEditTraveller) return;
3705
3705
  if (submitInFlightRef.current) return;
@@ -3714,7 +3714,7 @@ function BookingDetails({
3714
3714
  },
3715
3715
  [onSubmitEditTraveller, closeEditModal]
3716
3716
  );
3717
- const handleDeleteConfirm = React29__namespace.useCallback(
3717
+ const handleDeleteConfirm = React30__namespace.useCallback(
3718
3718
  async (adventureId, travellerId) => {
3719
3719
  if (!onConfirmRemoveTraveller) return;
3720
3720
  if (submitInFlightRef.current) return;
@@ -5290,7 +5290,7 @@ function BookingCreatedEmail({
5290
5290
  }, children: i + 1 }) }),
5291
5291
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
5292
5292
  ] }) }) }, i)) }),
5293
- nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxRuntime.jsxs(React29__namespace.Fragment, { children: [
5293
+ nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
5294
5294
  idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
5295
5295
  idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
5296
5296
  ] }, idx)) })
@@ -7310,11 +7310,11 @@ function DatePickerField({
7310
7310
  fromDate,
7311
7311
  className
7312
7312
  }) {
7313
- const [open, setOpen] = React29__namespace.useState(false);
7314
- const containerRef = React29__namespace.useRef(null);
7315
- const [calendarWidth, setCalendarWidth] = React29__namespace.useState();
7313
+ const [open, setOpen] = React30__namespace.useState(false);
7314
+ const containerRef = React30__namespace.useRef(null);
7315
+ const [calendarWidth, setCalendarWidth] = React30__namespace.useState();
7316
7316
  const hasValue = !!value;
7317
- React29__namespace.useEffect(() => {
7317
+ React30__namespace.useEffect(() => {
7318
7318
  if (!containerRef.current) return;
7319
7319
  const observer = new ResizeObserver(([entry]) => {
7320
7320
  setCalendarWidth(entry.contentRect.width);
@@ -7423,7 +7423,7 @@ function BookingForm({
7423
7423
  subtitle = "Free enquiry \u2013 no commitment",
7424
7424
  className
7425
7425
  }) {
7426
- const [values, setValues] = React29__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
7426
+ const [values, setValues] = React30__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
7427
7427
  const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
7428
7428
  const handleSubmit = (e) => {
7429
7429
  e.preventDefault();
@@ -7991,11 +7991,11 @@ function FloatingTextarea({
7991
7991
  }
7992
7992
  function SelectField({ field, value, onChange, error, disabled }) {
7993
7993
  var _a, _b, _c;
7994
- const [open, setOpen] = React29__namespace.useState(false);
7995
- const containerRef = React29__namespace.useRef(null);
7994
+ const [open, setOpen] = React30__namespace.useState(false);
7995
+ const containerRef = React30__namespace.useRef(null);
7996
7996
  const options = (_a = field.options) != null ? _a : [];
7997
7997
  const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
7998
- React29__namespace.useEffect(() => {
7998
+ React30__namespace.useEffect(() => {
7999
7999
  if (!open) return;
8000
8000
  const handleOutside = (e) => {
8001
8001
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -8460,11 +8460,11 @@ function RegistrationForm({
8460
8460
  readOnly = false
8461
8461
  }) {
8462
8462
  var _a;
8463
- const L = React29__namespace.useMemo(
8463
+ const L = React30__namespace.useMemo(
8464
8464
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
8465
8465
  [labels]
8466
8466
  );
8467
- const sortedFields = React29__namespace.useMemo(
8467
+ const sortedFields = React30__namespace.useMemo(
8468
8468
  () => [...fields].sort((a, b) => {
8469
8469
  var _a2, _b;
8470
8470
  return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
@@ -8472,7 +8472,7 @@ function RegistrationForm({
8472
8472
  [fields]
8473
8473
  );
8474
8474
  const isControlled = values !== void 0;
8475
- const [internal, setInternal] = React29__namespace.useState(
8475
+ const [internal, setInternal] = React30__namespace.useState(
8476
8476
  () => initializeValues(
8477
8477
  sortedFields,
8478
8478
  defaultValues != null ? defaultValues : {},
@@ -8480,9 +8480,9 @@ function RegistrationForm({
8480
8480
  includeTerms
8481
8481
  )
8482
8482
  );
8483
- const [submitAttempted, setSubmitAttempted] = React29__namespace.useState(false);
8484
- const [validationErrors, setValidationErrors] = React29__namespace.useState({});
8485
- React29__namespace.useEffect(() => {
8483
+ const [submitAttempted, setSubmitAttempted] = React30__namespace.useState(false);
8484
+ const [validationErrors, setValidationErrors] = React30__namespace.useState({});
8485
+ React30__namespace.useEffect(() => {
8486
8486
  if (isControlled) return;
8487
8487
  setInternal((prev) => {
8488
8488
  const next = initializeValues(
@@ -8539,7 +8539,7 @@ function RegistrationForm({
8539
8539
  const termsError = submitAttempted && termsEnabled && !termsAccepted;
8540
8540
  const firstErrorFieldId = Object.keys(fieldErrors)[0];
8541
8541
  const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
8542
- React29__namespace.useEffect(() => {
8542
+ React30__namespace.useEffect(() => {
8543
8543
  if (!submitAttempted || !scrollTargetId) return;
8544
8544
  const timer = setTimeout(() => {
8545
8545
  const elem = document.getElementById(scrollTargetId);
@@ -9001,10 +9001,10 @@ var OTPCodeInput = ({
9001
9001
  id,
9002
9002
  required
9003
9003
  }) => {
9004
- const baseId = id != null ? id : React29__namespace.useId();
9005
- const inputRef = React29__namespace.useRef(null);
9006
- const [focused, setFocused] = React29__namespace.useState(false);
9007
- const digits = React29__namespace.useMemo(() => {
9004
+ const baseId = id != null ? id : React30__namespace.useId();
9005
+ const inputRef = React30__namespace.useRef(null);
9006
+ const [focused, setFocused] = React30__namespace.useState(false);
9007
+ const digits = React30__namespace.useMemo(() => {
9008
9008
  const arr = value.split("").slice(0, length);
9009
9009
  while (arr.length < length) arr.push("");
9010
9010
  return arr;
@@ -9117,7 +9117,7 @@ function Checkbox(_a) {
9117
9117
  })
9118
9118
  );
9119
9119
  }
9120
- var AccordionVariantContext = React29__namespace.createContext("default");
9120
+ var AccordionVariantContext = React30__namespace.createContext("default");
9121
9121
  function Accordion(_a) {
9122
9122
  var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
9123
9123
  return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -9135,7 +9135,7 @@ function Accordion(_a) {
9135
9135
  }
9136
9136
  function AccordionItem(_a) {
9137
9137
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
9138
- const variant = React29__namespace.useContext(AccordionVariantContext);
9138
+ const variant = React30__namespace.useContext(AccordionVariantContext);
9139
9139
  return /* @__PURE__ */ jsxRuntime.jsx(
9140
9140
  accordion.Accordion.Item,
9141
9141
  __spreadValues({
@@ -9156,7 +9156,7 @@ function AccordionTrigger(_a) {
9156
9156
  "className",
9157
9157
  "children"
9158
9158
  ]);
9159
- const variant = React29__namespace.useContext(AccordionVariantContext);
9159
+ const variant = React30__namespace.useContext(AccordionVariantContext);
9160
9160
  return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
9161
9161
  accordion.Accordion.Trigger,
9162
9162
  __spreadProps(__spreadValues({
@@ -9210,7 +9210,7 @@ function AccordionContent(_a) {
9210
9210
  "className",
9211
9211
  "children"
9212
9212
  ]);
9213
- const variant = React29__namespace.useContext(AccordionVariantContext);
9213
+ const variant = React30__namespace.useContext(AccordionVariantContext);
9214
9214
  return /* @__PURE__ */ jsxRuntime.jsx(
9215
9215
  accordion.Accordion.Panel,
9216
9216
  __spreadProps(__spreadValues({
@@ -9428,15 +9428,15 @@ function FilterPanel({
9428
9428
  onSortChange
9429
9429
  }) {
9430
9430
  var _a, _b;
9431
- const resolvedGroups = React29__namespace.useMemo(() => resolveGroups(groups), [groups]);
9432
- const [internalValue, setInternalValue] = React29__namespace.useState(
9431
+ const resolvedGroups = React30__namespace.useMemo(() => resolveGroups(groups), [groups]);
9432
+ const [internalValue, setInternalValue] = React30__namespace.useState(
9433
9433
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
9434
9434
  );
9435
9435
  const selected = value != null ? value : internalValue;
9436
- const [expandedItems, setExpandedItems] = React29__namespace.useState(
9436
+ const [expandedItems, setExpandedItems] = React30__namespace.useState(
9437
9437
  () => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
9438
9438
  );
9439
- const toggleExpanded = React29__namespace.useCallback((id) => {
9439
+ const toggleExpanded = React30__namespace.useCallback((id) => {
9440
9440
  setExpandedItems((prev) => {
9441
9441
  const next = new Set(prev);
9442
9442
  if (next.has(id)) next.delete(id);
@@ -9502,7 +9502,7 @@ function FilterPanel({
9502
9502
  /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "px-0 py-3.5 hover:no-underline transition-colors", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2.5", children: [
9503
9503
  group.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary shrink-0", children: group.icon }),
9504
9504
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold text-foreground font-ui", children: group.label }),
9505
- groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold text-primary-foreground", children: groupSelected.length })
9505
+ groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold leading-none text-primary-foreground", children: groupSelected.length })
9506
9506
  ] }) }),
9507
9507
  /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "px-4 pb-3 pt-1", children: /* @__PURE__ */ jsxRuntime.jsx(
9508
9508
  FilterItemsList,
@@ -9542,7 +9542,7 @@ function FilterPanel({
9542
9542
  children: [
9543
9543
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
9544
9544
  title,
9545
- totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-primary px-1.5 text-[10px] font-bold text-primary-foreground", children: totalSelected })
9545
+ totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-primary px-1.5 text-[10px] font-bold leading-none text-primary-foreground", children: totalSelected })
9546
9546
  ] }),
9547
9547
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SlidersHorizontalIcon, { className: "h-4 w-4 text-foreground" })
9548
9548
  ]
@@ -9663,7 +9663,7 @@ function FilterPanel({
9663
9663
  "span",
9664
9664
  {
9665
9665
  className: cn(
9666
- "inline-flex items-center justify-center rounded-full text-[10px] font-bold px-1.5 min-w-[18px] h-[18px]",
9666
+ "inline-flex items-center justify-center rounded-full text-[10px] font-bold leading-none px-1.5 min-w-[18px] h-[18px]",
9667
9667
  isActive ? "bg-background text-foreground" : "bg-foreground text-background"
9668
9668
  ),
9669
9669
  children: selectedCount
@@ -9766,7 +9766,7 @@ function FilterPanel({
9766
9766
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
9767
9767
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
9768
9768
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-ui", children: title }),
9769
- totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 w-5 items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-foreground", children: totalSelected })
9769
+ totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 w-5 items-center justify-center rounded-full bg-primary text-[10px] font-bold leading-none text-primary-foreground", children: totalSelected })
9770
9770
  ] }),
9771
9771
  /* @__PURE__ */ jsxRuntime.jsx(
9772
9772
  Accordion,
@@ -9785,7 +9785,7 @@ function FilterPanel({
9785
9785
  /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "px-0 py-3.5 hover:no-underline transition-colors", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2.5", children: [
9786
9786
  group.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary shrink-0", children: group.icon }),
9787
9787
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold text-foreground font-ui", children: group.label }),
9788
- groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold text-primary-foreground", children: groupSelected.length })
9788
+ groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold leading-none text-primary-foreground", children: groupSelected.length })
9789
9789
  ] }) }),
9790
9790
  /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "px-4 pb-3 pt-1", children: /* @__PURE__ */ jsxRuntime.jsx(
9791
9791
  FilterItemsList,
@@ -9820,11 +9820,11 @@ function FilterPanel({
9820
9820
  var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
9821
9821
  function TrustpilotEmbed({ config }) {
9822
9822
  var _a, _b, _c, _d, _e, _f;
9823
- const ref = React29__namespace.useRef(null);
9824
- const [widgetReady, setWidgetReady] = React29__namespace.useState(false);
9825
- const [delayPassed, setDelayPassed] = React29__namespace.useState(false);
9823
+ const ref = React30__namespace.useRef(null);
9824
+ const [widgetReady, setWidgetReady] = React30__namespace.useState(false);
9825
+ const [delayPassed, setDelayPassed] = React30__namespace.useState(false);
9826
9826
  const showFallback = delayPassed && !widgetReady;
9827
- React29__namespace.useEffect(() => {
9827
+ React30__namespace.useEffect(() => {
9828
9828
  var _a2;
9829
9829
  if (typeof document === "undefined" || !ref.current) return;
9830
9830
  const node = ref.current;
@@ -10028,9 +10028,9 @@ function Picture(_a) {
10028
10028
  "decoding",
10029
10029
  "loading"
10030
10030
  ]);
10031
- const ref = React29__namespace.useRef(null);
10032
- const [visible, setVisible] = React29__namespace.useState(eager);
10033
- React29__namespace.useEffect(() => {
10031
+ const ref = React30__namespace.useRef(null);
10032
+ const [visible, setVisible] = React30__namespace.useState(eager);
10033
+ React30__namespace.useEffect(() => {
10034
10034
  if (eager || visible) return;
10035
10035
  const el = ref.current;
10036
10036
  if (!el || typeof IntersectionObserver === "undefined") {
@@ -10146,11 +10146,11 @@ function ItineraryModal({
10146
10146
  onNext
10147
10147
  }) {
10148
10148
  var _a, _b, _c;
10149
- const [imgIndex, setImgIndex] = React29__namespace.useState(0);
10149
+ const [imgIndex, setImgIndex] = React30__namespace.useState(0);
10150
10150
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
10151
10151
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
10152
10152
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
10153
- React29__namespace.useEffect(() => {
10153
+ React30__namespace.useEffect(() => {
10154
10154
  setImgIndex(0);
10155
10155
  }, [stop == null ? void 0 : stop.dayNumber]);
10156
10156
  if (!stop) return null;
@@ -10277,8 +10277,8 @@ function ItineraryModal({
10277
10277
  ) });
10278
10278
  }
10279
10279
  function Itinerary({ title, subtitle, stops, className }) {
10280
- const [activeIndex, setActiveIndex] = React29__namespace.useState(null);
10281
- const scrollRef = React29__namespace.useRef(null);
10280
+ const [activeIndex, setActiveIndex] = React30__namespace.useState(null);
10281
+ const scrollRef = React30__namespace.useRef(null);
10282
10282
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
10283
10283
  const scrollBy = (dir) => {
10284
10284
  if (!scrollRef.current) return;
@@ -10370,18 +10370,18 @@ function Lightbox({
10370
10370
  onClose
10371
10371
  }) {
10372
10372
  var _a;
10373
- const [index, setIndex] = React29__namespace.useState(initialIndex);
10373
+ const [index, setIndex] = React30__namespace.useState(initialIndex);
10374
10374
  const total = photos.length;
10375
10375
  const photo = photos[index];
10376
- const prev = React29__namespace.useCallback(
10376
+ const prev = React30__namespace.useCallback(
10377
10377
  () => setIndex((i) => (i - 1 + total) % total),
10378
10378
  [total]
10379
10379
  );
10380
- const next = React29__namespace.useCallback(
10380
+ const next = React30__namespace.useCallback(
10381
10381
  () => setIndex((i) => (i + 1) % total),
10382
10382
  [total]
10383
10383
  );
10384
- React29__namespace.useEffect(() => {
10384
+ React30__namespace.useEffect(() => {
10385
10385
  const onKey = (e) => {
10386
10386
  if (e.key === "Escape") onClose();
10387
10387
  if (e.key === "ArrowLeft") prev();
@@ -10547,7 +10547,7 @@ function GridGallery({
10547
10547
  initialVisible,
10548
10548
  onOpen
10549
10549
  }) {
10550
- const [expanded, setExpanded] = React29__namespace.useState(false);
10550
+ const [expanded, setExpanded] = React30__namespace.useState(false);
10551
10551
  const cols = gridCols(photos.length);
10552
10552
  const hasMore = photos.length > initialVisible;
10553
10553
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -10577,7 +10577,7 @@ function CompactGridGallery({
10577
10577
  initialVisible,
10578
10578
  onOpen
10579
10579
  }) {
10580
- const [expanded, setExpanded] = React29__namespace.useState(false);
10580
+ const [expanded, setExpanded] = React30__namespace.useState(false);
10581
10581
  const hasMore = photos.length > initialVisible;
10582
10582
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
10583
10583
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10606,7 +10606,7 @@ function MasonryGallery({
10606
10606
  initialVisible,
10607
10607
  onOpen
10608
10608
  }) {
10609
- const [expanded, setExpanded] = React29__namespace.useState(false);
10609
+ const [expanded, setExpanded] = React30__namespace.useState(false);
10610
10610
  const hasMore = photos.length > initialVisible;
10611
10611
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
10612
10612
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10679,7 +10679,7 @@ function FeaturedGallery({
10679
10679
  photos,
10680
10680
  onOpen
10681
10681
  }) {
10682
- const [expanded, setExpanded] = React29__namespace.useState(false);
10682
+ const [expanded, setExpanded] = React30__namespace.useState(false);
10683
10683
  const featured = photos.slice(0, 3);
10684
10684
  const extra = photos.slice(3);
10685
10685
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10846,9 +10846,9 @@ function PhotoGallery({
10846
10846
  onPhotoClick,
10847
10847
  className
10848
10848
  }) {
10849
- const [lightboxIndex, setLightboxIndex] = React29__namespace.useState(null);
10850
- const [carouselIndex, setCarouselIndex] = React29__namespace.useState(0);
10851
- const normalised = React29__namespace.useMemo(() => photos.map(normalise), [photos]);
10849
+ const [lightboxIndex, setLightboxIndex] = React30__namespace.useState(null);
10850
+ const [carouselIndex, setCarouselIndex] = React30__namespace.useState(0);
10851
+ const normalised = React30__namespace.useMemo(() => photos.map(normalise), [photos]);
10852
10852
  const handleOpen = (index) => {
10853
10853
  setLightboxIndex(index);
10854
10854
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
@@ -10932,7 +10932,7 @@ function ItineraryDay({
10932
10932
  photoLayout = "rounded",
10933
10933
  className
10934
10934
  }) {
10935
- const photoList = React29__namespace.useMemo(() => normalisePhotos(photos), [photos]);
10935
+ const photoList = React30__namespace.useMemo(() => normalisePhotos(photos), [photos]);
10936
10936
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
10937
10937
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
10938
10938
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
@@ -10987,8 +10987,8 @@ function MenuTrip({
10987
10987
  bold = true,
10988
10988
  className
10989
10989
  }) {
10990
- const scrollRef = React29__namespace.useRef(null);
10991
- React29__namespace.useEffect(() => {
10990
+ const scrollRef = React30__namespace.useRef(null);
10991
+ React30__namespace.useEffect(() => {
10992
10992
  if (!scrollRef.current || !activeSection) return;
10993
10993
  const container = scrollRef.current;
10994
10994
  const btn = container.querySelector(
@@ -11184,8 +11184,8 @@ function PricingTrip({
11184
11184
  className
11185
11185
  }) {
11186
11186
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
11187
- const [showEstimates, setShowEstimates] = React29__namespace.useState(false);
11188
- const [showPriceInfo, setShowPriceInfo] = React29__namespace.useState(false);
11187
+ const [showEstimates, setShowEstimates] = React30__namespace.useState(false);
11188
+ const [showPriceInfo, setShowPriceInfo] = React30__namespace.useState(false);
11189
11189
  if (variant === "compact") {
11190
11190
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
11191
11191
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -11625,14 +11625,14 @@ function SiteHeader({
11625
11625
  }) {
11626
11626
  const t = VARIANT[variant];
11627
11627
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
11628
- const [openMenu, setOpenMenu] = React29__namespace.useState(null);
11629
- const [langOpen, setLangOpen] = React29__namespace.useState(false);
11630
- const [mobileOpen, setMobileOpen] = React29__namespace.useState(false);
11631
- const [openMobileSection, setOpenMobileSection] = React29__namespace.useState(null);
11632
- const [activeLang, setActiveLang] = React29__namespace.useState(currentLanguage);
11628
+ const [openMenu, setOpenMenu] = React30__namespace.useState(null);
11629
+ const [langOpen, setLangOpen] = React30__namespace.useState(false);
11630
+ const [mobileOpen, setMobileOpen] = React30__namespace.useState(false);
11631
+ const [openMobileSection, setOpenMobileSection] = React30__namespace.useState(null);
11632
+ const [activeLang, setActiveLang] = React30__namespace.useState(currentLanguage);
11633
11633
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
11634
- const menuCloseTimer = React29__namespace.useRef(void 0);
11635
- const langCloseTimer = React29__namespace.useRef(void 0);
11634
+ const menuCloseTimer = React30__namespace.useRef(void 0);
11635
+ const langCloseTimer = React30__namespace.useRef(void 0);
11636
11636
  const handleMenuEnter = (label) => {
11637
11637
  clearTimeout(menuCloseTimer.current);
11638
11638
  setOpenMenu(label);
@@ -11653,7 +11653,7 @@ function SiteHeader({
11653
11653
  setOpenMenu(null);
11654
11654
  setLangOpen(false);
11655
11655
  };
11656
- React29__namespace.useEffect(() => () => {
11656
+ React30__namespace.useEffect(() => () => {
11657
11657
  clearTimeout(menuCloseTimer.current);
11658
11658
  clearTimeout(langCloseTimer.current);
11659
11659
  }, []);
@@ -11929,7 +11929,7 @@ function SiteHeader({
11929
11929
  ), children: [
11930
11930
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
11931
11931
  const isActive = lang.code === activeLang;
11932
- return /* @__PURE__ */ jsxRuntime.jsxs(React29__namespace.Fragment, { children: [
11932
+ return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
11933
11933
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
11934
11934
  "text-xs select-none",
11935
11935
  variant === "white" ? "text-border" : "text-white/15"
@@ -11991,8 +11991,8 @@ function SiteHeader({
11991
11991
  );
11992
11992
  }
11993
11993
  function ThemeToggle({ className }) {
11994
- const [dark, setDark] = React29__namespace.useState(false);
11995
- React29__namespace.useEffect(() => {
11994
+ const [dark, setDark] = React30__namespace.useState(false);
11995
+ React30__namespace.useEffect(() => {
11996
11996
  const saved = localStorage.getItem("theme");
11997
11997
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
11998
11998
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -12042,7 +12042,7 @@ var chipVariants = classVarianceAuthority.cva(
12042
12042
  }
12043
12043
  }
12044
12044
  );
12045
- var Chip = React29__namespace.forwardRef(function Chip2(_a, ref) {
12045
+ var Chip = React30__namespace.forwardRef(function Chip2(_a, ref) {
12046
12046
  var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
12047
12047
  const classes = cn(chipVariants({ variant, size }), className);
12048
12048
  if (href) {
@@ -12139,10 +12139,12 @@ function TripCardEditorial(props) {
12139
12139
  favorited: favoritedProp,
12140
12140
  onFavoriteToggle,
12141
12141
  location,
12142
+ locationHref,
12142
12143
  difficulty,
12143
- tag
12144
+ tag,
12145
+ tagHref
12144
12146
  } = props;
12145
- const [internalFav, setInternalFav] = React29__namespace.useState(false);
12147
+ const [internalFav, setInternalFav] = React30__namespace.useState(false);
12146
12148
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
12147
12149
  const handleFav = (e) => {
12148
12150
  e.preventDefault();
@@ -12163,7 +12165,23 @@ function TripCardEditorial(props) {
12163
12165
  }
12164
12166
  ),
12165
12167
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/85 via-black/20 to-transparent" }),
12166
- tag && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-3 left-3 z-10 max-w-[calc(100%-4.5rem)]", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", size: "sm", children: tag }) }),
12168
+ tag && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-3 left-3 z-20 max-w-[calc(100%-4.5rem)]", children: tagHref ? /* @__PURE__ */ jsxRuntime.jsx(
12169
+ "a",
12170
+ {
12171
+ href: tagHref,
12172
+ onClick: (e) => e.stopPropagation(),
12173
+ className: "inline-block rounded-full focus:outline-none focus-visible:ring-2 focus-visible:ring-white/70",
12174
+ children: /* @__PURE__ */ jsxRuntime.jsx(
12175
+ Chip,
12176
+ {
12177
+ variant: "glass",
12178
+ size: "sm",
12179
+ className: "cursor-pointer transition-colors hover:bg-white/25",
12180
+ children: tag
12181
+ }
12182
+ )
12183
+ }
12184
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", size: "sm", children: tag }) }),
12167
12185
  favoritable && /* @__PURE__ */ jsxRuntime.jsx(
12168
12186
  "button",
12169
12187
  {
@@ -12172,7 +12190,7 @@ function TripCardEditorial(props) {
12172
12190
  "aria-pressed": favorited,
12173
12191
  onClick: handleFav,
12174
12192
  className: cn(
12175
- "absolute top-3 right-3 flex h-9 w-9 items-center justify-center rounded-full",
12193
+ "absolute top-3 right-3 z-20 flex h-9 w-9 items-center justify-center rounded-full",
12176
12194
  "border border-white/15 bg-black/30 backdrop-blur-sm",
12177
12195
  "transition-colors hover:bg-white/10 hover:border-white/50",
12178
12196
  favorited ? "text-white" : "text-white/85 hover:text-white"
@@ -12184,7 +12202,22 @@ function TripCardEditorial(props) {
12184
12202
  ] }),
12185
12203
  (description || price || nights || location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
12186
12204
  (location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
12187
- location ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-foreground/85", children: [
12205
+ location ? locationHref ? (
12206
+ // Above the card's stretched link (z-20) so the location is
12207
+ // independently clickable through to its destination page.
12208
+ /* @__PURE__ */ jsxRuntime.jsxs(
12209
+ "a",
12210
+ {
12211
+ href: locationHref,
12212
+ onClick: (e) => e.stopPropagation(),
12213
+ className: "relative z-20 flex items-center gap-1.5 text-foreground/85 transition-colors hover:text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded",
12214
+ children: [
12215
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
12216
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold underline-offset-2 hover:underline", children: location })
12217
+ ]
12218
+ }
12219
+ )
12220
+ ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-foreground/85", children: [
12188
12221
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
12189
12222
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: location })
12190
12223
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
@@ -12209,7 +12242,17 @@ function TripCardEditorial(props) {
12209
12242
  "shadow-md transition-shadow duration-300 hover:shadow-xl",
12210
12243
  className
12211
12244
  );
12212
- return href ? /* @__PURE__ */ jsxRuntime.jsx("a", { href, className: baseClasses, "aria-label": title, children: body }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: body });
12245
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: baseClasses, children: [
12246
+ body,
12247
+ href && /* @__PURE__ */ jsxRuntime.jsx(
12248
+ "a",
12249
+ {
12250
+ href,
12251
+ "aria-label": title,
12252
+ className: "absolute inset-0 z-[1] rounded-2xl focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
12253
+ }
12254
+ )
12255
+ ] });
12213
12256
  }
12214
12257
  function TripCard(props) {
12215
12258
  if (props.variant === "editorial") {
@@ -12287,7 +12330,7 @@ function TripCard(props) {
12287
12330
  );
12288
12331
  }
12289
12332
  function useHlsVideo(videoRef, src) {
12290
- React29__namespace.useEffect(() => {
12333
+ React30__namespace.useEffect(() => {
12291
12334
  if (!src || !videoRef.current) return;
12292
12335
  const video = videoRef.current;
12293
12336
  if (!src.includes(".m3u8")) return;
@@ -12331,11 +12374,11 @@ function TripHeader({
12331
12374
  className
12332
12375
  }) {
12333
12376
  var _a;
12334
- const [heroIndex, setHeroIndex] = React29__namespace.useState(0);
12335
- const [videoReady, setVideoReady] = React29__namespace.useState(false);
12336
- const videoRef = React29__namespace.useRef(null);
12377
+ const [heroIndex, setHeroIndex] = React30__namespace.useState(0);
12378
+ const [videoReady, setVideoReady] = React30__namespace.useState(false);
12379
+ const videoRef = React30__namespace.useRef(null);
12337
12380
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
12338
- const validImages = React29__namespace.useMemo(
12381
+ const validImages = React30__namespace.useMemo(
12339
12382
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
12340
12383
  [images]
12341
12384
  );
@@ -12350,7 +12393,7 @@ function TripHeader({
12350
12393
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
12351
12394
  const hasMeta = !!(destination || duration);
12352
12395
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
12353
- React29__namespace.useEffect(() => {
12396
+ React30__namespace.useEffect(() => {
12354
12397
  if (!videoUrl) return;
12355
12398
  const el = videoRef.current;
12356
12399
  if (!el) return;
@@ -12493,7 +12536,7 @@ function TripHeader({
12493
12536
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
12494
12537
  ),
12495
12538
  children: [
12496
- breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React29__namespace.Fragment, { children: [
12539
+ breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
12497
12540
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
12498
12541
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
12499
12542
  ] }, i)) }),
@@ -12659,10 +12702,10 @@ function LanguagePicker({
12659
12702
  }) {
12660
12703
  var _a;
12661
12704
  const t = VARIANT2[variant];
12662
- const [open, setOpen] = React29__namespace.useState(false);
12663
- const ref = React29__namespace.useRef(null);
12705
+ const [open, setOpen] = React30__namespace.useState(false);
12706
+ const ref = React30__namespace.useRef(null);
12664
12707
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
12665
- React29__namespace.useEffect(() => {
12708
+ React30__namespace.useEffect(() => {
12666
12709
  if (!open) return;
12667
12710
  const onDocClick = (e) => {
12668
12711
  if (ref.current && !ref.current.contains(e.target)) {
@@ -12863,7 +12906,7 @@ function SiteFooter({
12863
12906
  children: wrapper
12864
12907
  },
12865
12908
  b.alt + i
12866
- ) : /* @__PURE__ */ jsxRuntime.jsx(React29__namespace.Fragment, { children: wrapper }, b.alt + i);
12909
+ ) : /* @__PURE__ */ jsxRuntime.jsx(React30__namespace.Fragment, { children: wrapper }, b.alt + i);
12867
12910
  }) })
12868
12911
  ] }),
12869
12912
  themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
@@ -13038,10 +13081,10 @@ function TripPage({
13038
13081
  className
13039
13082
  }) {
13040
13083
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
13041
- const [activeSection, setActiveSection] = React29__namespace.useState("");
13042
- const [accordionValue, setAccordionValue] = React29__namespace.useState([]);
13043
- const [faqsExpanded, setFaqsExpanded] = React29__namespace.useState(false);
13044
- const accordionSectionIds = React29__namespace.useMemo(
13084
+ const [activeSection, setActiveSection] = React30__namespace.useState("");
13085
+ const [accordionValue, setAccordionValue] = React30__namespace.useState([]);
13086
+ const [faqsExpanded, setFaqsExpanded] = React30__namespace.useState(false);
13087
+ const accordionSectionIds = React30__namespace.useMemo(
13045
13088
  () => /* @__PURE__ */ new Set([
13046
13089
  "when-it-operates",
13047
13090
  "how-to-get-there",
@@ -13055,18 +13098,18 @@ function TripPage({
13055
13098
  ]),
13056
13099
  []
13057
13100
  );
13058
- const [navFloating, setNavFloating] = React29__namespace.useState(false);
13059
- const [navHidden, setNavHidden] = React29__namespace.useState(false);
13060
- const [isFloating, setIsFloating] = React29__namespace.useState(false);
13061
- const [sidebarPos, setSidebarPos] = React29__namespace.useState(null);
13062
- const [pricingBarVisible, setPricingBarVisible] = React29__namespace.useState(false);
13063
- const navRef = React29__namespace.useRef(null);
13064
- const navSentinelRef = React29__namespace.useRef(null);
13065
- const sentinelRef = React29__namespace.useRef(null);
13066
- const sidebarPlaceholderRef = React29__namespace.useRef(null);
13067
- const pricingBarRef = React29__namespace.useRef(null);
13068
- const galleryRef = React29__namespace.useRef(null);
13069
- const sections = React29__namespace.useMemo(
13101
+ const [navFloating, setNavFloating] = React30__namespace.useState(false);
13102
+ const [navHidden, setNavHidden] = React30__namespace.useState(false);
13103
+ const [isFloating, setIsFloating] = React30__namespace.useState(false);
13104
+ const [sidebarPos, setSidebarPos] = React30__namespace.useState(null);
13105
+ const [pricingBarVisible, setPricingBarVisible] = React30__namespace.useState(false);
13106
+ const navRef = React30__namespace.useRef(null);
13107
+ const navSentinelRef = React30__namespace.useRef(null);
13108
+ const sentinelRef = React30__namespace.useRef(null);
13109
+ const sidebarPlaceholderRef = React30__namespace.useRef(null);
13110
+ const pricingBarRef = React30__namespace.useRef(null);
13111
+ const galleryRef = React30__namespace.useRef(null);
13112
+ const sections = React30__namespace.useMemo(
13070
13113
  () => {
13071
13114
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
13072
13115
  return [
@@ -13088,7 +13131,7 @@ function TripPage({
13088
13131
  // eslint-disable-next-line react-hooks/exhaustive-deps
13089
13132
  []
13090
13133
  );
13091
- React29__namespace.useEffect(() => {
13134
+ React30__namespace.useEffect(() => {
13092
13135
  const sentinel = navSentinelRef.current;
13093
13136
  if (!sentinel) return;
13094
13137
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -13096,7 +13139,7 @@ function TripPage({
13096
13139
  update();
13097
13140
  return () => document.removeEventListener("scroll", update, { capture: true });
13098
13141
  }, []);
13099
- React29__namespace.useEffect(() => {
13142
+ React30__namespace.useEffect(() => {
13100
13143
  const sentinel = sentinelRef.current;
13101
13144
  if (!sentinel) return;
13102
13145
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -13104,7 +13147,7 @@ function TripPage({
13104
13147
  update();
13105
13148
  return () => document.removeEventListener("scroll", update, { capture: true });
13106
13149
  }, []);
13107
- React29__namespace.useEffect(() => {
13150
+ React30__namespace.useEffect(() => {
13108
13151
  const measure = () => {
13109
13152
  if (!sidebarPlaceholderRef.current) return;
13110
13153
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -13114,7 +13157,7 @@ function TripPage({
13114
13157
  window.addEventListener("resize", measure);
13115
13158
  return () => window.removeEventListener("resize", measure);
13116
13159
  }, [isFloating]);
13117
- React29__namespace.useEffect(() => {
13160
+ React30__namespace.useEffect(() => {
13118
13161
  const check = () => {
13119
13162
  var _a2;
13120
13163
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -13125,7 +13168,7 @@ function TripPage({
13125
13168
  check();
13126
13169
  return () => document.removeEventListener("scroll", check, { capture: true });
13127
13170
  }, []);
13128
- React29__namespace.useEffect(() => {
13171
+ React30__namespace.useEffect(() => {
13129
13172
  const check = () => {
13130
13173
  if (!pricingBarRef.current) return;
13131
13174
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -13134,7 +13177,7 @@ function TripPage({
13134
13177
  check();
13135
13178
  return () => document.removeEventListener("scroll", check, { capture: true });
13136
13179
  }, []);
13137
- React29__namespace.useEffect(() => {
13180
+ React30__namespace.useEffect(() => {
13138
13181
  if (sections.length === 0) return;
13139
13182
  setActiveSection(sections[0].id);
13140
13183
  const update = () => {
@@ -13740,6 +13783,7 @@ function CategoryPage2({
13740
13783
  title,
13741
13784
  intro,
13742
13785
  heroImage,
13786
+ videoUrl,
13743
13787
  trustpilotMini,
13744
13788
  breadcrumb,
13745
13789
  siteHeader,
@@ -13772,13 +13816,32 @@ function CategoryPage2({
13772
13816
  className
13773
13817
  }) {
13774
13818
  var _a;
13775
- const [faqsExpanded, setFaqsExpanded] = React29__namespace.useState(false);
13776
- const [tripsExpanded, setTripsExpanded] = React29__namespace.useState(false);
13777
- const [filterValue, setFilterValue] = React29__namespace.useState({});
13778
- const [sort, setSort] = React29__namespace.useState(
13819
+ const [videoReady, setVideoReady] = React30__namespace.useState(false);
13820
+ const videoRef = React30__namespace.useRef(null);
13821
+ const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
13822
+ useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13823
+ React30__namespace.useEffect(() => {
13824
+ if (!videoUrl) return;
13825
+ const el = videoRef.current;
13826
+ if (!el) return;
13827
+ const io = new IntersectionObserver(
13828
+ ([entry]) => {
13829
+ if (entry.isIntersecting) el.play().catch(() => {
13830
+ });
13831
+ else el.pause();
13832
+ },
13833
+ { threshold: 0.1 }
13834
+ );
13835
+ io.observe(el);
13836
+ return () => io.disconnect();
13837
+ }, [videoUrl]);
13838
+ const [faqsExpanded, setFaqsExpanded] = React30__namespace.useState(false);
13839
+ const [tripsExpanded, setTripsExpanded] = React30__namespace.useState(false);
13840
+ const [filterValue, setFilterValue] = React30__namespace.useState({});
13841
+ const [sort, setSort] = React30__namespace.useState(
13779
13842
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
13780
13843
  );
13781
- const sortedTrips = React29__namespace.useMemo(() => {
13844
+ const sortedTrips = React30__namespace.useMemo(() => {
13782
13845
  const active = Object.entries(filterValue).filter(
13783
13846
  ([, vals]) => vals && vals.length > 0
13784
13847
  );
@@ -13839,15 +13902,36 @@ function CategoryPage2({
13839
13902
  !heroImage && "bg-gradient-to-br from-primary-900 via-primary-800 to-primary-950"
13840
13903
  ),
13841
13904
  children: [
13842
- heroImage && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 overflow-hidden", children: [
13843
- /* @__PURE__ */ jsxRuntime.jsx(
13905
+ (heroImage || videoUrl) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 overflow-hidden", children: [
13906
+ heroImage && /* @__PURE__ */ jsxRuntime.jsx(
13844
13907
  "img",
13845
13908
  {
13846
13909
  src: heroImage,
13847
13910
  alt: "",
13848
13911
  "aria-hidden": true,
13849
13912
  fetchPriority: "high",
13850
- className: "absolute inset-0 h-full w-full object-cover"
13913
+ className: cn(
13914
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
13915
+ videoUrl && videoReady ? "opacity-0" : "opacity-100"
13916
+ )
13917
+ }
13918
+ ),
13919
+ videoUrl && /* @__PURE__ */ jsxRuntime.jsx(
13920
+ "video",
13921
+ {
13922
+ ref: videoRef,
13923
+ src: isHls ? void 0 : videoUrl,
13924
+ autoPlay: true,
13925
+ muted: true,
13926
+ loop: true,
13927
+ playsInline: true,
13928
+ preload: "auto",
13929
+ poster: heroImage,
13930
+ onCanPlay: () => setVideoReady(true),
13931
+ className: cn(
13932
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
13933
+ videoReady ? "opacity-100" : "opacity-0"
13934
+ )
13851
13935
  }
13852
13936
  ),
13853
13937
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-b from-black/55 via-black/40 to-black/65" })
@@ -13861,7 +13945,7 @@ function CategoryPage2({
13861
13945
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
13862
13946
  breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
13863
13947
  const isLast = i === breadcrumb.length - 1;
13864
- return /* @__PURE__ */ jsxRuntime.jsxs(React29__namespace.Fragment, { children: [
13948
+ return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
13865
13949
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13866
13950
  crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
13867
13951
  "a",
@@ -14148,12 +14232,12 @@ function Toast({
14148
14232
  duration = 6e3,
14149
14233
  className
14150
14234
  }) {
14151
- const [mounted, setMounted] = React29__namespace.useState(false);
14152
- const [visible, setVisible] = React29__namespace.useState(true);
14153
- React29__namespace.useEffect(() => {
14235
+ const [mounted, setMounted] = React30__namespace.useState(false);
14236
+ const [visible, setVisible] = React30__namespace.useState(true);
14237
+ React30__namespace.useEffect(() => {
14154
14238
  setMounted(true);
14155
14239
  }, []);
14156
- React29__namespace.useEffect(() => {
14240
+ React30__namespace.useEffect(() => {
14157
14241
  if (duration === 0) return;
14158
14242
  const t = setTimeout(() => {
14159
14243
  setVisible(false);
@@ -14560,21 +14644,21 @@ function LeadCapturePopup({
14560
14644
  }) {
14561
14645
  var _a;
14562
14646
  const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
14563
- const [open, setOpen] = React29.useState(false);
14564
- const [closing, setClosing] = React29.useState(false);
14565
- const [submitted, setSubmitted] = React29.useState(false);
14566
- const [submitting, setSubmitting] = React29.useState(false);
14567
- const [error, setError] = React29.useState(null);
14568
- const [name, setName] = React29.useState("");
14569
- const [email, setEmail] = React29.useState("");
14570
- const [travelDate, setTravelDate] = React29.useState("");
14571
- const panelRef = React29.useRef(null);
14572
- const nameRef = React29.useRef(null);
14573
- const show = React29.useCallback(() => {
14647
+ const [open, setOpen] = React30.useState(false);
14648
+ const [closing, setClosing] = React30.useState(false);
14649
+ const [submitted, setSubmitted] = React30.useState(false);
14650
+ const [submitting, setSubmitting] = React30.useState(false);
14651
+ const [error, setError] = React30.useState(null);
14652
+ const [name, setName] = React30.useState("");
14653
+ const [email, setEmail] = React30.useState("");
14654
+ const [travelDate, setTravelDate] = React30.useState("");
14655
+ const panelRef = React30.useRef(null);
14656
+ const nameRef = React30.useRef(null);
14657
+ const show = React30.useCallback(() => {
14574
14658
  if (isDismissed()) return;
14575
14659
  setOpen(true);
14576
14660
  }, []);
14577
- React29.useEffect(() => {
14661
+ React30.useEffect(() => {
14578
14662
  var _a2;
14579
14663
  if (isDismissed()) return;
14580
14664
  if (config.trigger === "delay") {
@@ -14601,7 +14685,7 @@ function LeadCapturePopup({
14601
14685
  return () => window.removeEventListener("scroll", handler);
14602
14686
  }
14603
14687
  }, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
14604
- React29.useEffect(() => {
14688
+ React30.useEffect(() => {
14605
14689
  if (open && !submitted) {
14606
14690
  requestAnimationFrame(() => {
14607
14691
  var _a2;
@@ -14609,7 +14693,7 @@ function LeadCapturePopup({
14609
14693
  });
14610
14694
  }
14611
14695
  }, [open, submitted]);
14612
- const close = React29.useCallback(() => {
14696
+ const close = React30.useCallback(() => {
14613
14697
  setClosing(true);
14614
14698
  setDismissed(config.dismissDays);
14615
14699
  setTimeout(() => {
@@ -14617,7 +14701,7 @@ function LeadCapturePopup({
14617
14701
  setClosing(false);
14618
14702
  }, 250);
14619
14703
  }, [config.dismissDays]);
14620
- React29.useEffect(() => {
14704
+ React30.useEffect(() => {
14621
14705
  if (!open) return;
14622
14706
  const handler = (e) => {
14623
14707
  if (e.key === "Escape") close();
@@ -14625,7 +14709,7 @@ function LeadCapturePopup({
14625
14709
  document.addEventListener("keydown", handler);
14626
14710
  return () => document.removeEventListener("keydown", handler);
14627
14711
  }, [open, close]);
14628
- const onOverlayClick = React29.useCallback(
14712
+ const onOverlayClick = React30.useCallback(
14629
14713
  (e) => {
14630
14714
  if (panelRef.current && !panelRef.current.contains(e.target)) {
14631
14715
  close();
@@ -14863,11 +14947,11 @@ function ExoOrb({
14863
14947
  trackCursor = true,
14864
14948
  className
14865
14949
  }) {
14866
- const uid = React29.useId().replace(/:/g, "");
14950
+ const uid = React30.useId().replace(/:/g, "");
14867
14951
  const id = (name) => `exo-orb-${uid}-${name}`;
14868
- const rootRef = React29.useRef(null);
14869
- const pupilRef = React29.useRef(null);
14870
- React29.useEffect(() => {
14952
+ const rootRef = React30.useRef(null);
14953
+ const pupilRef = React30.useRef(null);
14954
+ React30.useEffect(() => {
14871
14955
  if (!trackCursor) return;
14872
14956
  if (typeof window === "undefined") return;
14873
14957
  if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
@@ -15063,13 +15147,13 @@ function AskExo({
15063
15147
  teaserDelayMs = 2500,
15064
15148
  teaserDurationMs = 6e3
15065
15149
  }) {
15066
- const [open, setOpen] = React29.useState(false);
15067
- const [question, setQuestion] = React29.useState("");
15068
- const [teaserVisible, setTeaserVisible] = React29.useState(false);
15150
+ const [open, setOpen] = React30.useState(false);
15151
+ const [question, setQuestion] = React30.useState("");
15152
+ const [teaserVisible, setTeaserVisible] = React30.useState(false);
15069
15153
  const teaserEnabled = !!teaser && teaser !== "";
15070
- const inputRef = React29.useRef(null);
15071
- const textareaRef = React29.useRef(null);
15072
- React29.useEffect(() => {
15154
+ const inputRef = React30.useRef(null);
15155
+ const textareaRef = React30.useRef(null);
15156
+ React30.useEffect(() => {
15073
15157
  if (!open) {
15074
15158
  setQuestion("");
15075
15159
  return;
@@ -15081,7 +15165,7 @@ function AskExo({
15081
15165
  }, 200);
15082
15166
  return () => clearTimeout(t);
15083
15167
  }, [open, variant]);
15084
- React29.useEffect(() => {
15168
+ React30.useEffect(() => {
15085
15169
  if (!open) return;
15086
15170
  const onKey = (e) => {
15087
15171
  if (e.key === "Escape") setOpen(false);
@@ -15089,7 +15173,7 @@ function AskExo({
15089
15173
  document.addEventListener("keydown", onKey);
15090
15174
  return () => document.removeEventListener("keydown", onKey);
15091
15175
  }, [open]);
15092
- React29.useEffect(() => {
15176
+ React30.useEffect(() => {
15093
15177
  if (!teaserEnabled || open) return;
15094
15178
  if (typeof window === "undefined") return;
15095
15179
  const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
@@ -15102,7 +15186,7 @@ function AskExo({
15102
15186
  clearTimeout(hideTimer);
15103
15187
  };
15104
15188
  }, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
15105
- React29.useEffect(() => {
15189
+ React30.useEffect(() => {
15106
15190
  if (open) setTeaserVisible(false);
15107
15191
  }, [open]);
15108
15192
  const askExo = (q) => {
@@ -15655,8 +15739,8 @@ function ShareWidget({
15655
15739
  title = "Invite friends & lower the price",
15656
15740
  className
15657
15741
  }) {
15658
- const [copied, setCopied] = React29__namespace.useState(false);
15659
- const [showToast, setShowToast] = React29__namespace.useState(false);
15742
+ const [copied, setCopied] = React30__namespace.useState(false);
15743
+ const [showToast, setShowToast] = React30__namespace.useState(false);
15660
15744
  const encodedUrl = encodeURIComponent(url);
15661
15745
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
15662
15746
  const channels = [