@planetaexo/design-system 0.69.1 → 0.71.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 React32 = require('react');
3
+ var React20 = 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 React32__namespace = /*#__PURE__*/_interopNamespace(React32);
40
+ var React20__namespace = /*#__PURE__*/_interopNamespace(React20);
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 = React32__namespace.forwardRef(
105
+ var Button = React20__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 = React32__namespace.forwardRef(
334
+ var FloatingInput = React20__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 : React32__namespace.useId();
337
+ const inputId = id != null ? id : React20__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 = React32__namespace.forwardRef(
374
374
  }
375
375
  );
376
376
  FloatingInput.displayName = "FloatingInput";
377
- var FloatingSelect = React32__namespace.forwardRef(
377
+ var FloatingSelect = React20__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 : React32__namespace.useId();
380
+ const inputId = id != null ? id : React20__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(
@@ -642,11 +642,11 @@ function PhoneCountrySelect({
642
642
  showDial = true
643
643
  }) {
644
644
  var _a;
645
- const [open, setOpen] = React32__namespace.useState(false);
646
- const containerRef = React32__namespace.useRef(null);
647
- const listRef = React32__namespace.useRef(null);
645
+ const [open, setOpen] = React20__namespace.useState(false);
646
+ const containerRef = React20__namespace.useRef(null);
647
+ const listRef = React20__namespace.useRef(null);
648
648
  const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
649
- React32__namespace.useEffect(() => {
649
+ React20__namespace.useEffect(() => {
650
650
  if (!open) return;
651
651
  const handler = (e) => {
652
652
  var _a2;
@@ -657,7 +657,7 @@ function PhoneCountrySelect({
657
657
  document.addEventListener("mousedown", handler);
658
658
  return () => document.removeEventListener("mousedown", handler);
659
659
  }, [open]);
660
- React32__namespace.useEffect(() => {
660
+ React20__namespace.useEffect(() => {
661
661
  if (!open || !listRef.current) return;
662
662
  const activeEl = listRef.current.querySelector("[data-selected=true]");
663
663
  activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
@@ -927,8 +927,8 @@ function CalendarDayButton(_a) {
927
927
  "locale"
928
928
  ]);
929
929
  const defaultClassNames = reactDayPicker.getDefaultClassNames();
930
- const ref = React32__namespace.useRef(null);
931
- React32__namespace.useEffect(() => {
930
+ const ref = React20__namespace.useRef(null);
931
+ React20__namespace.useEffect(() => {
932
932
  var _a2;
933
933
  if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
934
934
  }, [modifiers.focused]);
@@ -959,16 +959,16 @@ function BirthDateField({
959
959
  className,
960
960
  disabled
961
961
  }) {
962
- const [open, setOpen] = React32__namespace.useState(false);
963
- const [text, setText] = React32__namespace.useState(
962
+ const [open, setOpen] = React20__namespace.useState(false);
963
+ const [text, setText] = React20__namespace.useState(
964
964
  value ? dateFns.format(value, "dd/MM/yyyy") : ""
965
965
  );
966
- const containerRef = React32__namespace.useRef(null);
967
- const inputId = React32__namespace.useId();
968
- React32__namespace.useEffect(() => {
966
+ const containerRef = React20__namespace.useRef(null);
967
+ const inputId = React20__namespace.useId();
968
+ React20__namespace.useEffect(() => {
969
969
  setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
970
970
  }, [value]);
971
- React32__namespace.useEffect(() => {
971
+ React20__namespace.useEffect(() => {
972
972
  if (!open) return;
973
973
  const handler = (e) => {
974
974
  var _a;
@@ -1177,14 +1177,14 @@ function CountrySearchField({
1177
1177
  }) {
1178
1178
  var _a;
1179
1179
  const list = countries != null ? countries : COUNTRIES;
1180
- const [query, setQuery] = React32__namespace.useState("");
1181
- const [open, setOpen] = React32__namespace.useState(false);
1182
- const containerRef = React32__namespace.useRef(null);
1183
- const searchRef = React32__namespace.useRef(null);
1180
+ const [query, setQuery] = React20__namespace.useState("");
1181
+ const [open, setOpen] = React20__namespace.useState(false);
1182
+ const containerRef = React20__namespace.useRef(null);
1183
+ const searchRef = React20__namespace.useRef(null);
1184
1184
  const selected = list.find((c) => c.code === value);
1185
1185
  const isFloated = open || !!selected;
1186
1186
  const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
1187
- React32__namespace.useEffect(() => {
1187
+ React20__namespace.useEffect(() => {
1188
1188
  if (!open) return;
1189
1189
  const handler = (e) => {
1190
1190
  var _a2;
@@ -1329,10 +1329,10 @@ function AdventureCard({
1329
1329
  }) {
1330
1330
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
1331
1331
  const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
1332
- const [checkedInternal, setCheckedInternal] = React32__namespace.useState(
1332
+ const [checkedInternal, setCheckedInternal] = React20__namespace.useState(
1333
1333
  new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
1334
1334
  );
1335
- const [openDescriptionId, setOpenDescriptionId] = React32__namespace.useState(null);
1335
+ const [openDescriptionId, setOpenDescriptionId] = React20__namespace.useState(null);
1336
1336
  const openDescriptionOptional = openDescriptionId ? (_e = adventure.optionals) == null ? void 0 : _e.find((o) => o.id === openDescriptionId) : void 0;
1337
1337
  const isChecked = (opt) => {
1338
1338
  var _a2;
@@ -1784,7 +1784,7 @@ function BookingShell({
1784
1784
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
1785
1785
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
1786
1786
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
1787
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
1787
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
1788
1788
  /* @__PURE__ */ jsxRuntime.jsx(
1789
1789
  "span",
1790
1790
  {
@@ -1983,7 +1983,7 @@ function TermsSection({
1983
1983
  termsContent
1984
1984
  }) {
1985
1985
  var _a;
1986
- const [modalOpen, setModalOpen] = React32__namespace.useState(false);
1986
+ const [modalOpen, setModalOpen] = React20__namespace.useState(false);
1987
1987
  const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
1988
1988
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
1989
1989
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
@@ -2121,9 +2121,9 @@ function BookingWizard({
2121
2121
  }) {
2122
2122
  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;
2123
2123
  const wizardSteps = WIZARD_STEPS_FN(labels);
2124
- const [step, setStep] = React32__namespace.useState("responsible");
2125
- const [error, setError] = React32__namespace.useState(null);
2126
- const [responsible, setResponsible] = React32__namespace.useState({
2124
+ const [step, setStep] = React20__namespace.useState("responsible");
2125
+ const [error, setError] = React20__namespace.useState(null);
2126
+ const [responsible, setResponsible] = React20__namespace.useState({
2127
2127
  firstName: "",
2128
2128
  lastName: "",
2129
2129
  email: "",
@@ -2142,7 +2142,7 @@ function BookingWizard({
2142
2142
  return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
2143
2143
  }, 0);
2144
2144
  const totalPax = totalAdults + totalChildren;
2145
- const [travellers, setTravellers] = React32__namespace.useState(
2145
+ const [travellers, setTravellers] = React20__namespace.useState(
2146
2146
  Array.from({ length: Math.max(totalPax, 1) }, () => ({
2147
2147
  firstName: "",
2148
2148
  lastName: "",
@@ -2150,9 +2150,9 @@ function BookingWizard({
2150
2150
  email: ""
2151
2151
  }))
2152
2152
  );
2153
- const [payAmount, setPayAmount] = React32__namespace.useState("full");
2154
- const [payMethod, setPayMethod] = React32__namespace.useState("stripe");
2155
- const [termsAccepted, setTermsAccepted] = React32__namespace.useState(false);
2153
+ const [payAmount, setPayAmount] = React20__namespace.useState("full");
2154
+ const [payMethod, setPayMethod] = React20__namespace.useState("stripe");
2155
+ const [termsAccepted, setTermsAccepted] = React20__namespace.useState(false);
2156
2156
  const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
2157
2157
  const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
2158
2158
  const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
@@ -2380,7 +2380,7 @@ function Offer({
2380
2380
  className
2381
2381
  }) {
2382
2382
  var _a, _b, _c;
2383
- const [showBooking, setShowBooking] = React32__namespace.useState(false);
2383
+ const [showBooking, setShowBooking] = React20__namespace.useState(false);
2384
2384
  const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
2385
2385
  const handleBook = () => {
2386
2386
  if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
@@ -2747,7 +2747,7 @@ function AdventureSection({
2747
2747
  labels
2748
2748
  }) {
2749
2749
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
2750
- const [detailsOpen, setDetailsOpen] = React32__namespace.useState(false);
2750
+ const [detailsOpen, setDetailsOpen] = React20__namespace.useState(false);
2751
2751
  const handleCopyUrl = (url) => {
2752
2752
  if (onCopyFormLink) {
2753
2753
  onCopyFormLink(url);
@@ -3286,8 +3286,8 @@ function AddTravellerDialog({
3286
3286
  errorMessage
3287
3287
  }) {
3288
3288
  var _a, _b, _c, _d, _e;
3289
- const [form, setForm] = React32__namespace.useState(() => createInitialAddFormData(config));
3290
- React32__namespace.useEffect(() => {
3289
+ const [form, setForm] = React20__namespace.useState(() => createInitialAddFormData(config));
3290
+ React20__namespace.useEffect(() => {
3291
3291
  if (open) {
3292
3292
  setForm(createInitialAddFormData(config));
3293
3293
  }
@@ -3347,7 +3347,7 @@ function EditTravellerDialog({
3347
3347
  errorMessage
3348
3348
  }) {
3349
3349
  var _a, _b, _c, _d, _e;
3350
- const [form, setForm] = React32__namespace.useState(() => ({
3350
+ const [form, setForm] = React20__namespace.useState(() => ({
3351
3351
  firstName: "",
3352
3352
  lastName: "",
3353
3353
  email: "",
@@ -3356,7 +3356,7 @@ function EditTravellerDialog({
3356
3356
  birthDate: "",
3357
3357
  personType: "ADULT"
3358
3358
  }));
3359
- React32__namespace.useEffect(() => {
3359
+ React20__namespace.useEffect(() => {
3360
3360
  var _a2, _b2, _c2, _d2, _e2, _f;
3361
3361
  if (open && traveller) {
3362
3362
  setForm({
@@ -3692,48 +3692,48 @@ function BookingDetails({
3692
3692
  const hasSubmitAddTraveller = !!onSubmitAddTraveller;
3693
3693
  const hasSubmitEditTraveller = !!onSubmitEditTraveller;
3694
3694
  const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
3695
- const [addModalState, setAddModalState] = React32__namespace.useState({
3695
+ const [addModalState, setAddModalState] = React20__namespace.useState({
3696
3696
  open: false,
3697
3697
  adventureId: null
3698
3698
  });
3699
- const [editModalState, setEditModalState] = React32__namespace.useState({ open: false, adventureId: null, traveller: null });
3700
- const [deleteModalState, setDeleteModalState] = React32__namespace.useState({ open: false, adventureId: null, traveller: null });
3701
- const [resendInviteDialogState, setResendInviteDialogState] = React32__namespace.useState({ open: false, traveller: null });
3702
- const handleRequestOpenAddModal = React32__namespace.useCallback((adventureId) => {
3699
+ const [editModalState, setEditModalState] = React20__namespace.useState({ open: false, adventureId: null, traveller: null });
3700
+ const [deleteModalState, setDeleteModalState] = React20__namespace.useState({ open: false, adventureId: null, traveller: null });
3701
+ const [resendInviteDialogState, setResendInviteDialogState] = React20__namespace.useState({ open: false, traveller: null });
3702
+ const handleRequestOpenAddModal = React20__namespace.useCallback((adventureId) => {
3703
3703
  setAddModalState({ open: true, adventureId });
3704
3704
  }, []);
3705
- const handleRequestOpenEditModal = React32__namespace.useCallback(
3705
+ const handleRequestOpenEditModal = React20__namespace.useCallback(
3706
3706
  (adventureId, traveller) => {
3707
3707
  setEditModalState({ open: true, adventureId, traveller });
3708
3708
  },
3709
3709
  []
3710
3710
  );
3711
- const handleRequestOpenDeleteModal = React32__namespace.useCallback(
3711
+ const handleRequestOpenDeleteModal = React20__namespace.useCallback(
3712
3712
  (adventureId, traveller) => {
3713
3713
  setDeleteModalState({ open: true, adventureId, traveller });
3714
3714
  },
3715
3715
  []
3716
3716
  );
3717
- const handleRequestOpenResendInviteDialog = React32__namespace.useCallback(
3717
+ const handleRequestOpenResendInviteDialog = React20__namespace.useCallback(
3718
3718
  (traveller) => {
3719
3719
  setResendInviteDialogState({ open: true, traveller });
3720
3720
  },
3721
3721
  []
3722
3722
  );
3723
- const closeAddModal = React32__namespace.useCallback(() => {
3723
+ const closeAddModal = React20__namespace.useCallback(() => {
3724
3724
  setAddModalState({ open: false, adventureId: null });
3725
3725
  }, []);
3726
- const closeEditModal = React32__namespace.useCallback(() => {
3726
+ const closeEditModal = React20__namespace.useCallback(() => {
3727
3727
  setEditModalState({ open: false, adventureId: null, traveller: null });
3728
3728
  }, []);
3729
- const closeDeleteModal = React32__namespace.useCallback(() => {
3729
+ const closeDeleteModal = React20__namespace.useCallback(() => {
3730
3730
  setDeleteModalState({ open: false, adventureId: null, traveller: null });
3731
3731
  }, []);
3732
- const closeResendInviteDialog = React32__namespace.useCallback(() => {
3732
+ const closeResendInviteDialog = React20__namespace.useCallback(() => {
3733
3733
  setResendInviteDialogState({ open: false, traveller: null });
3734
3734
  }, []);
3735
- const submitInFlightRef = React32__namespace.useRef(false);
3736
- const handleAddSubmit = React32__namespace.useCallback(
3735
+ const submitInFlightRef = React20__namespace.useRef(false);
3736
+ const handleAddSubmit = React20__namespace.useCallback(
3737
3737
  async (adventureId, data) => {
3738
3738
  if (!onSubmitAddTraveller) return;
3739
3739
  if (submitInFlightRef.current) return;
@@ -3748,7 +3748,7 @@ function BookingDetails({
3748
3748
  },
3749
3749
  [onSubmitAddTraveller, closeAddModal]
3750
3750
  );
3751
- const handleEditSubmit = React32__namespace.useCallback(
3751
+ const handleEditSubmit = React20__namespace.useCallback(
3752
3752
  async (adventureId, travellerId, data) => {
3753
3753
  if (!onSubmitEditTraveller) return;
3754
3754
  if (submitInFlightRef.current) return;
@@ -3763,7 +3763,7 @@ function BookingDetails({
3763
3763
  },
3764
3764
  [onSubmitEditTraveller, closeEditModal]
3765
3765
  );
3766
- const handleDeleteConfirm = React32__namespace.useCallback(
3766
+ const handleDeleteConfirm = React20__namespace.useCallback(
3767
3767
  async (adventureId, travellerId) => {
3768
3768
  if (!onConfirmRemoveTraveller) return;
3769
3769
  if (submitInFlightRef.current) return;
@@ -5690,7 +5690,7 @@ function BookingCreatedEmail({
5690
5690
  }, children: i + 1 }) }),
5691
5691
  /* @__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 }) })
5692
5692
  ] }) }) }, i)) }),
5693
- 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(React32__namespace.Fragment, { children: [
5693
+ 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(React20__namespace.Fragment, { children: [
5694
5694
  idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
5695
5695
  idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
5696
5696
  ] }, idx)) })
@@ -8473,11 +8473,11 @@ function DatePickerField({
8473
8473
  className,
8474
8474
  error
8475
8475
  }) {
8476
- const [open, setOpen] = React32__namespace.useState(false);
8477
- const containerRef = React32__namespace.useRef(null);
8478
- const [calendarWidth, setCalendarWidth] = React32__namespace.useState();
8476
+ const [open, setOpen] = React20__namespace.useState(false);
8477
+ const containerRef = React20__namespace.useRef(null);
8478
+ const [calendarWidth, setCalendarWidth] = React20__namespace.useState();
8479
8479
  const hasValue = !!value;
8480
- React32__namespace.useEffect(() => {
8480
+ React20__namespace.useEffect(() => {
8481
8481
  if (!containerRef.current) return;
8482
8482
  const observer = new ResizeObserver(([entry]) => {
8483
8483
  setCalendarWidth(entry.contentRect.width);
@@ -8606,15 +8606,15 @@ function BookingForm({
8606
8606
  const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
8607
8607
  const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
8608
8608
  const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
8609
- const [values, setValues] = React32__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8610
- const [errors, setErrors] = React32__namespace.useState({});
8609
+ const [values, setValues] = React20__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8610
+ const [errors, setErrors] = React20__namespace.useState({});
8611
8611
  const set = (key, value) => {
8612
8612
  setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8613
8613
  setErrors(
8614
8614
  (prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
8615
8615
  );
8616
8616
  };
8617
- React32__namespace.useEffect(() => {
8617
+ React20__namespace.useEffect(() => {
8618
8618
  if (!defaultValues) return;
8619
8619
  setValues((prev) => {
8620
8620
  let changed = false;
@@ -9253,11 +9253,11 @@ function FloatingTextarea({
9253
9253
  }
9254
9254
  function SelectField({ field, value, onChange, error, disabled }) {
9255
9255
  var _a, _b, _c;
9256
- const [open, setOpen] = React32__namespace.useState(false);
9257
- const containerRef = React32__namespace.useRef(null);
9256
+ const [open, setOpen] = React20__namespace.useState(false);
9257
+ const containerRef = React20__namespace.useRef(null);
9258
9258
  const options = (_a = field.options) != null ? _a : [];
9259
9259
  const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
9260
- React32__namespace.useEffect(() => {
9260
+ React20__namespace.useEffect(() => {
9261
9261
  if (!open) return;
9262
9262
  const handleOutside = (e) => {
9263
9263
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -9725,11 +9725,11 @@ function RegistrationForm({
9725
9725
  readOnly = false
9726
9726
  }) {
9727
9727
  var _a;
9728
- const L = React32__namespace.useMemo(
9728
+ const L = React20__namespace.useMemo(
9729
9729
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS14), labels != null ? labels : {}),
9730
9730
  [labels]
9731
9731
  );
9732
- const sortedFields = React32__namespace.useMemo(
9732
+ const sortedFields = React20__namespace.useMemo(
9733
9733
  () => [...fields].sort((a, b) => {
9734
9734
  var _a2, _b;
9735
9735
  return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
@@ -9737,7 +9737,7 @@ function RegistrationForm({
9737
9737
  [fields]
9738
9738
  );
9739
9739
  const isControlled = values !== void 0;
9740
- const [internal, setInternal] = React32__namespace.useState(
9740
+ const [internal, setInternal] = React20__namespace.useState(
9741
9741
  () => initializeValues(
9742
9742
  sortedFields,
9743
9743
  defaultValues != null ? defaultValues : {},
@@ -9745,9 +9745,9 @@ function RegistrationForm({
9745
9745
  includeTerms
9746
9746
  )
9747
9747
  );
9748
- const [submitAttempted, setSubmitAttempted] = React32__namespace.useState(false);
9749
- const [validationErrors, setValidationErrors] = React32__namespace.useState({});
9750
- React32__namespace.useEffect(() => {
9748
+ const [submitAttempted, setSubmitAttempted] = React20__namespace.useState(false);
9749
+ const [validationErrors, setValidationErrors] = React20__namespace.useState({});
9750
+ React20__namespace.useEffect(() => {
9751
9751
  if (isControlled) return;
9752
9752
  setInternal((prev) => {
9753
9753
  const next = initializeValues(
@@ -9804,7 +9804,7 @@ function RegistrationForm({
9804
9804
  const termsError = submitAttempted && termsEnabled && !termsAccepted;
9805
9805
  const firstErrorFieldId = Object.keys(fieldErrors)[0];
9806
9806
  const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
9807
- React32__namespace.useEffect(() => {
9807
+ React20__namespace.useEffect(() => {
9808
9808
  if (!submitAttempted || !scrollTargetId) return;
9809
9809
  const timer = setTimeout(() => {
9810
9810
  const elem = document.getElementById(scrollTargetId);
@@ -10275,18 +10275,18 @@ function CancellationForm({
10275
10275
  className
10276
10276
  }) {
10277
10277
  var _a, _b, _c;
10278
- const [selectedAdventureIds, setSelectedAdventureIds] = React32__namespace.useState(/* @__PURE__ */ new Set());
10279
- const [participantsByAdventure, setParticipantsByAdventure] = React32__namespace.useState({});
10280
- const [reasonCode, setReasonCode] = React32__namespace.useState("");
10281
- const [reasonOther, setReasonOther] = React32__namespace.useState("");
10282
- const [refundPreference, setRefundPreference] = React32__namespace.useState("");
10283
- const [refundOther, setRefundOther] = React32__namespace.useState("");
10284
- const [agreedToPolicy, setAgreedToPolicy] = React32__namespace.useState(false);
10285
- const [contactName, setContactName] = React32__namespace.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
10286
- const [contactEmail, setContactEmail] = React32__namespace.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
10287
- const [contactPhone, setContactPhone] = React32__namespace.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
10288
- const [errors, setErrors] = React32__namespace.useState({});
10289
- const allParticipantsOf = React32__namespace.useCallback(
10278
+ const [selectedAdventureIds, setSelectedAdventureIds] = React20__namespace.useState(/* @__PURE__ */ new Set());
10279
+ const [participantsByAdventure, setParticipantsByAdventure] = React20__namespace.useState({});
10280
+ const [reasonCode, setReasonCode] = React20__namespace.useState("");
10281
+ const [reasonOther, setReasonOther] = React20__namespace.useState("");
10282
+ const [refundPreference, setRefundPreference] = React20__namespace.useState("");
10283
+ const [refundOther, setRefundOther] = React20__namespace.useState("");
10284
+ const [agreedToPolicy, setAgreedToPolicy] = React20__namespace.useState(false);
10285
+ const [contactName, setContactName] = React20__namespace.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
10286
+ const [contactEmail, setContactEmail] = React20__namespace.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
10287
+ const [contactPhone, setContactPhone] = React20__namespace.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
10288
+ const [errors, setErrors] = React20__namespace.useState({});
10289
+ const allParticipantsOf = React20__namespace.useCallback(
10290
10290
  (advId) => {
10291
10291
  var _a2, _b2;
10292
10292
  return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
@@ -10543,10 +10543,10 @@ var OTPCodeInput = ({
10543
10543
  id,
10544
10544
  required
10545
10545
  }) => {
10546
- const baseId = id != null ? id : React32__namespace.useId();
10547
- const inputRef = React32__namespace.useRef(null);
10548
- const [focused, setFocused] = React32__namespace.useState(false);
10549
- const digits = React32__namespace.useMemo(() => {
10546
+ const baseId = id != null ? id : React20__namespace.useId();
10547
+ const inputRef = React20__namespace.useRef(null);
10548
+ const [focused, setFocused] = React20__namespace.useState(false);
10549
+ const digits = React20__namespace.useMemo(() => {
10550
10550
  const arr = value.split("").slice(0, length);
10551
10551
  while (arr.length < length) arr.push("");
10552
10552
  return arr;
@@ -10659,7 +10659,7 @@ function Checkbox(_a) {
10659
10659
  })
10660
10660
  );
10661
10661
  }
10662
- var AccordionVariantContext = React32__namespace.createContext("default");
10662
+ var AccordionVariantContext = React20__namespace.createContext("default");
10663
10663
  function Accordion(_a) {
10664
10664
  var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
10665
10665
  return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -10677,7 +10677,7 @@ function Accordion(_a) {
10677
10677
  }
10678
10678
  function AccordionItem(_a) {
10679
10679
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
10680
- const variant = React32__namespace.useContext(AccordionVariantContext);
10680
+ const variant = React20__namespace.useContext(AccordionVariantContext);
10681
10681
  return /* @__PURE__ */ jsxRuntime.jsx(
10682
10682
  accordion.Accordion.Item,
10683
10683
  __spreadValues({
@@ -10700,7 +10700,7 @@ function AccordionTrigger(_a) {
10700
10700
  "children",
10701
10701
  "headingLevel"
10702
10702
  ]);
10703
- const variant = React32__namespace.useContext(AccordionVariantContext);
10703
+ const variant = React20__namespace.useContext(AccordionVariantContext);
10704
10704
  const headingRender = headingLevel === 2 ? /* @__PURE__ */ jsxRuntime.jsx("h2", {}) : headingLevel === 4 ? /* @__PURE__ */ jsxRuntime.jsx("h4", {}) : headingLevel === 5 ? /* @__PURE__ */ jsxRuntime.jsx("h5", {}) : headingLevel === 6 ? /* @__PURE__ */ jsxRuntime.jsx("h6", {}) : void 0;
10705
10705
  return /* @__PURE__ */ jsxRuntime.jsx(
10706
10706
  accordion.Accordion.Header,
@@ -10762,7 +10762,7 @@ function AccordionContent(_a) {
10762
10762
  "className",
10763
10763
  "children"
10764
10764
  ]);
10765
- const variant = React32__namespace.useContext(AccordionVariantContext);
10765
+ const variant = React20__namespace.useContext(AccordionVariantContext);
10766
10766
  return /* @__PURE__ */ jsxRuntime.jsx(
10767
10767
  accordion.Accordion.Panel,
10768
10768
  __spreadProps(__spreadValues({
@@ -10981,15 +10981,15 @@ function FilterPanel({
10981
10981
  labels
10982
10982
  }) {
10983
10983
  var _a, _b, _c, _d, _e, _f, _g, _h;
10984
- const resolvedGroups = React32__namespace.useMemo(() => resolveGroups(groups), [groups]);
10985
- const [internalValue, setInternalValue] = React32__namespace.useState(
10984
+ const resolvedGroups = React20__namespace.useMemo(() => resolveGroups(groups), [groups]);
10985
+ const [internalValue, setInternalValue] = React20__namespace.useState(
10986
10986
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
10987
10987
  );
10988
10988
  const selected = value != null ? value : internalValue;
10989
- const [expandedItems, setExpandedItems] = React32__namespace.useState(
10989
+ const [expandedItems, setExpandedItems] = React20__namespace.useState(
10990
10990
  () => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
10991
10991
  );
10992
- const toggleExpanded = React32__namespace.useCallback((id) => {
10992
+ const toggleExpanded = React20__namespace.useCallback((id) => {
10993
10993
  setExpandedItems((prev) => {
10994
10994
  const next = new Set(prev);
10995
10995
  if (next.has(id)) next.delete(id);
@@ -11373,11 +11373,11 @@ function FilterPanel({
11373
11373
  var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
11374
11374
  function TrustpilotEmbed({ config }) {
11375
11375
  var _a, _b, _c, _d, _e, _f;
11376
- const ref = React32__namespace.useRef(null);
11377
- const [widgetReady, setWidgetReady] = React32__namespace.useState(false);
11378
- const [delayPassed, setDelayPassed] = React32__namespace.useState(false);
11376
+ const ref = React20__namespace.useRef(null);
11377
+ const [widgetReady, setWidgetReady] = React20__namespace.useState(false);
11378
+ const [delayPassed, setDelayPassed] = React20__namespace.useState(false);
11379
11379
  const showFallback = delayPassed && !widgetReady;
11380
- React32__namespace.useEffect(() => {
11380
+ React20__namespace.useEffect(() => {
11381
11381
  var _a2;
11382
11382
  if (typeof document === "undefined" || !ref.current) return;
11383
11383
  const node = ref.current;
@@ -11565,7 +11565,7 @@ function webpVariantUrl(src) {
11565
11565
  return `${withoutQuery}.webp${query}`;
11566
11566
  }
11567
11567
  function PictureLoader() {
11568
- const gradientId = React32__namespace.useId();
11568
+ const gradientId = React20__namespace.useId();
11569
11569
  return /* @__PURE__ */ jsxRuntime.jsx(
11570
11570
  "span",
11571
11571
  {
@@ -11635,10 +11635,10 @@ function Picture(_a) {
11635
11635
  "onError"
11636
11636
  ]);
11637
11637
  var _a2, _b2;
11638
- const ref = React32__namespace.useRef(null);
11639
- const [visible, setVisible] = React32__namespace.useState(eager);
11640
- const [loaded, setLoaded] = React32__namespace.useState(false);
11641
- React32__namespace.useEffect(() => {
11638
+ const ref = React20__namespace.useRef(null);
11639
+ const [visible, setVisible] = React20__namespace.useState(eager);
11640
+ const [loaded, setLoaded] = React20__namespace.useState(false);
11641
+ React20__namespace.useEffect(() => {
11642
11642
  if (eager || visible) return;
11643
11643
  const el = ref.current;
11644
11644
  if (!el || typeof IntersectionObserver === "undefined") {
@@ -11657,7 +11657,7 @@ function Picture(_a) {
11657
11657
  io.observe(el);
11658
11658
  return () => io.disconnect();
11659
11659
  }, [eager, visible, rootMargin]);
11660
- React32__namespace.useEffect(() => {
11660
+ React20__namespace.useEffect(() => {
11661
11661
  setLoaded(false);
11662
11662
  }, [src]);
11663
11663
  const webp = webpVariantUrl(src);
@@ -11788,11 +11788,11 @@ function ItineraryModal({
11788
11788
  onNext
11789
11789
  }) {
11790
11790
  var _a, _b, _c;
11791
- const [imgIndex, setImgIndex] = React32__namespace.useState(0);
11791
+ const [imgIndex, setImgIndex] = React20__namespace.useState(0);
11792
11792
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
11793
11793
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
11794
11794
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
11795
- React32__namespace.useEffect(() => {
11795
+ React20__namespace.useEffect(() => {
11796
11796
  setImgIndex(0);
11797
11797
  }, [stop == null ? void 0 : stop.dayNumber]);
11798
11798
  if (!stop) return null;
@@ -11919,8 +11919,8 @@ function ItineraryModal({
11919
11919
  ) });
11920
11920
  }
11921
11921
  function Itinerary({ title, subtitle, stops, className }) {
11922
- const [activeIndex, setActiveIndex] = React32__namespace.useState(null);
11923
- const scrollRef = React32__namespace.useRef(null);
11922
+ const [activeIndex, setActiveIndex] = React20__namespace.useState(null);
11923
+ const scrollRef = React20__namespace.useRef(null);
11924
11924
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
11925
11925
  const scrollBy = (dir) => {
11926
11926
  if (!scrollRef.current) return;
@@ -12013,18 +12013,18 @@ function Lightbox({
12013
12013
  labels
12014
12014
  }) {
12015
12015
  var _a, _b, _c, _d;
12016
- const [index, setIndex] = React32__namespace.useState(initialIndex);
12016
+ const [index, setIndex] = React20__namespace.useState(initialIndex);
12017
12017
  const total = photos.length;
12018
12018
  const photo = photos[index];
12019
- const prev = React32__namespace.useCallback(
12019
+ const prev = React20__namespace.useCallback(
12020
12020
  () => setIndex((i) => (i - 1 + total) % total),
12021
12021
  [total]
12022
12022
  );
12023
- const next = React32__namespace.useCallback(
12023
+ const next = React20__namespace.useCallback(
12024
12024
  () => setIndex((i) => (i + 1) % total),
12025
12025
  [total]
12026
12026
  );
12027
- React32__namespace.useEffect(() => {
12027
+ React20__namespace.useEffect(() => {
12028
12028
  const onKey = (e) => {
12029
12029
  if (e.key === "Escape") onClose();
12030
12030
  if (e.key === "ArrowLeft") prev();
@@ -12126,6 +12126,260 @@ function Lightbox({
12126
12126
  }
12127
12127
  );
12128
12128
  }
12129
+ function FeedLightbox({
12130
+ sections,
12131
+ initialIndex,
12132
+ onClose,
12133
+ labels
12134
+ }) {
12135
+ var _a;
12136
+ const { items, total, bounds } = React20__namespace.useMemo(() => {
12137
+ const items2 = [];
12138
+ const bounds2 = [];
12139
+ let i = 0;
12140
+ for (const section of sections) {
12141
+ if (!section.photos.length) continue;
12142
+ bounds2.push({
12143
+ label: section.label,
12144
+ start: i,
12145
+ end: i + section.photos.length - 1
12146
+ });
12147
+ section.photos.forEach((photo, p) => {
12148
+ items2.push({
12149
+ photo,
12150
+ index: i,
12151
+ sectionLabel: section.label,
12152
+ isSectionStart: p === 0
12153
+ });
12154
+ i += 1;
12155
+ });
12156
+ }
12157
+ return { items: items2, total: i, bounds: bounds2 };
12158
+ }, [sections]);
12159
+ const scrollRef = React20__namespace.useRef(null);
12160
+ const itemRefs = React20__namespace.useRef([]);
12161
+ const [active, setActive] = React20__namespace.useState(initialIndex);
12162
+ const activeLabel = React20__namespace.useMemo(
12163
+ () => {
12164
+ var _a2;
12165
+ return (_a2 = bounds.find((b) => active >= b.start && active <= b.end)) == null ? void 0 : _a2.label;
12166
+ },
12167
+ [bounds, active]
12168
+ );
12169
+ React20__namespace.useEffect(() => {
12170
+ const previous = document.body.style.overflow;
12171
+ document.body.style.overflow = "hidden";
12172
+ return () => {
12173
+ document.body.style.overflow = previous;
12174
+ };
12175
+ }, []);
12176
+ React20__namespace.useEffect(() => {
12177
+ const onKey = (e) => {
12178
+ if (e.key === "Escape") onClose();
12179
+ };
12180
+ document.addEventListener("keydown", onKey);
12181
+ return () => document.removeEventListener("keydown", onKey);
12182
+ }, [onClose]);
12183
+ React20__namespace.useEffect(() => {
12184
+ const root = scrollRef.current;
12185
+ if (!root) return;
12186
+ let frame = 0;
12187
+ let userMoved = false;
12188
+ const recompute = () => {
12189
+ var _a2;
12190
+ frame = 0;
12191
+ if (!userMoved) {
12192
+ (_a2 = itemRefs.current[initialIndex]) == null ? void 0 : _a2.scrollIntoView({ block: "start" });
12193
+ }
12194
+ const anchorY = root.getBoundingClientRect().top + 64;
12195
+ let current = 0;
12196
+ itemRefs.current.forEach((el, i) => {
12197
+ if (el && el.getBoundingClientRect().top <= anchorY) current = i;
12198
+ });
12199
+ if (root.scrollTop + root.clientHeight >= root.scrollHeight - 2) {
12200
+ current = total - 1;
12201
+ }
12202
+ setActive(current);
12203
+ };
12204
+ const schedule = () => {
12205
+ if (!frame) frame = requestAnimationFrame(recompute);
12206
+ };
12207
+ const onScroll = () => schedule();
12208
+ const onUserMove = () => {
12209
+ userMoved = true;
12210
+ };
12211
+ root.addEventListener("scroll", onScroll, { passive: true });
12212
+ root.addEventListener("wheel", onUserMove, { passive: true });
12213
+ root.addEventListener("touchmove", onUserMove, { passive: true });
12214
+ window.addEventListener("keydown", onUserMove);
12215
+ const ro = new ResizeObserver(schedule);
12216
+ itemRefs.current.forEach((el) => el && ro.observe(el));
12217
+ recompute();
12218
+ return () => {
12219
+ root.removeEventListener("scroll", onScroll);
12220
+ root.removeEventListener("wheel", onUserMove);
12221
+ root.removeEventListener("touchmove", onUserMove);
12222
+ window.removeEventListener("keydown", onUserMove);
12223
+ ro.disconnect();
12224
+ if (frame) cancelAnimationFrame(frame);
12225
+ };
12226
+ }, []);
12227
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 flex flex-col bg-background", children: [
12228
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sticky top-0 z-10 flex items-center gap-3 border-b border-border/60 bg-background/85 px-3 py-2.5 backdrop-blur-md", children: [
12229
+ /* @__PURE__ */ jsxRuntime.jsx(
12230
+ "button",
12231
+ {
12232
+ type: "button",
12233
+ onClick: onClose,
12234
+ className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
12235
+ "aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
12236
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5" })
12237
+ }
12238
+ ),
12239
+ activeLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-center font-heading text-sm font-bold uppercase tracking-wide text-foreground", children: activeLabel }),
12240
+ total > 1 && /* @__PURE__ */ jsxRuntime.jsxs(
12241
+ "span",
12242
+ {
12243
+ className: cn(
12244
+ "shrink-0 font-ui text-sm font-medium tabular-nums text-muted-foreground",
12245
+ !activeLabel && "ml-auto"
12246
+ ),
12247
+ children: [
12248
+ active + 1,
12249
+ " / ",
12250
+ total
12251
+ ]
12252
+ }
12253
+ )
12254
+ ] }),
12255
+ /* @__PURE__ */ jsxRuntime.jsx(
12256
+ "div",
12257
+ {
12258
+ ref: scrollRef,
12259
+ className: "flex-1 overflow-y-auto overscroll-contain",
12260
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex w-full max-w-3xl flex-col gap-3 py-4", children: items.map(({ photo, index, sectionLabel, isSectionStart }) => {
12261
+ var _a2;
12262
+ return /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
12263
+ sectionLabel && isSectionStart && /* @__PURE__ */ jsxRuntime.jsx(
12264
+ "h2",
12265
+ {
12266
+ className: cn(
12267
+ "px-3 font-heading text-lg font-bold uppercase tracking-wide text-foreground sm:px-4",
12268
+ index > 0 && "mt-3"
12269
+ ),
12270
+ children: sectionLabel
12271
+ }
12272
+ ),
12273
+ /* @__PURE__ */ jsxRuntime.jsxs(
12274
+ "figure",
12275
+ {
12276
+ "data-index": index,
12277
+ ref: (el) => {
12278
+ itemRefs.current[index] = el;
12279
+ },
12280
+ children: [
12281
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden bg-muted", children: /* @__PURE__ */ jsxRuntime.jsx(
12282
+ Picture,
12283
+ {
12284
+ src: photo.src,
12285
+ alt: (_a2 = photo.alt) != null ? _a2 : `Photo ${index + 1}`,
12286
+ title: photo.caption,
12287
+ className: "block h-auto w-full",
12288
+ eager: index < 2,
12289
+ rootMargin: "800px"
12290
+ }
12291
+ ) }),
12292
+ (photo.caption || photo.credit) && /* @__PURE__ */ jsxRuntime.jsxs("figcaption", { className: "px-3 pt-2 sm:px-4", children: [
12293
+ photo.caption && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-ui text-sm leading-snug text-foreground/80", children: photo.caption }),
12294
+ photo.credit && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "font-ui text-xs text-muted-foreground", children: [
12295
+ "\xA9 ",
12296
+ photo.credit
12297
+ ] })
12298
+ ] })
12299
+ ]
12300
+ }
12301
+ )
12302
+ ] }, index);
12303
+ }) })
12304
+ }
12305
+ )
12306
+ ] });
12307
+ }
12308
+ var PhotoTourContext = React20__namespace.createContext(null);
12309
+ function PhotoTourProvider({
12310
+ enabled = true,
12311
+ labels,
12312
+ children
12313
+ }) {
12314
+ const entries = React20__namespace.useRef(/* @__PURE__ */ new Map());
12315
+ const [open, setOpen] = React20__namespace.useState(null);
12316
+ const register = React20__namespace.useCallback((entry) => {
12317
+ entries.current.set(entry.id, entry);
12318
+ }, []);
12319
+ const unregister = React20__namespace.useCallback((id) => {
12320
+ entries.current.delete(id);
12321
+ }, []);
12322
+ const openTour = React20__namespace.useCallback((id, localIndex) => {
12323
+ var _a, _b;
12324
+ const ordered = [...entries.current.values()].filter((e) => e.photos.length).sort((a, b) => {
12325
+ const ea = a.getEl();
12326
+ const eb = b.getEl();
12327
+ if (!ea || !eb) return 0;
12328
+ const pos = ea.compareDocumentPosition(eb);
12329
+ if (pos & Node.DOCUMENT_POSITION_FOLLOWING) return -1;
12330
+ if (pos & Node.DOCUMENT_POSITION_PRECEDING) return 1;
12331
+ return 0;
12332
+ });
12333
+ const targetSrc = (_b = (_a = entries.current.get(id)) == null ? void 0 : _a.photos[localIndex]) == null ? void 0 : _b.src;
12334
+ const seen = /* @__PURE__ */ new Set();
12335
+ const sections = [];
12336
+ for (const entry of ordered) {
12337
+ const photos = entry.photos.filter((p) => {
12338
+ if (seen.has(p.src)) return false;
12339
+ seen.add(p.src);
12340
+ return true;
12341
+ });
12342
+ if (!photos.length) continue;
12343
+ const prev = sections[sections.length - 1];
12344
+ if (prev && prev.label === entry.label) {
12345
+ prev.photos.push(...photos);
12346
+ } else {
12347
+ sections.push({ label: entry.label, photos: [...photos] });
12348
+ }
12349
+ }
12350
+ let index = 0;
12351
+ let running = 0;
12352
+ let done = false;
12353
+ for (const section of sections) {
12354
+ for (const photo of section.photos) {
12355
+ if (photo.src === targetSrc) {
12356
+ index = running;
12357
+ done = true;
12358
+ break;
12359
+ }
12360
+ running += 1;
12361
+ }
12362
+ if (done) break;
12363
+ }
12364
+ setOpen({ sections, index });
12365
+ }, []);
12366
+ const value = React20__namespace.useMemo(
12367
+ () => ({ enabled, register, unregister, open: openTour }),
12368
+ [enabled, register, unregister, openTour]
12369
+ );
12370
+ return /* @__PURE__ */ jsxRuntime.jsxs(PhotoTourContext.Provider, { value, children: [
12371
+ children,
12372
+ open && /* @__PURE__ */ jsxRuntime.jsx(
12373
+ FeedLightbox,
12374
+ {
12375
+ sections: open.sections,
12376
+ initialIndex: open.index,
12377
+ labels,
12378
+ onClose: () => setOpen(null)
12379
+ }
12380
+ )
12381
+ ] });
12382
+ }
12129
12383
  function PhotoTile({
12130
12384
  photo,
12131
12385
  index,
@@ -12198,7 +12452,7 @@ function GridGallery({
12198
12452
  onOpen,
12199
12453
  labels
12200
12454
  }) {
12201
- const [expanded, setExpanded] = React32__namespace.useState(false);
12455
+ const [expanded, setExpanded] = React20__namespace.useState(false);
12202
12456
  const cols = gridCols(photos.length);
12203
12457
  const hasMore = photos.length > initialVisible;
12204
12458
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -12230,7 +12484,7 @@ function CompactGridGallery({
12230
12484
  onOpen,
12231
12485
  labels
12232
12486
  }) {
12233
- const [expanded, setExpanded] = React32__namespace.useState(false);
12487
+ const [expanded, setExpanded] = React20__namespace.useState(false);
12234
12488
  const hasMore = photos.length > initialVisible;
12235
12489
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
12236
12490
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -12261,7 +12515,7 @@ function MasonryGallery({
12261
12515
  onOpen,
12262
12516
  labels
12263
12517
  }) {
12264
- const [expanded, setExpanded] = React32__namespace.useState(false);
12518
+ const [expanded, setExpanded] = React20__namespace.useState(false);
12265
12519
  const hasMore = photos.length > initialVisible;
12266
12520
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
12267
12521
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -12338,7 +12592,7 @@ function FeaturedGallery({
12338
12592
  onOpen,
12339
12593
  labels
12340
12594
  }) {
12341
- const [expanded, setExpanded] = React32__namespace.useState(false);
12595
+ const [expanded, setExpanded] = React20__namespace.useState(false);
12342
12596
  const featured = photos.slice(0, 3);
12343
12597
  const extra = photos.slice(3);
12344
12598
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -12453,11 +12707,33 @@ function CarouselGallery({
12453
12707
  const photo = photos[index];
12454
12708
  const prev = () => onIndexChange((index - 1 + total) % total);
12455
12709
  const next = () => onIndexChange((index + 1) % total);
12710
+ const touchStart = React20__namespace.useRef(null);
12711
+ const swiped = React20__namespace.useRef(false);
12712
+ const onTouchStart = (e) => {
12713
+ const t = e.touches[0];
12714
+ touchStart.current = { x: t.clientX, y: t.clientY };
12715
+ swiped.current = false;
12716
+ };
12717
+ const onTouchEnd = (e) => {
12718
+ const start = touchStart.current;
12719
+ touchStart.current = null;
12720
+ if (!start || total <= 1) return;
12721
+ const t = e.changedTouches[0];
12722
+ const dx = t.clientX - start.x;
12723
+ const dy = t.clientY - start.y;
12724
+ if (Math.abs(dx) > 40 && Math.abs(dx) > Math.abs(dy)) {
12725
+ swiped.current = true;
12726
+ if (dx < 0) next();
12727
+ else prev();
12728
+ }
12729
+ };
12456
12730
  return /* @__PURE__ */ jsxRuntime.jsxs(
12457
12731
  "div",
12458
12732
  {
12733
+ onTouchStart,
12734
+ onTouchEnd,
12459
12735
  className: cn(
12460
- "relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted group/photo",
12736
+ "relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted group/photo touch-pan-y select-none",
12461
12737
  className
12462
12738
  ),
12463
12739
  children: [
@@ -12465,7 +12741,13 @@ function CarouselGallery({
12465
12741
  "button",
12466
12742
  {
12467
12743
  type: "button",
12468
- onClick: () => onOpen(index),
12744
+ onClick: () => {
12745
+ if (swiped.current) {
12746
+ swiped.current = false;
12747
+ return;
12748
+ }
12749
+ onOpen(index);
12750
+ },
12469
12751
  "aria-label": `Open photo ${index + 1} fullscreen`,
12470
12752
  className: "absolute inset-0 w-full h-full cursor-zoom-in focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
12471
12753
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -12538,17 +12820,46 @@ function PhotoGallery({
12538
12820
  initialVisible = 6,
12539
12821
  onPhotoClick,
12540
12822
  labels,
12823
+ lightbox: lightboxMode = "classic",
12824
+ tourSection,
12541
12825
  className
12542
12826
  }) {
12543
- const [lightboxIndex, setLightboxIndex] = React32__namespace.useState(null);
12544
- const [carouselIndex, setCarouselIndex] = React32__namespace.useState(0);
12545
- const normalised = React32__namespace.useMemo(() => photos.map(normalise), [photos]);
12827
+ const [lightboxIndex, setLightboxIndex] = React20__namespace.useState(null);
12828
+ const [carouselIndex, setCarouselIndex] = React20__namespace.useState(0);
12829
+ const normalised = React20__namespace.useMemo(() => photos.map(normalise), [photos]);
12830
+ const tour = React20__namespace.useContext(PhotoTourContext);
12831
+ const tourId = React20__namespace.useId();
12832
+ const markerRef = React20__namespace.useRef(null);
12833
+ const inTour = !!((tour == null ? void 0 : tour.enabled) && tourSection);
12834
+ React20__namespace.useEffect(() => {
12835
+ if (!inTour || !tour) return;
12836
+ tour.register({
12837
+ id: tourId,
12838
+ label: tourSection,
12839
+ getEl: () => markerRef.current,
12840
+ photos: normalised
12841
+ });
12842
+ return () => tour.unregister(tourId);
12843
+ }, [inTour, tour, tourId, tourSection, normalised]);
12546
12844
  const handleOpen = (index) => {
12547
- setLightboxIndex(index);
12548
12845
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
12846
+ if (inTour && tour) {
12847
+ tour.open(tourId, index);
12848
+ return;
12849
+ }
12850
+ setLightboxIndex(index);
12549
12851
  };
12550
12852
  if (normalised.length === 0) return null;
12551
- const lightbox = lightboxIndex !== null && /* @__PURE__ */ jsxRuntime.jsx(
12853
+ const tourMarker = inTour && /* @__PURE__ */ jsxRuntime.jsx("span", { ref: markerRef, "aria-hidden": true, className: "hidden" });
12854
+ const lightbox = lightboxIndex !== null && (lightboxMode === "feed" ? /* @__PURE__ */ jsxRuntime.jsx(
12855
+ FeedLightbox,
12856
+ {
12857
+ sections: [{ photos: normalised }],
12858
+ initialIndex: lightboxIndex,
12859
+ onClose: () => setLightboxIndex(null),
12860
+ labels
12861
+ }
12862
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
12552
12863
  Lightbox,
12553
12864
  {
12554
12865
  photos: normalised,
@@ -12556,9 +12867,10 @@ function PhotoGallery({
12556
12867
  onClose: () => setLightboxIndex(null),
12557
12868
  labels
12558
12869
  }
12559
- );
12870
+ ));
12560
12871
  if (variant === "carousel" || variant === "fullBleed") {
12561
12872
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
12873
+ tourMarker,
12562
12874
  /* @__PURE__ */ jsxRuntime.jsx(
12563
12875
  CarouselGallery,
12564
12876
  {
@@ -12577,6 +12889,7 @@ function PhotoGallery({
12577
12889
  ] });
12578
12890
  }
12579
12891
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", className), children: [
12892
+ tourMarker,
12580
12893
  variant === "grid" && /* @__PURE__ */ jsxRuntime.jsx(
12581
12894
  GridGallery,
12582
12895
  {
@@ -12632,14 +12945,15 @@ function ItineraryDay({
12632
12945
  photoLayout = "rounded",
12633
12946
  className
12634
12947
  }) {
12635
- const photoList = React32__namespace.useMemo(() => normalisePhotos(photos), [photos]);
12948
+ const photoList = React20__namespace.useMemo(() => normalisePhotos(photos), [photos]);
12636
12949
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
12637
12950
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
12638
12951
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
12639
12952
  PhotoGallery,
12640
12953
  {
12641
12954
  photos: photoList,
12642
- variant: isFullBleed ? "fullBleed" : "carousel"
12955
+ variant: isFullBleed ? "fullBleed" : "carousel",
12956
+ tourSection: dayLabel != null ? dayLabel : `Day ${dayNumber}`
12643
12957
  }
12644
12958
  );
12645
12959
  return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn("w-full flex flex-col gap-5", className), children: [
@@ -12687,8 +13001,8 @@ function MenuTrip({
12687
13001
  bold = true,
12688
13002
  className
12689
13003
  }) {
12690
- const scrollRef = React32__namespace.useRef(null);
12691
- React32__namespace.useEffect(() => {
13004
+ const scrollRef = React20__namespace.useRef(null);
13005
+ React20__namespace.useEffect(() => {
12692
13006
  if (!scrollRef.current || !activeSection) return;
12693
13007
  const container = scrollRef.current;
12694
13008
  const btn = container.querySelector(
@@ -12886,8 +13200,8 @@ function PricingTrip({
12886
13200
  className
12887
13201
  }) {
12888
13202
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
12889
- const [showEstimates, setShowEstimates] = React32__namespace.useState(false);
12890
- const [showPriceInfo, setShowPriceInfo] = React32__namespace.useState(false);
13203
+ const [showEstimates, setShowEstimates] = React20__namespace.useState(false);
13204
+ const [showPriceInfo, setShowPriceInfo] = React20__namespace.useState(false);
12891
13205
  if (variant === "compact") {
12892
13206
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
12893
13207
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -13323,6 +13637,7 @@ function SiteHeader({
13323
13637
  logoSrcDark = "/logo-planetaexo-green.png",
13324
13638
  logoSrc,
13325
13639
  logoAlt = "Planeta Exo",
13640
+ logoHref = "#",
13326
13641
  languages = DEFAULT_LANGUAGES,
13327
13642
  currentLanguage = "EN",
13328
13643
  onLanguageChange,
@@ -13335,14 +13650,14 @@ function SiteHeader({
13335
13650
  var _a, _b, _c, _d, _e, _f, _g;
13336
13651
  const t = VARIANT[variant];
13337
13652
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
13338
- const [openMenu, setOpenMenu] = React32__namespace.useState(null);
13339
- const [langOpen, setLangOpen] = React32__namespace.useState(false);
13340
- const [mobileOpen, setMobileOpen] = React32__namespace.useState(false);
13341
- const [openMobileSection, setOpenMobileSection] = React32__namespace.useState(null);
13342
- const [activeLang, setActiveLang] = React32__namespace.useState(currentLanguage);
13653
+ const [openMenu, setOpenMenu] = React20__namespace.useState(null);
13654
+ const [langOpen, setLangOpen] = React20__namespace.useState(false);
13655
+ const [mobileOpen, setMobileOpen] = React20__namespace.useState(false);
13656
+ const [openMobileSection, setOpenMobileSection] = React20__namespace.useState(null);
13657
+ const [activeLang, setActiveLang] = React20__namespace.useState(currentLanguage);
13343
13658
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
13344
- const menuCloseTimer = React32__namespace.useRef(void 0);
13345
- const langCloseTimer = React32__namespace.useRef(void 0);
13659
+ const menuCloseTimer = React20__namespace.useRef(void 0);
13660
+ const langCloseTimer = React20__namespace.useRef(void 0);
13346
13661
  const handleMenuEnter = (label) => {
13347
13662
  clearTimeout(menuCloseTimer.current);
13348
13663
  setOpenMenu(label);
@@ -13363,7 +13678,7 @@ function SiteHeader({
13363
13678
  setOpenMenu(null);
13364
13679
  setLangOpen(false);
13365
13680
  };
13366
- React32__namespace.useEffect(() => () => {
13681
+ React20__namespace.useEffect(() => () => {
13367
13682
  clearTimeout(menuCloseTimer.current);
13368
13683
  clearTimeout(langCloseTimer.current);
13369
13684
  }, []);
@@ -13401,7 +13716,7 @@ function SiteHeader({
13401
13716
  /* @__PURE__ */ jsxRuntime.jsx(
13402
13717
  "a",
13403
13718
  {
13404
- href: "#",
13719
+ href: logoHref,
13405
13720
  className: cn(
13406
13721
  "shrink-0 flex items-center",
13407
13722
  "absolute left-1/2 -translate-x-1/2",
@@ -13553,7 +13868,7 @@ function SiteHeader({
13553
13868
  ),
13554
13869
  children: [
13555
13870
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 h-[72px] shrink-0 border-b border-white/8", children: [
13556
- /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#", className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsxRuntime.jsx(
13871
+ /* @__PURE__ */ jsxRuntime.jsx("a", { href: logoHref, className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsxRuntime.jsx(
13557
13872
  "img",
13558
13873
  {
13559
13874
  src: resolvedLogo,
@@ -13639,7 +13954,7 @@ function SiteHeader({
13639
13954
  ), children: [
13640
13955
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
13641
13956
  const isActive = lang.code === activeLang;
13642
- return /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
13957
+ return /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
13643
13958
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
13644
13959
  "text-xs select-none",
13645
13960
  variant === "white" ? "text-border" : "text-white/15"
@@ -13701,8 +14016,8 @@ function SiteHeader({
13701
14016
  );
13702
14017
  }
13703
14018
  function ThemeToggle({ className }) {
13704
- const [dark, setDark] = React32__namespace.useState(false);
13705
- React32__namespace.useEffect(() => {
14019
+ const [dark, setDark] = React20__namespace.useState(false);
14020
+ React20__namespace.useEffect(() => {
13706
14021
  const saved = localStorage.getItem("theme");
13707
14022
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
13708
14023
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -13752,7 +14067,7 @@ var chipVariants = classVarianceAuthority.cva(
13752
14067
  }
13753
14068
  }
13754
14069
  );
13755
- var Chip = React32__namespace.forwardRef(function Chip2(_a, ref) {
14070
+ var Chip = React20__namespace.forwardRef(function Chip2(_a, ref) {
13756
14071
  var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
13757
14072
  const classes = cn(chipVariants({ variant, size }), className);
13758
14073
  if (href) {
@@ -13819,6 +14134,19 @@ var statusConfig = {
13819
14134
  icon: /* @__PURE__ */ jsxRuntime.jsx(TrendingIcon, {})
13820
14135
  }
13821
14136
  };
14137
+ function StarIcon() {
14138
+ return /* @__PURE__ */ jsxRuntime.jsx(
14139
+ "svg",
14140
+ {
14141
+ width: "15",
14142
+ height: "15",
14143
+ viewBox: "0 0 24 24",
14144
+ fill: "currentColor",
14145
+ "aria-hidden": "true",
14146
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 17.27l-5.4 3.27 1.43-6.16-4.78-4.14 6.3-.54L12 4l2.45 5.7 6.3.54-4.78 4.14 1.43 6.16z" })
14147
+ }
14148
+ );
14149
+ }
13822
14150
  function HeartIcon({ filled = false }) {
13823
14151
  return /* @__PURE__ */ jsxRuntime.jsx(
13824
14152
  "svg",
@@ -13836,7 +14164,7 @@ function HeartIcon({ filled = false }) {
13836
14164
  );
13837
14165
  }
13838
14166
  function TripCardEditorial(props) {
13839
- var _a, _b, _c, _d;
14167
+ var _a, _b, _c, _d, _e, _f;
13840
14168
  const {
13841
14169
  image,
13842
14170
  imageAlt = "",
@@ -13853,10 +14181,14 @@ function TripCardEditorial(props) {
13853
14181
  location,
13854
14182
  locationHref,
13855
14183
  difficulty,
14184
+ rating,
14185
+ reviewCount,
13856
14186
  tag,
13857
14187
  tagHref
13858
14188
  } = props;
13859
- const [internalFav, setInternalFav] = React32__namespace.useState(false);
14189
+ const hasRating = typeof rating === "number" && rating > 0;
14190
+ const reviewsWord = reviewCount === 1 ? (_a = labels == null ? void 0 : labels.review) != null ? _a : "review" : (_b = labels == null ? void 0 : labels.reviews) != null ? _b : "reviews";
14191
+ const [internalFav, setInternalFav] = React20__namespace.useState(false);
13860
14192
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
13861
14193
  const handleFav = (e) => {
13862
14194
  e.preventDefault();
@@ -13898,7 +14230,7 @@ function TripCardEditorial(props) {
13898
14230
  "button",
13899
14231
  {
13900
14232
  type: "button",
13901
- "aria-label": favorited ? (_a = labels == null ? void 0 : labels.removeFromFavorites) != null ? _a : "Remove from favorites" : (_b = labels == null ? void 0 : labels.addToFavorites) != null ? _b : "Add to favorites",
14233
+ "aria-label": favorited ? (_c = labels == null ? void 0 : labels.removeFromFavorites) != null ? _c : "Remove from favorites" : (_d = labels == null ? void 0 : labels.addToFavorites) != null ? _d : "Add to favorites",
13902
14234
  "aria-pressed": favorited,
13903
14235
  onClick: handleFav,
13904
14236
  className: cn(
@@ -13912,7 +14244,24 @@ function TripCardEditorial(props) {
13912
14244
  ),
13913
14245
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0 p-5 text-white", children: /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg sm:text-xl font-bold font-heading leading-tight", children: title }) })
13914
14246
  ] }),
13915
- (description || price || nights || location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
14247
+ (description || price || nights || location || difficulty || hasRating) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
14248
+ hasRating && /* @__PURE__ */ jsxRuntime.jsxs(
14249
+ "div",
14250
+ {
14251
+ className: "flex items-center gap-1.5 text-foreground/85",
14252
+ "aria-label": reviewCount ? `${rating.toFixed(1)} (${reviewCount} ${reviewsWord})` : `${rating.toFixed(1)}`,
14253
+ children: [
14254
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-amber-500", children: /* @__PURE__ */ jsxRuntime.jsx(StarIcon, {}) }),
14255
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: rating.toFixed(1) }),
14256
+ reviewCount ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-ui text-muted-foreground", children: [
14257
+ "\xB7 ",
14258
+ reviewCount,
14259
+ " ",
14260
+ reviewsWord
14261
+ ] }) : null
14262
+ ]
14263
+ }
14264
+ ),
13916
14265
  (location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
13917
14266
  location ? locationHref ? (
13918
14267
  // Above the card's stretched link (z-20) so the location is
@@ -13942,7 +14291,7 @@ function TripCardEditorial(props) {
13942
14291
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13943
14292
  nights,
13944
14293
  " ",
13945
- nights === 1 ? (_c = labels == null ? void 0 : labels.night) != null ? _c : "night" : (_d = labels == null ? void 0 : labels.nights) != null ? _d : "nights"
14294
+ nights === 1 ? (_e = labels == null ? void 0 : labels.night) != null ? _e : "night" : (_f = labels == null ? void 0 : labels.nights) != null ? _f : "nights"
13946
14295
  ] })
13947
14296
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
13948
14297
  price && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
@@ -14371,7 +14720,7 @@ function BlogPost({
14371
14720
  ) }),
14372
14721
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
14373
14722
  /* @__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: [
14374
- 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(React32__namespace.Fragment, { children: [
14723
+ 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(React20__namespace.Fragment, { children: [
14375
14724
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
14376
14725
  crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
14377
14726
  "a",
@@ -14425,7 +14774,7 @@ function BlogPost({
14425
14774
  ] });
14426
14775
  }
14427
14776
  function useHlsVideo(videoRef, src) {
14428
- React32__namespace.useEffect(() => {
14777
+ React20__namespace.useEffect(() => {
14429
14778
  if (!src || !videoRef.current) return;
14430
14779
  const video = videoRef.current;
14431
14780
  if (!src.includes(".m3u8")) return;
@@ -14471,11 +14820,11 @@ function TripHeader({
14471
14820
  className
14472
14821
  }) {
14473
14822
  var _a, _b, _c, _d, _e, _f, _g;
14474
- const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
14475
- const [videoReady, setVideoReady] = React32__namespace.useState(false);
14476
- const videoRef = React32__namespace.useRef(null);
14823
+ const [heroIndex, setHeroIndex] = React20__namespace.useState(0);
14824
+ const [videoReady, setVideoReady] = React20__namespace.useState(false);
14825
+ const videoRef = React20__namespace.useRef(null);
14477
14826
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
14478
- const validImages = React32__namespace.useMemo(
14827
+ const validImages = React20__namespace.useMemo(
14479
14828
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
14480
14829
  [images]
14481
14830
  );
@@ -14490,7 +14839,7 @@ function TripHeader({
14490
14839
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
14491
14840
  const hasMeta = !!(destination || duration || groupSize);
14492
14841
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
14493
- React32__namespace.useEffect(() => {
14842
+ React20__namespace.useEffect(() => {
14494
14843
  if (!videoUrl) return;
14495
14844
  const el = videoRef.current;
14496
14845
  if (!el) return;
@@ -14633,7 +14982,7 @@ function TripHeader({
14633
14982
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
14634
14983
  ),
14635
14984
  children: [
14636
- 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(React32__namespace.Fragment, { children: [
14985
+ 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(React20__namespace.Fragment, { children: [
14637
14986
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
14638
14987
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
14639
14988
  ] }, i)) }),
@@ -14803,10 +15152,10 @@ function LanguagePicker({
14803
15152
  }) {
14804
15153
  var _a;
14805
15154
  const t = VARIANT2[variant];
14806
- const [open, setOpen] = React32__namespace.useState(false);
14807
- const ref = React32__namespace.useRef(null);
15155
+ const [open, setOpen] = React20__namespace.useState(false);
15156
+ const ref = React20__namespace.useRef(null);
14808
15157
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
14809
- React32__namespace.useEffect(() => {
15158
+ React20__namespace.useEffect(() => {
14810
15159
  if (!open) return;
14811
15160
  const onDocClick = (e) => {
14812
15161
  if (ref.current && !ref.current.contains(e.target)) {
@@ -15014,7 +15363,7 @@ function SiteFooter({
15014
15363
  children: wrapper
15015
15364
  },
15016
15365
  b.alt + i
15017
- ) : /* @__PURE__ */ jsxRuntime.jsx(React32__namespace.Fragment, { children: wrapper }, b.alt + i);
15366
+ ) : /* @__PURE__ */ jsxRuntime.jsx(React20__namespace.Fragment, { children: wrapper }, b.alt + i);
15018
15367
  }) })
15019
15368
  ] }),
15020
15369
  themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
@@ -15156,6 +15505,7 @@ function TripPage({
15156
15505
  itinerary,
15157
15506
  itineraryDays,
15158
15507
  gallery,
15508
+ galleryLightbox = "classic",
15159
15509
  included,
15160
15510
  notIncluded,
15161
15511
  whatToBring,
@@ -15195,15 +15545,16 @@ function TripPage({
15195
15545
  fromLabel,
15196
15546
  perPersonLabel,
15197
15547
  siteHeader,
15548
+ footerBadges,
15198
15549
  uiVariant = "v1",
15199
15550
  features,
15200
15551
  className
15201
15552
  }) {
15202
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
15203
- const [activeSection, setActiveSection] = React32__namespace.useState("");
15204
- const [accordionValue, setAccordionValue] = React32__namespace.useState([]);
15205
- const [faqsExpanded, setFaqsExpanded] = React32__namespace.useState(false);
15206
- const accordionSectionIds = React32__namespace.useMemo(
15553
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
15554
+ const [activeSection, setActiveSection] = React20__namespace.useState("");
15555
+ const [accordionValue, setAccordionValue] = React20__namespace.useState([]);
15556
+ const [faqsExpanded, setFaqsExpanded] = React20__namespace.useState(false);
15557
+ const accordionSectionIds = React20__namespace.useMemo(
15207
15558
  () => /* @__PURE__ */ new Set([
15208
15559
  "when-it-operates",
15209
15560
  "how-to-get-there",
@@ -15217,18 +15568,18 @@ function TripPage({
15217
15568
  ]),
15218
15569
  []
15219
15570
  );
15220
- const [navFloating, setNavFloating] = React32__namespace.useState(false);
15221
- const [navHidden, setNavHidden] = React32__namespace.useState(false);
15222
- const [isFloating, setIsFloating] = React32__namespace.useState(false);
15223
- const [sidebarPos, setSidebarPos] = React32__namespace.useState(null);
15224
- const [pricingBarVisible, setPricingBarVisible] = React32__namespace.useState(false);
15225
- const navRef = React32__namespace.useRef(null);
15226
- const navSentinelRef = React32__namespace.useRef(null);
15227
- const sentinelRef = React32__namespace.useRef(null);
15228
- const sidebarPlaceholderRef = React32__namespace.useRef(null);
15229
- const pricingBarRef = React32__namespace.useRef(null);
15230
- const galleryRef = React32__namespace.useRef(null);
15231
- const sections = React32__namespace.useMemo(
15571
+ const [navFloating, setNavFloating] = React20__namespace.useState(false);
15572
+ const [navHidden, setNavHidden] = React20__namespace.useState(false);
15573
+ const [isFloating, setIsFloating] = React20__namespace.useState(false);
15574
+ const [sidebarPos, setSidebarPos] = React20__namespace.useState(null);
15575
+ const [pricingBarVisible, setPricingBarVisible] = React20__namespace.useState(false);
15576
+ const navRef = React20__namespace.useRef(null);
15577
+ const navSentinelRef = React20__namespace.useRef(null);
15578
+ const sentinelRef = React20__namespace.useRef(null);
15579
+ const sidebarPlaceholderRef = React20__namespace.useRef(null);
15580
+ const pricingBarRef = React20__namespace.useRef(null);
15581
+ const galleryRef = React20__namespace.useRef(null);
15582
+ const sections = React20__namespace.useMemo(
15232
15583
  () => {
15233
15584
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
15234
15585
  return [
@@ -15250,7 +15601,7 @@ function TripPage({
15250
15601
  // eslint-disable-next-line react-hooks/exhaustive-deps
15251
15602
  []
15252
15603
  );
15253
- React32__namespace.useEffect(() => {
15604
+ React20__namespace.useEffect(() => {
15254
15605
  const sentinel = navSentinelRef.current;
15255
15606
  if (!sentinel) return;
15256
15607
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -15258,7 +15609,7 @@ function TripPage({
15258
15609
  update();
15259
15610
  return () => document.removeEventListener("scroll", update, { capture: true });
15260
15611
  }, []);
15261
- React32__namespace.useEffect(() => {
15612
+ React20__namespace.useEffect(() => {
15262
15613
  const sentinel = sentinelRef.current;
15263
15614
  if (!sentinel) return;
15264
15615
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -15266,7 +15617,7 @@ function TripPage({
15266
15617
  update();
15267
15618
  return () => document.removeEventListener("scroll", update, { capture: true });
15268
15619
  }, []);
15269
- React32__namespace.useEffect(() => {
15620
+ React20__namespace.useEffect(() => {
15270
15621
  const measure = () => {
15271
15622
  if (!sidebarPlaceholderRef.current) return;
15272
15623
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -15276,7 +15627,7 @@ function TripPage({
15276
15627
  window.addEventListener("resize", measure);
15277
15628
  return () => window.removeEventListener("resize", measure);
15278
15629
  }, [isFloating]);
15279
- React32__namespace.useEffect(() => {
15630
+ React20__namespace.useEffect(() => {
15280
15631
  const check = () => {
15281
15632
  var _a2;
15282
15633
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -15287,7 +15638,7 @@ function TripPage({
15287
15638
  check();
15288
15639
  return () => document.removeEventListener("scroll", check, { capture: true });
15289
15640
  }, []);
15290
- React32__namespace.useEffect(() => {
15641
+ React20__namespace.useEffect(() => {
15291
15642
  const check = () => {
15292
15643
  if (!pricingBarRef.current) return;
15293
15644
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -15296,7 +15647,7 @@ function TripPage({
15296
15647
  check();
15297
15648
  return () => document.removeEventListener("scroll", check, { capture: true });
15298
15649
  }, []);
15299
- React32__namespace.useEffect(() => {
15650
+ React20__namespace.useEffect(() => {
15300
15651
  if (sections.length === 0) return;
15301
15652
  setActiveSection(sections[0].id);
15302
15653
  const update = () => {
@@ -15354,468 +15705,483 @@ function TripPage({
15354
15705
  }
15355
15706
  performScroll();
15356
15707
  };
15357
- return /* @__PURE__ */ jsxRuntime.jsxs(
15358
- "div",
15708
+ return /* @__PURE__ */ jsxRuntime.jsx(
15709
+ PhotoTourProvider,
15359
15710
  {
15360
- className: cn("w-full overflow-x-hidden", className),
15361
- "data-ui-variant": uiVariant,
15362
- "data-features": features ? JSON.stringify(features) : void 0,
15363
- children: [
15364
- /* @__PURE__ */ jsxRuntime.jsx(
15365
- TripHeader,
15366
- {
15367
- images,
15368
- videoUrl,
15369
- title,
15370
- breadcrumb,
15371
- destination,
15372
- duration,
15373
- groupSize,
15374
- labels: {
15375
- night: labels == null ? void 0 : labels.night,
15376
- nights: labels == null ? void 0 : labels.nights,
15377
- day: labels == null ? void 0 : labels.day,
15378
- days: labels == null ? void 0 : labels.days,
15379
- previousImage: labels == null ? void 0 : labels.previousImage,
15380
- nextImage: labels == null ? void 0 : labels.nextImage
15381
- },
15382
- tagline,
15383
- chips,
15384
- siteHeader,
15385
- uiVariant,
15386
- belowMeta: trustpilotHero ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
15387
- }
15388
- ),
15389
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
15390
- highlights && highlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 flex flex-wrap justify-center gap-6 py-2", children: highlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2 text-center", children: [
15391
- h.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full border-2 border-border text-foreground", children: h.icon }),
15392
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
15393
- ] }, i)) }),
15394
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
15395
- sections.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
15396
- "div",
15397
- {
15398
- className: cn(
15399
- "pt-8 pb-2 flex justify-center transition-opacity duration-150",
15400
- navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
15401
- ),
15402
- children: /* @__PURE__ */ jsxRuntime.jsx(
15403
- MenuTrip,
15711
+ enabled: galleryLightbox === "feed",
15712
+ labels: {
15713
+ close: labels == null ? void 0 : labels.galleryClose,
15714
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15715
+ next: labels == null ? void 0 : labels.galleryNext
15716
+ },
15717
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
15718
+ "div",
15719
+ {
15720
+ className: cn("w-full overflow-x-hidden", className),
15721
+ "data-ui-variant": uiVariant,
15722
+ "data-features": features ? JSON.stringify(features) : void 0,
15723
+ children: [
15724
+ /* @__PURE__ */ jsxRuntime.jsx(
15725
+ TripHeader,
15726
+ {
15727
+ images,
15728
+ videoUrl,
15729
+ title,
15730
+ breadcrumb,
15731
+ destination,
15732
+ duration,
15733
+ groupSize,
15734
+ labels: {
15735
+ night: labels == null ? void 0 : labels.night,
15736
+ nights: labels == null ? void 0 : labels.nights,
15737
+ day: labels == null ? void 0 : labels.day,
15738
+ days: labels == null ? void 0 : labels.days,
15739
+ previousImage: labels == null ? void 0 : labels.previousImage,
15740
+ nextImage: labels == null ? void 0 : labels.nextImage
15741
+ },
15742
+ tagline,
15743
+ chips,
15744
+ siteHeader,
15745
+ uiVariant,
15746
+ belowMeta: trustpilotHero ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
15747
+ }
15748
+ ),
15749
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
15750
+ highlights && highlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 flex flex-wrap justify-center gap-6 py-2", children: highlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2 text-center", children: [
15751
+ h.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full border-2 border-border text-foreground", children: h.icon }),
15752
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
15753
+ ] }, i)) }),
15754
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
15755
+ sections.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
15756
+ "div",
15404
15757
  {
15405
- sections,
15406
- activeSection,
15407
- onSelect: scrollToSection,
15408
- variant: "floating"
15758
+ className: cn(
15759
+ "pt-8 pb-2 flex justify-center transition-opacity duration-150",
15760
+ navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
15761
+ ),
15762
+ children: /* @__PURE__ */ jsxRuntime.jsx(
15763
+ MenuTrip,
15764
+ {
15765
+ sections,
15766
+ activeSection,
15767
+ onSelect: scrollToSection,
15768
+ variant: "floating"
15769
+ }
15770
+ )
15409
15771
  }
15410
- )
15411
- }
15412
- ) : /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "my-6" }),
15413
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
15414
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
15415
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
15416
- (overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
15417
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-4", children: (_a = labels == null ? void 0 : labels.overview) != null ? _a : "Overview" }),
15418
- overview && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-lg text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview }),
15419
- overviewHighlights && overviewHighlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("flex flex-col gap-5", overview && "mt-8"), children: overviewHighlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-4", children: [
15420
- h.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center text-foreground [&_svg]:h-8 [&_svg]:w-8", children: h.icon }),
15421
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 pt-1 text-base text-foreground leading-relaxed [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: h.description })
15422
- ] }, i)) }),
15423
- recommendedFor && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 flex items-start gap-2.5 rounded-xl bg-primary/8 border border-primary/20 p-4", children: [
15424
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
15425
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground font-ui", children: [
15426
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: "Recommended for: " }),
15427
- recommendedFor
15428
- ] })
15429
- ] })
15430
- ] }),
15431
- itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15432
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_b = labels == null ? void 0 : labels.itinerary) != null ? _b : "Itinerary" }),
15433
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsxRuntime.jsx(
15434
- ItineraryDay,
15435
- __spreadProps(__spreadValues({}, day), {
15436
- photoLayout: "fullBleedBottom"
15437
- }),
15438
- day.dayNumber
15439
- )) })
15440
- ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15441
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
15442
- /* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
15443
- ] }),
15444
- included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
15445
- /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15446
- (sectionIcons == null ? void 0 : sectionIcons.whatIsIncluded) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatIsIncluded }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
15447
- (_d = labels == null ? void 0 : labels.whatIsIncluded) != null ? _d : "Included"
15448
- ] }),
15449
- /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: included })
15450
- ] }),
15451
- notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
15452
- /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15453
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5 text-muted-foreground" }),
15454
- (_e = labels == null ? void 0 : labels.notIncluded) != null ? _e : "Not included"
15455
- ] }),
15456
- /* @__PURE__ */ jsxRuntime.jsx(
15457
- Checklist,
15458
- {
15459
- items: notIncluded,
15460
- icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-4 w-4 text-muted-foreground" })
15461
- }
15462
- )
15463
- ] }),
15464
- (howToGetThere || (whatToBring == null ? void 0 : whatToBring.length) || weather || optionalExtras || accommodation || (accommodationGallery == null ? void 0 : accommodationGallery.length) || food || (foodGallery == null ? void 0 : foodGallery.length) || (meetingPoints == null ? void 0 : meetingPoints.length) || meetingPoint || termsAndConditions || whenItOperates) && /* @__PURE__ */ jsxRuntime.jsxs(
15465
- Accordion,
15466
- {
15467
- multiple: false,
15468
- value: accordionValue,
15469
- onValueChange: setAccordionValue,
15470
- className: "border-t border-border",
15471
- children: [
15472
- whenItOperates && /* @__PURE__ */ jsxRuntime.jsxs(
15473
- AccordionItem,
15474
- {
15475
- value: "when-it-operates",
15476
- id: "trip-section-when-it-operates",
15477
- className: "scroll-mt-20 border-b border-border",
15478
- children: [
15479
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15480
- (sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-5 w-5 text-primary" }),
15481
- (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
15482
- ] }) }),
15483
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-bold [&_a]:text-primary [&_a]:underline", children: whenItOperates }) })
15484
- ]
15485
- }
15486
- ),
15487
- (accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
15488
- AccordionItem,
15489
- {
15490
- value: "accommodation",
15491
- id: "trip-section-accommodation",
15492
- className: "scroll-mt-20 border-b border-border",
15493
- children: [
15494
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15495
- (sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
15496
- (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
15497
- ] }) }),
15498
- /* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", children: [
15499
- accommodation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }),
15500
- accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
15501
- PhotoGallery,
15502
- {
15503
- labels: {
15504
- seeMore: labels == null ? void 0 : labels.seeMore,
15505
- showLess: labels == null ? void 0 : labels.showLess,
15506
- close: labels == null ? void 0 : labels.galleryClose,
15507
- previous: labels == null ? void 0 : labels.galleryPrevious,
15508
- next: labels == null ? void 0 : labels.galleryNext
15509
- },
15510
- photos: accommodationGallery,
15511
- variant: accommodationGalleryVariant,
15512
- initialVisible: 6
15513
- }
15514
- ) })
15515
- ] })
15516
- ]
15517
- }
15518
- ),
15519
- (food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
15520
- AccordionItem,
15521
- {
15522
- value: "food",
15523
- id: "trip-section-food",
15524
- className: "scroll-mt-20 border-b border-border",
15525
- children: [
15526
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15527
- (sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UtensilsIcon, { className: "h-5 w-5 text-primary" }),
15528
- (_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
15529
- ] }) }),
15530
- /* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", children: [
15531
- food && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }),
15532
- foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
15533
- PhotoGallery,
15534
- {
15535
- labels: {
15536
- seeMore: labels == null ? void 0 : labels.seeMore,
15537
- showLess: labels == null ? void 0 : labels.showLess,
15538
- close: labels == null ? void 0 : labels.galleryClose,
15539
- previous: labels == null ? void 0 : labels.galleryPrevious,
15540
- next: labels == null ? void 0 : labels.galleryNext
15541
- },
15542
- photos: foodGallery,
15543
- variant: foodGalleryVariant,
15544
- initialVisible: 6
15545
- }
15546
- ) })
15547
- ] })
15548
- ]
15549
- }
15550
- ),
15551
- (meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
15552
- AccordionItem,
15553
- {
15554
- value: "meeting",
15555
- id: "trip-section-meeting",
15556
- className: "scroll-mt-20 border-b border-border",
15557
- children: [
15558
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15559
- (sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-5 w-5 text-primary" }),
15560
- (_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
15561
- ] }) }),
15562
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
15563
- var _a2, _b2, _c2;
15564
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15565
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
15566
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
15567
- mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? (_a2 = labels == null ? void 0 : labels.meetingPointActivity) != null ? _a2 : "Activity location" : mp.type === "alternative" ? (_b2 = labels == null ? void 0 : labels.meetingPointAlternative) != null ? _b2 : "Alternative meeting point" : (_c2 = labels == null ? void 0 : labels.meetingPoint) != null ? _c2 : "Meeting point" }),
15568
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15569
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15570
- ] })
15571
- ] }, i);
15572
- }) }) })
15573
- ]
15574
- }
15575
- ),
15576
- howToGetThere && /* @__PURE__ */ jsxRuntime.jsxs(
15577
- AccordionItem,
15578
- {
15579
- value: "how-to-get-there",
15580
- id: "trip-section-how-to-get-there",
15581
- className: "scroll-mt-20 border-b border-border",
15582
- children: [
15583
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15584
- (sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CompassIcon, { className: "h-5 w-5 text-primary" }),
15585
- (_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
15586
- ] }) }),
15587
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: howToGetThere }) })
15588
- ]
15589
- }
15590
- ),
15591
- weather && /* @__PURE__ */ jsxRuntime.jsxs(
15592
- AccordionItem,
15593
- {
15594
- value: "weather",
15595
- id: "trip-section-weather",
15596
- className: "scroll-mt-20 border-b border-border",
15597
- children: [
15598
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15599
- (sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-5 w-5 text-primary" }),
15600
- (_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
15601
- ] }) }),
15602
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: weather }) })
15603
- ]
15604
- }
15605
- ),
15606
- whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
15607
- AccordionItem,
15608
- {
15609
- value: "what-to-bring",
15610
- id: "trip-section-what-to-bring",
15611
- className: "scroll-mt-20 border-b border-border",
15612
- children: [
15613
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15614
- (sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BackpackIcon, { className: "h-5 w-5 text-primary" }),
15615
- (_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
15616
- ] }) }),
15617
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-4 w-4" }) }) })
15618
- ]
15619
- }
15620
- ),
15621
- optionalExtras && /* @__PURE__ */ jsxRuntime.jsxs(
15622
- AccordionItem,
15623
- {
15624
- value: "optional-extras",
15625
- id: "trip-section-optional-extras",
15626
- className: "scroll-mt-20 border-b border-border",
15627
- children: [
15628
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15629
- (sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CherryIcon, { className: "h-5 w-5 text-primary" }),
15630
- (_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
15631
- ] }) }),
15632
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: optionalExtras }) })
15633
- ]
15634
- }
15635
- ),
15636
- termsAndConditions && /* @__PURE__ */ jsxRuntime.jsxs(
15637
- AccordionItem,
15772
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "my-6" }),
15773
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
15774
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
15775
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
15776
+ (overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
15777
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-4", children: (_a = labels == null ? void 0 : labels.overview) != null ? _a : "Overview" }),
15778
+ overview && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-lg text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview }),
15779
+ overviewHighlights && overviewHighlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("flex flex-col gap-5", overview && "mt-8"), children: overviewHighlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-4", children: [
15780
+ h.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center text-foreground [&_svg]:h-8 [&_svg]:w-8", children: h.icon }),
15781
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 pt-1 text-base text-foreground leading-relaxed [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: h.description })
15782
+ ] }, i)) }),
15783
+ recommendedFor && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 flex items-start gap-2.5 rounded-xl bg-primary/8 border border-primary/20 p-4", children: [
15784
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
15785
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground font-ui", children: [
15786
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: "Recommended for: " }),
15787
+ recommendedFor
15788
+ ] })
15789
+ ] })
15790
+ ] }),
15791
+ itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15792
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_b = labels == null ? void 0 : labels.itinerary) != null ? _b : "Itinerary" }),
15793
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsxRuntime.jsx(
15794
+ ItineraryDay,
15795
+ __spreadProps(__spreadValues({}, day), {
15796
+ photoLayout: "fullBleedBottom"
15797
+ }),
15798
+ day.dayNumber
15799
+ )) })
15800
+ ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15801
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
15802
+ /* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
15803
+ ] }),
15804
+ included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
15805
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15806
+ (sectionIcons == null ? void 0 : sectionIcons.whatIsIncluded) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatIsIncluded }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
15807
+ (_d = labels == null ? void 0 : labels.whatIsIncluded) != null ? _d : "Included"
15808
+ ] }),
15809
+ /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: included })
15810
+ ] }),
15811
+ notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
15812
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15813
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5 text-muted-foreground" }),
15814
+ (_e = labels == null ? void 0 : labels.notIncluded) != null ? _e : "Not included"
15815
+ ] }),
15816
+ /* @__PURE__ */ jsxRuntime.jsx(
15817
+ Checklist,
15638
15818
  {
15639
- value: "terms",
15640
- id: "trip-section-terms",
15641
- className: "scroll-mt-20 border-b border-border",
15642
- children: [
15643
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15644
- (sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ReceiptIcon, { className: "h-5 w-5 text-primary" }),
15645
- (_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
15646
- ] }) }),
15647
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: termsAndConditions }) })
15648
- ]
15819
+ items: notIncluded,
15820
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-4 w-4 text-muted-foreground" })
15649
15821
  }
15650
15822
  )
15651
- ]
15652
- }
15653
- ),
15654
- faqs && faqs.length > 0 && (() => {
15655
- var _a2, _b2, _c2;
15656
- const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
15657
- const hiddenCount = faqs.length - visibleFaqs.length;
15658
- return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
15659
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_a2 = labels == null ? void 0 : labels.faq) != null ? _a2 : "FAQ" }),
15660
- /* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
15661
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { children: faq.question }),
15662
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
15663
- ] }, i)) }),
15664
- faqs.length > faqInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
15665
- "button",
15823
+ ] }),
15824
+ (howToGetThere || (whatToBring == null ? void 0 : whatToBring.length) || weather || optionalExtras || accommodation || (accommodationGallery == null ? void 0 : accommodationGallery.length) || food || (foodGallery == null ? void 0 : foodGallery.length) || (meetingPoints == null ? void 0 : meetingPoints.length) || meetingPoint || termsAndConditions || whenItOperates) && /* @__PURE__ */ jsxRuntime.jsxs(
15825
+ Accordion,
15666
15826
  {
15667
- type: "button",
15668
- onClick: () => setFaqsExpanded((v) => !v),
15669
- className: cn(
15670
- "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15671
- "text-sm font-semibold text-foreground shadow-sm",
15672
- "hover:bg-muted transition-colors duration-150",
15673
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15674
- ),
15675
- children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15676
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15677
- (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
15678
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15679
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15680
- (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
15681
- " (",
15682
- hiddenCount,
15683
- ")"
15684
- ] })
15827
+ multiple: false,
15828
+ value: accordionValue,
15829
+ onValueChange: setAccordionValue,
15830
+ className: "border-t border-border",
15831
+ children: [
15832
+ whenItOperates && /* @__PURE__ */ jsxRuntime.jsxs(
15833
+ AccordionItem,
15834
+ {
15835
+ value: "when-it-operates",
15836
+ id: "trip-section-when-it-operates",
15837
+ className: "scroll-mt-20 border-b border-border",
15838
+ children: [
15839
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15840
+ (sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-5 w-5 text-primary" }),
15841
+ (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
15842
+ ] }) }),
15843
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-bold [&_a]:text-primary [&_a]:underline", children: whenItOperates }) })
15844
+ ]
15845
+ }
15846
+ ),
15847
+ (accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
15848
+ AccordionItem,
15849
+ {
15850
+ value: "accommodation",
15851
+ id: "trip-section-accommodation",
15852
+ className: "scroll-mt-20 border-b border-border",
15853
+ children: [
15854
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15855
+ (sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
15856
+ (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
15857
+ ] }) }),
15858
+ /* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
15859
+ accommodation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }),
15860
+ accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
15861
+ PhotoGallery,
15862
+ {
15863
+ labels: {
15864
+ seeMore: labels == null ? void 0 : labels.seeMore,
15865
+ showLess: labels == null ? void 0 : labels.showLess,
15866
+ close: labels == null ? void 0 : labels.galleryClose,
15867
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15868
+ next: labels == null ? void 0 : labels.galleryNext
15869
+ },
15870
+ photos: accommodationGallery,
15871
+ variant: accommodationGalleryVariant,
15872
+ initialVisible: 6,
15873
+ tourSection: (_h = labels == null ? void 0 : labels.accommodation) != null ? _h : "Accommodation"
15874
+ }
15875
+ ) })
15876
+ ] })
15877
+ ]
15878
+ }
15879
+ ),
15880
+ (food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
15881
+ AccordionItem,
15882
+ {
15883
+ value: "food",
15884
+ id: "trip-section-food",
15885
+ className: "scroll-mt-20 border-b border-border",
15886
+ children: [
15887
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15888
+ (sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UtensilsIcon, { className: "h-5 w-5 text-primary" }),
15889
+ (_i = labels == null ? void 0 : labels.food) != null ? _i : "Food"
15890
+ ] }) }),
15891
+ /* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
15892
+ food && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }),
15893
+ foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
15894
+ PhotoGallery,
15895
+ {
15896
+ labels: {
15897
+ seeMore: labels == null ? void 0 : labels.seeMore,
15898
+ showLess: labels == null ? void 0 : labels.showLess,
15899
+ close: labels == null ? void 0 : labels.galleryClose,
15900
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15901
+ next: labels == null ? void 0 : labels.galleryNext
15902
+ },
15903
+ photos: foodGallery,
15904
+ variant: foodGalleryVariant,
15905
+ initialVisible: 6,
15906
+ tourSection: (_j = labels == null ? void 0 : labels.food) != null ? _j : "Food"
15907
+ }
15908
+ ) })
15909
+ ] })
15910
+ ]
15911
+ }
15912
+ ),
15913
+ (meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
15914
+ AccordionItem,
15915
+ {
15916
+ value: "meeting",
15917
+ id: "trip-section-meeting",
15918
+ className: "scroll-mt-20 border-b border-border",
15919
+ children: [
15920
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15921
+ (sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-5 w-5 text-primary" }),
15922
+ (_k = labels == null ? void 0 : labels.meetingPoint) != null ? _k : "Meeting point"
15923
+ ] }) }),
15924
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
15925
+ var _a2, _b2, _c2;
15926
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15927
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
15928
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
15929
+ mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? (_a2 = labels == null ? void 0 : labels.meetingPointActivity) != null ? _a2 : "Activity location" : mp.type === "alternative" ? (_b2 = labels == null ? void 0 : labels.meetingPointAlternative) != null ? _b2 : "Alternative meeting point" : (_c2 = labels == null ? void 0 : labels.meetingPoint) != null ? _c2 : "Meeting point" }),
15930
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15931
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15932
+ ] })
15933
+ ] }, i);
15934
+ }) }) })
15935
+ ]
15936
+ }
15937
+ ),
15938
+ howToGetThere && /* @__PURE__ */ jsxRuntime.jsxs(
15939
+ AccordionItem,
15940
+ {
15941
+ value: "how-to-get-there",
15942
+ id: "trip-section-how-to-get-there",
15943
+ className: "scroll-mt-20 border-b border-border",
15944
+ children: [
15945
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15946
+ (sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CompassIcon, { className: "h-5 w-5 text-primary" }),
15947
+ (_l = labels == null ? void 0 : labels.howToGetThere) != null ? _l : "How to get there"
15948
+ ] }) }),
15949
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: howToGetThere }) })
15950
+ ]
15951
+ }
15952
+ ),
15953
+ weather && /* @__PURE__ */ jsxRuntime.jsxs(
15954
+ AccordionItem,
15955
+ {
15956
+ value: "weather",
15957
+ id: "trip-section-weather",
15958
+ className: "scroll-mt-20 border-b border-border",
15959
+ children: [
15960
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15961
+ (sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-5 w-5 text-primary" }),
15962
+ (_m = labels == null ? void 0 : labels.weather) != null ? _m : "Weather"
15963
+ ] }) }),
15964
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: weather }) })
15965
+ ]
15966
+ }
15967
+ ),
15968
+ whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
15969
+ AccordionItem,
15970
+ {
15971
+ value: "what-to-bring",
15972
+ id: "trip-section-what-to-bring",
15973
+ className: "scroll-mt-20 border-b border-border",
15974
+ children: [
15975
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15976
+ (sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BackpackIcon, { className: "h-5 w-5 text-primary" }),
15977
+ (_n = labels == null ? void 0 : labels.whatToBring) != null ? _n : "What to bring"
15978
+ ] }) }),
15979
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-4 w-4" }) }) })
15980
+ ]
15981
+ }
15982
+ ),
15983
+ optionalExtras && /* @__PURE__ */ jsxRuntime.jsxs(
15984
+ AccordionItem,
15985
+ {
15986
+ value: "optional-extras",
15987
+ id: "trip-section-optional-extras",
15988
+ className: "scroll-mt-20 border-b border-border",
15989
+ children: [
15990
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15991
+ (sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CherryIcon, { className: "h-5 w-5 text-primary" }),
15992
+ (_o = labels == null ? void 0 : labels.optionalExtras) != null ? _o : "Optional extras"
15993
+ ] }) }),
15994
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: optionalExtras }) })
15995
+ ]
15996
+ }
15997
+ ),
15998
+ termsAndConditions && /* @__PURE__ */ jsxRuntime.jsxs(
15999
+ AccordionItem,
16000
+ {
16001
+ value: "terms",
16002
+ id: "trip-section-terms",
16003
+ className: "scroll-mt-20 border-b border-border",
16004
+ children: [
16005
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
16006
+ (sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ReceiptIcon, { className: "h-5 w-5 text-primary" }),
16007
+ (_p = labels == null ? void 0 : labels.terms) != null ? _p : "Terms & conditions"
16008
+ ] }) }),
16009
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: termsAndConditions }) })
16010
+ ]
16011
+ }
16012
+ )
16013
+ ]
15685
16014
  }
15686
- ) })
15687
- ] });
15688
- })(),
15689
- trustpilot ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
15690
- /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
15691
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: (_o = labels == null ? void 0 : labels.reviews) != null ? _o : "What our guests think" }),
15692
- /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilot })
15693
- ] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
15694
- /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
15695
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: (_p = labels == null ? void 0 : labels.reviews) != null ? _p : "What our guests think" }),
15696
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
15697
- var _a2;
15698
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
15699
- /* @__PURE__ */ jsxRuntime.jsx(Stars, { count: (_a2 = r.rating) != null ? _a2 : 5 }),
15700
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
15701
- "\u201C",
15702
- r.text,
15703
- "\u201D"
15704
- ] }),
15705
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
15706
- "\u2014 ",
15707
- r.author
15708
- ] })
15709
- ] }, i);
15710
- }) })
16015
+ ),
16016
+ faqs && faqs.length > 0 && (() => {
16017
+ var _a2, _b2, _c2;
16018
+ const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
16019
+ const hiddenCount = faqs.length - visibleFaqs.length;
16020
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
16021
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_a2 = labels == null ? void 0 : labels.faq) != null ? _a2 : "FAQ" }),
16022
+ /* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
16023
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { children: faq.question }),
16024
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
16025
+ ] }, i)) }),
16026
+ faqs.length > faqInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
16027
+ "button",
16028
+ {
16029
+ type: "button",
16030
+ onClick: () => setFaqsExpanded((v) => !v),
16031
+ className: cn(
16032
+ "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
16033
+ "text-sm font-semibold text-foreground shadow-sm",
16034
+ "hover:bg-muted transition-colors duration-150",
16035
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
16036
+ ),
16037
+ children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
16038
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
16039
+ (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
16040
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
16041
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
16042
+ (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
16043
+ " (",
16044
+ hiddenCount,
16045
+ ")"
16046
+ ] })
16047
+ }
16048
+ ) })
16049
+ ] });
16050
+ })(),
16051
+ trustpilot ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
16052
+ /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
16053
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: (_q = labels == null ? void 0 : labels.reviews) != null ? _q : "What our guests think" }),
16054
+ /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilot })
16055
+ ] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
16056
+ /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
16057
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: (_r = labels == null ? void 0 : labels.reviews) != null ? _r : "What our guests think" }),
16058
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
16059
+ var _a2;
16060
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
16061
+ /* @__PURE__ */ jsxRuntime.jsx(Stars, { count: (_a2 = r.rating) != null ? _a2 : 5 }),
16062
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
16063
+ "\u201C",
16064
+ r.text,
16065
+ "\u201D"
16066
+ ] }),
16067
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
16068
+ "\u2014 ",
16069
+ r.author
16070
+ ] })
16071
+ ] }, i);
16072
+ }) })
16073
+ ] })
16074
+ ] }),
16075
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: sidebarPlaceholderRef, className: "hidden lg:block lg:w-72 xl:w-80 shrink-0", children: !isFloating && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sticky top-20 rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
16076
+ PricingTrip,
16077
+ {
16078
+ priceFrom,
16079
+ currency,
16080
+ season,
16081
+ departureTimes,
16082
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
16083
+ bookLabel: bookLabel != null ? bookLabel : "Check availability",
16084
+ fromLabel,
16085
+ perPersonLabel,
16086
+ variant: "card",
16087
+ belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
16088
+ benefits,
16089
+ currencyEstimates,
16090
+ priceInfo
16091
+ }
16092
+ ) }) })
15711
16093
  ] })
15712
16094
  ] }),
15713
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: sidebarPlaceholderRef, className: "hidden lg:block lg:w-72 xl:w-80 shrink-0", children: !isFloating && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sticky top-20 rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
15714
- PricingTrip,
16095
+ sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
16096
+ "div",
15715
16097
  {
15716
- priceFrom,
15717
- currency,
15718
- season,
15719
- departureTimes,
15720
- onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15721
- bookLabel: bookLabel != null ? bookLabel : "Check availability",
15722
- fromLabel,
15723
- perPersonLabel,
15724
- variant: "card",
15725
- belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15726
- benefits,
15727
- currencyEstimates,
15728
- priceInfo
16098
+ ref: navRef,
16099
+ className: cn(
16100
+ "fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
16101
+ navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
16102
+ ),
16103
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
16104
+ MenuTrip,
16105
+ {
16106
+ sections,
16107
+ activeSection,
16108
+ onSelect: scrollToSection,
16109
+ variant: "floating"
16110
+ }
16111
+ ) })
15729
16112
  }
15730
- ) }) })
15731
- ] })
15732
- ] }),
15733
- sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
15734
- "div",
15735
- {
15736
- ref: navRef,
15737
- className: cn(
15738
- "fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
15739
- navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
15740
16113
  ),
15741
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
15742
- MenuTrip,
16114
+ isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsxRuntime.jsx(
16115
+ "div",
15743
16116
  {
15744
- sections,
15745
- activeSection,
15746
- onSelect: scrollToSection,
15747
- variant: "floating"
16117
+ className: "hidden lg:block fixed z-20",
16118
+ style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
16119
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
16120
+ PricingTrip,
16121
+ {
16122
+ priceFrom,
16123
+ currency,
16124
+ season,
16125
+ departureTimes,
16126
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
16127
+ bookLabel: bookLabel != null ? bookLabel : "Check availability",
16128
+ fromLabel,
16129
+ perPersonLabel,
16130
+ variant: "card",
16131
+ belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
16132
+ benefits,
16133
+ currencyEstimates,
16134
+ priceInfo
16135
+ }
16136
+ ) })
15748
16137
  }
15749
- ) })
15750
- }
15751
- ),
15752
- isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsxRuntime.jsx(
15753
- "div",
15754
- {
15755
- className: "hidden lg:block fixed z-20",
15756
- style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
15757
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
16138
+ ),
16139
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsxRuntime.jsx(
16140
+ PhotoGallery,
16141
+ {
16142
+ labels: {
16143
+ seeMore: labels == null ? void 0 : labels.seeMore,
16144
+ showLess: labels == null ? void 0 : labels.showLess,
16145
+ close: labels == null ? void 0 : labels.galleryClose,
16146
+ previous: labels == null ? void 0 : labels.galleryPrevious,
16147
+ next: labels == null ? void 0 : labels.galleryNext
16148
+ },
16149
+ photos: gallery,
16150
+ variant: "gridCompact",
16151
+ initialVisible: 8,
16152
+ lightbox: galleryLightbox,
16153
+ tourSection: (_s = labels == null ? void 0 : labels.gallery) != null ? _s : "Gallery"
16154
+ }
16155
+ ) }),
16156
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
16157
+ BookingForm,
16158
+ {
16159
+ labels: bookingLabels,
16160
+ defaultValues: bookingDefaults,
16161
+ onSubmit: onBookingSubmit,
16162
+ loading: bookingLoading
16163
+ }
16164
+ ) }) }),
16165
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed bottom-0 inset-x-0 z-30 lg:hidden border-t border-border bg-background/95 backdrop-blur-sm px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
15758
16166
  PricingTrip,
15759
16167
  {
15760
16168
  priceFrom,
15761
16169
  currency,
15762
- season,
15763
- departureTimes,
15764
16170
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15765
- bookLabel: bookLabel != null ? bookLabel : "Check availability",
16171
+ bookLabel: bookLabel != null ? bookLabel : "Book now",
15766
16172
  fromLabel,
15767
16173
  perPersonLabel,
15768
- variant: "card",
15769
- belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15770
- benefits,
15771
- currencyEstimates,
15772
- priceInfo
16174
+ variant: "compact",
16175
+ sharp: true,
16176
+ priceInfo,
16177
+ currencyEstimates
15773
16178
  }
15774
- ) })
15775
- }
15776
- ),
15777
- gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsxRuntime.jsx(
15778
- PhotoGallery,
15779
- {
15780
- labels: {
15781
- seeMore: labels == null ? void 0 : labels.seeMore,
15782
- showLess: labels == null ? void 0 : labels.showLess,
15783
- close: labels == null ? void 0 : labels.galleryClose,
15784
- previous: labels == null ? void 0 : labels.galleryPrevious,
15785
- next: labels == null ? void 0 : labels.galleryNext
15786
- },
15787
- photos: gallery,
15788
- variant: "gridCompact",
15789
- initialVisible: 8
15790
- }
15791
- ) }),
15792
- gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
15793
- BookingForm,
15794
- {
15795
- labels: bookingLabels,
15796
- defaultValues: bookingDefaults,
15797
- onSubmit: onBookingSubmit,
15798
- loading: bookingLoading
15799
- }
15800
- ) }) }),
15801
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed bottom-0 inset-x-0 z-30 lg:hidden border-t border-border bg-background/95 backdrop-blur-sm px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
15802
- PricingTrip,
15803
- {
15804
- priceFrom,
15805
- currency,
15806
- onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15807
- bookLabel: bookLabel != null ? bookLabel : "Book now",
15808
- fromLabel,
15809
- perPersonLabel,
15810
- variant: "compact",
15811
- sharp: true,
15812
- priceInfo,
15813
- currencyEstimates
15814
- }
15815
- ) }),
15816
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" }),
15817
- /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, {})
15818
- ]
16179
+ ) }),
16180
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" }),
16181
+ /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { badges: footerBadges })
16182
+ ]
16183
+ }
16184
+ )
15819
16185
  }
15820
16186
  );
15821
16187
  }
@@ -15874,14 +16240,15 @@ function CategoryPage2({
15874
16240
  viewAllPostsLabel,
15875
16241
  cardLabels,
15876
16242
  filterLabels,
16243
+ footerBadges,
15877
16244
  className
15878
16245
  }) {
15879
16246
  var _a;
15880
- const [videoReady, setVideoReady] = React32__namespace.useState(false);
15881
- const videoRef = React32__namespace.useRef(null);
16247
+ const [videoReady, setVideoReady] = React20__namespace.useState(false);
16248
+ const videoRef = React20__namespace.useRef(null);
15882
16249
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
15883
16250
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
15884
- React32__namespace.useEffect(() => {
16251
+ React20__namespace.useEffect(() => {
15885
16252
  if (!videoUrl) return;
15886
16253
  const el = videoRef.current;
15887
16254
  if (!el) return;
@@ -15896,13 +16263,13 @@ function CategoryPage2({
15896
16263
  io.observe(el);
15897
16264
  return () => io.disconnect();
15898
16265
  }, [videoUrl]);
15899
- const [faqsExpanded, setFaqsExpanded] = React32__namespace.useState(false);
15900
- const [tripsExpanded, setTripsExpanded] = React32__namespace.useState(false);
15901
- const [filterValue, setFilterValue] = React32__namespace.useState({});
15902
- const [sort, setSort] = React32__namespace.useState(
16266
+ const [faqsExpanded, setFaqsExpanded] = React20__namespace.useState(false);
16267
+ const [tripsExpanded, setTripsExpanded] = React20__namespace.useState(false);
16268
+ const [filterValue, setFilterValue] = React20__namespace.useState({});
16269
+ const [sort, setSort] = React20__namespace.useState(
15903
16270
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
15904
16271
  );
15905
- const sortedTrips = React32__namespace.useMemo(() => {
16272
+ const sortedTrips = React20__namespace.useMemo(() => {
15906
16273
  const active = Object.entries(filterValue).filter(
15907
16274
  ([, vals]) => vals && vals.length > 0
15908
16275
  );
@@ -16006,7 +16373,7 @@ function CategoryPage2({
16006
16373
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
16007
16374
  breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
16008
16375
  const isLast = i === breadcrumb.length - 1;
16009
- return /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
16376
+ return /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
16010
16377
  i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
16011
16378
  crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
16012
16379
  "a",
@@ -16198,7 +16565,7 @@ function CategoryPage2({
16198
16565
  ) })
16199
16566
  ] });
16200
16567
  })(),
16201
- /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, {})
16568
+ /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { badges: footerBadges })
16202
16569
  ] });
16203
16570
  }
16204
16571
  var sizeConfig3 = {
@@ -16303,12 +16670,12 @@ function Toast({
16303
16670
  duration = 6e3,
16304
16671
  className
16305
16672
  }) {
16306
- const [mounted, setMounted] = React32__namespace.useState(false);
16307
- const [visible, setVisible] = React32__namespace.useState(true);
16308
- React32__namespace.useEffect(() => {
16673
+ const [mounted, setMounted] = React20__namespace.useState(false);
16674
+ const [visible, setVisible] = React20__namespace.useState(true);
16675
+ React20__namespace.useEffect(() => {
16309
16676
  setMounted(true);
16310
16677
  }, []);
16311
- React32__namespace.useEffect(() => {
16678
+ React20__namespace.useEffect(() => {
16312
16679
  if (duration === 0) return;
16313
16680
  const t = setTimeout(() => {
16314
16681
  setVisible(false);
@@ -16715,21 +17082,21 @@ function LeadCapturePopup({
16715
17082
  }) {
16716
17083
  var _a;
16717
17084
  const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
16718
- const [open, setOpen] = React32.useState(false);
16719
- const [closing, setClosing] = React32.useState(false);
16720
- const [submitted, setSubmitted] = React32.useState(false);
16721
- const [submitting, setSubmitting] = React32.useState(false);
16722
- const [error, setError] = React32.useState(null);
16723
- const [name, setName] = React32.useState("");
16724
- const [email, setEmail] = React32.useState("");
16725
- const [travelDate, setTravelDate] = React32.useState("");
16726
- const panelRef = React32.useRef(null);
16727
- const nameRef = React32.useRef(null);
16728
- const show = React32.useCallback(() => {
17085
+ const [open, setOpen] = React20.useState(false);
17086
+ const [closing, setClosing] = React20.useState(false);
17087
+ const [submitted, setSubmitted] = React20.useState(false);
17088
+ const [submitting, setSubmitting] = React20.useState(false);
17089
+ const [error, setError] = React20.useState(null);
17090
+ const [name, setName] = React20.useState("");
17091
+ const [email, setEmail] = React20.useState("");
17092
+ const [travelDate, setTravelDate] = React20.useState("");
17093
+ const panelRef = React20.useRef(null);
17094
+ const nameRef = React20.useRef(null);
17095
+ const show = React20.useCallback(() => {
16729
17096
  if (isDismissed()) return;
16730
17097
  setOpen(true);
16731
17098
  }, []);
16732
- React32.useEffect(() => {
17099
+ React20.useEffect(() => {
16733
17100
  var _a2;
16734
17101
  if (isDismissed()) return;
16735
17102
  if (config.trigger === "delay") {
@@ -16756,7 +17123,7 @@ function LeadCapturePopup({
16756
17123
  return () => window.removeEventListener("scroll", handler);
16757
17124
  }
16758
17125
  }, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
16759
- React32.useEffect(() => {
17126
+ React20.useEffect(() => {
16760
17127
  if (open && !submitted) {
16761
17128
  requestAnimationFrame(() => {
16762
17129
  var _a2;
@@ -16764,7 +17131,7 @@ function LeadCapturePopup({
16764
17131
  });
16765
17132
  }
16766
17133
  }, [open, submitted]);
16767
- const close = React32.useCallback(() => {
17134
+ const close = React20.useCallback(() => {
16768
17135
  setClosing(true);
16769
17136
  setDismissed(config.dismissDays);
16770
17137
  setTimeout(() => {
@@ -16772,7 +17139,7 @@ function LeadCapturePopup({
16772
17139
  setClosing(false);
16773
17140
  }, 250);
16774
17141
  }, [config.dismissDays]);
16775
- React32.useEffect(() => {
17142
+ React20.useEffect(() => {
16776
17143
  if (!open) return;
16777
17144
  const handler = (e) => {
16778
17145
  if (e.key === "Escape") close();
@@ -16780,7 +17147,7 @@ function LeadCapturePopup({
16780
17147
  document.addEventListener("keydown", handler);
16781
17148
  return () => document.removeEventListener("keydown", handler);
16782
17149
  }, [open, close]);
16783
- const onOverlayClick = React32.useCallback(
17150
+ const onOverlayClick = React20.useCallback(
16784
17151
  (e) => {
16785
17152
  if (panelRef.current && !panelRef.current.contains(e.target)) {
16786
17153
  close();
@@ -17018,11 +17385,11 @@ function ExoOrb({
17018
17385
  trackCursor = true,
17019
17386
  className
17020
17387
  }) {
17021
- const uid = React32.useId().replace(/:/g, "");
17388
+ const uid = React20.useId().replace(/:/g, "");
17022
17389
  const id = (name) => `exo-orb-${uid}-${name}`;
17023
- const rootRef = React32.useRef(null);
17024
- const pupilRef = React32.useRef(null);
17025
- React32.useEffect(() => {
17390
+ const rootRef = React20.useRef(null);
17391
+ const pupilRef = React20.useRef(null);
17392
+ React20.useEffect(() => {
17026
17393
  if (!trackCursor) return;
17027
17394
  if (typeof window === "undefined") return;
17028
17395
  if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
@@ -17218,13 +17585,13 @@ function AskExo({
17218
17585
  teaserDelayMs = 2500,
17219
17586
  teaserDurationMs = 6e3
17220
17587
  }) {
17221
- const [open, setOpen] = React32.useState(false);
17222
- const [question, setQuestion] = React32.useState("");
17223
- const [teaserVisible, setTeaserVisible] = React32.useState(false);
17588
+ const [open, setOpen] = React20.useState(false);
17589
+ const [question, setQuestion] = React20.useState("");
17590
+ const [teaserVisible, setTeaserVisible] = React20.useState(false);
17224
17591
  const teaserEnabled = !!teaser && teaser !== "";
17225
- const inputRef = React32.useRef(null);
17226
- const textareaRef = React32.useRef(null);
17227
- React32.useEffect(() => {
17592
+ const inputRef = React20.useRef(null);
17593
+ const textareaRef = React20.useRef(null);
17594
+ React20.useEffect(() => {
17228
17595
  if (!open) {
17229
17596
  setQuestion("");
17230
17597
  return;
@@ -17236,7 +17603,7 @@ function AskExo({
17236
17603
  }, 200);
17237
17604
  return () => clearTimeout(t);
17238
17605
  }, [open, variant]);
17239
- React32.useEffect(() => {
17606
+ React20.useEffect(() => {
17240
17607
  if (!open) return;
17241
17608
  const onKey = (e) => {
17242
17609
  if (e.key === "Escape") setOpen(false);
@@ -17244,7 +17611,7 @@ function AskExo({
17244
17611
  document.addEventListener("keydown", onKey);
17245
17612
  return () => document.removeEventListener("keydown", onKey);
17246
17613
  }, [open]);
17247
- React32.useEffect(() => {
17614
+ React20.useEffect(() => {
17248
17615
  if (!teaserEnabled || open) return;
17249
17616
  if (typeof window === "undefined") return;
17250
17617
  const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
@@ -17257,7 +17624,7 @@ function AskExo({
17257
17624
  clearTimeout(hideTimer);
17258
17625
  };
17259
17626
  }, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
17260
- React32.useEffect(() => {
17627
+ React20.useEffect(() => {
17261
17628
  if (open) setTeaserVisible(false);
17262
17629
  }, [open]);
17263
17630
  const askExo = (q) => {
@@ -17810,8 +18177,8 @@ function ShareWidget({
17810
18177
  title = "Invite friends & lower the price",
17811
18178
  className
17812
18179
  }) {
17813
- const [copied, setCopied] = React32__namespace.useState(false);
17814
- const [showToast, setShowToast] = React32__namespace.useState(false);
18180
+ const [copied, setCopied] = React20__namespace.useState(false);
18181
+ const [showToast, setShowToast] = React20__namespace.useState(false);
17815
18182
  const encodedUrl = encodeURIComponent(url);
17816
18183
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
17817
18184
  const channels = [
@@ -18028,11 +18395,11 @@ function HomeHeader({
18028
18395
  className
18029
18396
  }) {
18030
18397
  var _a;
18031
- const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
18032
- const [videoReady, setVideoReady] = React32__namespace.useState(false);
18033
- const videoRef = React32__namespace.useRef(null);
18398
+ const [heroIndex, setHeroIndex] = React20__namespace.useState(0);
18399
+ const [videoReady, setVideoReady] = React20__namespace.useState(false);
18400
+ const videoRef = React20__namespace.useRef(null);
18034
18401
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
18035
- const validImages = React32__namespace.useMemo(
18402
+ const validImages = React20__namespace.useMemo(
18036
18403
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
18037
18404
  [images]
18038
18405
  );
@@ -18046,7 +18413,7 @@ function HomeHeader({
18046
18413
  const showCarousel = !videoUrl && validImages.length > 1;
18047
18414
  const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
18048
18415
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
18049
- React32__namespace.useEffect(() => {
18416
+ React20__namespace.useEffect(() => {
18050
18417
  if (!videoUrl) return;
18051
18418
  const el = videoRef.current;
18052
18419
  if (!el) return;
@@ -18404,7 +18771,7 @@ function AdventureExplorer({
18404
18771
  className
18405
18772
  }) {
18406
18773
  var _a, _b, _c, _d, _e;
18407
- const [activeId, setActiveId] = React32__namespace.useState(
18774
+ const [activeId, setActiveId] = React20__namespace.useState(
18408
18775
  defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
18409
18776
  );
18410
18777
  const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
@@ -18744,8 +19111,8 @@ function RotatingSubtitle({
18744
19111
  interval,
18745
19112
  className
18746
19113
  }) {
18747
- const [index, setIndex] = React32__namespace.useState(0);
18748
- React32__namespace.useEffect(() => {
19114
+ const [index, setIndex] = React20__namespace.useState(0);
19115
+ React20__namespace.useEffect(() => {
18749
19116
  var _a;
18750
19117
  if (phrases.length < 2) return;
18751
19118
  const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
@@ -18784,7 +19151,7 @@ function CtaBanner({
18784
19151
  overlayOpacity = 35,
18785
19152
  className
18786
19153
  }) {
18787
- const phrases = React32__namespace.useMemo(
19154
+ const phrases = React20__namespace.useMemo(
18788
19155
  () => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
18789
19156
  [subtitle]
18790
19157
  );
@@ -19065,7 +19432,7 @@ function SectionHead({
19065
19432
  }
19066
19433
  function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
19067
19434
  var _a;
19068
- const railRef = React32__namespace.useRef(null);
19435
+ const railRef = React20__namespace.useRef(null);
19069
19436
  const scrollByCard = (dir) => {
19070
19437
  const rail = railRef.current;
19071
19438
  if (!rail) return;
@@ -19273,7 +19640,7 @@ function SegmentedControl({
19273
19640
  }) {
19274
19641
  var _a;
19275
19642
  const isControlled = value != null;
19276
- const [internal, setInternal] = React32__namespace.useState(
19643
+ const [internal, setInternal] = React20__namespace.useState(
19277
19644
  defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
19278
19645
  );
19279
19646
  const active = isControlled ? value : internal;
@@ -19432,6 +19799,7 @@ exports.PaymentReceiptEmail = PaymentReceiptEmail;
19432
19799
  exports.PaymentReminderEmail = PaymentReminderEmail;
19433
19800
  exports.PhoneCountrySelect = PhoneCountrySelect;
19434
19801
  exports.PhotoGallery = PhotoGallery;
19802
+ exports.PhotoTourProvider = PhotoTourProvider;
19435
19803
  exports.Picture = Picture;
19436
19804
  exports.PriceProgress = PriceProgress;
19437
19805
  exports.PricingMatrixCard = PricingMatrixCard;