@planetaexo/design-system 0.55.0 → 0.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var 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) {
@@ -12140,9 +12140,10 @@ function TripCardEditorial(props) {
12140
12140
  onFavoriteToggle,
12141
12141
  location,
12142
12142
  difficulty,
12143
- tag
12143
+ tag,
12144
+ tagHref
12144
12145
  } = props;
12145
- const [internalFav, setInternalFav] = React29__namespace.useState(false);
12146
+ const [internalFav, setInternalFav] = React30__namespace.useState(false);
12146
12147
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
12147
12148
  const handleFav = (e) => {
12148
12149
  e.preventDefault();
@@ -12163,7 +12164,23 @@ function TripCardEditorial(props) {
12163
12164
  }
12164
12165
  ),
12165
12166
  /* @__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 }) }),
12167
+ tag && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-3 left-3 z-20 max-w-[calc(100%-4.5rem)]", children: tagHref ? /* @__PURE__ */ jsxRuntime.jsx(
12168
+ "a",
12169
+ {
12170
+ href: tagHref,
12171
+ onClick: (e) => e.stopPropagation(),
12172
+ className: "inline-block rounded-full focus:outline-none focus-visible:ring-2 focus-visible:ring-white/70",
12173
+ children: /* @__PURE__ */ jsxRuntime.jsx(
12174
+ Chip,
12175
+ {
12176
+ variant: "glass",
12177
+ size: "sm",
12178
+ className: "cursor-pointer transition-colors hover:bg-white/25",
12179
+ children: tag
12180
+ }
12181
+ )
12182
+ }
12183
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", size: "sm", children: tag }) }),
12167
12184
  favoritable && /* @__PURE__ */ jsxRuntime.jsx(
12168
12185
  "button",
12169
12186
  {
@@ -12172,7 +12189,7 @@ function TripCardEditorial(props) {
12172
12189
  "aria-pressed": favorited,
12173
12190
  onClick: handleFav,
12174
12191
  className: cn(
12175
- "absolute top-3 right-3 flex h-9 w-9 items-center justify-center rounded-full",
12192
+ "absolute top-3 right-3 z-20 flex h-9 w-9 items-center justify-center rounded-full",
12176
12193
  "border border-white/15 bg-black/30 backdrop-blur-sm",
12177
12194
  "transition-colors hover:bg-white/10 hover:border-white/50",
12178
12195
  favorited ? "text-white" : "text-white/85 hover:text-white"
@@ -12209,7 +12226,17 @@ function TripCardEditorial(props) {
12209
12226
  "shadow-md transition-shadow duration-300 hover:shadow-xl",
12210
12227
  className
12211
12228
  );
12212
- return href ? /* @__PURE__ */ jsxRuntime.jsx("a", { href, className: baseClasses, "aria-label": title, children: body }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: body });
12229
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: baseClasses, children: [
12230
+ body,
12231
+ href && /* @__PURE__ */ jsxRuntime.jsx(
12232
+ "a",
12233
+ {
12234
+ href,
12235
+ "aria-label": title,
12236
+ className: "absolute inset-0 z-[1] rounded-2xl focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
12237
+ }
12238
+ )
12239
+ ] });
12213
12240
  }
12214
12241
  function TripCard(props) {
12215
12242
  if (props.variant === "editorial") {
@@ -12287,7 +12314,7 @@ function TripCard(props) {
12287
12314
  );
12288
12315
  }
12289
12316
  function useHlsVideo(videoRef, src) {
12290
- React29__namespace.useEffect(() => {
12317
+ React30__namespace.useEffect(() => {
12291
12318
  if (!src || !videoRef.current) return;
12292
12319
  const video = videoRef.current;
12293
12320
  if (!src.includes(".m3u8")) return;
@@ -12331,11 +12358,11 @@ function TripHeader({
12331
12358
  className
12332
12359
  }) {
12333
12360
  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);
12361
+ const [heroIndex, setHeroIndex] = React30__namespace.useState(0);
12362
+ const [videoReady, setVideoReady] = React30__namespace.useState(false);
12363
+ const videoRef = React30__namespace.useRef(null);
12337
12364
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
12338
- const validImages = React29__namespace.useMemo(
12365
+ const validImages = React30__namespace.useMemo(
12339
12366
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
12340
12367
  [images]
12341
12368
  );
@@ -12350,7 +12377,7 @@ function TripHeader({
12350
12377
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
12351
12378
  const hasMeta = !!(destination || duration);
12352
12379
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
12353
- React29__namespace.useEffect(() => {
12380
+ React30__namespace.useEffect(() => {
12354
12381
  if (!videoUrl) return;
12355
12382
  const el = videoRef.current;
12356
12383
  if (!el) return;
@@ -12493,7 +12520,7 @@ function TripHeader({
12493
12520
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
12494
12521
  ),
12495
12522
  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: [
12523
+ 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
12524
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
12498
12525
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
12499
12526
  ] }, i)) }),
@@ -12659,10 +12686,10 @@ function LanguagePicker({
12659
12686
  }) {
12660
12687
  var _a;
12661
12688
  const t = VARIANT2[variant];
12662
- const [open, setOpen] = React29__namespace.useState(false);
12663
- const ref = React29__namespace.useRef(null);
12689
+ const [open, setOpen] = React30__namespace.useState(false);
12690
+ const ref = React30__namespace.useRef(null);
12664
12691
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
12665
- React29__namespace.useEffect(() => {
12692
+ React30__namespace.useEffect(() => {
12666
12693
  if (!open) return;
12667
12694
  const onDocClick = (e) => {
12668
12695
  if (ref.current && !ref.current.contains(e.target)) {
@@ -12863,7 +12890,7 @@ function SiteFooter({
12863
12890
  children: wrapper
12864
12891
  },
12865
12892
  b.alt + i
12866
- ) : /* @__PURE__ */ jsxRuntime.jsx(React29__namespace.Fragment, { children: wrapper }, b.alt + i);
12893
+ ) : /* @__PURE__ */ jsxRuntime.jsx(React30__namespace.Fragment, { children: wrapper }, b.alt + i);
12867
12894
  }) })
12868
12895
  ] }),
12869
12896
  themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
@@ -13038,10 +13065,10 @@ function TripPage({
13038
13065
  className
13039
13066
  }) {
13040
13067
  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(
13068
+ const [activeSection, setActiveSection] = React30__namespace.useState("");
13069
+ const [accordionValue, setAccordionValue] = React30__namespace.useState([]);
13070
+ const [faqsExpanded, setFaqsExpanded] = React30__namespace.useState(false);
13071
+ const accordionSectionIds = React30__namespace.useMemo(
13045
13072
  () => /* @__PURE__ */ new Set([
13046
13073
  "when-it-operates",
13047
13074
  "how-to-get-there",
@@ -13055,18 +13082,18 @@ function TripPage({
13055
13082
  ]),
13056
13083
  []
13057
13084
  );
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(
13085
+ const [navFloating, setNavFloating] = React30__namespace.useState(false);
13086
+ const [navHidden, setNavHidden] = React30__namespace.useState(false);
13087
+ const [isFloating, setIsFloating] = React30__namespace.useState(false);
13088
+ const [sidebarPos, setSidebarPos] = React30__namespace.useState(null);
13089
+ const [pricingBarVisible, setPricingBarVisible] = React30__namespace.useState(false);
13090
+ const navRef = React30__namespace.useRef(null);
13091
+ const navSentinelRef = React30__namespace.useRef(null);
13092
+ const sentinelRef = React30__namespace.useRef(null);
13093
+ const sidebarPlaceholderRef = React30__namespace.useRef(null);
13094
+ const pricingBarRef = React30__namespace.useRef(null);
13095
+ const galleryRef = React30__namespace.useRef(null);
13096
+ const sections = React30__namespace.useMemo(
13070
13097
  () => {
13071
13098
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
13072
13099
  return [
@@ -13088,7 +13115,7 @@ function TripPage({
13088
13115
  // eslint-disable-next-line react-hooks/exhaustive-deps
13089
13116
  []
13090
13117
  );
13091
- React29__namespace.useEffect(() => {
13118
+ React30__namespace.useEffect(() => {
13092
13119
  const sentinel = navSentinelRef.current;
13093
13120
  if (!sentinel) return;
13094
13121
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -13096,7 +13123,7 @@ function TripPage({
13096
13123
  update();
13097
13124
  return () => document.removeEventListener("scroll", update, { capture: true });
13098
13125
  }, []);
13099
- React29__namespace.useEffect(() => {
13126
+ React30__namespace.useEffect(() => {
13100
13127
  const sentinel = sentinelRef.current;
13101
13128
  if (!sentinel) return;
13102
13129
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -13104,7 +13131,7 @@ function TripPage({
13104
13131
  update();
13105
13132
  return () => document.removeEventListener("scroll", update, { capture: true });
13106
13133
  }, []);
13107
- React29__namespace.useEffect(() => {
13134
+ React30__namespace.useEffect(() => {
13108
13135
  const measure = () => {
13109
13136
  if (!sidebarPlaceholderRef.current) return;
13110
13137
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -13114,7 +13141,7 @@ function TripPage({
13114
13141
  window.addEventListener("resize", measure);
13115
13142
  return () => window.removeEventListener("resize", measure);
13116
13143
  }, [isFloating]);
13117
- React29__namespace.useEffect(() => {
13144
+ React30__namespace.useEffect(() => {
13118
13145
  const check = () => {
13119
13146
  var _a2;
13120
13147
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -13125,7 +13152,7 @@ function TripPage({
13125
13152
  check();
13126
13153
  return () => document.removeEventListener("scroll", check, { capture: true });
13127
13154
  }, []);
13128
- React29__namespace.useEffect(() => {
13155
+ React30__namespace.useEffect(() => {
13129
13156
  const check = () => {
13130
13157
  if (!pricingBarRef.current) return;
13131
13158
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -13134,7 +13161,7 @@ function TripPage({
13134
13161
  check();
13135
13162
  return () => document.removeEventListener("scroll", check, { capture: true });
13136
13163
  }, []);
13137
- React29__namespace.useEffect(() => {
13164
+ React30__namespace.useEffect(() => {
13138
13165
  if (sections.length === 0) return;
13139
13166
  setActiveSection(sections[0].id);
13140
13167
  const update = () => {
@@ -13740,6 +13767,7 @@ function CategoryPage2({
13740
13767
  title,
13741
13768
  intro,
13742
13769
  heroImage,
13770
+ videoUrl,
13743
13771
  trustpilotMini,
13744
13772
  breadcrumb,
13745
13773
  siteHeader,
@@ -13772,13 +13800,32 @@ function CategoryPage2({
13772
13800
  className
13773
13801
  }) {
13774
13802
  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(
13803
+ const [videoReady, setVideoReady] = React30__namespace.useState(false);
13804
+ const videoRef = React30__namespace.useRef(null);
13805
+ const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
13806
+ useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13807
+ React30__namespace.useEffect(() => {
13808
+ if (!videoUrl) return;
13809
+ const el = videoRef.current;
13810
+ if (!el) return;
13811
+ const io = new IntersectionObserver(
13812
+ ([entry]) => {
13813
+ if (entry.isIntersecting) el.play().catch(() => {
13814
+ });
13815
+ else el.pause();
13816
+ },
13817
+ { threshold: 0.1 }
13818
+ );
13819
+ io.observe(el);
13820
+ return () => io.disconnect();
13821
+ }, [videoUrl]);
13822
+ const [faqsExpanded, setFaqsExpanded] = React30__namespace.useState(false);
13823
+ const [tripsExpanded, setTripsExpanded] = React30__namespace.useState(false);
13824
+ const [filterValue, setFilterValue] = React30__namespace.useState({});
13825
+ const [sort, setSort] = React30__namespace.useState(
13779
13826
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
13780
13827
  );
13781
- const sortedTrips = React29__namespace.useMemo(() => {
13828
+ const sortedTrips = React30__namespace.useMemo(() => {
13782
13829
  const active = Object.entries(filterValue).filter(
13783
13830
  ([, vals]) => vals && vals.length > 0
13784
13831
  );
@@ -13839,15 +13886,36 @@ function CategoryPage2({
13839
13886
  !heroImage && "bg-gradient-to-br from-primary-900 via-primary-800 to-primary-950"
13840
13887
  ),
13841
13888
  children: [
13842
- heroImage && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 overflow-hidden", children: [
13843
- /* @__PURE__ */ jsxRuntime.jsx(
13889
+ (heroImage || videoUrl) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 overflow-hidden", children: [
13890
+ heroImage && /* @__PURE__ */ jsxRuntime.jsx(
13844
13891
  "img",
13845
13892
  {
13846
13893
  src: heroImage,
13847
13894
  alt: "",
13848
13895
  "aria-hidden": true,
13849
13896
  fetchPriority: "high",
13850
- className: "absolute inset-0 h-full w-full object-cover"
13897
+ className: cn(
13898
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
13899
+ videoUrl && videoReady ? "opacity-0" : "opacity-100"
13900
+ )
13901
+ }
13902
+ ),
13903
+ videoUrl && /* @__PURE__ */ jsxRuntime.jsx(
13904
+ "video",
13905
+ {
13906
+ ref: videoRef,
13907
+ src: isHls ? void 0 : videoUrl,
13908
+ autoPlay: true,
13909
+ muted: true,
13910
+ loop: true,
13911
+ playsInline: true,
13912
+ preload: "auto",
13913
+ poster: heroImage,
13914
+ onCanPlay: () => setVideoReady(true),
13915
+ className: cn(
13916
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
13917
+ videoReady ? "opacity-100" : "opacity-0"
13918
+ )
13851
13919
  }
13852
13920
  ),
13853
13921
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-b from-black/55 via-black/40 to-black/65" })
@@ -13859,10 +13927,29 @@ function CategoryPage2({
13859
13927
  })
13860
13928
  ),
13861
13929
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
13862
- 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: [
13863
- i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13864
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui", children: crumb.label })
13865
- ] }, i)) }),
13930
+ breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
13931
+ const isLast = i === breadcrumb.length - 1;
13932
+ return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
13933
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13934
+ crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
13935
+ "a",
13936
+ {
13937
+ href: crumb.href,
13938
+ className: "text-xs text-white/70 font-ui hover:text-white hover:underline transition-colors",
13939
+ children: crumb.label
13940
+ }
13941
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
13942
+ "span",
13943
+ {
13944
+ className: cn(
13945
+ "text-xs font-ui",
13946
+ isLast ? "text-white" : "text-white/70"
13947
+ ),
13948
+ children: crumb.label
13949
+ }
13950
+ )
13951
+ ] }, i);
13952
+ }) }),
13866
13953
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight max-w-3xl", children: title }),
13867
13954
  intro && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 text-base sm:text-lg text-white/90 leading-relaxed max-w-2xl [&_strong]:font-semibold [&_a]:underline", children: intro }),
13868
13955
  trustpilotMini && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 max-w-sm", children: /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) })
@@ -14129,12 +14216,12 @@ function Toast({
14129
14216
  duration = 6e3,
14130
14217
  className
14131
14218
  }) {
14132
- const [mounted, setMounted] = React29__namespace.useState(false);
14133
- const [visible, setVisible] = React29__namespace.useState(true);
14134
- React29__namespace.useEffect(() => {
14219
+ const [mounted, setMounted] = React30__namespace.useState(false);
14220
+ const [visible, setVisible] = React30__namespace.useState(true);
14221
+ React30__namespace.useEffect(() => {
14135
14222
  setMounted(true);
14136
14223
  }, []);
14137
- React29__namespace.useEffect(() => {
14224
+ React30__namespace.useEffect(() => {
14138
14225
  if (duration === 0) return;
14139
14226
  const t = setTimeout(() => {
14140
14227
  setVisible(false);
@@ -14541,21 +14628,21 @@ function LeadCapturePopup({
14541
14628
  }) {
14542
14629
  var _a;
14543
14630
  const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
14544
- const [open, setOpen] = React29.useState(false);
14545
- const [closing, setClosing] = React29.useState(false);
14546
- const [submitted, setSubmitted] = React29.useState(false);
14547
- const [submitting, setSubmitting] = React29.useState(false);
14548
- const [error, setError] = React29.useState(null);
14549
- const [name, setName] = React29.useState("");
14550
- const [email, setEmail] = React29.useState("");
14551
- const [travelDate, setTravelDate] = React29.useState("");
14552
- const panelRef = React29.useRef(null);
14553
- const nameRef = React29.useRef(null);
14554
- const show = React29.useCallback(() => {
14631
+ const [open, setOpen] = React30.useState(false);
14632
+ const [closing, setClosing] = React30.useState(false);
14633
+ const [submitted, setSubmitted] = React30.useState(false);
14634
+ const [submitting, setSubmitting] = React30.useState(false);
14635
+ const [error, setError] = React30.useState(null);
14636
+ const [name, setName] = React30.useState("");
14637
+ const [email, setEmail] = React30.useState("");
14638
+ const [travelDate, setTravelDate] = React30.useState("");
14639
+ const panelRef = React30.useRef(null);
14640
+ const nameRef = React30.useRef(null);
14641
+ const show = React30.useCallback(() => {
14555
14642
  if (isDismissed()) return;
14556
14643
  setOpen(true);
14557
14644
  }, []);
14558
- React29.useEffect(() => {
14645
+ React30.useEffect(() => {
14559
14646
  var _a2;
14560
14647
  if (isDismissed()) return;
14561
14648
  if (config.trigger === "delay") {
@@ -14582,7 +14669,7 @@ function LeadCapturePopup({
14582
14669
  return () => window.removeEventListener("scroll", handler);
14583
14670
  }
14584
14671
  }, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
14585
- React29.useEffect(() => {
14672
+ React30.useEffect(() => {
14586
14673
  if (open && !submitted) {
14587
14674
  requestAnimationFrame(() => {
14588
14675
  var _a2;
@@ -14590,7 +14677,7 @@ function LeadCapturePopup({
14590
14677
  });
14591
14678
  }
14592
14679
  }, [open, submitted]);
14593
- const close = React29.useCallback(() => {
14680
+ const close = React30.useCallback(() => {
14594
14681
  setClosing(true);
14595
14682
  setDismissed(config.dismissDays);
14596
14683
  setTimeout(() => {
@@ -14598,7 +14685,7 @@ function LeadCapturePopup({
14598
14685
  setClosing(false);
14599
14686
  }, 250);
14600
14687
  }, [config.dismissDays]);
14601
- React29.useEffect(() => {
14688
+ React30.useEffect(() => {
14602
14689
  if (!open) return;
14603
14690
  const handler = (e) => {
14604
14691
  if (e.key === "Escape") close();
@@ -14606,7 +14693,7 @@ function LeadCapturePopup({
14606
14693
  document.addEventListener("keydown", handler);
14607
14694
  return () => document.removeEventListener("keydown", handler);
14608
14695
  }, [open, close]);
14609
- const onOverlayClick = React29.useCallback(
14696
+ const onOverlayClick = React30.useCallback(
14610
14697
  (e) => {
14611
14698
  if (panelRef.current && !panelRef.current.contains(e.target)) {
14612
14699
  close();
@@ -14844,11 +14931,11 @@ function ExoOrb({
14844
14931
  trackCursor = true,
14845
14932
  className
14846
14933
  }) {
14847
- const uid = React29.useId().replace(/:/g, "");
14934
+ const uid = React30.useId().replace(/:/g, "");
14848
14935
  const id = (name) => `exo-orb-${uid}-${name}`;
14849
- const rootRef = React29.useRef(null);
14850
- const pupilRef = React29.useRef(null);
14851
- React29.useEffect(() => {
14936
+ const rootRef = React30.useRef(null);
14937
+ const pupilRef = React30.useRef(null);
14938
+ React30.useEffect(() => {
14852
14939
  if (!trackCursor) return;
14853
14940
  if (typeof window === "undefined") return;
14854
14941
  if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
@@ -15044,13 +15131,13 @@ function AskExo({
15044
15131
  teaserDelayMs = 2500,
15045
15132
  teaserDurationMs = 6e3
15046
15133
  }) {
15047
- const [open, setOpen] = React29.useState(false);
15048
- const [question, setQuestion] = React29.useState("");
15049
- const [teaserVisible, setTeaserVisible] = React29.useState(false);
15134
+ const [open, setOpen] = React30.useState(false);
15135
+ const [question, setQuestion] = React30.useState("");
15136
+ const [teaserVisible, setTeaserVisible] = React30.useState(false);
15050
15137
  const teaserEnabled = !!teaser && teaser !== "";
15051
- const inputRef = React29.useRef(null);
15052
- const textareaRef = React29.useRef(null);
15053
- React29.useEffect(() => {
15138
+ const inputRef = React30.useRef(null);
15139
+ const textareaRef = React30.useRef(null);
15140
+ React30.useEffect(() => {
15054
15141
  if (!open) {
15055
15142
  setQuestion("");
15056
15143
  return;
@@ -15062,7 +15149,7 @@ function AskExo({
15062
15149
  }, 200);
15063
15150
  return () => clearTimeout(t);
15064
15151
  }, [open, variant]);
15065
- React29.useEffect(() => {
15152
+ React30.useEffect(() => {
15066
15153
  if (!open) return;
15067
15154
  const onKey = (e) => {
15068
15155
  if (e.key === "Escape") setOpen(false);
@@ -15070,7 +15157,7 @@ function AskExo({
15070
15157
  document.addEventListener("keydown", onKey);
15071
15158
  return () => document.removeEventListener("keydown", onKey);
15072
15159
  }, [open]);
15073
- React29.useEffect(() => {
15160
+ React30.useEffect(() => {
15074
15161
  if (!teaserEnabled || open) return;
15075
15162
  if (typeof window === "undefined") return;
15076
15163
  const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
@@ -15083,7 +15170,7 @@ function AskExo({
15083
15170
  clearTimeout(hideTimer);
15084
15171
  };
15085
15172
  }, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
15086
- React29.useEffect(() => {
15173
+ React30.useEffect(() => {
15087
15174
  if (open) setTeaserVisible(false);
15088
15175
  }, [open]);
15089
15176
  const askExo = (q) => {
@@ -15636,8 +15723,8 @@ function ShareWidget({
15636
15723
  title = "Invite friends & lower the price",
15637
15724
  className
15638
15725
  }) {
15639
- const [copied, setCopied] = React29__namespace.useState(false);
15640
- const [showToast, setShowToast] = React29__namespace.useState(false);
15726
+ const [copied, setCopied] = React30__namespace.useState(false);
15727
+ const [showToast, setShowToast] = React30__namespace.useState(false);
15641
15728
  const encodedUrl = encodeURIComponent(url);
15642
15729
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
15643
15730
  const channels = [