@planetaexo/design-system 0.57.1 → 0.58.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 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") {
@@ -10052,32 +10106,51 @@ function Picture(_a) {
10052
10106
  const webp = webpVariantUrl(src);
10053
10107
  const realSrc = visible ? src : PLACEHOLDER_SRC;
10054
10108
  const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
10109
+ const handleLoad = (e) => {
10110
+ if (visible) setLoaded(true);
10111
+ onLoad == null ? void 0 : onLoad(e);
10112
+ };
10113
+ const handleError = (e) => {
10114
+ if (visible) setLoaded(true);
10115
+ onError == null ? void 0 : onError(e);
10116
+ };
10117
+ const showLoader = visible && !loaded;
10055
10118
  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
- );
10119
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10120
+ showLoader && /* @__PURE__ */ jsxRuntime.jsx(PictureLoader, {}),
10121
+ /* @__PURE__ */ jsxRuntime.jsx(
10122
+ "img",
10123
+ __spreadValues({
10124
+ ref,
10125
+ src: realSrc,
10126
+ "data-src": visible ? void 0 : src,
10127
+ decoding: decodingResolved,
10128
+ loading: loading != null ? loading : eager ? void 0 : "lazy",
10129
+ onLoad: handleLoad,
10130
+ onError: handleError
10131
+ }, imgProps)
10132
+ )
10133
+ ] });
10066
10134
  }
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
- )
10135
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10136
+ showLoader && /* @__PURE__ */ jsxRuntime.jsx(PictureLoader, {}),
10137
+ /* @__PURE__ */ jsxRuntime.jsxs("picture", { style: { display: "contents" }, children: [
10138
+ visible && /* @__PURE__ */ jsxRuntime.jsx("source", { srcSet: webp, type: "image/webp" }),
10139
+ extraSources,
10140
+ /* @__PURE__ */ jsxRuntime.jsx(
10141
+ "img",
10142
+ __spreadValues({
10143
+ ref,
10144
+ src: realSrc,
10145
+ "data-src": visible ? void 0 : src,
10146
+ "data-srcset-webp": visible ? void 0 : webp,
10147
+ decoding: decodingResolved,
10148
+ loading: loading != null ? loading : eager ? void 0 : "lazy",
10149
+ onLoad: handleLoad,
10150
+ onError: handleError
10151
+ }, imgProps)
10152
+ )
10153
+ ] })
10081
10154
  ] });
10082
10155
  }
10083
10156
  function ItineraryDayCard({
@@ -10146,11 +10219,11 @@ function ItineraryModal({
10146
10219
  onNext
10147
10220
  }) {
10148
10221
  var _a, _b, _c;
10149
- const [imgIndex, setImgIndex] = React30__namespace.useState(0);
10222
+ const [imgIndex, setImgIndex] = React31__namespace.useState(0);
10150
10223
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
10151
10224
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
10152
10225
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
10153
- React30__namespace.useEffect(() => {
10226
+ React31__namespace.useEffect(() => {
10154
10227
  setImgIndex(0);
10155
10228
  }, [stop == null ? void 0 : stop.dayNumber]);
10156
10229
  if (!stop) return null;
@@ -10277,8 +10350,8 @@ function ItineraryModal({
10277
10350
  ) });
10278
10351
  }
10279
10352
  function Itinerary({ title, subtitle, stops, className }) {
10280
- const [activeIndex, setActiveIndex] = React30__namespace.useState(null);
10281
- const scrollRef = React30__namespace.useRef(null);
10353
+ const [activeIndex, setActiveIndex] = React31__namespace.useState(null);
10354
+ const scrollRef = React31__namespace.useRef(null);
10282
10355
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
10283
10356
  const scrollBy = (dir) => {
10284
10357
  if (!scrollRef.current) return;
@@ -10370,18 +10443,18 @@ function Lightbox({
10370
10443
  onClose
10371
10444
  }) {
10372
10445
  var _a;
10373
- const [index, setIndex] = React30__namespace.useState(initialIndex);
10446
+ const [index, setIndex] = React31__namespace.useState(initialIndex);
10374
10447
  const total = photos.length;
10375
10448
  const photo = photos[index];
10376
- const prev = React30__namespace.useCallback(
10449
+ const prev = React31__namespace.useCallback(
10377
10450
  () => setIndex((i) => (i - 1 + total) % total),
10378
10451
  [total]
10379
10452
  );
10380
- const next = React30__namespace.useCallback(
10453
+ const next = React31__namespace.useCallback(
10381
10454
  () => setIndex((i) => (i + 1) % total),
10382
10455
  [total]
10383
10456
  );
10384
- React30__namespace.useEffect(() => {
10457
+ React31__namespace.useEffect(() => {
10385
10458
  const onKey = (e) => {
10386
10459
  if (e.key === "Escape") onClose();
10387
10460
  if (e.key === "ArrowLeft") prev();
@@ -10486,7 +10559,8 @@ function PhotoTile({
10486
10559
  photo,
10487
10560
  index,
10488
10561
  className,
10489
- onClick
10562
+ onClick,
10563
+ showCredit = false
10490
10564
  }) {
10491
10565
  var _a, _b;
10492
10566
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -10509,7 +10583,8 @@ function PhotoTile({
10509
10583
  loading: "lazy"
10510
10584
  }
10511
10585
  ),
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" }) })
10586
+ /* @__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" }) }),
10587
+ 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
10588
  ]
10514
10589
  }
10515
10590
  );
@@ -10547,7 +10622,7 @@ function GridGallery({
10547
10622
  initialVisible,
10548
10623
  onOpen
10549
10624
  }) {
10550
- const [expanded, setExpanded] = React30__namespace.useState(false);
10625
+ const [expanded, setExpanded] = React31__namespace.useState(false);
10551
10626
  const cols = gridCols(photos.length);
10552
10627
  const hasMore = photos.length > initialVisible;
10553
10628
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -10577,7 +10652,7 @@ function CompactGridGallery({
10577
10652
  initialVisible,
10578
10653
  onOpen
10579
10654
  }) {
10580
- const [expanded, setExpanded] = React30__namespace.useState(false);
10655
+ const [expanded, setExpanded] = React31__namespace.useState(false);
10581
10656
  const hasMore = photos.length > initialVisible;
10582
10657
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
10583
10658
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10606,7 +10681,7 @@ function MasonryGallery({
10606
10681
  initialVisible,
10607
10682
  onOpen
10608
10683
  }) {
10609
- const [expanded, setExpanded] = React30__namespace.useState(false);
10684
+ const [expanded, setExpanded] = React31__namespace.useState(false);
10610
10685
  const hasMore = photos.length > initialVisible;
10611
10686
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
10612
10687
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10679,7 +10754,7 @@ function FeaturedGallery({
10679
10754
  photos,
10680
10755
  onOpen
10681
10756
  }) {
10682
- const [expanded, setExpanded] = React30__namespace.useState(false);
10757
+ const [expanded, setExpanded] = React31__namespace.useState(false);
10683
10758
  const featured = photos.slice(0, 3);
10684
10759
  const extra = photos.slice(3);
10685
10760
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -10749,6 +10824,37 @@ function FeaturedGallery({
10749
10824
  )
10750
10825
  ] });
10751
10826
  }
10827
+ function CollageGallery({
10828
+ photos,
10829
+ onOpen,
10830
+ seamless = false
10831
+ }) {
10832
+ const [hero, ...rest] = photos;
10833
+ const gap = seamless ? "gap-0" : "gap-1.5";
10834
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col", gap), children: [
10835
+ hero && /* @__PURE__ */ jsxRuntime.jsx(
10836
+ PhotoTile,
10837
+ {
10838
+ photo: hero,
10839
+ index: 0,
10840
+ className: "aspect-[16/10] sm:aspect-[2/1]",
10841
+ onClick: () => onOpen(0),
10842
+ showCredit: true
10843
+ }
10844
+ ),
10845
+ rest.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid grid-cols-2", gap), children: rest.map((p, i) => /* @__PURE__ */ jsxRuntime.jsx(
10846
+ PhotoTile,
10847
+ {
10848
+ photo: p,
10849
+ index: i + 1,
10850
+ className: "aspect-[4/3]",
10851
+ onClick: () => onOpen(i + 1),
10852
+ showCredit: true
10853
+ },
10854
+ i + 1
10855
+ )) })
10856
+ ] });
10857
+ }
10752
10858
  function CarouselGallery({
10753
10859
  photos,
10754
10860
  index,
@@ -10846,9 +10952,9 @@ function PhotoGallery({
10846
10952
  onPhotoClick,
10847
10953
  className
10848
10954
  }) {
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]);
10955
+ const [lightboxIndex, setLightboxIndex] = React31__namespace.useState(null);
10956
+ const [carouselIndex, setCarouselIndex] = React31__namespace.useState(0);
10957
+ const normalised = React31__namespace.useMemo(() => photos.map(normalise), [photos]);
10852
10958
  const handleOpen = (index) => {
10853
10959
  setLightboxIndex(index);
10854
10960
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
@@ -10908,6 +11014,8 @@ function PhotoGallery({
10908
11014
  ),
10909
11015
  variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
10910
11016
  variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
11017
+ variant === "collage" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
11018
+ variant === "collageTight" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
10911
11019
  lightbox
10912
11020
  ] });
10913
11021
  }
@@ -10932,7 +11040,7 @@ function ItineraryDay({
10932
11040
  photoLayout = "rounded",
10933
11041
  className
10934
11042
  }) {
10935
- const photoList = React30__namespace.useMemo(() => normalisePhotos(photos), [photos]);
11043
+ const photoList = React31__namespace.useMemo(() => normalisePhotos(photos), [photos]);
10936
11044
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
10937
11045
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
10938
11046
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
@@ -10987,8 +11095,8 @@ function MenuTrip({
10987
11095
  bold = true,
10988
11096
  className
10989
11097
  }) {
10990
- const scrollRef = React30__namespace.useRef(null);
10991
- React30__namespace.useEffect(() => {
11098
+ const scrollRef = React31__namespace.useRef(null);
11099
+ React31__namespace.useEffect(() => {
10992
11100
  if (!scrollRef.current || !activeSection) return;
10993
11101
  const container = scrollRef.current;
10994
11102
  const btn = container.querySelector(
@@ -11184,8 +11292,8 @@ function PricingTrip({
11184
11292
  className
11185
11293
  }) {
11186
11294
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
11187
- const [showEstimates, setShowEstimates] = React30__namespace.useState(false);
11188
- const [showPriceInfo, setShowPriceInfo] = React30__namespace.useState(false);
11295
+ const [showEstimates, setShowEstimates] = React31__namespace.useState(false);
11296
+ const [showPriceInfo, setShowPriceInfo] = React31__namespace.useState(false);
11189
11297
  if (variant === "compact") {
11190
11298
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
11191
11299
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -11625,14 +11733,14 @@ function SiteHeader({
11625
11733
  }) {
11626
11734
  const t = VARIANT[variant];
11627
11735
  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);
11736
+ const [openMenu, setOpenMenu] = React31__namespace.useState(null);
11737
+ const [langOpen, setLangOpen] = React31__namespace.useState(false);
11738
+ const [mobileOpen, setMobileOpen] = React31__namespace.useState(false);
11739
+ const [openMobileSection, setOpenMobileSection] = React31__namespace.useState(null);
11740
+ const [activeLang, setActiveLang] = React31__namespace.useState(currentLanguage);
11633
11741
  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);
11742
+ const menuCloseTimer = React31__namespace.useRef(void 0);
11743
+ const langCloseTimer = React31__namespace.useRef(void 0);
11636
11744
  const handleMenuEnter = (label) => {
11637
11745
  clearTimeout(menuCloseTimer.current);
11638
11746
  setOpenMenu(label);
@@ -11653,7 +11761,7 @@ function SiteHeader({
11653
11761
  setOpenMenu(null);
11654
11762
  setLangOpen(false);
11655
11763
  };
11656
- React30__namespace.useEffect(() => () => {
11764
+ React31__namespace.useEffect(() => () => {
11657
11765
  clearTimeout(menuCloseTimer.current);
11658
11766
  clearTimeout(langCloseTimer.current);
11659
11767
  }, []);
@@ -11929,7 +12037,7 @@ function SiteHeader({
11929
12037
  ), children: [
11930
12038
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
11931
12039
  const isActive = lang.code === activeLang;
11932
- return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
12040
+ return /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
11933
12041
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
11934
12042
  "text-xs select-none",
11935
12043
  variant === "white" ? "text-border" : "text-white/15"
@@ -11991,8 +12099,8 @@ function SiteHeader({
11991
12099
  );
11992
12100
  }
11993
12101
  function ThemeToggle({ className }) {
11994
- const [dark, setDark] = React30__namespace.useState(false);
11995
- React30__namespace.useEffect(() => {
12102
+ const [dark, setDark] = React31__namespace.useState(false);
12103
+ React31__namespace.useEffect(() => {
11996
12104
  const saved = localStorage.getItem("theme");
11997
12105
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
11998
12106
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -12042,7 +12150,7 @@ var chipVariants = classVarianceAuthority.cva(
12042
12150
  }
12043
12151
  }
12044
12152
  );
12045
- var Chip = React30__namespace.forwardRef(function Chip2(_a, ref) {
12153
+ var Chip = React31__namespace.forwardRef(function Chip2(_a, ref) {
12046
12154
  var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
12047
12155
  const classes = cn(chipVariants({ variant, size }), className);
12048
12156
  if (href) {
@@ -12144,7 +12252,7 @@ function TripCardEditorial(props) {
12144
12252
  tag,
12145
12253
  tagHref
12146
12254
  } = props;
12147
- const [internalFav, setInternalFav] = React30__namespace.useState(false);
12255
+ const [internalFav, setInternalFav] = React31__namespace.useState(false);
12148
12256
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
12149
12257
  const handleFav = (e) => {
12150
12258
  e.preventDefault();
@@ -12329,8 +12437,387 @@ function TripCard(props) {
12329
12437
  }
12330
12438
  );
12331
12439
  }
12440
+ function ArrowIcon2() {
12441
+ return /* @__PURE__ */ jsxRuntime.jsxs(
12442
+ "svg",
12443
+ {
12444
+ width: "13",
12445
+ height: "13",
12446
+ viewBox: "0 0 24 24",
12447
+ fill: "none",
12448
+ stroke: "currentColor",
12449
+ strokeWidth: "2.2",
12450
+ strokeLinecap: "round",
12451
+ strokeLinejoin: "round",
12452
+ children: [
12453
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
12454
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "12 5 19 12 12 19" })
12455
+ ]
12456
+ }
12457
+ );
12458
+ }
12459
+ var sizeConfig2 = {
12460
+ sm: {
12461
+ card: "h-72 w-56",
12462
+ title: "text-lg font-bold",
12463
+ meta: "text-xs",
12464
+ excerpt: "text-xs"
12465
+ },
12466
+ md: {
12467
+ card: "h-96 w-72",
12468
+ title: "text-xl font-bold",
12469
+ meta: "text-xs",
12470
+ excerpt: "text-sm"
12471
+ },
12472
+ lg: {
12473
+ card: "h-[28rem] w-96",
12474
+ title: "text-2xl font-bold",
12475
+ meta: "text-sm",
12476
+ excerpt: "text-sm"
12477
+ }
12478
+ };
12479
+ function BlogCard({
12480
+ image,
12481
+ imageAlt = "",
12482
+ category,
12483
+ readingTime,
12484
+ date,
12485
+ title,
12486
+ excerpt,
12487
+ href,
12488
+ external,
12489
+ cta,
12490
+ size = "md",
12491
+ className
12492
+ }) {
12493
+ var _a;
12494
+ const s = sizeConfig2[size];
12495
+ const meta = [date != null ? date : null, readingTime != null ? readingTime : null].filter(Boolean).join(" | ");
12496
+ const ctaLabel = (_a = cta == null ? void 0 : cta.label) != null ? _a : "Read more";
12497
+ const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
12498
+ /* @__PURE__ */ jsxRuntime.jsx(
12499
+ "img",
12500
+ {
12501
+ src: image,
12502
+ alt: imageAlt,
12503
+ loading: "lazy",
12504
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
12505
+ }
12506
+ ),
12507
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/40 to-black/10" }),
12508
+ 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" }),
12509
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
12510
+ meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/70 font-medium font-ui", s.meta), children: meta }),
12511
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-white leading-snug", s.title), children: title }),
12512
+ excerpt && /* @__PURE__ */ jsxRuntime.jsx(
12513
+ "p",
12514
+ {
12515
+ className: cn(
12516
+ "text-white/80 leading-relaxed -mt-1 line-clamp-2",
12517
+ s.excerpt
12518
+ ),
12519
+ children: excerpt
12520
+ }
12521
+ ),
12522
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex items-center justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs(
12523
+ "span",
12524
+ {
12525
+ className: cn(
12526
+ "group/cta inline-flex items-center gap-1.5 border-b border-white/70 pb-0.5",
12527
+ "text-sm font-semibold text-white transition-colors hover:border-white hover:text-white",
12528
+ "font-ui"
12529
+ ),
12530
+ children: [
12531
+ ctaLabel,
12532
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "transition-transform duration-150 group-hover/cta:translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon2, {}) })
12533
+ ]
12534
+ }
12535
+ ) })
12536
+ ] })
12537
+ ] });
12538
+ const baseClasses = cn(
12539
+ "group relative flex flex-col justify-between overflow-hidden rounded-2xl",
12540
+ "shadow-md transition-shadow duration-300 hover:shadow-xl",
12541
+ s.card,
12542
+ className
12543
+ );
12544
+ return href ? /* @__PURE__ */ jsxRuntime.jsx(
12545
+ "a",
12546
+ {
12547
+ href,
12548
+ onClick: cta == null ? void 0 : cta.onClick,
12549
+ className: baseClasses,
12550
+ "aria-label": title,
12551
+ target: external ? "_blank" : void 0,
12552
+ rel: external ? "noopener noreferrer" : void 0,
12553
+ children: inner
12554
+ }
12555
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: inner });
12556
+ }
12557
+ var alignClass = {
12558
+ left: "text-left",
12559
+ center: "text-center",
12560
+ right: "text-right"
12561
+ };
12562
+ function Figure({
12563
+ caption,
12564
+ wide,
12565
+ children
12566
+ }) {
12567
+ return /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: cn(wide && "lg:-mx-24"), children: [
12568
+ children,
12569
+ caption && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: "mt-2.5 text-center text-xs text-muted-foreground font-sans italic", children: caption })
12570
+ ] });
12571
+ }
12572
+ function renderBlock(block, i) {
12573
+ var _a, _b, _c, _d, _e;
12574
+ switch (block.type) {
12575
+ case "paragraph":
12576
+ return /* @__PURE__ */ jsxRuntime.jsx(
12577
+ "p",
12578
+ {
12579
+ className: cn(
12580
+ "font-sans text-foreground/90",
12581
+ block.lead ? "text-lg sm:text-xl leading-relaxed text-foreground" : "text-base sm:text-lg leading-relaxed"
12582
+ ),
12583
+ children: block.text
12584
+ },
12585
+ i
12586
+ );
12587
+ case "heading": {
12588
+ const level = (_a = block.level) != null ? _a : 2;
12589
+ const Tag = level === 2 ? "h2" : "h3";
12590
+ return /* @__PURE__ */ jsxRuntime.jsx(
12591
+ Tag,
12592
+ {
12593
+ id: block.id,
12594
+ className: cn(
12595
+ "font-heading font-bold text-foreground scroll-mt-24",
12596
+ level === 2 ? "text-2xl sm:text-3xl leading-tight pt-2" : "text-xl sm:text-2xl leading-snug"
12597
+ ),
12598
+ children: block.text
12599
+ },
12600
+ i
12601
+ );
12602
+ }
12603
+ case "image":
12604
+ return /* @__PURE__ */ jsxRuntime.jsxs(Figure, { caption: block.caption, wide: block.wide, children: [
12605
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-2xl bg-muted shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
12606
+ Picture,
12607
+ {
12608
+ src: block.src,
12609
+ alt: (_b = block.alt) != null ? _b : "",
12610
+ loading: "lazy",
12611
+ className: "w-full h-auto object-cover"
12612
+ }
12613
+ ) }),
12614
+ block.credit && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sr-only", children: [
12615
+ "Photo: ",
12616
+ block.credit
12617
+ ] })
12618
+ ] }, i);
12619
+ case "collage":
12620
+ return /* @__PURE__ */ jsxRuntime.jsx(Figure, { caption: block.caption, wide: block.wide, children: /* @__PURE__ */ jsxRuntime.jsx(
12621
+ PhotoGallery,
12622
+ {
12623
+ photos: block.photos,
12624
+ variant: (_c = block.variant) != null ? _c : "collage",
12625
+ initialVisible: Infinity
12626
+ }
12627
+ ) }, i);
12628
+ case "table":
12629
+ 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: [
12630
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-muted/60", children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: block.columns.map((col) => {
12631
+ var _a2;
12632
+ return /* @__PURE__ */ jsxRuntime.jsx(
12633
+ "th",
12634
+ {
12635
+ className: cn(
12636
+ "px-4 py-3 font-ui font-semibold text-foreground whitespace-nowrap",
12637
+ alignClass[(_a2 = col.align) != null ? _a2 : "left"]
12638
+ ),
12639
+ children: col.label
12640
+ },
12641
+ col.key
12642
+ );
12643
+ }) }) }),
12644
+ /* @__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) => {
12645
+ var _a2;
12646
+ return /* @__PURE__ */ jsxRuntime.jsx(
12647
+ "td",
12648
+ {
12649
+ className: cn(
12650
+ "px-4 py-3 font-sans text-foreground/90 align-top",
12651
+ alignClass[(_a2 = col.align) != null ? _a2 : "left"]
12652
+ ),
12653
+ children: row[col.key]
12654
+ },
12655
+ col.key
12656
+ );
12657
+ }) }, ri)) })
12658
+ ] }) }) }, i);
12659
+ case "callout": {
12660
+ const icon = (_d = block.icon) != null ? _d : "\u{1F449}";
12661
+ const cta = (_e = block.cta) != null ? _e : "Read more";
12662
+ const body = /* @__PURE__ */ jsxRuntime.jsxs(
12663
+ "div",
12664
+ {
12665
+ className: cn(
12666
+ "rounded-r-xl border-l-4 border-primary bg-muted/40 px-5 py-4",
12667
+ block.href && "transition-colors hover:bg-muted/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
12668
+ ),
12669
+ children: [
12670
+ block.title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-ui font-semibold text-foreground", children: block.title }),
12671
+ /* @__PURE__ */ jsxRuntime.jsxs(
12672
+ "p",
12673
+ {
12674
+ className: cn(
12675
+ "font-sans text-foreground/90 leading-relaxed",
12676
+ block.title && "mt-1"
12677
+ ),
12678
+ children: [
12679
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mr-1.5", children: icon }),
12680
+ block.text
12681
+ ]
12682
+ }
12683
+ ),
12684
+ 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: [
12685
+ cta,
12686
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-3.5 w-3.5" })
12687
+ ] })
12688
+ ]
12689
+ }
12690
+ );
12691
+ return block.href ? /* @__PURE__ */ jsxRuntime.jsx(
12692
+ "a",
12693
+ {
12694
+ href: block.href,
12695
+ target: block.external ? "_blank" : void 0,
12696
+ rel: block.external ? "noopener noreferrer" : void 0,
12697
+ className: "block no-underline",
12698
+ children: body
12699
+ },
12700
+ i
12701
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { children: body }, i);
12702
+ }
12703
+ case "quote":
12704
+ return /* @__PURE__ */ jsxRuntime.jsxs(
12705
+ "blockquote",
12706
+ {
12707
+ className: "border-l-4 border-border pl-5 py-1 font-sans text-xl sm:text-2xl italic leading-snug text-foreground",
12708
+ children: [
12709
+ block.text,
12710
+ block.cite && /* @__PURE__ */ jsxRuntime.jsxs("cite", { className: "mt-2 block font-ui text-sm not-italic font-semibold text-muted-foreground", children: [
12711
+ "\u2014 ",
12712
+ block.cite
12713
+ ] })
12714
+ ]
12715
+ },
12716
+ i
12717
+ );
12718
+ case "list": {
12719
+ const Tag = block.ordered ? "ol" : "ul";
12720
+ return /* @__PURE__ */ jsxRuntime.jsx(
12721
+ Tag,
12722
+ {
12723
+ className: cn(
12724
+ "font-sans text-base sm:text-lg leading-relaxed text-foreground/90 pl-5 space-y-2",
12725
+ block.ordered ? "list-decimal" : "list-disc"
12726
+ ),
12727
+ children: block.items.map((item, li) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "pl-1", children: item }, li))
12728
+ },
12729
+ i
12730
+ );
12731
+ }
12732
+ default:
12733
+ return null;
12734
+ }
12735
+ }
12736
+ function BlogPost({
12737
+ image,
12738
+ imageAlt = "",
12739
+ title,
12740
+ category,
12741
+ breadcrumb,
12742
+ author,
12743
+ date,
12744
+ readingTime,
12745
+ blocks,
12746
+ children,
12747
+ related,
12748
+ relatedTitle = "Keep reading",
12749
+ className
12750
+ }) {
12751
+ const hasMeta = !!(author || date || readingTime);
12752
+ return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn("w-full", className), children: [
12753
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full overflow-hidden bg-muted", children: [
12754
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-[62vh] min-h-[460px] w-full", children: /* @__PURE__ */ jsxRuntime.jsx(
12755
+ Picture,
12756
+ {
12757
+ src: image,
12758
+ alt: imageAlt || title,
12759
+ fetchPriority: "high",
12760
+ eager: true,
12761
+ className: "absolute inset-0 h-full w-full object-cover"
12762
+ }
12763
+ ) }),
12764
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
12765
+ /* @__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: [
12766
+ 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: [
12767
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
12768
+ crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
12769
+ "a",
12770
+ {
12771
+ href: crumb.href,
12772
+ className: "text-xs text-white/70 font-ui hover:text-white transition-colors",
12773
+ children: crumb.label
12774
+ }
12775
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui", children: crumb.label })
12776
+ ] }, i)) }),
12777
+ category && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", children: category }) }),
12778
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight", children: title }),
12779
+ hasMeta && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 flex items-center gap-4 flex-wrap", children: [
12780
+ author && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
12781
+ author.avatar && // eslint-disable-next-line @next/next/no-img-element
12782
+ /* @__PURE__ */ jsxRuntime.jsx(
12783
+ "img",
12784
+ {
12785
+ src: author.avatar,
12786
+ alt: author.name,
12787
+ loading: "lazy",
12788
+ className: "h-10 w-10 rounded-full object-cover ring-2 ring-white/30"
12789
+ }
12790
+ ),
12791
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "leading-tight", children: [
12792
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-white font-ui", children: author.name }),
12793
+ author.role && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-white/70 font-ui", children: author.role })
12794
+ ] })
12795
+ ] }),
12796
+ (date || readingTime) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4 text-white/80", children: [
12797
+ date && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5 text-sm font-ui", children: [
12798
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
12799
+ date
12800
+ ] }),
12801
+ readingTime && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5 text-sm font-ui", children: [
12802
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
12803
+ readingTime
12804
+ ] })
12805
+ ] })
12806
+ ] })
12807
+ ] }) })
12808
+ ] }),
12809
+ /* @__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: [
12810
+ blocks.map((block, i) => renderBlock(block, i)),
12811
+ children
12812
+ ] }) }),
12813
+ 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: [
12814
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold font-heading text-foreground mb-6", children: relatedTitle }),
12815
+ /* @__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)) })
12816
+ ] }) })
12817
+ ] });
12818
+ }
12332
12819
  function useHlsVideo(videoRef, src) {
12333
- React30__namespace.useEffect(() => {
12820
+ React31__namespace.useEffect(() => {
12334
12821
  if (!src || !videoRef.current) return;
12335
12822
  const video = videoRef.current;
12336
12823
  if (!src.includes(".m3u8")) return;
@@ -12374,11 +12861,11 @@ function TripHeader({
12374
12861
  className
12375
12862
  }) {
12376
12863
  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);
12864
+ const [heroIndex, setHeroIndex] = React31__namespace.useState(0);
12865
+ const [videoReady, setVideoReady] = React31__namespace.useState(false);
12866
+ const videoRef = React31__namespace.useRef(null);
12380
12867
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
12381
- const validImages = React30__namespace.useMemo(
12868
+ const validImages = React31__namespace.useMemo(
12382
12869
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
12383
12870
  [images]
12384
12871
  );
@@ -12393,7 +12880,7 @@ function TripHeader({
12393
12880
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
12394
12881
  const hasMeta = !!(destination || duration);
12395
12882
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
12396
- React30__namespace.useEffect(() => {
12883
+ React31__namespace.useEffect(() => {
12397
12884
  if (!videoUrl) return;
12398
12885
  const el = videoRef.current;
12399
12886
  if (!el) return;
@@ -12536,7 +13023,7 @@ function TripHeader({
12536
13023
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
12537
13024
  ),
12538
13025
  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: [
13026
+ 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
13027
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
12541
13028
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
12542
13029
  ] }, i)) }),
@@ -12702,10 +13189,10 @@ function LanguagePicker({
12702
13189
  }) {
12703
13190
  var _a;
12704
13191
  const t = VARIANT2[variant];
12705
- const [open, setOpen] = React30__namespace.useState(false);
12706
- const ref = React30__namespace.useRef(null);
13192
+ const [open, setOpen] = React31__namespace.useState(false);
13193
+ const ref = React31__namespace.useRef(null);
12707
13194
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
12708
- React30__namespace.useEffect(() => {
13195
+ React31__namespace.useEffect(() => {
12709
13196
  if (!open) return;
12710
13197
  const onDocClick = (e) => {
12711
13198
  if (ref.current && !ref.current.contains(e.target)) {
@@ -12906,7 +13393,7 @@ function SiteFooter({
12906
13393
  children: wrapper
12907
13394
  },
12908
13395
  b.alt + i
12909
- ) : /* @__PURE__ */ jsxRuntime.jsx(React30__namespace.Fragment, { children: wrapper }, b.alt + i);
13396
+ ) : /* @__PURE__ */ jsxRuntime.jsx(React31__namespace.Fragment, { children: wrapper }, b.alt + i);
12910
13397
  }) })
12911
13398
  ] }),
12912
13399
  themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
@@ -13081,10 +13568,10 @@ function TripPage({
13081
13568
  className
13082
13569
  }) {
13083
13570
  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(
13571
+ const [activeSection, setActiveSection] = React31__namespace.useState("");
13572
+ const [accordionValue, setAccordionValue] = React31__namespace.useState([]);
13573
+ const [faqsExpanded, setFaqsExpanded] = React31__namespace.useState(false);
13574
+ const accordionSectionIds = React31__namespace.useMemo(
13088
13575
  () => /* @__PURE__ */ new Set([
13089
13576
  "when-it-operates",
13090
13577
  "how-to-get-there",
@@ -13098,18 +13585,18 @@ function TripPage({
13098
13585
  ]),
13099
13586
  []
13100
13587
  );
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(
13588
+ const [navFloating, setNavFloating] = React31__namespace.useState(false);
13589
+ const [navHidden, setNavHidden] = React31__namespace.useState(false);
13590
+ const [isFloating, setIsFloating] = React31__namespace.useState(false);
13591
+ const [sidebarPos, setSidebarPos] = React31__namespace.useState(null);
13592
+ const [pricingBarVisible, setPricingBarVisible] = React31__namespace.useState(false);
13593
+ const navRef = React31__namespace.useRef(null);
13594
+ const navSentinelRef = React31__namespace.useRef(null);
13595
+ const sentinelRef = React31__namespace.useRef(null);
13596
+ const sidebarPlaceholderRef = React31__namespace.useRef(null);
13597
+ const pricingBarRef = React31__namespace.useRef(null);
13598
+ const galleryRef = React31__namespace.useRef(null);
13599
+ const sections = React31__namespace.useMemo(
13113
13600
  () => {
13114
13601
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
13115
13602
  return [
@@ -13131,7 +13618,7 @@ function TripPage({
13131
13618
  // eslint-disable-next-line react-hooks/exhaustive-deps
13132
13619
  []
13133
13620
  );
13134
- React30__namespace.useEffect(() => {
13621
+ React31__namespace.useEffect(() => {
13135
13622
  const sentinel = navSentinelRef.current;
13136
13623
  if (!sentinel) return;
13137
13624
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -13139,7 +13626,7 @@ function TripPage({
13139
13626
  update();
13140
13627
  return () => document.removeEventListener("scroll", update, { capture: true });
13141
13628
  }, []);
13142
- React30__namespace.useEffect(() => {
13629
+ React31__namespace.useEffect(() => {
13143
13630
  const sentinel = sentinelRef.current;
13144
13631
  if (!sentinel) return;
13145
13632
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -13147,7 +13634,7 @@ function TripPage({
13147
13634
  update();
13148
13635
  return () => document.removeEventListener("scroll", update, { capture: true });
13149
13636
  }, []);
13150
- React30__namespace.useEffect(() => {
13637
+ React31__namespace.useEffect(() => {
13151
13638
  const measure = () => {
13152
13639
  if (!sidebarPlaceholderRef.current) return;
13153
13640
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -13157,7 +13644,7 @@ function TripPage({
13157
13644
  window.addEventListener("resize", measure);
13158
13645
  return () => window.removeEventListener("resize", measure);
13159
13646
  }, [isFloating]);
13160
- React30__namespace.useEffect(() => {
13647
+ React31__namespace.useEffect(() => {
13161
13648
  const check = () => {
13162
13649
  var _a2;
13163
13650
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -13168,7 +13655,7 @@ function TripPage({
13168
13655
  check();
13169
13656
  return () => document.removeEventListener("scroll", check, { capture: true });
13170
13657
  }, []);
13171
- React30__namespace.useEffect(() => {
13658
+ React31__namespace.useEffect(() => {
13172
13659
  const check = () => {
13173
13660
  if (!pricingBarRef.current) return;
13174
13661
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -13177,7 +13664,7 @@ function TripPage({
13177
13664
  check();
13178
13665
  return () => document.removeEventListener("scroll", check, { capture: true });
13179
13666
  }, []);
13180
- React30__namespace.useEffect(() => {
13667
+ React31__namespace.useEffect(() => {
13181
13668
  if (sections.length === 0) return;
13182
13669
  setActiveSection(sections[0].id);
13183
13670
  const update = () => {
@@ -13652,120 +14139,6 @@ function TripPage({
13652
14139
  }
13653
14140
  );
13654
14141
  }
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
- cta,
13704
- size = "md",
13705
- className
13706
- }) {
13707
- var _a;
13708
- const s = sizeConfig2[size];
13709
- const meta = [date != null ? date : null, readingTime != null ? readingTime : null].filter(Boolean).join(" | ");
13710
- const ctaLabel = (_a = cta == null ? void 0 : cta.label) != null ? _a : "Read more";
13711
- const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
13712
- /* @__PURE__ */ jsxRuntime.jsx(
13713
- "img",
13714
- {
13715
- src: image,
13716
- alt: imageAlt,
13717
- loading: "lazy",
13718
- className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
13719
- }
13720
- ),
13721
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/40 to-black/10" }),
13722
- 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" }),
13723
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
13724
- meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/70 font-medium font-ui", s.meta), children: meta }),
13725
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-white leading-snug", s.title), children: title }),
13726
- excerpt && /* @__PURE__ */ jsxRuntime.jsx(
13727
- "p",
13728
- {
13729
- className: cn(
13730
- "text-white/80 leading-relaxed -mt-1 line-clamp-2",
13731
- s.excerpt
13732
- ),
13733
- children: excerpt
13734
- }
13735
- ),
13736
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex items-center justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs(
13737
- "span",
13738
- {
13739
- className: cn(
13740
- "group/cta inline-flex items-center gap-1.5 border-b border-white/70 pb-0.5",
13741
- "text-sm font-semibold text-white transition-colors hover:border-white hover:text-white",
13742
- "font-ui"
13743
- ),
13744
- children: [
13745
- ctaLabel,
13746
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "transition-transform duration-150 group-hover/cta:translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon2, {}) })
13747
- ]
13748
- }
13749
- ) })
13750
- ] })
13751
- ] });
13752
- const baseClasses = cn(
13753
- "group relative flex flex-col justify-between overflow-hidden rounded-2xl",
13754
- "shadow-md transition-shadow duration-300 hover:shadow-xl",
13755
- s.card,
13756
- className
13757
- );
13758
- return href ? /* @__PURE__ */ jsxRuntime.jsx(
13759
- "a",
13760
- {
13761
- href,
13762
- onClick: cta == null ? void 0 : cta.onClick,
13763
- className: baseClasses,
13764
- "aria-label": title,
13765
- children: inner
13766
- }
13767
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: inner });
13768
- }
13769
14142
  function SectionHeading({
13770
14143
  eyebrow,
13771
14144
  title,
@@ -13816,11 +14189,11 @@ function CategoryPage2({
13816
14189
  className
13817
14190
  }) {
13818
14191
  var _a;
13819
- const [videoReady, setVideoReady] = React30__namespace.useState(false);
13820
- const videoRef = React30__namespace.useRef(null);
14192
+ const [videoReady, setVideoReady] = React31__namespace.useState(false);
14193
+ const videoRef = React31__namespace.useRef(null);
13821
14194
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
13822
14195
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13823
- React30__namespace.useEffect(() => {
14196
+ React31__namespace.useEffect(() => {
13824
14197
  if (!videoUrl) return;
13825
14198
  const el = videoRef.current;
13826
14199
  if (!el) return;
@@ -13835,13 +14208,13 @@ function CategoryPage2({
13835
14208
  io.observe(el);
13836
14209
  return () => io.disconnect();
13837
14210
  }, [videoUrl]);
13838
- const [faqsExpanded, setFaqsExpanded] = React30__namespace.useState(false);
13839
- const [tripsExpanded, setTripsExpanded] = React30__namespace.useState(false);
13840
- const [filterValue, setFilterValue] = React30__namespace.useState({});
13841
- const [sort, setSort] = React30__namespace.useState(
14211
+ const [faqsExpanded, setFaqsExpanded] = React31__namespace.useState(false);
14212
+ const [tripsExpanded, setTripsExpanded] = React31__namespace.useState(false);
14213
+ const [filterValue, setFilterValue] = React31__namespace.useState({});
14214
+ const [sort, setSort] = React31__namespace.useState(
13842
14215
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
13843
14216
  );
13844
- const sortedTrips = React30__namespace.useMemo(() => {
14217
+ const sortedTrips = React31__namespace.useMemo(() => {
13845
14218
  const active = Object.entries(filterValue).filter(
13846
14219
  ([, vals]) => vals && vals.length > 0
13847
14220
  );
@@ -13945,7 +14318,7 @@ function CategoryPage2({
13945
14318
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
13946
14319
  breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
13947
14320
  const isLast = i === breadcrumb.length - 1;
13948
- return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
14321
+ return /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
13949
14322
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
13950
14323
  crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
13951
14324
  "a",
@@ -14072,6 +14445,7 @@ function CategoryPage2({
14072
14445
  BlogCard,
14073
14446
  {
14074
14447
  href: post.href,
14448
+ external: post.external,
14075
14449
  image: post.image,
14076
14450
  imageAlt: post.imageAlt,
14077
14451
  title: post.title,
@@ -14232,12 +14606,12 @@ function Toast({
14232
14606
  duration = 6e3,
14233
14607
  className
14234
14608
  }) {
14235
- const [mounted, setMounted] = React30__namespace.useState(false);
14236
- const [visible, setVisible] = React30__namespace.useState(true);
14237
- React30__namespace.useEffect(() => {
14609
+ const [mounted, setMounted] = React31__namespace.useState(false);
14610
+ const [visible, setVisible] = React31__namespace.useState(true);
14611
+ React31__namespace.useEffect(() => {
14238
14612
  setMounted(true);
14239
14613
  }, []);
14240
- React30__namespace.useEffect(() => {
14614
+ React31__namespace.useEffect(() => {
14241
14615
  if (duration === 0) return;
14242
14616
  const t = setTimeout(() => {
14243
14617
  setVisible(false);
@@ -14644,21 +15018,21 @@ function LeadCapturePopup({
14644
15018
  }) {
14645
15019
  var _a;
14646
15020
  const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
14647
- const [open, setOpen] = React30.useState(false);
14648
- const [closing, setClosing] = React30.useState(false);
14649
- const [submitted, setSubmitted] = React30.useState(false);
14650
- const [submitting, setSubmitting] = React30.useState(false);
14651
- const [error, setError] = React30.useState(null);
14652
- const [name, setName] = React30.useState("");
14653
- const [email, setEmail] = React30.useState("");
14654
- const [travelDate, setTravelDate] = React30.useState("");
14655
- const panelRef = React30.useRef(null);
14656
- const nameRef = React30.useRef(null);
14657
- const show = React30.useCallback(() => {
15021
+ const [open, setOpen] = React31.useState(false);
15022
+ const [closing, setClosing] = React31.useState(false);
15023
+ const [submitted, setSubmitted] = React31.useState(false);
15024
+ const [submitting, setSubmitting] = React31.useState(false);
15025
+ const [error, setError] = React31.useState(null);
15026
+ const [name, setName] = React31.useState("");
15027
+ const [email, setEmail] = React31.useState("");
15028
+ const [travelDate, setTravelDate] = React31.useState("");
15029
+ const panelRef = React31.useRef(null);
15030
+ const nameRef = React31.useRef(null);
15031
+ const show = React31.useCallback(() => {
14658
15032
  if (isDismissed()) return;
14659
15033
  setOpen(true);
14660
15034
  }, []);
14661
- React30.useEffect(() => {
15035
+ React31.useEffect(() => {
14662
15036
  var _a2;
14663
15037
  if (isDismissed()) return;
14664
15038
  if (config.trigger === "delay") {
@@ -14685,7 +15059,7 @@ function LeadCapturePopup({
14685
15059
  return () => window.removeEventListener("scroll", handler);
14686
15060
  }
14687
15061
  }, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
14688
- React30.useEffect(() => {
15062
+ React31.useEffect(() => {
14689
15063
  if (open && !submitted) {
14690
15064
  requestAnimationFrame(() => {
14691
15065
  var _a2;
@@ -14693,7 +15067,7 @@ function LeadCapturePopup({
14693
15067
  });
14694
15068
  }
14695
15069
  }, [open, submitted]);
14696
- const close = React30.useCallback(() => {
15070
+ const close = React31.useCallback(() => {
14697
15071
  setClosing(true);
14698
15072
  setDismissed(config.dismissDays);
14699
15073
  setTimeout(() => {
@@ -14701,7 +15075,7 @@ function LeadCapturePopup({
14701
15075
  setClosing(false);
14702
15076
  }, 250);
14703
15077
  }, [config.dismissDays]);
14704
- React30.useEffect(() => {
15078
+ React31.useEffect(() => {
14705
15079
  if (!open) return;
14706
15080
  const handler = (e) => {
14707
15081
  if (e.key === "Escape") close();
@@ -14709,7 +15083,7 @@ function LeadCapturePopup({
14709
15083
  document.addEventListener("keydown", handler);
14710
15084
  return () => document.removeEventListener("keydown", handler);
14711
15085
  }, [open, close]);
14712
- const onOverlayClick = React30.useCallback(
15086
+ const onOverlayClick = React31.useCallback(
14713
15087
  (e) => {
14714
15088
  if (panelRef.current && !panelRef.current.contains(e.target)) {
14715
15089
  close();
@@ -14947,11 +15321,11 @@ function ExoOrb({
14947
15321
  trackCursor = true,
14948
15322
  className
14949
15323
  }) {
14950
- const uid = React30.useId().replace(/:/g, "");
15324
+ const uid = React31.useId().replace(/:/g, "");
14951
15325
  const id = (name) => `exo-orb-${uid}-${name}`;
14952
- const rootRef = React30.useRef(null);
14953
- const pupilRef = React30.useRef(null);
14954
- React30.useEffect(() => {
15326
+ const rootRef = React31.useRef(null);
15327
+ const pupilRef = React31.useRef(null);
15328
+ React31.useEffect(() => {
14955
15329
  if (!trackCursor) return;
14956
15330
  if (typeof window === "undefined") return;
14957
15331
  if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
@@ -15147,13 +15521,13 @@ function AskExo({
15147
15521
  teaserDelayMs = 2500,
15148
15522
  teaserDurationMs = 6e3
15149
15523
  }) {
15150
- const [open, setOpen] = React30.useState(false);
15151
- const [question, setQuestion] = React30.useState("");
15152
- const [teaserVisible, setTeaserVisible] = React30.useState(false);
15524
+ const [open, setOpen] = React31.useState(false);
15525
+ const [question, setQuestion] = React31.useState("");
15526
+ const [teaserVisible, setTeaserVisible] = React31.useState(false);
15153
15527
  const teaserEnabled = !!teaser && teaser !== "";
15154
- const inputRef = React30.useRef(null);
15155
- const textareaRef = React30.useRef(null);
15156
- React30.useEffect(() => {
15528
+ const inputRef = React31.useRef(null);
15529
+ const textareaRef = React31.useRef(null);
15530
+ React31.useEffect(() => {
15157
15531
  if (!open) {
15158
15532
  setQuestion("");
15159
15533
  return;
@@ -15165,7 +15539,7 @@ function AskExo({
15165
15539
  }, 200);
15166
15540
  return () => clearTimeout(t);
15167
15541
  }, [open, variant]);
15168
- React30.useEffect(() => {
15542
+ React31.useEffect(() => {
15169
15543
  if (!open) return;
15170
15544
  const onKey = (e) => {
15171
15545
  if (e.key === "Escape") setOpen(false);
@@ -15173,7 +15547,7 @@ function AskExo({
15173
15547
  document.addEventListener("keydown", onKey);
15174
15548
  return () => document.removeEventListener("keydown", onKey);
15175
15549
  }, [open]);
15176
- React30.useEffect(() => {
15550
+ React31.useEffect(() => {
15177
15551
  if (!teaserEnabled || open) return;
15178
15552
  if (typeof window === "undefined") return;
15179
15553
  const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
@@ -15186,7 +15560,7 @@ function AskExo({
15186
15560
  clearTimeout(hideTimer);
15187
15561
  };
15188
15562
  }, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
15189
- React30.useEffect(() => {
15563
+ React31.useEffect(() => {
15190
15564
  if (open) setTeaserVisible(false);
15191
15565
  }, [open]);
15192
15566
  const askExo = (q) => {
@@ -15739,8 +16113,8 @@ function ShareWidget({
15739
16113
  title = "Invite friends & lower the price",
15740
16114
  className
15741
16115
  }) {
15742
- const [copied, setCopied] = React30__namespace.useState(false);
15743
- const [showToast, setShowToast] = React30__namespace.useState(false);
16116
+ const [copied, setCopied] = React31__namespace.useState(false);
16117
+ const [showToast, setShowToast] = React31__namespace.useState(false);
15744
16118
  const encodedUrl = encodeURIComponent(url);
15745
16119
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
15746
16120
  const channels = [
@@ -15895,6 +16269,8 @@ exports.AgentContactCard = AgentContactCard;
15895
16269
  exports.Alert = Alert;
15896
16270
  exports.AskExo = AskExo;
15897
16271
  exports.BirthDateField = BirthDateField;
16272
+ exports.BlogCard = BlogCard;
16273
+ exports.BlogPost = BlogPost;
15898
16274
  exports.BookingAdventureCard = BookingAdventureCard;
15899
16275
  exports.BookingCancellationEmail = BookingCancellationEmail;
15900
16276
  exports.BookingConfirmedCard = BookingConfirmedCard;