@planetaexo/design-system 0.57.2 → 0.58.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 React30 = require('react');
3
+ var React31 = 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 React30__namespace = /*#__PURE__*/_interopNamespace(React30);
40
+ var React31__namespace = /*#__PURE__*/_interopNamespace(React31);
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 = React30__namespace.forwardRef(
105
+ var Button = React31__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 = React30__namespace.forwardRef(
334
+ var FloatingInput = React31__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 : React30__namespace.useId();
337
+ const inputId = id != null ? id : React31__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 = React30__namespace.forwardRef(
374
374
  }
375
375
  );
376
376
  FloatingInput.displayName = "FloatingInput";
377
- var FloatingSelect = React30__namespace.forwardRef(
377
+ var FloatingSelect = React31__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 : React30__namespace.useId();
380
+ const inputId = id != null ? id : React31__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] = React30__namespace.useState(false);
645
- const containerRef = React30__namespace.useRef(null);
646
- const listRef = React30__namespace.useRef(null);
644
+ const [open, setOpen] = React31__namespace.useState(false);
645
+ const containerRef = React31__namespace.useRef(null);
646
+ const listRef = React31__namespace.useRef(null);
647
647
  const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
648
- React30__namespace.useEffect(() => {
648
+ React31__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
- React30__namespace.useEffect(() => {
659
+ React31__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 = React30__namespace.useRef(null);
930
- React30__namespace.useEffect(() => {
929
+ const ref = React31__namespace.useRef(null);
930
+ React31__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] = React30__namespace.useState(false);
962
- const [text, setText] = React30__namespace.useState(
961
+ const [open, setOpen] = React31__namespace.useState(false);
962
+ const [text, setText] = React31__namespace.useState(
963
963
  value ? dateFns.format(value, "dd/MM/yyyy") : ""
964
964
  );
965
- const containerRef = React30__namespace.useRef(null);
966
- const inputId = React30__namespace.useId();
967
- React30__namespace.useEffect(() => {
965
+ const containerRef = React31__namespace.useRef(null);
966
+ const inputId = React31__namespace.useId();
967
+ React31__namespace.useEffect(() => {
968
968
  setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
969
969
  }, [value]);
970
- React30__namespace.useEffect(() => {
970
+ React31__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] = 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);
1179
+ const [query, setQuery] = React31__namespace.useState("");
1180
+ const [open, setOpen] = React31__namespace.useState(false);
1181
+ const containerRef = React31__namespace.useRef(null);
1182
+ const searchRef = React31__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
- React30__namespace.useEffect(() => {
1186
+ React31__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] = React30__namespace.useState(
1331
+ const [checkedInternal, setCheckedInternal] = React31__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] = React30__namespace.useState(null);
1334
+ const [openDescriptionId, setOpenDescriptionId] = React31__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(React30__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(React31__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] = React30__namespace.useState(false);
1963
+ const [modalOpen, setModalOpen] = React31__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] = React30__namespace.useState("responsible");
2102
- const [error, setError] = React30__namespace.useState(null);
2103
- const [responsible, setResponsible] = React30__namespace.useState({
2101
+ const [step, setStep] = React31__namespace.useState("responsible");
2102
+ const [error, setError] = React31__namespace.useState(null);
2103
+ const [responsible, setResponsible] = React31__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] = React30__namespace.useState(
2122
+ const [travellers, setTravellers] = React31__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] = React30__namespace.useState("full");
2131
- const [payMethod, setPayMethod] = React30__namespace.useState("stripe");
2132
- const [termsAccepted, setTermsAccepted] = React30__namespace.useState(false);
2130
+ const [payAmount, setPayAmount] = React31__namespace.useState("full");
2131
+ const [payMethod, setPayMethod] = React31__namespace.useState("stripe");
2132
+ const [termsAccepted, setTermsAccepted] = React31__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] = React30__namespace.useState(false);
2360
+ const [showBooking, setShowBooking] = React31__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] = React30__namespace.useState(false);
2727
+ const [detailsOpen, setDetailsOpen] = React31__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] = React30__namespace.useState(() => createInitialAddFormData(config));
3241
- React30__namespace.useEffect(() => {
3240
+ const [form, setForm] = React31__namespace.useState(() => createInitialAddFormData(config));
3241
+ React31__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] = React30__namespace.useState(() => ({
3301
+ const [form, setForm] = React31__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
- React30__namespace.useEffect(() => {
3310
+ React31__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] = React30__namespace.useState({
3646
+ const [addModalState, setAddModalState] = React31__namespace.useState({
3647
3647
  open: false,
3648
3648
  adventureId: null
3649
3649
  });
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) => {
3650
+ const [editModalState, setEditModalState] = React31__namespace.useState({ open: false, adventureId: null, traveller: null });
3651
+ const [deleteModalState, setDeleteModalState] = React31__namespace.useState({ open: false, adventureId: null, traveller: null });
3652
+ const [resendInviteDialogState, setResendInviteDialogState] = React31__namespace.useState({ open: false, traveller: null });
3653
+ const handleRequestOpenAddModal = React31__namespace.useCallback((adventureId) => {
3654
3654
  setAddModalState({ open: true, adventureId });
3655
3655
  }, []);
3656
- const handleRequestOpenEditModal = React30__namespace.useCallback(
3656
+ const handleRequestOpenEditModal = React31__namespace.useCallback(
3657
3657
  (adventureId, traveller) => {
3658
3658
  setEditModalState({ open: true, adventureId, traveller });
3659
3659
  },
3660
3660
  []
3661
3661
  );
3662
- const handleRequestOpenDeleteModal = React30__namespace.useCallback(
3662
+ const handleRequestOpenDeleteModal = React31__namespace.useCallback(
3663
3663
  (adventureId, traveller) => {
3664
3664
  setDeleteModalState({ open: true, adventureId, traveller });
3665
3665
  },
3666
3666
  []
3667
3667
  );
3668
- const handleRequestOpenResendInviteDialog = React30__namespace.useCallback(
3668
+ const handleRequestOpenResendInviteDialog = React31__namespace.useCallback(
3669
3669
  (traveller) => {
3670
3670
  setResendInviteDialogState({ open: true, traveller });
3671
3671
  },
3672
3672
  []
3673
3673
  );
3674
- const closeAddModal = React30__namespace.useCallback(() => {
3674
+ const closeAddModal = React31__namespace.useCallback(() => {
3675
3675
  setAddModalState({ open: false, adventureId: null });
3676
3676
  }, []);
3677
- const closeEditModal = React30__namespace.useCallback(() => {
3677
+ const closeEditModal = React31__namespace.useCallback(() => {
3678
3678
  setEditModalState({ open: false, adventureId: null, traveller: null });
3679
3679
  }, []);
3680
- const closeDeleteModal = React30__namespace.useCallback(() => {
3680
+ const closeDeleteModal = React31__namespace.useCallback(() => {
3681
3681
  setDeleteModalState({ open: false, adventureId: null, traveller: null });
3682
3682
  }, []);
3683
- const closeResendInviteDialog = React30__namespace.useCallback(() => {
3683
+ const closeResendInviteDialog = React31__namespace.useCallback(() => {
3684
3684
  setResendInviteDialogState({ open: false, traveller: null });
3685
3685
  }, []);
3686
- const submitInFlightRef = React30__namespace.useRef(false);
3687
- const handleAddSubmit = React30__namespace.useCallback(
3686
+ const submitInFlightRef = React31__namespace.useRef(false);
3687
+ const handleAddSubmit = React31__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 = React30__namespace.useCallback(
3702
+ const handleEditSubmit = React31__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 = React30__namespace.useCallback(
3717
+ const handleDeleteConfirm = React31__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(React30__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(React31__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] = React30__namespace.useState(false);
7314
- const containerRef = React30__namespace.useRef(null);
7315
- const [calendarWidth, setCalendarWidth] = React30__namespace.useState();
7313
+ const [open, setOpen] = React31__namespace.useState(false);
7314
+ const containerRef = React31__namespace.useRef(null);
7315
+ const [calendarWidth, setCalendarWidth] = React31__namespace.useState();
7316
7316
  const hasValue = !!value;
7317
- React30__namespace.useEffect(() => {
7317
+ React31__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] = React30__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
7426
+ const [values, setValues] = React31__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] = React30__namespace.useState(false);
7995
- const containerRef = React30__namespace.useRef(null);
7994
+ const [open, setOpen] = React31__namespace.useState(false);
7995
+ const containerRef = React31__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
- React30__namespace.useEffect(() => {
7998
+ React31__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 = React30__namespace.useMemo(
8463
+ const L = React31__namespace.useMemo(
8464
8464
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
8465
8465
  [labels]
8466
8466
  );
8467
- const sortedFields = React30__namespace.useMemo(
8467
+ const sortedFields = React31__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] = React30__namespace.useState(
8475
+ const [internal, setInternal] = React31__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] = React30__namespace.useState(false);
8484
- const [validationErrors, setValidationErrors] = React30__namespace.useState({});
8485
- React30__namespace.useEffect(() => {
8483
+ const [submitAttempted, setSubmitAttempted] = React31__namespace.useState(false);
8484
+ const [validationErrors, setValidationErrors] = React31__namespace.useState({});
8485
+ React31__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
- React30__namespace.useEffect(() => {
8542
+ React31__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 : React30__namespace.useId();
9005
- const inputRef = React30__namespace.useRef(null);
9006
- const [focused, setFocused] = React30__namespace.useState(false);
9007
- const digits = React30__namespace.useMemo(() => {
9004
+ const baseId = id != null ? id : React31__namespace.useId();
9005
+ const inputRef = React31__namespace.useRef(null);
9006
+ const [focused, setFocused] = React31__namespace.useState(false);
9007
+ const digits = React31__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 = React30__namespace.createContext("default");
9120
+ var AccordionVariantContext = React31__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 = React30__namespace.useContext(AccordionVariantContext);
9138
+ const variant = React31__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 = React30__namespace.useContext(AccordionVariantContext);
9159
+ const variant = React31__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 = React30__namespace.useContext(AccordionVariantContext);
9213
+ const variant = React31__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 = React30__namespace.useMemo(() => resolveGroups(groups), [groups]);
9432
- const [internalValue, setInternalValue] = React30__namespace.useState(
9431
+ const resolvedGroups = React31__namespace.useMemo(() => resolveGroups(groups), [groups]);
9432
+ const [internalValue, setInternalValue] = React31__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] = React30__namespace.useState(
9436
+ const [expandedItems, setExpandedItems] = React31__namespace.useState(
9437
9437
  () => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
9438
9438
  );
9439
- const toggleExpanded = React30__namespace.useCallback((id) => {
9439
+ const toggleExpanded = React31__namespace.useCallback((id) => {
9440
9440
  setExpandedItems((prev) => {
9441
9441
  const next = new Set(prev);
9442
9442
  if (next.has(id)) next.delete(id);
@@ -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 = React30__namespace.useRef(null);
9824
- const [widgetReady, setWidgetReady] = React30__namespace.useState(false);
9825
- const [delayPassed, setDelayPassed] = React30__namespace.useState(false);
9823
+ const ref = React31__namespace.useRef(null);
9824
+ const [widgetReady, setWidgetReady] = React31__namespace.useState(false);
9825
+ const [delayPassed, setDelayPassed] = React31__namespace.useState(false);
9826
9826
  const showFallback = delayPassed && !widgetReady;
9827
- React30__namespace.useEffect(() => {
9827
+ React31__namespace.useEffect(() => {
9828
9828
  var _a2;
9829
9829
  if (typeof document === "undefined" || !ref.current) return;
9830
9830
  const node = ref.current;
@@ -10011,6 +10011,55 @@ function webpVariantUrl(src) {
10011
10011
  const withoutQuery = query ? src.slice(0, -query.length) : src;
10012
10012
  return `${withoutQuery}.webp${query}`;
10013
10013
  }
10014
+ function PictureLoader() {
10015
+ const gradientId = React31__namespace.useId();
10016
+ return /* @__PURE__ */ jsxRuntime.jsx(
10017
+ "span",
10018
+ {
10019
+ "aria-hidden": true,
10020
+ className: "pointer-events-none absolute inset-0 flex items-center justify-center",
10021
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
10022
+ "svg",
10023
+ {
10024
+ viewBox: "0 0 200 200",
10025
+ xmlns: "http://www.w3.org/2000/svg",
10026
+ className: "h-10 w-10 text-primary",
10027
+ fill: "none",
10028
+ children: [
10029
+ /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: gradientId, children: [
10030
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0", stopColor: "currentColor", stopOpacity: "0" }),
10031
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "1", stopColor: "currentColor" })
10032
+ ] }),
10033
+ /* @__PURE__ */ jsxRuntime.jsx(
10034
+ "circle",
10035
+ {
10036
+ stroke: `url(#${gradientId})`,
10037
+ strokeWidth: "15",
10038
+ strokeLinecap: "round",
10039
+ strokeDasharray: "0 44 0 44 0 44 0 44 0 360",
10040
+ cx: "100",
10041
+ cy: "100",
10042
+ r: "70",
10043
+ style: { transformOrigin: "center" },
10044
+ children: /* @__PURE__ */ jsxRuntime.jsx(
10045
+ "animateTransform",
10046
+ {
10047
+ type: "rotate",
10048
+ attributeName: "transform",
10049
+ calcMode: "discrete",
10050
+ dur: "2s",
10051
+ values: "360;324;288;252;216;180;144;108;72;36",
10052
+ repeatCount: "indefinite"
10053
+ }
10054
+ )
10055
+ }
10056
+ )
10057
+ ]
10058
+ }
10059
+ )
10060
+ }
10061
+ );
10062
+ }
10014
10063
  var PLACEHOLDER_SRC = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
10015
10064
  function Picture(_a) {
10016
10065
  var _b = _a, {
@@ -10019,18 +10068,23 @@ function Picture(_a) {
10019
10068
  eager = false,
10020
10069
  rootMargin = "200px",
10021
10070
  decoding,
10022
- loading
10071
+ loading,
10072
+ onLoad,
10073
+ onError
10023
10074
  } = _b, imgProps = __objRest(_b, [
10024
10075
  "src",
10025
10076
  "extraSources",
10026
10077
  "eager",
10027
10078
  "rootMargin",
10028
10079
  "decoding",
10029
- "loading"
10080
+ "loading",
10081
+ "onLoad",
10082
+ "onError"
10030
10083
  ]);
10031
- const ref = React30__namespace.useRef(null);
10032
- const [visible, setVisible] = React30__namespace.useState(eager);
10033
- React30__namespace.useEffect(() => {
10084
+ const ref = React31__namespace.useRef(null);
10085
+ const [visible, setVisible] = React31__namespace.useState(eager);
10086
+ const [loaded, setLoaded] = React31__namespace.useState(false);
10087
+ React31__namespace.useEffect(() => {
10034
10088
  if (eager || visible) return;
10035
10089
  const el = ref.current;
10036
10090
  if (!el || typeof IntersectionObserver === "undefined") {
@@ -10049,35 +10103,57 @@ function Picture(_a) {
10049
10103
  io.observe(el);
10050
10104
  return () => io.disconnect();
10051
10105
  }, [eager, visible, rootMargin]);
10106
+ React31__namespace.useEffect(() => {
10107
+ setLoaded(false);
10108
+ }, [src]);
10052
10109
  const webp = webpVariantUrl(src);
10053
10110
  const realSrc = visible ? src : PLACEHOLDER_SRC;
10054
10111
  const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
10112
+ const handleLoad = (e) => {
10113
+ if (visible) setLoaded(true);
10114
+ onLoad == null ? void 0 : onLoad(e);
10115
+ };
10116
+ const handleError = (e) => {
10117
+ if (visible) setLoaded(true);
10118
+ onError == null ? void 0 : onError(e);
10119
+ };
10120
+ const showLoader = visible && !loaded;
10055
10121
  if (!webp) {
10056
- return /* @__PURE__ */ jsxRuntime.jsx(
10057
- "img",
10058
- __spreadValues({
10059
- ref,
10060
- src: realSrc,
10061
- "data-src": visible ? void 0 : src,
10062
- decoding: decodingResolved,
10063
- loading: loading != null ? loading : eager ? void 0 : "lazy"
10064
- }, imgProps)
10065
- );
10122
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10123
+ showLoader && /* @__PURE__ */ jsxRuntime.jsx(PictureLoader, {}),
10124
+ /* @__PURE__ */ jsxRuntime.jsx(
10125
+ "img",
10126
+ __spreadValues({
10127
+ ref,
10128
+ src: realSrc,
10129
+ "data-src": visible ? void 0 : src,
10130
+ decoding: decodingResolved,
10131
+ loading: loading != null ? loading : eager ? void 0 : "lazy",
10132
+ onLoad: handleLoad,
10133
+ onError: handleError
10134
+ }, imgProps)
10135
+ )
10136
+ ] });
10066
10137
  }
10067
- return /* @__PURE__ */ jsxRuntime.jsxs("picture", { style: { display: "contents" }, children: [
10068
- visible && /* @__PURE__ */ jsxRuntime.jsx("source", { srcSet: webp, type: "image/webp" }),
10069
- extraSources,
10070
- /* @__PURE__ */ jsxRuntime.jsx(
10071
- "img",
10072
- __spreadValues({
10073
- ref,
10074
- src: realSrc,
10075
- "data-src": visible ? void 0 : src,
10076
- "data-srcset-webp": visible ? void 0 : webp,
10077
- decoding: decodingResolved,
10078
- loading: loading != null ? loading : eager ? void 0 : "lazy"
10079
- }, imgProps)
10080
- )
10138
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10139
+ showLoader && /* @__PURE__ */ jsxRuntime.jsx(PictureLoader, {}),
10140
+ /* @__PURE__ */ jsxRuntime.jsxs("picture", { style: { display: "contents" }, children: [
10141
+ visible && /* @__PURE__ */ jsxRuntime.jsx("source", { srcSet: webp, type: "image/webp" }),
10142
+ extraSources,
10143
+ /* @__PURE__ */ jsxRuntime.jsx(
10144
+ "img",
10145
+ __spreadValues({
10146
+ ref,
10147
+ src: realSrc,
10148
+ "data-src": visible ? void 0 : src,
10149
+ "data-srcset-webp": visible ? void 0 : webp,
10150
+ decoding: decodingResolved,
10151
+ loading: loading != null ? loading : eager ? void 0 : "lazy",
10152
+ onLoad: handleLoad,
10153
+ onError: handleError
10154
+ }, imgProps)
10155
+ )
10156
+ ] })
10081
10157
  ] });
10082
10158
  }
10083
10159
  function ItineraryDayCard({
@@ -10146,11 +10222,11 @@ function ItineraryModal({
10146
10222
  onNext
10147
10223
  }) {
10148
10224
  var _a, _b, _c;
10149
- const [imgIndex, setImgIndex] = React30__namespace.useState(0);
10225
+ const [imgIndex, setImgIndex] = React31__namespace.useState(0);
10150
10226
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
10151
10227
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
10152
10228
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
10153
- React30__namespace.useEffect(() => {
10229
+ React31__namespace.useEffect(() => {
10154
10230
  setImgIndex(0);
10155
10231
  }, [stop == null ? void 0 : stop.dayNumber]);
10156
10232
  if (!stop) return null;
@@ -10277,8 +10353,8 @@ function ItineraryModal({
10277
10353
  ) });
10278
10354
  }
10279
10355
  function Itinerary({ title, subtitle, stops, className }) {
10280
- const [activeIndex, setActiveIndex] = React30__namespace.useState(null);
10281
- const scrollRef = React30__namespace.useRef(null);
10356
+ const [activeIndex, setActiveIndex] = React31__namespace.useState(null);
10357
+ const scrollRef = React31__namespace.useRef(null);
10282
10358
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
10283
10359
  const scrollBy = (dir) => {
10284
10360
  if (!scrollRef.current) return;
@@ -10370,18 +10446,18 @@ function Lightbox({
10370
10446
  onClose
10371
10447
  }) {
10372
10448
  var _a;
10373
- const [index, setIndex] = React30__namespace.useState(initialIndex);
10449
+ const [index, setIndex] = React31__namespace.useState(initialIndex);
10374
10450
  const total = photos.length;
10375
10451
  const photo = photos[index];
10376
- const prev = React30__namespace.useCallback(
10452
+ const prev = React31__namespace.useCallback(
10377
10453
  () => setIndex((i) => (i - 1 + total) % total),
10378
10454
  [total]
10379
10455
  );
10380
- const next = React30__namespace.useCallback(
10456
+ const next = React31__namespace.useCallback(
10381
10457
  () => setIndex((i) => (i + 1) % total),
10382
10458
  [total]
10383
10459
  );
10384
- React30__namespace.useEffect(() => {
10460
+ React31__namespace.useEffect(() => {
10385
10461
  const onKey = (e) => {
10386
10462
  if (e.key === "Escape") onClose();
10387
10463
  if (e.key === "ArrowLeft") prev();
@@ -10486,7 +10562,8 @@ function PhotoTile({
10486
10562
  photo,
10487
10563
  index,
10488
10564
  className,
10489
- onClick
10565
+ onClick,
10566
+ showCredit = false
10490
10567
  }) {
10491
10568
  var _a, _b;
10492
10569
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -10509,7 +10586,8 @@ function PhotoTile({
10509
10586
  loading: "lazy"
10510
10587
  }
10511
10588
  ),
10512
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ZoomInIcon, { className: "h-8 w-8 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300 drop-shadow-lg" }) })
10589
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ZoomInIcon, { className: "h-8 w-8 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300 drop-shadow-lg" }) }),
10590
+ showCredit && photo.credit && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pointer-events-none absolute bottom-2 right-2.5 text-[11px] font-ui text-white/90 [text-shadow:0_1px_3px_rgba(0,0,0,0.7)]", children: photo.credit })
10513
10591
  ]
10514
10592
  }
10515
10593
  );
@@ -10547,7 +10625,7 @@ function GridGallery({
10547
10625
  initialVisible,
10548
10626
  onOpen
10549
10627
  }) {
10550
- const [expanded, setExpanded] = React30__namespace.useState(false);
10628
+ const [expanded, setExpanded] = React31__namespace.useState(false);
10551
10629
  const cols = gridCols(photos.length);
10552
10630
  const hasMore = photos.length > initialVisible;
10553
10631
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -10577,7 +10655,7 @@ function CompactGridGallery({
10577
10655
  initialVisible,
10578
10656
  onOpen
10579
10657
  }) {
10580
- const [expanded, setExpanded] = React30__namespace.useState(false);
10658
+ const [expanded, setExpanded] = React31__namespace.useState(false);
10581
10659
  const hasMore = photos.length > initialVisible;
10582
10660
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
10583
10661
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10606,7 +10684,7 @@ function MasonryGallery({
10606
10684
  initialVisible,
10607
10685
  onOpen
10608
10686
  }) {
10609
- const [expanded, setExpanded] = React30__namespace.useState(false);
10687
+ const [expanded, setExpanded] = React31__namespace.useState(false);
10610
10688
  const hasMore = photos.length > initialVisible;
10611
10689
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
10612
10690
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10679,7 +10757,7 @@ function FeaturedGallery({
10679
10757
  photos,
10680
10758
  onOpen
10681
10759
  }) {
10682
- const [expanded, setExpanded] = React30__namespace.useState(false);
10760
+ const [expanded, setExpanded] = React31__namespace.useState(false);
10683
10761
  const featured = photos.slice(0, 3);
10684
10762
  const extra = photos.slice(3);
10685
10763
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10749,6 +10827,37 @@ function FeaturedGallery({
10749
10827
  )
10750
10828
  ] });
10751
10829
  }
10830
+ function CollageGallery({
10831
+ photos,
10832
+ onOpen,
10833
+ seamless = false
10834
+ }) {
10835
+ const [hero, ...rest] = photos;
10836
+ const gap = seamless ? "gap-0" : "gap-1.5";
10837
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col", gap), children: [
10838
+ hero && /* @__PURE__ */ jsxRuntime.jsx(
10839
+ PhotoTile,
10840
+ {
10841
+ photo: hero,
10842
+ index: 0,
10843
+ className: "aspect-[16/10] sm:aspect-[2/1]",
10844
+ onClick: () => onOpen(0),
10845
+ showCredit: true
10846
+ }
10847
+ ),
10848
+ rest.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid grid-cols-2", gap), children: rest.map((p, i) => /* @__PURE__ */ jsxRuntime.jsx(
10849
+ PhotoTile,
10850
+ {
10851
+ photo: p,
10852
+ index: i + 1,
10853
+ className: "aspect-[4/3]",
10854
+ onClick: () => onOpen(i + 1),
10855
+ showCredit: true
10856
+ },
10857
+ i + 1
10858
+ )) })
10859
+ ] });
10860
+ }
10752
10861
  function CarouselGallery({
10753
10862
  photos,
10754
10863
  index,
@@ -10846,9 +10955,9 @@ function PhotoGallery({
10846
10955
  onPhotoClick,
10847
10956
  className
10848
10957
  }) {
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]);
10958
+ const [lightboxIndex, setLightboxIndex] = React31__namespace.useState(null);
10959
+ const [carouselIndex, setCarouselIndex] = React31__namespace.useState(0);
10960
+ const normalised = React31__namespace.useMemo(() => photos.map(normalise), [photos]);
10852
10961
  const handleOpen = (index) => {
10853
10962
  setLightboxIndex(index);
10854
10963
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
@@ -10908,6 +11017,8 @@ function PhotoGallery({
10908
11017
  ),
10909
11018
  variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
10910
11019
  variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
11020
+ variant === "collage" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
11021
+ variant === "collageTight" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
10911
11022
  lightbox
10912
11023
  ] });
10913
11024
  }
@@ -10932,7 +11043,7 @@ function ItineraryDay({
10932
11043
  photoLayout = "rounded",
10933
11044
  className
10934
11045
  }) {
10935
- const photoList = React30__namespace.useMemo(() => normalisePhotos(photos), [photos]);
11046
+ const photoList = React31__namespace.useMemo(() => normalisePhotos(photos), [photos]);
10936
11047
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
10937
11048
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
10938
11049
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
@@ -10987,8 +11098,8 @@ function MenuTrip({
10987
11098
  bold = true,
10988
11099
  className
10989
11100
  }) {
10990
- const scrollRef = React30__namespace.useRef(null);
10991
- React30__namespace.useEffect(() => {
11101
+ const scrollRef = React31__namespace.useRef(null);
11102
+ React31__namespace.useEffect(() => {
10992
11103
  if (!scrollRef.current || !activeSection) return;
10993
11104
  const container = scrollRef.current;
10994
11105
  const btn = container.querySelector(
@@ -11184,8 +11295,8 @@ function PricingTrip({
11184
11295
  className
11185
11296
  }) {
11186
11297
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
11187
- const [showEstimates, setShowEstimates] = React30__namespace.useState(false);
11188
- const [showPriceInfo, setShowPriceInfo] = React30__namespace.useState(false);
11298
+ const [showEstimates, setShowEstimates] = React31__namespace.useState(false);
11299
+ const [showPriceInfo, setShowPriceInfo] = React31__namespace.useState(false);
11189
11300
  if (variant === "compact") {
11190
11301
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
11191
11302
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -11625,14 +11736,14 @@ function SiteHeader({
11625
11736
  }) {
11626
11737
  const t = VARIANT[variant];
11627
11738
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
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);
11739
+ const [openMenu, setOpenMenu] = React31__namespace.useState(null);
11740
+ const [langOpen, setLangOpen] = React31__namespace.useState(false);
11741
+ const [mobileOpen, setMobileOpen] = React31__namespace.useState(false);
11742
+ const [openMobileSection, setOpenMobileSection] = React31__namespace.useState(null);
11743
+ const [activeLang, setActiveLang] = React31__namespace.useState(currentLanguage);
11633
11744
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
11634
- const menuCloseTimer = React30__namespace.useRef(void 0);
11635
- const langCloseTimer = React30__namespace.useRef(void 0);
11745
+ const menuCloseTimer = React31__namespace.useRef(void 0);
11746
+ const langCloseTimer = React31__namespace.useRef(void 0);
11636
11747
  const handleMenuEnter = (label) => {
11637
11748
  clearTimeout(menuCloseTimer.current);
11638
11749
  setOpenMenu(label);
@@ -11653,7 +11764,7 @@ function SiteHeader({
11653
11764
  setOpenMenu(null);
11654
11765
  setLangOpen(false);
11655
11766
  };
11656
- React30__namespace.useEffect(() => () => {
11767
+ React31__namespace.useEffect(() => () => {
11657
11768
  clearTimeout(menuCloseTimer.current);
11658
11769
  clearTimeout(langCloseTimer.current);
11659
11770
  }, []);
@@ -11929,7 +12040,7 @@ function SiteHeader({
11929
12040
  ), children: [
11930
12041
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
11931
12042
  const isActive = lang.code === activeLang;
11932
- return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
12043
+ return /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
11933
12044
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
11934
12045
  "text-xs select-none",
11935
12046
  variant === "white" ? "text-border" : "text-white/15"
@@ -11991,8 +12102,8 @@ function SiteHeader({
11991
12102
  );
11992
12103
  }
11993
12104
  function ThemeToggle({ className }) {
11994
- const [dark, setDark] = React30__namespace.useState(false);
11995
- React30__namespace.useEffect(() => {
12105
+ const [dark, setDark] = React31__namespace.useState(false);
12106
+ React31__namespace.useEffect(() => {
11996
12107
  const saved = localStorage.getItem("theme");
11997
12108
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
11998
12109
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -12042,7 +12153,7 @@ var chipVariants = classVarianceAuthority.cva(
12042
12153
  }
12043
12154
  }
12044
12155
  );
12045
- var Chip = React30__namespace.forwardRef(function Chip2(_a, ref) {
12156
+ var Chip = React31__namespace.forwardRef(function Chip2(_a, ref) {
12046
12157
  var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
12047
12158
  const classes = cn(chipVariants({ variant, size }), className);
12048
12159
  if (href) {
@@ -12144,7 +12255,7 @@ function TripCardEditorial(props) {
12144
12255
  tag,
12145
12256
  tagHref
12146
12257
  } = props;
12147
- const [internalFav, setInternalFav] = React30__namespace.useState(false);
12258
+ const [internalFav, setInternalFav] = React31__namespace.useState(false);
12148
12259
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
12149
12260
  const handleFav = (e) => {
12150
12261
  e.preventDefault();
@@ -12329,8 +12440,387 @@ function TripCard(props) {
12329
12440
  }
12330
12441
  );
12331
12442
  }
12443
+ function ArrowIcon2() {
12444
+ return /* @__PURE__ */ jsxRuntime.jsxs(
12445
+ "svg",
12446
+ {
12447
+ width: "13",
12448
+ height: "13",
12449
+ viewBox: "0 0 24 24",
12450
+ fill: "none",
12451
+ stroke: "currentColor",
12452
+ strokeWidth: "2.2",
12453
+ strokeLinecap: "round",
12454
+ strokeLinejoin: "round",
12455
+ children: [
12456
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
12457
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "12 5 19 12 12 19" })
12458
+ ]
12459
+ }
12460
+ );
12461
+ }
12462
+ var sizeConfig2 = {
12463
+ sm: {
12464
+ card: "h-72 w-56",
12465
+ title: "text-lg font-bold",
12466
+ meta: "text-xs",
12467
+ excerpt: "text-xs"
12468
+ },
12469
+ md: {
12470
+ card: "h-96 w-72",
12471
+ title: "text-xl font-bold",
12472
+ meta: "text-xs",
12473
+ excerpt: "text-sm"
12474
+ },
12475
+ lg: {
12476
+ card: "h-[28rem] w-96",
12477
+ title: "text-2xl font-bold",
12478
+ meta: "text-sm",
12479
+ excerpt: "text-sm"
12480
+ }
12481
+ };
12482
+ function BlogCard({
12483
+ image,
12484
+ imageAlt = "",
12485
+ category,
12486
+ readingTime,
12487
+ date,
12488
+ title,
12489
+ excerpt,
12490
+ href,
12491
+ external,
12492
+ cta,
12493
+ size = "md",
12494
+ className
12495
+ }) {
12496
+ var _a;
12497
+ const s = sizeConfig2[size];
12498
+ const meta = [date != null ? date : null, readingTime != null ? readingTime : null].filter(Boolean).join(" | ");
12499
+ const ctaLabel = (_a = cta == null ? void 0 : cta.label) != null ? _a : "Read more";
12500
+ const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
12501
+ /* @__PURE__ */ jsxRuntime.jsx(
12502
+ "img",
12503
+ {
12504
+ src: image,
12505
+ alt: imageAlt,
12506
+ loading: "lazy",
12507
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
12508
+ }
12509
+ ),
12510
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/40 to-black/10" }),
12511
+ category ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", children: category }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10" }),
12512
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
12513
+ meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/70 font-medium font-ui", s.meta), children: meta }),
12514
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-white leading-snug", s.title), children: title }),
12515
+ excerpt && /* @__PURE__ */ jsxRuntime.jsx(
12516
+ "p",
12517
+ {
12518
+ className: cn(
12519
+ "text-white/80 leading-relaxed -mt-1 line-clamp-2",
12520
+ s.excerpt
12521
+ ),
12522
+ children: excerpt
12523
+ }
12524
+ ),
12525
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex items-center justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs(
12526
+ "span",
12527
+ {
12528
+ className: cn(
12529
+ "group/cta inline-flex items-center gap-1.5 border-b border-white/70 pb-0.5",
12530
+ "text-sm font-semibold text-white transition-colors hover:border-white hover:text-white",
12531
+ "font-ui"
12532
+ ),
12533
+ children: [
12534
+ ctaLabel,
12535
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "transition-transform duration-150 group-hover/cta:translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon2, {}) })
12536
+ ]
12537
+ }
12538
+ ) })
12539
+ ] })
12540
+ ] });
12541
+ const baseClasses = cn(
12542
+ "group relative flex flex-col justify-between overflow-hidden rounded-2xl",
12543
+ "shadow-md transition-shadow duration-300 hover:shadow-xl",
12544
+ s.card,
12545
+ className
12546
+ );
12547
+ return href ? /* @__PURE__ */ jsxRuntime.jsx(
12548
+ "a",
12549
+ {
12550
+ href,
12551
+ onClick: cta == null ? void 0 : cta.onClick,
12552
+ className: baseClasses,
12553
+ "aria-label": title,
12554
+ target: external ? "_blank" : void 0,
12555
+ rel: external ? "noopener noreferrer" : void 0,
12556
+ children: inner
12557
+ }
12558
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: inner });
12559
+ }
12560
+ var alignClass = {
12561
+ left: "text-left",
12562
+ center: "text-center",
12563
+ right: "text-right"
12564
+ };
12565
+ function Figure({
12566
+ caption,
12567
+ wide,
12568
+ children
12569
+ }) {
12570
+ return /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: cn(wide && "lg:-mx-24"), children: [
12571
+ children,
12572
+ caption && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: "mt-2.5 text-center text-xs text-muted-foreground font-sans italic", children: caption })
12573
+ ] });
12574
+ }
12575
+ function renderBlock(block, i) {
12576
+ var _a, _b, _c, _d, _e;
12577
+ switch (block.type) {
12578
+ case "paragraph":
12579
+ return /* @__PURE__ */ jsxRuntime.jsx(
12580
+ "p",
12581
+ {
12582
+ className: cn(
12583
+ "font-sans text-foreground/90",
12584
+ block.lead ? "text-lg sm:text-xl leading-relaxed text-foreground" : "text-base sm:text-lg leading-relaxed"
12585
+ ),
12586
+ children: block.text
12587
+ },
12588
+ i
12589
+ );
12590
+ case "heading": {
12591
+ const level = (_a = block.level) != null ? _a : 2;
12592
+ const Tag = level === 2 ? "h2" : "h3";
12593
+ return /* @__PURE__ */ jsxRuntime.jsx(
12594
+ Tag,
12595
+ {
12596
+ id: block.id,
12597
+ className: cn(
12598
+ "font-heading font-bold text-foreground scroll-mt-24",
12599
+ level === 2 ? "text-2xl sm:text-3xl leading-tight pt-2" : "text-xl sm:text-2xl leading-snug"
12600
+ ),
12601
+ children: block.text
12602
+ },
12603
+ i
12604
+ );
12605
+ }
12606
+ case "image":
12607
+ return /* @__PURE__ */ jsxRuntime.jsxs(Figure, { caption: block.caption, wide: block.wide, children: [
12608
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-2xl bg-muted shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
12609
+ Picture,
12610
+ {
12611
+ src: block.src,
12612
+ alt: (_b = block.alt) != null ? _b : "",
12613
+ loading: "lazy",
12614
+ className: "w-full h-auto object-cover"
12615
+ }
12616
+ ) }),
12617
+ block.credit && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sr-only", children: [
12618
+ "Photo: ",
12619
+ block.credit
12620
+ ] })
12621
+ ] }, i);
12622
+ case "collage":
12623
+ return /* @__PURE__ */ jsxRuntime.jsx(Figure, { caption: block.caption, wide: block.wide, children: /* @__PURE__ */ jsxRuntime.jsx(
12624
+ PhotoGallery,
12625
+ {
12626
+ photos: block.photos,
12627
+ variant: (_c = block.variant) != null ? _c : "collage",
12628
+ initialVisible: Infinity
12629
+ }
12630
+ ) }, i);
12631
+ case "table":
12632
+ return /* @__PURE__ */ jsxRuntime.jsx(Figure, { caption: block.caption, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto rounded-xl border border-border", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full text-sm", children: [
12633
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-muted/60", children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: block.columns.map((col) => {
12634
+ var _a2;
12635
+ return /* @__PURE__ */ jsxRuntime.jsx(
12636
+ "th",
12637
+ {
12638
+ className: cn(
12639
+ "px-4 py-3 font-ui font-semibold text-foreground whitespace-nowrap",
12640
+ alignClass[(_a2 = col.align) != null ? _a2 : "left"]
12641
+ ),
12642
+ children: col.label
12643
+ },
12644
+ col.key
12645
+ );
12646
+ }) }) }),
12647
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-border", children: block.rows.map((row, ri) => /* @__PURE__ */ jsxRuntime.jsx("tr", { className: "hover:bg-muted/30 transition-colors", children: block.columns.map((col) => {
12648
+ var _a2;
12649
+ return /* @__PURE__ */ jsxRuntime.jsx(
12650
+ "td",
12651
+ {
12652
+ className: cn(
12653
+ "px-4 py-3 font-sans text-foreground/90 align-top",
12654
+ alignClass[(_a2 = col.align) != null ? _a2 : "left"]
12655
+ ),
12656
+ children: row[col.key]
12657
+ },
12658
+ col.key
12659
+ );
12660
+ }) }, ri)) })
12661
+ ] }) }) }, i);
12662
+ case "callout": {
12663
+ const icon = (_d = block.icon) != null ? _d : "\u{1F449}";
12664
+ const cta = (_e = block.cta) != null ? _e : "Read more";
12665
+ const body = /* @__PURE__ */ jsxRuntime.jsxs(
12666
+ "div",
12667
+ {
12668
+ className: cn(
12669
+ "rounded-r-xl border-l-4 border-primary bg-muted/40 px-5 py-4",
12670
+ block.href && "transition-colors hover:bg-muted/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
12671
+ ),
12672
+ children: [
12673
+ block.title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-ui font-semibold text-foreground", children: block.title }),
12674
+ /* @__PURE__ */ jsxRuntime.jsxs(
12675
+ "p",
12676
+ {
12677
+ className: cn(
12678
+ "font-sans text-foreground/90 leading-relaxed",
12679
+ block.title && "mt-1"
12680
+ ),
12681
+ children: [
12682
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mr-1.5", children: icon }),
12683
+ block.text
12684
+ ]
12685
+ }
12686
+ ),
12687
+ block.href && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-2 inline-flex items-center gap-1.5 font-ui text-sm font-semibold text-primary", children: [
12688
+ cta,
12689
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-3.5 w-3.5" })
12690
+ ] })
12691
+ ]
12692
+ }
12693
+ );
12694
+ return block.href ? /* @__PURE__ */ jsxRuntime.jsx(
12695
+ "a",
12696
+ {
12697
+ href: block.href,
12698
+ target: block.external ? "_blank" : void 0,
12699
+ rel: block.external ? "noopener noreferrer" : void 0,
12700
+ className: "block no-underline",
12701
+ children: body
12702
+ },
12703
+ i
12704
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { children: body }, i);
12705
+ }
12706
+ case "quote":
12707
+ return /* @__PURE__ */ jsxRuntime.jsxs(
12708
+ "blockquote",
12709
+ {
12710
+ className: "border-l-4 border-border pl-5 py-1 font-sans text-xl sm:text-2xl italic leading-snug text-foreground",
12711
+ children: [
12712
+ block.text,
12713
+ block.cite && /* @__PURE__ */ jsxRuntime.jsxs("cite", { className: "mt-2 block font-ui text-sm not-italic font-semibold text-muted-foreground", children: [
12714
+ "\u2014 ",
12715
+ block.cite
12716
+ ] })
12717
+ ]
12718
+ },
12719
+ i
12720
+ );
12721
+ case "list": {
12722
+ const Tag = block.ordered ? "ol" : "ul";
12723
+ return /* @__PURE__ */ jsxRuntime.jsx(
12724
+ Tag,
12725
+ {
12726
+ className: cn(
12727
+ "font-sans text-base sm:text-lg leading-relaxed text-foreground/90 pl-5 space-y-2",
12728
+ block.ordered ? "list-decimal" : "list-disc"
12729
+ ),
12730
+ children: block.items.map((item, li) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "pl-1", children: item }, li))
12731
+ },
12732
+ i
12733
+ );
12734
+ }
12735
+ default:
12736
+ return null;
12737
+ }
12738
+ }
12739
+ function BlogPost({
12740
+ image,
12741
+ imageAlt = "",
12742
+ title,
12743
+ category,
12744
+ breadcrumb,
12745
+ author,
12746
+ date,
12747
+ readingTime,
12748
+ blocks,
12749
+ children,
12750
+ related,
12751
+ relatedTitle = "Keep reading",
12752
+ className
12753
+ }) {
12754
+ const hasMeta = !!(author || date || readingTime);
12755
+ return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn("w-full", className), children: [
12756
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full overflow-hidden bg-muted", children: [
12757
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-[62vh] min-h-[460px] w-full", children: /* @__PURE__ */ jsxRuntime.jsx(
12758
+ Picture,
12759
+ {
12760
+ src: image,
12761
+ alt: imageAlt || title,
12762
+ fetchPriority: "high",
12763
+ eager: true,
12764
+ className: "absolute inset-0 h-full w-full object-cover"
12765
+ }
12766
+ ) }),
12767
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
12768
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-3xl px-6 sm:px-8 pb-9 sm:pb-11", children: [
12769
+ 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(React31__namespace.Fragment, { children: [
12770
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
12771
+ crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
12772
+ "a",
12773
+ {
12774
+ href: crumb.href,
12775
+ className: "text-xs text-white/70 font-ui hover:text-white transition-colors",
12776
+ children: crumb.label
12777
+ }
12778
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui", children: crumb.label })
12779
+ ] }, i)) }),
12780
+ category && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", children: category }) }),
12781
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight", children: title }),
12782
+ hasMeta && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 flex items-center gap-4 flex-wrap", children: [
12783
+ author && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
12784
+ author.avatar && // eslint-disable-next-line @next/next/no-img-element
12785
+ /* @__PURE__ */ jsxRuntime.jsx(
12786
+ "img",
12787
+ {
12788
+ src: author.avatar,
12789
+ alt: author.name,
12790
+ loading: "lazy",
12791
+ className: "h-10 w-10 rounded-full object-cover ring-2 ring-white/30"
12792
+ }
12793
+ ),
12794
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "leading-tight", children: [
12795
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-white font-ui", children: author.name }),
12796
+ author.role && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-white/70 font-ui", children: author.role })
12797
+ ] })
12798
+ ] }),
12799
+ (date || readingTime) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4 text-white/80", children: [
12800
+ date && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5 text-sm font-ui", children: [
12801
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
12802
+ date
12803
+ ] }),
12804
+ readingTime && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5 text-sm font-ui", children: [
12805
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
12806
+ readingTime
12807
+ ] })
12808
+ ] })
12809
+ ] })
12810
+ ] }) })
12811
+ ] }),
12812
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-3xl px-6 sm:px-8 pt-10 sm:pt-12 pb-16", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [
12813
+ blocks.map((block, i) => renderBlock(block, i)),
12814
+ children
12815
+ ] }) }),
12816
+ related && related.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-border bg-muted/30", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-5xl px-6 sm:px-8 py-12", children: [
12817
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold font-heading text-foreground mb-6", children: relatedTitle }),
12818
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-5", children: related.map((post, i) => /* @__PURE__ */ jsxRuntime.jsx(BlogCard, __spreadProps(__spreadValues({}, post), { className: "w-full" }), i)) })
12819
+ ] }) })
12820
+ ] });
12821
+ }
12332
12822
  function useHlsVideo(videoRef, src) {
12333
- React30__namespace.useEffect(() => {
12823
+ React31__namespace.useEffect(() => {
12334
12824
  if (!src || !videoRef.current) return;
12335
12825
  const video = videoRef.current;
12336
12826
  if (!src.includes(".m3u8")) return;
@@ -12374,11 +12864,11 @@ function TripHeader({
12374
12864
  className
12375
12865
  }) {
12376
12866
  var _a;
12377
- const [heroIndex, setHeroIndex] = React30__namespace.useState(0);
12378
- const [videoReady, setVideoReady] = React30__namespace.useState(false);
12379
- const videoRef = React30__namespace.useRef(null);
12867
+ const [heroIndex, setHeroIndex] = React31__namespace.useState(0);
12868
+ const [videoReady, setVideoReady] = React31__namespace.useState(false);
12869
+ const videoRef = React31__namespace.useRef(null);
12380
12870
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
12381
- const validImages = React30__namespace.useMemo(
12871
+ const validImages = React31__namespace.useMemo(
12382
12872
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
12383
12873
  [images]
12384
12874
  );
@@ -12393,7 +12883,7 @@ function TripHeader({
12393
12883
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
12394
12884
  const hasMeta = !!(destination || duration);
12395
12885
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
12396
- React30__namespace.useEffect(() => {
12886
+ React31__namespace.useEffect(() => {
12397
12887
  if (!videoUrl) return;
12398
12888
  const el = videoRef.current;
12399
12889
  if (!el) return;
@@ -12536,7 +13026,7 @@ function TripHeader({
12536
13026
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
12537
13027
  ),
12538
13028
  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: [
13029
+ 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(React31__namespace.Fragment, { children: [
12540
13030
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
12541
13031
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
12542
13032
  ] }, i)) }),
@@ -12702,10 +13192,10 @@ function LanguagePicker({
12702
13192
  }) {
12703
13193
  var _a;
12704
13194
  const t = VARIANT2[variant];
12705
- const [open, setOpen] = React30__namespace.useState(false);
12706
- const ref = React30__namespace.useRef(null);
13195
+ const [open, setOpen] = React31__namespace.useState(false);
13196
+ const ref = React31__namespace.useRef(null);
12707
13197
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
12708
- React30__namespace.useEffect(() => {
13198
+ React31__namespace.useEffect(() => {
12709
13199
  if (!open) return;
12710
13200
  const onDocClick = (e) => {
12711
13201
  if (ref.current && !ref.current.contains(e.target)) {
@@ -12906,7 +13396,7 @@ function SiteFooter({
12906
13396
  children: wrapper
12907
13397
  },
12908
13398
  b.alt + i
12909
- ) : /* @__PURE__ */ jsxRuntime.jsx(React30__namespace.Fragment, { children: wrapper }, b.alt + i);
13399
+ ) : /* @__PURE__ */ jsxRuntime.jsx(React31__namespace.Fragment, { children: wrapper }, b.alt + i);
12910
13400
  }) })
12911
13401
  ] }),
12912
13402
  themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
@@ -13081,10 +13571,10 @@ function TripPage({
13081
13571
  className
13082
13572
  }) {
13083
13573
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
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(
13574
+ const [activeSection, setActiveSection] = React31__namespace.useState("");
13575
+ const [accordionValue, setAccordionValue] = React31__namespace.useState([]);
13576
+ const [faqsExpanded, setFaqsExpanded] = React31__namespace.useState(false);
13577
+ const accordionSectionIds = React31__namespace.useMemo(
13088
13578
  () => /* @__PURE__ */ new Set([
13089
13579
  "when-it-operates",
13090
13580
  "how-to-get-there",
@@ -13098,18 +13588,18 @@ function TripPage({
13098
13588
  ]),
13099
13589
  []
13100
13590
  );
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(
13591
+ const [navFloating, setNavFloating] = React31__namespace.useState(false);
13592
+ const [navHidden, setNavHidden] = React31__namespace.useState(false);
13593
+ const [isFloating, setIsFloating] = React31__namespace.useState(false);
13594
+ const [sidebarPos, setSidebarPos] = React31__namespace.useState(null);
13595
+ const [pricingBarVisible, setPricingBarVisible] = React31__namespace.useState(false);
13596
+ const navRef = React31__namespace.useRef(null);
13597
+ const navSentinelRef = React31__namespace.useRef(null);
13598
+ const sentinelRef = React31__namespace.useRef(null);
13599
+ const sidebarPlaceholderRef = React31__namespace.useRef(null);
13600
+ const pricingBarRef = React31__namespace.useRef(null);
13601
+ const galleryRef = React31__namespace.useRef(null);
13602
+ const sections = React31__namespace.useMemo(
13113
13603
  () => {
13114
13604
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
13115
13605
  return [
@@ -13131,7 +13621,7 @@ function TripPage({
13131
13621
  // eslint-disable-next-line react-hooks/exhaustive-deps
13132
13622
  []
13133
13623
  );
13134
- React30__namespace.useEffect(() => {
13624
+ React31__namespace.useEffect(() => {
13135
13625
  const sentinel = navSentinelRef.current;
13136
13626
  if (!sentinel) return;
13137
13627
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -13139,7 +13629,7 @@ function TripPage({
13139
13629
  update();
13140
13630
  return () => document.removeEventListener("scroll", update, { capture: true });
13141
13631
  }, []);
13142
- React30__namespace.useEffect(() => {
13632
+ React31__namespace.useEffect(() => {
13143
13633
  const sentinel = sentinelRef.current;
13144
13634
  if (!sentinel) return;
13145
13635
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -13147,7 +13637,7 @@ function TripPage({
13147
13637
  update();
13148
13638
  return () => document.removeEventListener("scroll", update, { capture: true });
13149
13639
  }, []);
13150
- React30__namespace.useEffect(() => {
13640
+ React31__namespace.useEffect(() => {
13151
13641
  const measure = () => {
13152
13642
  if (!sidebarPlaceholderRef.current) return;
13153
13643
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -13157,7 +13647,7 @@ function TripPage({
13157
13647
  window.addEventListener("resize", measure);
13158
13648
  return () => window.removeEventListener("resize", measure);
13159
13649
  }, [isFloating]);
13160
- React30__namespace.useEffect(() => {
13650
+ React31__namespace.useEffect(() => {
13161
13651
  const check = () => {
13162
13652
  var _a2;
13163
13653
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -13168,7 +13658,7 @@ function TripPage({
13168
13658
  check();
13169
13659
  return () => document.removeEventListener("scroll", check, { capture: true });
13170
13660
  }, []);
13171
- React30__namespace.useEffect(() => {
13661
+ React31__namespace.useEffect(() => {
13172
13662
  const check = () => {
13173
13663
  if (!pricingBarRef.current) return;
13174
13664
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -13177,7 +13667,7 @@ function TripPage({
13177
13667
  check();
13178
13668
  return () => document.removeEventListener("scroll", check, { capture: true });
13179
13669
  }, []);
13180
- React30__namespace.useEffect(() => {
13670
+ React31__namespace.useEffect(() => {
13181
13671
  if (sections.length === 0) return;
13182
13672
  setActiveSection(sections[0].id);
13183
13673
  const update = () => {
@@ -13652,123 +14142,6 @@ function TripPage({
13652
14142
  }
13653
14143
  );
13654
14144
  }
13655
- function ArrowIcon2() {
13656
- return /* @__PURE__ */ jsxRuntime.jsxs(
13657
- "svg",
13658
- {
13659
- width: "13",
13660
- height: "13",
13661
- viewBox: "0 0 24 24",
13662
- fill: "none",
13663
- stroke: "currentColor",
13664
- strokeWidth: "2.2",
13665
- strokeLinecap: "round",
13666
- strokeLinejoin: "round",
13667
- children: [
13668
- /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
13669
- /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "12 5 19 12 12 19" })
13670
- ]
13671
- }
13672
- );
13673
- }
13674
- var sizeConfig2 = {
13675
- sm: {
13676
- card: "h-72 w-56",
13677
- title: "text-lg font-bold",
13678
- meta: "text-xs",
13679
- excerpt: "text-xs"
13680
- },
13681
- md: {
13682
- card: "h-96 w-72",
13683
- title: "text-xl font-bold",
13684
- meta: "text-xs",
13685
- excerpt: "text-sm"
13686
- },
13687
- lg: {
13688
- card: "h-[28rem] w-96",
13689
- title: "text-2xl font-bold",
13690
- meta: "text-sm",
13691
- excerpt: "text-sm"
13692
- }
13693
- };
13694
- function BlogCard({
13695
- image,
13696
- imageAlt = "",
13697
- category,
13698
- readingTime,
13699
- date,
13700
- title,
13701
- excerpt,
13702
- href,
13703
- external,
13704
- cta,
13705
- size = "md",
13706
- className
13707
- }) {
13708
- var _a;
13709
- const s = sizeConfig2[size];
13710
- const meta = [date != null ? date : null, readingTime != null ? readingTime : null].filter(Boolean).join(" | ");
13711
- const ctaLabel = (_a = cta == null ? void 0 : cta.label) != null ? _a : "Read more";
13712
- const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
13713
- /* @__PURE__ */ jsxRuntime.jsx(
13714
- "img",
13715
- {
13716
- src: image,
13717
- alt: imageAlt,
13718
- loading: "lazy",
13719
- className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
13720
- }
13721
- ),
13722
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/40 to-black/10" }),
13723
- category ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", children: category }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10" }),
13724
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
13725
- meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/70 font-medium font-ui", s.meta), children: meta }),
13726
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-white leading-snug", s.title), children: title }),
13727
- excerpt && /* @__PURE__ */ jsxRuntime.jsx(
13728
- "p",
13729
- {
13730
- className: cn(
13731
- "text-white/80 leading-relaxed -mt-1 line-clamp-2",
13732
- s.excerpt
13733
- ),
13734
- children: excerpt
13735
- }
13736
- ),
13737
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex items-center justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs(
13738
- "span",
13739
- {
13740
- className: cn(
13741
- "group/cta inline-flex items-center gap-1.5 border-b border-white/70 pb-0.5",
13742
- "text-sm font-semibold text-white transition-colors hover:border-white hover:text-white",
13743
- "font-ui"
13744
- ),
13745
- children: [
13746
- ctaLabel,
13747
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "transition-transform duration-150 group-hover/cta:translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon2, {}) })
13748
- ]
13749
- }
13750
- ) })
13751
- ] })
13752
- ] });
13753
- const baseClasses = cn(
13754
- "group relative flex flex-col justify-between overflow-hidden rounded-2xl",
13755
- "shadow-md transition-shadow duration-300 hover:shadow-xl",
13756
- s.card,
13757
- className
13758
- );
13759
- return href ? /* @__PURE__ */ jsxRuntime.jsx(
13760
- "a",
13761
- {
13762
- href,
13763
- onClick: cta == null ? void 0 : cta.onClick,
13764
- className: baseClasses,
13765
- "aria-label": title,
13766
- target: external ? "_blank" : void 0,
13767
- rel: external ? "noopener noreferrer" : void 0,
13768
- children: inner
13769
- }
13770
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: inner });
13771
- }
13772
14145
  function SectionHeading({
13773
14146
  eyebrow,
13774
14147
  title,
@@ -13819,11 +14192,11 @@ function CategoryPage2({
13819
14192
  className
13820
14193
  }) {
13821
14194
  var _a;
13822
- const [videoReady, setVideoReady] = React30__namespace.useState(false);
13823
- const videoRef = React30__namespace.useRef(null);
14195
+ const [videoReady, setVideoReady] = React31__namespace.useState(false);
14196
+ const videoRef = React31__namespace.useRef(null);
13824
14197
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
13825
14198
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13826
- React30__namespace.useEffect(() => {
14199
+ React31__namespace.useEffect(() => {
13827
14200
  if (!videoUrl) return;
13828
14201
  const el = videoRef.current;
13829
14202
  if (!el) return;
@@ -13838,13 +14211,13 @@ function CategoryPage2({
13838
14211
  io.observe(el);
13839
14212
  return () => io.disconnect();
13840
14213
  }, [videoUrl]);
13841
- const [faqsExpanded, setFaqsExpanded] = React30__namespace.useState(false);
13842
- const [tripsExpanded, setTripsExpanded] = React30__namespace.useState(false);
13843
- const [filterValue, setFilterValue] = React30__namespace.useState({});
13844
- const [sort, setSort] = React30__namespace.useState(
14214
+ const [faqsExpanded, setFaqsExpanded] = React31__namespace.useState(false);
14215
+ const [tripsExpanded, setTripsExpanded] = React31__namespace.useState(false);
14216
+ const [filterValue, setFilterValue] = React31__namespace.useState({});
14217
+ const [sort, setSort] = React31__namespace.useState(
13845
14218
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
13846
14219
  );
13847
- const sortedTrips = React30__namespace.useMemo(() => {
14220
+ const sortedTrips = React31__namespace.useMemo(() => {
13848
14221
  const active = Object.entries(filterValue).filter(
13849
14222
  ([, vals]) => vals && vals.length > 0
13850
14223
  );
@@ -13948,7 +14321,7 @@ function CategoryPage2({
13948
14321
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
13949
14322
  breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
13950
14323
  const isLast = i === breadcrumb.length - 1;
13951
- return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
14324
+ return /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
13952
14325
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13953
14326
  crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
13954
14327
  "a",
@@ -14236,12 +14609,12 @@ function Toast({
14236
14609
  duration = 6e3,
14237
14610
  className
14238
14611
  }) {
14239
- const [mounted, setMounted] = React30__namespace.useState(false);
14240
- const [visible, setVisible] = React30__namespace.useState(true);
14241
- React30__namespace.useEffect(() => {
14612
+ const [mounted, setMounted] = React31__namespace.useState(false);
14613
+ const [visible, setVisible] = React31__namespace.useState(true);
14614
+ React31__namespace.useEffect(() => {
14242
14615
  setMounted(true);
14243
14616
  }, []);
14244
- React30__namespace.useEffect(() => {
14617
+ React31__namespace.useEffect(() => {
14245
14618
  if (duration === 0) return;
14246
14619
  const t = setTimeout(() => {
14247
14620
  setVisible(false);
@@ -14648,21 +15021,21 @@ function LeadCapturePopup({
14648
15021
  }) {
14649
15022
  var _a;
14650
15023
  const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
14651
- const [open, setOpen] = React30.useState(false);
14652
- const [closing, setClosing] = React30.useState(false);
14653
- const [submitted, setSubmitted] = React30.useState(false);
14654
- const [submitting, setSubmitting] = React30.useState(false);
14655
- const [error, setError] = React30.useState(null);
14656
- const [name, setName] = React30.useState("");
14657
- const [email, setEmail] = React30.useState("");
14658
- const [travelDate, setTravelDate] = React30.useState("");
14659
- const panelRef = React30.useRef(null);
14660
- const nameRef = React30.useRef(null);
14661
- const show = React30.useCallback(() => {
15024
+ const [open, setOpen] = React31.useState(false);
15025
+ const [closing, setClosing] = React31.useState(false);
15026
+ const [submitted, setSubmitted] = React31.useState(false);
15027
+ const [submitting, setSubmitting] = React31.useState(false);
15028
+ const [error, setError] = React31.useState(null);
15029
+ const [name, setName] = React31.useState("");
15030
+ const [email, setEmail] = React31.useState("");
15031
+ const [travelDate, setTravelDate] = React31.useState("");
15032
+ const panelRef = React31.useRef(null);
15033
+ const nameRef = React31.useRef(null);
15034
+ const show = React31.useCallback(() => {
14662
15035
  if (isDismissed()) return;
14663
15036
  setOpen(true);
14664
15037
  }, []);
14665
- React30.useEffect(() => {
15038
+ React31.useEffect(() => {
14666
15039
  var _a2;
14667
15040
  if (isDismissed()) return;
14668
15041
  if (config.trigger === "delay") {
@@ -14689,7 +15062,7 @@ function LeadCapturePopup({
14689
15062
  return () => window.removeEventListener("scroll", handler);
14690
15063
  }
14691
15064
  }, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
14692
- React30.useEffect(() => {
15065
+ React31.useEffect(() => {
14693
15066
  if (open && !submitted) {
14694
15067
  requestAnimationFrame(() => {
14695
15068
  var _a2;
@@ -14697,7 +15070,7 @@ function LeadCapturePopup({
14697
15070
  });
14698
15071
  }
14699
15072
  }, [open, submitted]);
14700
- const close = React30.useCallback(() => {
15073
+ const close = React31.useCallback(() => {
14701
15074
  setClosing(true);
14702
15075
  setDismissed(config.dismissDays);
14703
15076
  setTimeout(() => {
@@ -14705,7 +15078,7 @@ function LeadCapturePopup({
14705
15078
  setClosing(false);
14706
15079
  }, 250);
14707
15080
  }, [config.dismissDays]);
14708
- React30.useEffect(() => {
15081
+ React31.useEffect(() => {
14709
15082
  if (!open) return;
14710
15083
  const handler = (e) => {
14711
15084
  if (e.key === "Escape") close();
@@ -14713,7 +15086,7 @@ function LeadCapturePopup({
14713
15086
  document.addEventListener("keydown", handler);
14714
15087
  return () => document.removeEventListener("keydown", handler);
14715
15088
  }, [open, close]);
14716
- const onOverlayClick = React30.useCallback(
15089
+ const onOverlayClick = React31.useCallback(
14717
15090
  (e) => {
14718
15091
  if (panelRef.current && !panelRef.current.contains(e.target)) {
14719
15092
  close();
@@ -14951,11 +15324,11 @@ function ExoOrb({
14951
15324
  trackCursor = true,
14952
15325
  className
14953
15326
  }) {
14954
- const uid = React30.useId().replace(/:/g, "");
15327
+ const uid = React31.useId().replace(/:/g, "");
14955
15328
  const id = (name) => `exo-orb-${uid}-${name}`;
14956
- const rootRef = React30.useRef(null);
14957
- const pupilRef = React30.useRef(null);
14958
- React30.useEffect(() => {
15329
+ const rootRef = React31.useRef(null);
15330
+ const pupilRef = React31.useRef(null);
15331
+ React31.useEffect(() => {
14959
15332
  if (!trackCursor) return;
14960
15333
  if (typeof window === "undefined") return;
14961
15334
  if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
@@ -15151,13 +15524,13 @@ function AskExo({
15151
15524
  teaserDelayMs = 2500,
15152
15525
  teaserDurationMs = 6e3
15153
15526
  }) {
15154
- const [open, setOpen] = React30.useState(false);
15155
- const [question, setQuestion] = React30.useState("");
15156
- const [teaserVisible, setTeaserVisible] = React30.useState(false);
15527
+ const [open, setOpen] = React31.useState(false);
15528
+ const [question, setQuestion] = React31.useState("");
15529
+ const [teaserVisible, setTeaserVisible] = React31.useState(false);
15157
15530
  const teaserEnabled = !!teaser && teaser !== "";
15158
- const inputRef = React30.useRef(null);
15159
- const textareaRef = React30.useRef(null);
15160
- React30.useEffect(() => {
15531
+ const inputRef = React31.useRef(null);
15532
+ const textareaRef = React31.useRef(null);
15533
+ React31.useEffect(() => {
15161
15534
  if (!open) {
15162
15535
  setQuestion("");
15163
15536
  return;
@@ -15169,7 +15542,7 @@ function AskExo({
15169
15542
  }, 200);
15170
15543
  return () => clearTimeout(t);
15171
15544
  }, [open, variant]);
15172
- React30.useEffect(() => {
15545
+ React31.useEffect(() => {
15173
15546
  if (!open) return;
15174
15547
  const onKey = (e) => {
15175
15548
  if (e.key === "Escape") setOpen(false);
@@ -15177,7 +15550,7 @@ function AskExo({
15177
15550
  document.addEventListener("keydown", onKey);
15178
15551
  return () => document.removeEventListener("keydown", onKey);
15179
15552
  }, [open]);
15180
- React30.useEffect(() => {
15553
+ React31.useEffect(() => {
15181
15554
  if (!teaserEnabled || open) return;
15182
15555
  if (typeof window === "undefined") return;
15183
15556
  const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
@@ -15190,7 +15563,7 @@ function AskExo({
15190
15563
  clearTimeout(hideTimer);
15191
15564
  };
15192
15565
  }, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
15193
- React30.useEffect(() => {
15566
+ React31.useEffect(() => {
15194
15567
  if (open) setTeaserVisible(false);
15195
15568
  }, [open]);
15196
15569
  const askExo = (q) => {
@@ -15743,8 +16116,8 @@ function ShareWidget({
15743
16116
  title = "Invite friends & lower the price",
15744
16117
  className
15745
16118
  }) {
15746
- const [copied, setCopied] = React30__namespace.useState(false);
15747
- const [showToast, setShowToast] = React30__namespace.useState(false);
16119
+ const [copied, setCopied] = React31__namespace.useState(false);
16120
+ const [showToast, setShowToast] = React31__namespace.useState(false);
15748
16121
  const encodedUrl = encodeURIComponent(url);
15749
16122
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
15750
16123
  const channels = [
@@ -15899,6 +16272,8 @@ exports.AgentContactCard = AgentContactCard;
15899
16272
  exports.Alert = Alert;
15900
16273
  exports.AskExo = AskExo;
15901
16274
  exports.BirthDateField = BirthDateField;
16275
+ exports.BlogCard = BlogCard;
16276
+ exports.BlogPost = BlogPost;
15902
16277
  exports.BookingAdventureCard = BookingAdventureCard;
15903
16278
  exports.BookingCancellationEmail = BookingCancellationEmail;
15904
16279
  exports.BookingConfirmedCard = BookingConfirmedCard;