@planetaexo/design-system 0.69.0 → 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.js CHANGED
@@ -1,10 +1,10 @@
1
- import * as React32 from 'react';
1
+ import * as React20 from 'react';
2
2
  import { useState, useRef, useCallback, useEffect, useId } from 'react';
3
3
  import { cva } from 'class-variance-authority';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
- import { XIcon, ChevronDownIcon, CalendarIcon, SearchIcon, ChevronRightIcon, ArrowLeftIcon, CheckCircle2Icon, MapIcon, LogOutIcon, UsersIcon, CreditCardIcon, AlertCircleIcon, MinusIcon, PlusIcon, CircleCheckIcon, SlidersHorizontalIcon, ChevronLeftIcon, HomeIcon, SailboatIcon, CarIcon, WavesIcon, FootprintsIcon, InfoIcon, ClockIcon, CheckIcon, ChevronUpIcon, MenuIcon, UserIcon, SunIcon, MoonIcon, MapPinIcon, TwitterIcon, YoutubeIcon, LinkedinIcon, InstagramIcon, FacebookIcon, ArrowRightIcon, PackageIcon, BedDoubleIcon, UtensilsIcon, CompassIcon, BackpackIcon, CherryIcon, ReceiptIcon, Loader2Icon, SendIcon, CheckCircleIcon, ArrowDownIcon, SparkleIcon, Share2Icon, CopyIcon, Info, MailIcon, PhoneIcon, MessageCircleIcon, UserPlusIcon, ExternalLinkIcon, PencilIcon, Trash2Icon, UserMinusIcon, AlertTriangleIcon, ZoomInIcon, StarIcon, LayoutGridIcon } from 'lucide-react';
7
+ import { XIcon, ChevronDownIcon, CalendarIcon, SearchIcon, ChevronRightIcon, ArrowLeftIcon, CheckCircle2Icon, MapIcon, LogOutIcon, UsersIcon, CreditCardIcon, AlertCircleIcon, MinusIcon, PlusIcon, CircleCheckIcon, SlidersHorizontalIcon, ChevronLeftIcon, HomeIcon, SailboatIcon, CarIcon, WavesIcon, FootprintsIcon, InfoIcon, ClockIcon, CheckIcon, ChevronUpIcon, MenuIcon, UserIcon, SunIcon, MoonIcon, MapPinIcon, TwitterIcon, YoutubeIcon, LinkedinIcon, InstagramIcon, FacebookIcon, ArrowRightIcon, PackageIcon, BedDoubleIcon, UtensilsIcon, CompassIcon, BackpackIcon, CherryIcon, ReceiptIcon, Loader2Icon, SendIcon, CheckCircleIcon, ArrowDownIcon, SparkleIcon, Share2Icon, CopyIcon, Info, MailIcon, PhoneIcon, MessageCircleIcon, UserPlusIcon, ExternalLinkIcon, PencilIcon, Trash2Icon, UserMinusIcon, AlertTriangleIcon, ZoomInIcon, StarIcon as StarIcon$1, LayoutGridIcon } from 'lucide-react';
8
8
  import { Separator as Separator$1 } from '@base-ui/react/separator';
9
9
  import { Dialog as Dialog$1 } from '@base-ui/react/dialog';
10
10
  import { Button as Button$1 } from '@base-ui/react/button';
@@ -81,7 +81,7 @@ var buttonVariants = cva(
81
81
  }
82
82
  }
83
83
  );
84
- var Button = React32.forwardRef(
84
+ var Button = React20.forwardRef(
85
85
  (_a, ref) => {
86
86
  var _b = _a, { className, variant, size } = _b, props = __objRest(_b, ["className", "variant", "size"]);
87
87
  return /* @__PURE__ */ jsx(
@@ -310,10 +310,10 @@ function DialogDescription(_a) {
310
310
  }, props)
311
311
  );
312
312
  }
313
- var FloatingInput = React32.forwardRef(
313
+ var FloatingInput = React20.forwardRef(
314
314
  (_a, ref) => {
315
315
  var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
316
- const inputId = id != null ? id : React32.useId();
316
+ const inputId = id != null ? id : React20.useId();
317
317
  return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
318
318
  /* @__PURE__ */ jsx(
319
319
  "input",
@@ -353,10 +353,10 @@ var FloatingInput = React32.forwardRef(
353
353
  }
354
354
  );
355
355
  FloatingInput.displayName = "FloatingInput";
356
- var FloatingSelect = React32.forwardRef(
356
+ var FloatingSelect = React20.forwardRef(
357
357
  (_a, ref) => {
358
358
  var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
359
- const inputId = id != null ? id : React32.useId();
359
+ const inputId = id != null ? id : React20.useId();
360
360
  const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
361
361
  return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
362
362
  /* @__PURE__ */ jsx(
@@ -621,11 +621,11 @@ function PhoneCountrySelect({
621
621
  showDial = true
622
622
  }) {
623
623
  var _a;
624
- const [open, setOpen] = React32.useState(false);
625
- const containerRef = React32.useRef(null);
626
- const listRef = React32.useRef(null);
624
+ const [open, setOpen] = React20.useState(false);
625
+ const containerRef = React20.useRef(null);
626
+ const listRef = React20.useRef(null);
627
627
  const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
628
- React32.useEffect(() => {
628
+ React20.useEffect(() => {
629
629
  if (!open) return;
630
630
  const handler = (e) => {
631
631
  var _a2;
@@ -636,7 +636,7 @@ function PhoneCountrySelect({
636
636
  document.addEventListener("mousedown", handler);
637
637
  return () => document.removeEventListener("mousedown", handler);
638
638
  }, [open]);
639
- React32.useEffect(() => {
639
+ React20.useEffect(() => {
640
640
  if (!open || !listRef.current) return;
641
641
  const activeEl = listRef.current.querySelector("[data-selected=true]");
642
642
  activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
@@ -906,8 +906,8 @@ function CalendarDayButton(_a) {
906
906
  "locale"
907
907
  ]);
908
908
  const defaultClassNames = getDefaultClassNames();
909
- const ref = React32.useRef(null);
910
- React32.useEffect(() => {
909
+ const ref = React20.useRef(null);
910
+ React20.useEffect(() => {
911
911
  var _a2;
912
912
  if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
913
913
  }, [modifiers.focused]);
@@ -938,16 +938,16 @@ function BirthDateField({
938
938
  className,
939
939
  disabled
940
940
  }) {
941
- const [open, setOpen] = React32.useState(false);
942
- const [text, setText] = React32.useState(
941
+ const [open, setOpen] = React20.useState(false);
942
+ const [text, setText] = React20.useState(
943
943
  value ? format(value, "dd/MM/yyyy") : ""
944
944
  );
945
- const containerRef = React32.useRef(null);
946
- const inputId = React32.useId();
947
- React32.useEffect(() => {
945
+ const containerRef = React20.useRef(null);
946
+ const inputId = React20.useId();
947
+ React20.useEffect(() => {
948
948
  setText(value ? format(value, "dd/MM/yyyy") : "");
949
949
  }, [value]);
950
- React32.useEffect(() => {
950
+ React20.useEffect(() => {
951
951
  if (!open) return;
952
952
  const handler = (e) => {
953
953
  var _a;
@@ -1156,14 +1156,14 @@ function CountrySearchField({
1156
1156
  }) {
1157
1157
  var _a;
1158
1158
  const list = countries != null ? countries : COUNTRIES;
1159
- const [query, setQuery] = React32.useState("");
1160
- const [open, setOpen] = React32.useState(false);
1161
- const containerRef = React32.useRef(null);
1162
- const searchRef = React32.useRef(null);
1159
+ const [query, setQuery] = React20.useState("");
1160
+ const [open, setOpen] = React20.useState(false);
1161
+ const containerRef = React20.useRef(null);
1162
+ const searchRef = React20.useRef(null);
1163
1163
  const selected = list.find((c) => c.code === value);
1164
1164
  const isFloated = open || !!selected;
1165
1165
  const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
1166
- React32.useEffect(() => {
1166
+ React20.useEffect(() => {
1167
1167
  if (!open) return;
1168
1168
  const handler = (e) => {
1169
1169
  var _a2;
@@ -1308,10 +1308,10 @@ function AdventureCard({
1308
1308
  }) {
1309
1309
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
1310
1310
  const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
1311
- const [checkedInternal, setCheckedInternal] = React32.useState(
1311
+ const [checkedInternal, setCheckedInternal] = React20.useState(
1312
1312
  new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
1313
1313
  );
1314
- const [openDescriptionId, setOpenDescriptionId] = React32.useState(null);
1314
+ const [openDescriptionId, setOpenDescriptionId] = React20.useState(null);
1315
1315
  const openDescriptionOptional = openDescriptionId ? (_e = adventure.optionals) == null ? void 0 : _e.find((o) => o.id === openDescriptionId) : void 0;
1316
1316
  const isChecked = (opt) => {
1317
1317
  var _a2;
@@ -1482,7 +1482,7 @@ function AdventureCard({
1482
1482
  ] }),
1483
1483
  adventure.rooms && adventure.rooms.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-5 mt-1", children: adventure.rooms.map((room, i) => {
1484
1484
  var _a2, _b2;
1485
- const bedLabel = (_b2 = (_a2 = adventure.bedArrangementLabels) == null ? void 0 : _a2[room.bedArrangement]) != null ? _b2 : room.bedArrangement === "DOUBLE" ? "Double" : room.bedArrangement === "TWIN" ? "Twin" : room.bedArrangement === "SINGLE" ? "Single" : "Triple";
1485
+ const bedLabel = (_b2 = (_a2 = adventure.bedArrangementLabels) == null ? void 0 : _a2[room.bedArrangement]) != null ? _b2 : room.bedArrangement === "DOUBLE" ? "Double" : room.bedArrangement === "TWIN" ? "Twin" : room.bedArrangement === "SINGLE" ? "Single" : room.bedArrangement === "TRIPLE" ? "Triple" : room.bedArrangement === "QUADRUPLE" ? "Quadruple" : "Quintuple";
1486
1486
  const heading = adventure.accommodationRoomHeading ? adventure.accommodationRoomHeading(room.accommodationName) : `Accommodation: ${room.accommodationName}`;
1487
1487
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
1488
1488
  /* @__PURE__ */ jsx("h4", { className: "text-lg font-semibold text-foreground font-heading", children: heading }),
@@ -1763,7 +1763,7 @@ function BookingShell({
1763
1763
  return /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
1764
1764
  /* @__PURE__ */ jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
1765
1765
  /* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
1766
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
1766
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(React20.Fragment, { children: [
1767
1767
  /* @__PURE__ */ jsx(
1768
1768
  "span",
1769
1769
  {
@@ -1962,7 +1962,7 @@ function TermsSection({
1962
1962
  termsContent
1963
1963
  }) {
1964
1964
  var _a;
1965
- const [modalOpen, setModalOpen] = React32.useState(false);
1965
+ const [modalOpen, setModalOpen] = React20.useState(false);
1966
1966
  const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
1967
1967
  return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
1968
1968
  /* @__PURE__ */ jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
@@ -2100,9 +2100,9 @@ function BookingWizard({
2100
2100
  }) {
2101
2101
  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;
2102
2102
  const wizardSteps = WIZARD_STEPS_FN(labels);
2103
- const [step, setStep] = React32.useState("responsible");
2104
- const [error, setError] = React32.useState(null);
2105
- const [responsible, setResponsible] = React32.useState({
2103
+ const [step, setStep] = React20.useState("responsible");
2104
+ const [error, setError] = React20.useState(null);
2105
+ const [responsible, setResponsible] = React20.useState({
2106
2106
  firstName: "",
2107
2107
  lastName: "",
2108
2108
  email: "",
@@ -2121,7 +2121,7 @@ function BookingWizard({
2121
2121
  return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
2122
2122
  }, 0);
2123
2123
  const totalPax = totalAdults + totalChildren;
2124
- const [travellers, setTravellers] = React32.useState(
2124
+ const [travellers, setTravellers] = React20.useState(
2125
2125
  Array.from({ length: Math.max(totalPax, 1) }, () => ({
2126
2126
  firstName: "",
2127
2127
  lastName: "",
@@ -2129,9 +2129,9 @@ function BookingWizard({
2129
2129
  email: ""
2130
2130
  }))
2131
2131
  );
2132
- const [payAmount, setPayAmount] = React32.useState("full");
2133
- const [payMethod, setPayMethod] = React32.useState("stripe");
2134
- const [termsAccepted, setTermsAccepted] = React32.useState(false);
2132
+ const [payAmount, setPayAmount] = React20.useState("full");
2133
+ const [payMethod, setPayMethod] = React20.useState("stripe");
2134
+ const [termsAccepted, setTermsAccepted] = React20.useState(false);
2135
2135
  const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
2136
2136
  const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
2137
2137
  const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
@@ -2359,7 +2359,7 @@ function Offer({
2359
2359
  className
2360
2360
  }) {
2361
2361
  var _a, _b, _c;
2362
- const [showBooking, setShowBooking] = React32.useState(false);
2362
+ const [showBooking, setShowBooking] = React20.useState(false);
2363
2363
  const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
2364
2364
  const handleBook = () => {
2365
2365
  if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
@@ -2726,7 +2726,7 @@ function AdventureSection({
2726
2726
  labels
2727
2727
  }) {
2728
2728
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
2729
- const [detailsOpen, setDetailsOpen] = React32.useState(false);
2729
+ const [detailsOpen, setDetailsOpen] = React20.useState(false);
2730
2730
  const handleCopyUrl = (url) => {
2731
2731
  if (onCopyFormLink) {
2732
2732
  onCopyFormLink(url);
@@ -3265,8 +3265,8 @@ function AddTravellerDialog({
3265
3265
  errorMessage
3266
3266
  }) {
3267
3267
  var _a, _b, _c, _d, _e;
3268
- const [form, setForm] = React32.useState(() => createInitialAddFormData(config));
3269
- React32.useEffect(() => {
3268
+ const [form, setForm] = React20.useState(() => createInitialAddFormData(config));
3269
+ React20.useEffect(() => {
3270
3270
  if (open) {
3271
3271
  setForm(createInitialAddFormData(config));
3272
3272
  }
@@ -3326,7 +3326,7 @@ function EditTravellerDialog({
3326
3326
  errorMessage
3327
3327
  }) {
3328
3328
  var _a, _b, _c, _d, _e;
3329
- const [form, setForm] = React32.useState(() => ({
3329
+ const [form, setForm] = React20.useState(() => ({
3330
3330
  firstName: "",
3331
3331
  lastName: "",
3332
3332
  email: "",
@@ -3335,7 +3335,7 @@ function EditTravellerDialog({
3335
3335
  birthDate: "",
3336
3336
  personType: "ADULT"
3337
3337
  }));
3338
- React32.useEffect(() => {
3338
+ React20.useEffect(() => {
3339
3339
  var _a2, _b2, _c2, _d2, _e2, _f;
3340
3340
  if (open && traveller) {
3341
3341
  setForm({
@@ -3671,48 +3671,48 @@ function BookingDetails({
3671
3671
  const hasSubmitAddTraveller = !!onSubmitAddTraveller;
3672
3672
  const hasSubmitEditTraveller = !!onSubmitEditTraveller;
3673
3673
  const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
3674
- const [addModalState, setAddModalState] = React32.useState({
3674
+ const [addModalState, setAddModalState] = React20.useState({
3675
3675
  open: false,
3676
3676
  adventureId: null
3677
3677
  });
3678
- const [editModalState, setEditModalState] = React32.useState({ open: false, adventureId: null, traveller: null });
3679
- const [deleteModalState, setDeleteModalState] = React32.useState({ open: false, adventureId: null, traveller: null });
3680
- const [resendInviteDialogState, setResendInviteDialogState] = React32.useState({ open: false, traveller: null });
3681
- const handleRequestOpenAddModal = React32.useCallback((adventureId) => {
3678
+ const [editModalState, setEditModalState] = React20.useState({ open: false, adventureId: null, traveller: null });
3679
+ const [deleteModalState, setDeleteModalState] = React20.useState({ open: false, adventureId: null, traveller: null });
3680
+ const [resendInviteDialogState, setResendInviteDialogState] = React20.useState({ open: false, traveller: null });
3681
+ const handleRequestOpenAddModal = React20.useCallback((adventureId) => {
3682
3682
  setAddModalState({ open: true, adventureId });
3683
3683
  }, []);
3684
- const handleRequestOpenEditModal = React32.useCallback(
3684
+ const handleRequestOpenEditModal = React20.useCallback(
3685
3685
  (adventureId, traveller) => {
3686
3686
  setEditModalState({ open: true, adventureId, traveller });
3687
3687
  },
3688
3688
  []
3689
3689
  );
3690
- const handleRequestOpenDeleteModal = React32.useCallback(
3690
+ const handleRequestOpenDeleteModal = React20.useCallback(
3691
3691
  (adventureId, traveller) => {
3692
3692
  setDeleteModalState({ open: true, adventureId, traveller });
3693
3693
  },
3694
3694
  []
3695
3695
  );
3696
- const handleRequestOpenResendInviteDialog = React32.useCallback(
3696
+ const handleRequestOpenResendInviteDialog = React20.useCallback(
3697
3697
  (traveller) => {
3698
3698
  setResendInviteDialogState({ open: true, traveller });
3699
3699
  },
3700
3700
  []
3701
3701
  );
3702
- const closeAddModal = React32.useCallback(() => {
3702
+ const closeAddModal = React20.useCallback(() => {
3703
3703
  setAddModalState({ open: false, adventureId: null });
3704
3704
  }, []);
3705
- const closeEditModal = React32.useCallback(() => {
3705
+ const closeEditModal = React20.useCallback(() => {
3706
3706
  setEditModalState({ open: false, adventureId: null, traveller: null });
3707
3707
  }, []);
3708
- const closeDeleteModal = React32.useCallback(() => {
3708
+ const closeDeleteModal = React20.useCallback(() => {
3709
3709
  setDeleteModalState({ open: false, adventureId: null, traveller: null });
3710
3710
  }, []);
3711
- const closeResendInviteDialog = React32.useCallback(() => {
3711
+ const closeResendInviteDialog = React20.useCallback(() => {
3712
3712
  setResendInviteDialogState({ open: false, traveller: null });
3713
3713
  }, []);
3714
- const submitInFlightRef = React32.useRef(false);
3715
- const handleAddSubmit = React32.useCallback(
3714
+ const submitInFlightRef = React20.useRef(false);
3715
+ const handleAddSubmit = React20.useCallback(
3716
3716
  async (adventureId, data) => {
3717
3717
  if (!onSubmitAddTraveller) return;
3718
3718
  if (submitInFlightRef.current) return;
@@ -3727,7 +3727,7 @@ function BookingDetails({
3727
3727
  },
3728
3728
  [onSubmitAddTraveller, closeAddModal]
3729
3729
  );
3730
- const handleEditSubmit = React32.useCallback(
3730
+ const handleEditSubmit = React20.useCallback(
3731
3731
  async (adventureId, travellerId, data) => {
3732
3732
  if (!onSubmitEditTraveller) return;
3733
3733
  if (submitInFlightRef.current) return;
@@ -3742,7 +3742,7 @@ function BookingDetails({
3742
3742
  },
3743
3743
  [onSubmitEditTraveller, closeEditModal]
3744
3744
  );
3745
- const handleDeleteConfirm = React32.useCallback(
3745
+ const handleDeleteConfirm = React20.useCallback(
3746
3746
  async (adventureId, travellerId) => {
3747
3747
  if (!onConfirmRemoveTraveller) return;
3748
3748
  if (submitInFlightRef.current) return;
@@ -4127,7 +4127,9 @@ var DEFAULT_LABELS = {
4127
4127
  DOUBLE: "Double",
4128
4128
  TWIN: "Twin",
4129
4129
  SINGLE: "Single",
4130
- TRIPLE: "Triple"
4130
+ TRIPLE: "Triple",
4131
+ QUADRUPLE: "Quadruple",
4132
+ QUINTUPLE: "Quintuple"
4131
4133
  }
4132
4134
  };
4133
4135
  function BookingAdventureCard({
@@ -4154,7 +4156,7 @@ function BookingAdventureCard({
4154
4156
  labels,
4155
4157
  className
4156
4158
  }) {
4157
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
4159
+ 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;
4158
4160
  const l = {
4159
4161
  travellersHeading: (_a = labels == null ? void 0 : labels.travellersHeading) != null ? _a : DEFAULT_LABELS.travellersHeading,
4160
4162
  detailsHeading: (_b = labels == null ? void 0 : labels.detailsHeading) != null ? _b : DEFAULT_LABELS.detailsHeading,
@@ -4174,7 +4176,9 @@ function BookingAdventureCard({
4174
4176
  DOUBLE: (_p = (_o = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _o.DOUBLE) != null ? _p : DEFAULT_LABELS.bedArrangementLabels.DOUBLE,
4175
4177
  TWIN: (_r = (_q = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _q.TWIN) != null ? _r : DEFAULT_LABELS.bedArrangementLabels.TWIN,
4176
4178
  SINGLE: (_t = (_s = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _s.SINGLE) != null ? _t : DEFAULT_LABELS.bedArrangementLabels.SINGLE,
4177
- TRIPLE: (_v = (_u = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _u.TRIPLE) != null ? _v : DEFAULT_LABELS.bedArrangementLabels.TRIPLE
4179
+ TRIPLE: (_v = (_u = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _u.TRIPLE) != null ? _v : DEFAULT_LABELS.bedArrangementLabels.TRIPLE,
4180
+ QUADRUPLE: (_x = (_w = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _w.QUADRUPLE) != null ? _x : DEFAULT_LABELS.bedArrangementLabels.QUADRUPLE,
4181
+ QUINTUPLE: (_z = (_y = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _y.QUINTUPLE) != null ? _z : DEFAULT_LABELS.bedArrangementLabels.QUINTUPLE
4178
4182
  }
4179
4183
  };
4180
4184
  const hasTravellers = !!travellers && travellers.length > 0;
@@ -4986,16 +4990,20 @@ var DEFAULT_BED_LABELS = {
4986
4990
  DOUBLE: "Double",
4987
4991
  TWIN: "Twin",
4988
4992
  SINGLE: "Single",
4989
- TRIPLE: "Triple"
4993
+ TRIPLE: "Triple",
4994
+ QUADRUPLE: "Quadruple",
4995
+ QUINTUPLE: "Quintuple"
4990
4996
  };
4991
4997
  function BookingSummary({ heading, rows, rooms, roomsHeading, bedArrangementLabels, footer, className }) {
4992
- var _a, _b, _c, _d, _e, _f;
4998
+ var _a, _b, _c, _d, _e, _f, _g, _h;
4993
4999
  const hasRooms = !!rooms && rooms.length > 0;
4994
5000
  const bedLabels = {
4995
5001
  DOUBLE: (_a = bedArrangementLabels == null ? void 0 : bedArrangementLabels.DOUBLE) != null ? _a : DEFAULT_BED_LABELS.DOUBLE,
4996
5002
  TWIN: (_b = bedArrangementLabels == null ? void 0 : bedArrangementLabels.TWIN) != null ? _b : DEFAULT_BED_LABELS.TWIN,
4997
5003
  SINGLE: (_c = bedArrangementLabels == null ? void 0 : bedArrangementLabels.SINGLE) != null ? _c : DEFAULT_BED_LABELS.SINGLE,
4998
- TRIPLE: (_d = bedArrangementLabels == null ? void 0 : bedArrangementLabels.TRIPLE) != null ? _d : DEFAULT_BED_LABELS.TRIPLE
5004
+ TRIPLE: (_d = bedArrangementLabels == null ? void 0 : bedArrangementLabels.TRIPLE) != null ? _d : DEFAULT_BED_LABELS.TRIPLE,
5005
+ QUADRUPLE: (_e = bedArrangementLabels == null ? void 0 : bedArrangementLabels.QUADRUPLE) != null ? _e : DEFAULT_BED_LABELS.QUADRUPLE,
5006
+ QUINTUPLE: (_f = bedArrangementLabels == null ? void 0 : bedArrangementLabels.QUINTUPLE) != null ? _f : DEFAULT_BED_LABELS.QUINTUPLE
4999
5007
  };
5000
5008
  return /* @__PURE__ */ jsxs("div", { className, style: { marginBottom: "24px" }, children: [
5001
5009
  heading && /* @__PURE__ */ jsx(
@@ -5120,8 +5128,8 @@ function BookingSummary({ heading, rows, rooms, roomsHeading, bedArrangementLabe
5120
5128
  style: {
5121
5129
  padding: "12px 20px",
5122
5130
  textAlign: "center",
5123
- fontWeight: (_e = footer.fontWeight) != null ? _e : 600,
5124
- color: (_f = footer.color) != null ? _f : emailTokens.foreground,
5131
+ fontWeight: (_g = footer.fontWeight) != null ? _g : 600,
5132
+ color: (_h = footer.color) != null ? _h : emailTokens.foreground,
5125
5133
  backgroundColor: footer.backgroundColor
5126
5134
  },
5127
5135
  children: footer.text
@@ -5263,7 +5271,9 @@ var DEFAULT_LABELS3 = {
5263
5271
  DOUBLE: "Double",
5264
5272
  TWIN: "Twin",
5265
5273
  SINGLE: "Single",
5266
- TRIPLE: "Triple"
5274
+ TRIPLE: "Triple",
5275
+ QUADRUPLE: "Quadruple",
5276
+ QUINTUPLE: "Quintuple"
5267
5277
  },
5268
5278
  paymentSummaryHeading: "\u{1F4B0} Payment Summary",
5269
5279
  paymentDetailsHeading: "Payment Details",
@@ -5659,7 +5669,7 @@ function BookingCreatedEmail({
5659
5669
  }, children: i + 1 }) }),
5660
5670
  /* @__PURE__ */ jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
5661
5671
  ] }) }) }, i)) }),
5662
- nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
5672
+ nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxs(React20.Fragment, { children: [
5663
5673
  idx === 0 ? /* @__PURE__ */ jsx("strong", { children: line }) : line,
5664
5674
  idx < arr.length - 1 ? /* @__PURE__ */ jsx("br", {}) : null
5665
5675
  ] }, idx)) })
@@ -7224,7 +7234,9 @@ var DEFAULT_LABELS11 = {
7224
7234
  DOUBLE: "Double",
7225
7235
  TWIN: "Twin",
7226
7236
  SINGLE: "Single",
7227
- TRIPLE: "Triple"
7237
+ TRIPLE: "Triple",
7238
+ QUADRUPLE: "Quadruple",
7239
+ QUINTUPLE: "Quintuple"
7228
7240
  },
7229
7241
  registrationPendingNotice: "The travellers' registration details will be sent to you as soon as all travellers have completed their forms.",
7230
7242
  mustReplyToConfirm: "Please reply to this email to confirm the booking.",
@@ -8440,11 +8452,11 @@ function DatePickerField({
8440
8452
  className,
8441
8453
  error
8442
8454
  }) {
8443
- const [open, setOpen] = React32.useState(false);
8444
- const containerRef = React32.useRef(null);
8445
- const [calendarWidth, setCalendarWidth] = React32.useState();
8455
+ const [open, setOpen] = React20.useState(false);
8456
+ const containerRef = React20.useRef(null);
8457
+ const [calendarWidth, setCalendarWidth] = React20.useState();
8446
8458
  const hasValue = !!value;
8447
- React32.useEffect(() => {
8459
+ React20.useEffect(() => {
8448
8460
  if (!containerRef.current) return;
8449
8461
  const observer = new ResizeObserver(([entry]) => {
8450
8462
  setCalendarWidth(entry.contentRect.width);
@@ -8573,15 +8585,15 @@ function BookingForm({
8573
8585
  const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
8574
8586
  const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
8575
8587
  const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
8576
- const [values, setValues] = React32.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8577
- const [errors, setErrors] = React32.useState({});
8588
+ const [values, setValues] = React20.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8589
+ const [errors, setErrors] = React20.useState({});
8578
8590
  const set = (key, value) => {
8579
8591
  setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8580
8592
  setErrors(
8581
8593
  (prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
8582
8594
  );
8583
8595
  };
8584
- React32.useEffect(() => {
8596
+ React20.useEffect(() => {
8585
8597
  if (!defaultValues) return;
8586
8598
  setValues((prev) => {
8587
8599
  let changed = false;
@@ -9220,11 +9232,11 @@ function FloatingTextarea({
9220
9232
  }
9221
9233
  function SelectField({ field, value, onChange, error, disabled }) {
9222
9234
  var _a, _b, _c;
9223
- const [open, setOpen] = React32.useState(false);
9224
- const containerRef = React32.useRef(null);
9235
+ const [open, setOpen] = React20.useState(false);
9236
+ const containerRef = React20.useRef(null);
9225
9237
  const options = (_a = field.options) != null ? _a : [];
9226
9238
  const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
9227
- React32.useEffect(() => {
9239
+ React20.useEffect(() => {
9228
9240
  if (!open) return;
9229
9241
  const handleOutside = (e) => {
9230
9242
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -9692,11 +9704,11 @@ function RegistrationForm({
9692
9704
  readOnly = false
9693
9705
  }) {
9694
9706
  var _a;
9695
- const L = React32.useMemo(
9707
+ const L = React20.useMemo(
9696
9708
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS14), labels != null ? labels : {}),
9697
9709
  [labels]
9698
9710
  );
9699
- const sortedFields = React32.useMemo(
9711
+ const sortedFields = React20.useMemo(
9700
9712
  () => [...fields].sort((a, b) => {
9701
9713
  var _a2, _b;
9702
9714
  return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
@@ -9704,7 +9716,7 @@ function RegistrationForm({
9704
9716
  [fields]
9705
9717
  );
9706
9718
  const isControlled = values !== void 0;
9707
- const [internal, setInternal] = React32.useState(
9719
+ const [internal, setInternal] = React20.useState(
9708
9720
  () => initializeValues(
9709
9721
  sortedFields,
9710
9722
  defaultValues != null ? defaultValues : {},
@@ -9712,9 +9724,9 @@ function RegistrationForm({
9712
9724
  includeTerms
9713
9725
  )
9714
9726
  );
9715
- const [submitAttempted, setSubmitAttempted] = React32.useState(false);
9716
- const [validationErrors, setValidationErrors] = React32.useState({});
9717
- React32.useEffect(() => {
9727
+ const [submitAttempted, setSubmitAttempted] = React20.useState(false);
9728
+ const [validationErrors, setValidationErrors] = React20.useState({});
9729
+ React20.useEffect(() => {
9718
9730
  if (isControlled) return;
9719
9731
  setInternal((prev) => {
9720
9732
  const next = initializeValues(
@@ -9771,7 +9783,7 @@ function RegistrationForm({
9771
9783
  const termsError = submitAttempted && termsEnabled && !termsAccepted;
9772
9784
  const firstErrorFieldId = Object.keys(fieldErrors)[0];
9773
9785
  const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
9774
- React32.useEffect(() => {
9786
+ React20.useEffect(() => {
9775
9787
  if (!submitAttempted || !scrollTargetId) return;
9776
9788
  const timer = setTimeout(() => {
9777
9789
  const elem = document.getElementById(scrollTargetId);
@@ -10242,18 +10254,18 @@ function CancellationForm({
10242
10254
  className
10243
10255
  }) {
10244
10256
  var _a, _b, _c;
10245
- const [selectedAdventureIds, setSelectedAdventureIds] = React32.useState(/* @__PURE__ */ new Set());
10246
- const [participantsByAdventure, setParticipantsByAdventure] = React32.useState({});
10247
- const [reasonCode, setReasonCode] = React32.useState("");
10248
- const [reasonOther, setReasonOther] = React32.useState("");
10249
- const [refundPreference, setRefundPreference] = React32.useState("");
10250
- const [refundOther, setRefundOther] = React32.useState("");
10251
- const [agreedToPolicy, setAgreedToPolicy] = React32.useState(false);
10252
- const [contactName, setContactName] = React32.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
10253
- const [contactEmail, setContactEmail] = React32.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
10254
- const [contactPhone, setContactPhone] = React32.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
10255
- const [errors, setErrors] = React32.useState({});
10256
- const allParticipantsOf = React32.useCallback(
10257
+ const [selectedAdventureIds, setSelectedAdventureIds] = React20.useState(/* @__PURE__ */ new Set());
10258
+ const [participantsByAdventure, setParticipantsByAdventure] = React20.useState({});
10259
+ const [reasonCode, setReasonCode] = React20.useState("");
10260
+ const [reasonOther, setReasonOther] = React20.useState("");
10261
+ const [refundPreference, setRefundPreference] = React20.useState("");
10262
+ const [refundOther, setRefundOther] = React20.useState("");
10263
+ const [agreedToPolicy, setAgreedToPolicy] = React20.useState(false);
10264
+ const [contactName, setContactName] = React20.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
10265
+ const [contactEmail, setContactEmail] = React20.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
10266
+ const [contactPhone, setContactPhone] = React20.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
10267
+ const [errors, setErrors] = React20.useState({});
10268
+ const allParticipantsOf = React20.useCallback(
10257
10269
  (advId) => {
10258
10270
  var _a2, _b2;
10259
10271
  return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
@@ -10510,10 +10522,10 @@ var OTPCodeInput = ({
10510
10522
  id,
10511
10523
  required
10512
10524
  }) => {
10513
- const baseId = id != null ? id : React32.useId();
10514
- const inputRef = React32.useRef(null);
10515
- const [focused, setFocused] = React32.useState(false);
10516
- const digits = React32.useMemo(() => {
10525
+ const baseId = id != null ? id : React20.useId();
10526
+ const inputRef = React20.useRef(null);
10527
+ const [focused, setFocused] = React20.useState(false);
10528
+ const digits = React20.useMemo(() => {
10517
10529
  const arr = value.split("").slice(0, length);
10518
10530
  while (arr.length < length) arr.push("");
10519
10531
  return arr;
@@ -10626,7 +10638,7 @@ function Checkbox(_a) {
10626
10638
  })
10627
10639
  );
10628
10640
  }
10629
- var AccordionVariantContext = React32.createContext("default");
10641
+ var AccordionVariantContext = React20.createContext("default");
10630
10642
  function Accordion(_a) {
10631
10643
  var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
10632
10644
  return /* @__PURE__ */ jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(
@@ -10644,7 +10656,7 @@ function Accordion(_a) {
10644
10656
  }
10645
10657
  function AccordionItem(_a) {
10646
10658
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
10647
- const variant = React32.useContext(AccordionVariantContext);
10659
+ const variant = React20.useContext(AccordionVariantContext);
10648
10660
  return /* @__PURE__ */ jsx(
10649
10661
  Accordion$1.Item,
10650
10662
  __spreadValues({
@@ -10667,7 +10679,7 @@ function AccordionTrigger(_a) {
10667
10679
  "children",
10668
10680
  "headingLevel"
10669
10681
  ]);
10670
- const variant = React32.useContext(AccordionVariantContext);
10682
+ const variant = React20.useContext(AccordionVariantContext);
10671
10683
  const headingRender = headingLevel === 2 ? /* @__PURE__ */ jsx("h2", {}) : headingLevel === 4 ? /* @__PURE__ */ jsx("h4", {}) : headingLevel === 5 ? /* @__PURE__ */ jsx("h5", {}) : headingLevel === 6 ? /* @__PURE__ */ jsx("h6", {}) : void 0;
10672
10684
  return /* @__PURE__ */ jsx(
10673
10685
  Accordion$1.Header,
@@ -10729,7 +10741,7 @@ function AccordionContent(_a) {
10729
10741
  "className",
10730
10742
  "children"
10731
10743
  ]);
10732
- const variant = React32.useContext(AccordionVariantContext);
10744
+ const variant = React20.useContext(AccordionVariantContext);
10733
10745
  return /* @__PURE__ */ jsx(
10734
10746
  Accordion$1.Panel,
10735
10747
  __spreadProps(__spreadValues({
@@ -10948,15 +10960,15 @@ function FilterPanel({
10948
10960
  labels
10949
10961
  }) {
10950
10962
  var _a, _b, _c, _d, _e, _f, _g, _h;
10951
- const resolvedGroups = React32.useMemo(() => resolveGroups(groups), [groups]);
10952
- const [internalValue, setInternalValue] = React32.useState(
10963
+ const resolvedGroups = React20.useMemo(() => resolveGroups(groups), [groups]);
10964
+ const [internalValue, setInternalValue] = React20.useState(
10953
10965
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
10954
10966
  );
10955
10967
  const selected = value != null ? value : internalValue;
10956
- const [expandedItems, setExpandedItems] = React32.useState(
10968
+ const [expandedItems, setExpandedItems] = React20.useState(
10957
10969
  () => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
10958
10970
  );
10959
- const toggleExpanded = React32.useCallback((id) => {
10971
+ const toggleExpanded = React20.useCallback((id) => {
10960
10972
  setExpandedItems((prev) => {
10961
10973
  const next = new Set(prev);
10962
10974
  if (next.has(id)) next.delete(id);
@@ -11340,11 +11352,11 @@ function FilterPanel({
11340
11352
  var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
11341
11353
  function TrustpilotEmbed({ config }) {
11342
11354
  var _a, _b, _c, _d, _e, _f;
11343
- const ref = React32.useRef(null);
11344
- const [widgetReady, setWidgetReady] = React32.useState(false);
11345
- const [delayPassed, setDelayPassed] = React32.useState(false);
11355
+ const ref = React20.useRef(null);
11356
+ const [widgetReady, setWidgetReady] = React20.useState(false);
11357
+ const [delayPassed, setDelayPassed] = React20.useState(false);
11346
11358
  const showFallback = delayPassed && !widgetReady;
11347
- React32.useEffect(() => {
11359
+ React20.useEffect(() => {
11348
11360
  var _a2;
11349
11361
  if (typeof document === "undefined" || !ref.current) return;
11350
11362
  const node = ref.current;
@@ -11532,7 +11544,7 @@ function webpVariantUrl(src) {
11532
11544
  return `${withoutQuery}.webp${query}`;
11533
11545
  }
11534
11546
  function PictureLoader() {
11535
- const gradientId = React32.useId();
11547
+ const gradientId = React20.useId();
11536
11548
  return /* @__PURE__ */ jsx(
11537
11549
  "span",
11538
11550
  {
@@ -11602,10 +11614,10 @@ function Picture(_a) {
11602
11614
  "onError"
11603
11615
  ]);
11604
11616
  var _a2, _b2;
11605
- const ref = React32.useRef(null);
11606
- const [visible, setVisible] = React32.useState(eager);
11607
- const [loaded, setLoaded] = React32.useState(false);
11608
- React32.useEffect(() => {
11617
+ const ref = React20.useRef(null);
11618
+ const [visible, setVisible] = React20.useState(eager);
11619
+ const [loaded, setLoaded] = React20.useState(false);
11620
+ React20.useEffect(() => {
11609
11621
  if (eager || visible) return;
11610
11622
  const el = ref.current;
11611
11623
  if (!el || typeof IntersectionObserver === "undefined") {
@@ -11624,7 +11636,7 @@ function Picture(_a) {
11624
11636
  io.observe(el);
11625
11637
  return () => io.disconnect();
11626
11638
  }, [eager, visible, rootMargin]);
11627
- React32.useEffect(() => {
11639
+ React20.useEffect(() => {
11628
11640
  setLoaded(false);
11629
11641
  }, [src]);
11630
11642
  const webp = webpVariantUrl(src);
@@ -11755,11 +11767,11 @@ function ItineraryModal({
11755
11767
  onNext
11756
11768
  }) {
11757
11769
  var _a, _b, _c;
11758
- const [imgIndex, setImgIndex] = React32.useState(0);
11770
+ const [imgIndex, setImgIndex] = React20.useState(0);
11759
11771
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
11760
11772
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
11761
11773
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
11762
- React32.useEffect(() => {
11774
+ React20.useEffect(() => {
11763
11775
  setImgIndex(0);
11764
11776
  }, [stop == null ? void 0 : stop.dayNumber]);
11765
11777
  if (!stop) return null;
@@ -11886,8 +11898,8 @@ function ItineraryModal({
11886
11898
  ) });
11887
11899
  }
11888
11900
  function Itinerary({ title, subtitle, stops, className }) {
11889
- const [activeIndex, setActiveIndex] = React32.useState(null);
11890
- const scrollRef = React32.useRef(null);
11901
+ const [activeIndex, setActiveIndex] = React20.useState(null);
11902
+ const scrollRef = React20.useRef(null);
11891
11903
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
11892
11904
  const scrollBy = (dir) => {
11893
11905
  if (!scrollRef.current) return;
@@ -11980,18 +11992,18 @@ function Lightbox({
11980
11992
  labels
11981
11993
  }) {
11982
11994
  var _a, _b, _c, _d;
11983
- const [index, setIndex] = React32.useState(initialIndex);
11995
+ const [index, setIndex] = React20.useState(initialIndex);
11984
11996
  const total = photos.length;
11985
11997
  const photo = photos[index];
11986
- const prev = React32.useCallback(
11998
+ const prev = React20.useCallback(
11987
11999
  () => setIndex((i) => (i - 1 + total) % total),
11988
12000
  [total]
11989
12001
  );
11990
- const next = React32.useCallback(
12002
+ const next = React20.useCallback(
11991
12003
  () => setIndex((i) => (i + 1) % total),
11992
12004
  [total]
11993
12005
  );
11994
- React32.useEffect(() => {
12006
+ React20.useEffect(() => {
11995
12007
  const onKey = (e) => {
11996
12008
  if (e.key === "Escape") onClose();
11997
12009
  if (e.key === "ArrowLeft") prev();
@@ -12093,6 +12105,260 @@ function Lightbox({
12093
12105
  }
12094
12106
  );
12095
12107
  }
12108
+ function FeedLightbox({
12109
+ sections,
12110
+ initialIndex,
12111
+ onClose,
12112
+ labels
12113
+ }) {
12114
+ var _a;
12115
+ const { items, total, bounds } = React20.useMemo(() => {
12116
+ const items2 = [];
12117
+ const bounds2 = [];
12118
+ let i = 0;
12119
+ for (const section of sections) {
12120
+ if (!section.photos.length) continue;
12121
+ bounds2.push({
12122
+ label: section.label,
12123
+ start: i,
12124
+ end: i + section.photos.length - 1
12125
+ });
12126
+ section.photos.forEach((photo, p) => {
12127
+ items2.push({
12128
+ photo,
12129
+ index: i,
12130
+ sectionLabel: section.label,
12131
+ isSectionStart: p === 0
12132
+ });
12133
+ i += 1;
12134
+ });
12135
+ }
12136
+ return { items: items2, total: i, bounds: bounds2 };
12137
+ }, [sections]);
12138
+ const scrollRef = React20.useRef(null);
12139
+ const itemRefs = React20.useRef([]);
12140
+ const [active, setActive] = React20.useState(initialIndex);
12141
+ const activeLabel = React20.useMemo(
12142
+ () => {
12143
+ var _a2;
12144
+ return (_a2 = bounds.find((b) => active >= b.start && active <= b.end)) == null ? void 0 : _a2.label;
12145
+ },
12146
+ [bounds, active]
12147
+ );
12148
+ React20.useEffect(() => {
12149
+ const previous = document.body.style.overflow;
12150
+ document.body.style.overflow = "hidden";
12151
+ return () => {
12152
+ document.body.style.overflow = previous;
12153
+ };
12154
+ }, []);
12155
+ React20.useEffect(() => {
12156
+ const onKey = (e) => {
12157
+ if (e.key === "Escape") onClose();
12158
+ };
12159
+ document.addEventListener("keydown", onKey);
12160
+ return () => document.removeEventListener("keydown", onKey);
12161
+ }, [onClose]);
12162
+ React20.useEffect(() => {
12163
+ const root = scrollRef.current;
12164
+ if (!root) return;
12165
+ let frame = 0;
12166
+ let userMoved = false;
12167
+ const recompute = () => {
12168
+ var _a2;
12169
+ frame = 0;
12170
+ if (!userMoved) {
12171
+ (_a2 = itemRefs.current[initialIndex]) == null ? void 0 : _a2.scrollIntoView({ block: "start" });
12172
+ }
12173
+ const anchorY = root.getBoundingClientRect().top + 64;
12174
+ let current = 0;
12175
+ itemRefs.current.forEach((el, i) => {
12176
+ if (el && el.getBoundingClientRect().top <= anchorY) current = i;
12177
+ });
12178
+ if (root.scrollTop + root.clientHeight >= root.scrollHeight - 2) {
12179
+ current = total - 1;
12180
+ }
12181
+ setActive(current);
12182
+ };
12183
+ const schedule = () => {
12184
+ if (!frame) frame = requestAnimationFrame(recompute);
12185
+ };
12186
+ const onScroll = () => schedule();
12187
+ const onUserMove = () => {
12188
+ userMoved = true;
12189
+ };
12190
+ root.addEventListener("scroll", onScroll, { passive: true });
12191
+ root.addEventListener("wheel", onUserMove, { passive: true });
12192
+ root.addEventListener("touchmove", onUserMove, { passive: true });
12193
+ window.addEventListener("keydown", onUserMove);
12194
+ const ro = new ResizeObserver(schedule);
12195
+ itemRefs.current.forEach((el) => el && ro.observe(el));
12196
+ recompute();
12197
+ return () => {
12198
+ root.removeEventListener("scroll", onScroll);
12199
+ root.removeEventListener("wheel", onUserMove);
12200
+ root.removeEventListener("touchmove", onUserMove);
12201
+ window.removeEventListener("keydown", onUserMove);
12202
+ ro.disconnect();
12203
+ if (frame) cancelAnimationFrame(frame);
12204
+ };
12205
+ }, []);
12206
+ return /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex flex-col bg-background", children: [
12207
+ /* @__PURE__ */ 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: [
12208
+ /* @__PURE__ */ jsx(
12209
+ "button",
12210
+ {
12211
+ type: "button",
12212
+ onClick: onClose,
12213
+ 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",
12214
+ "aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
12215
+ children: /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5" })
12216
+ }
12217
+ ),
12218
+ activeLabel && /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-center font-heading text-sm font-bold uppercase tracking-wide text-foreground", children: activeLabel }),
12219
+ total > 1 && /* @__PURE__ */ jsxs(
12220
+ "span",
12221
+ {
12222
+ className: cn(
12223
+ "shrink-0 font-ui text-sm font-medium tabular-nums text-muted-foreground",
12224
+ !activeLabel && "ml-auto"
12225
+ ),
12226
+ children: [
12227
+ active + 1,
12228
+ " / ",
12229
+ total
12230
+ ]
12231
+ }
12232
+ )
12233
+ ] }),
12234
+ /* @__PURE__ */ jsx(
12235
+ "div",
12236
+ {
12237
+ ref: scrollRef,
12238
+ className: "flex-1 overflow-y-auto overscroll-contain",
12239
+ children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex w-full max-w-3xl flex-col gap-3 py-4", children: items.map(({ photo, index, sectionLabel, isSectionStart }) => {
12240
+ var _a2;
12241
+ return /* @__PURE__ */ jsxs(React20.Fragment, { children: [
12242
+ sectionLabel && isSectionStart && /* @__PURE__ */ jsx(
12243
+ "h2",
12244
+ {
12245
+ className: cn(
12246
+ "px-3 font-heading text-lg font-bold uppercase tracking-wide text-foreground sm:px-4",
12247
+ index > 0 && "mt-3"
12248
+ ),
12249
+ children: sectionLabel
12250
+ }
12251
+ ),
12252
+ /* @__PURE__ */ jsxs(
12253
+ "figure",
12254
+ {
12255
+ "data-index": index,
12256
+ ref: (el) => {
12257
+ itemRefs.current[index] = el;
12258
+ },
12259
+ children: [
12260
+ /* @__PURE__ */ jsx("div", { className: "overflow-hidden bg-muted", children: /* @__PURE__ */ jsx(
12261
+ Picture,
12262
+ {
12263
+ src: photo.src,
12264
+ alt: (_a2 = photo.alt) != null ? _a2 : `Photo ${index + 1}`,
12265
+ title: photo.caption,
12266
+ className: "block h-auto w-full",
12267
+ eager: index < 2,
12268
+ rootMargin: "800px"
12269
+ }
12270
+ ) }),
12271
+ (photo.caption || photo.credit) && /* @__PURE__ */ jsxs("figcaption", { className: "px-3 pt-2 sm:px-4", children: [
12272
+ photo.caption && /* @__PURE__ */ jsx("p", { className: "font-ui text-sm leading-snug text-foreground/80", children: photo.caption }),
12273
+ photo.credit && /* @__PURE__ */ jsxs("p", { className: "font-ui text-xs text-muted-foreground", children: [
12274
+ "\xA9 ",
12275
+ photo.credit
12276
+ ] })
12277
+ ] })
12278
+ ]
12279
+ }
12280
+ )
12281
+ ] }, index);
12282
+ }) })
12283
+ }
12284
+ )
12285
+ ] });
12286
+ }
12287
+ var PhotoTourContext = React20.createContext(null);
12288
+ function PhotoTourProvider({
12289
+ enabled = true,
12290
+ labels,
12291
+ children
12292
+ }) {
12293
+ const entries = React20.useRef(/* @__PURE__ */ new Map());
12294
+ const [open, setOpen] = React20.useState(null);
12295
+ const register = React20.useCallback((entry) => {
12296
+ entries.current.set(entry.id, entry);
12297
+ }, []);
12298
+ const unregister = React20.useCallback((id) => {
12299
+ entries.current.delete(id);
12300
+ }, []);
12301
+ const openTour = React20.useCallback((id, localIndex) => {
12302
+ var _a, _b;
12303
+ const ordered = [...entries.current.values()].filter((e) => e.photos.length).sort((a, b) => {
12304
+ const ea = a.getEl();
12305
+ const eb = b.getEl();
12306
+ if (!ea || !eb) return 0;
12307
+ const pos = ea.compareDocumentPosition(eb);
12308
+ if (pos & Node.DOCUMENT_POSITION_FOLLOWING) return -1;
12309
+ if (pos & Node.DOCUMENT_POSITION_PRECEDING) return 1;
12310
+ return 0;
12311
+ });
12312
+ const targetSrc = (_b = (_a = entries.current.get(id)) == null ? void 0 : _a.photos[localIndex]) == null ? void 0 : _b.src;
12313
+ const seen = /* @__PURE__ */ new Set();
12314
+ const sections = [];
12315
+ for (const entry of ordered) {
12316
+ const photos = entry.photos.filter((p) => {
12317
+ if (seen.has(p.src)) return false;
12318
+ seen.add(p.src);
12319
+ return true;
12320
+ });
12321
+ if (!photos.length) continue;
12322
+ const prev = sections[sections.length - 1];
12323
+ if (prev && prev.label === entry.label) {
12324
+ prev.photos.push(...photos);
12325
+ } else {
12326
+ sections.push({ label: entry.label, photos: [...photos] });
12327
+ }
12328
+ }
12329
+ let index = 0;
12330
+ let running = 0;
12331
+ let done = false;
12332
+ for (const section of sections) {
12333
+ for (const photo of section.photos) {
12334
+ if (photo.src === targetSrc) {
12335
+ index = running;
12336
+ done = true;
12337
+ break;
12338
+ }
12339
+ running += 1;
12340
+ }
12341
+ if (done) break;
12342
+ }
12343
+ setOpen({ sections, index });
12344
+ }, []);
12345
+ const value = React20.useMemo(
12346
+ () => ({ enabled, register, unregister, open: openTour }),
12347
+ [enabled, register, unregister, openTour]
12348
+ );
12349
+ return /* @__PURE__ */ jsxs(PhotoTourContext.Provider, { value, children: [
12350
+ children,
12351
+ open && /* @__PURE__ */ jsx(
12352
+ FeedLightbox,
12353
+ {
12354
+ sections: open.sections,
12355
+ initialIndex: open.index,
12356
+ labels,
12357
+ onClose: () => setOpen(null)
12358
+ }
12359
+ )
12360
+ ] });
12361
+ }
12096
12362
  function PhotoTile({
12097
12363
  photo,
12098
12364
  index,
@@ -12165,7 +12431,7 @@ function GridGallery({
12165
12431
  onOpen,
12166
12432
  labels
12167
12433
  }) {
12168
- const [expanded, setExpanded] = React32.useState(false);
12434
+ const [expanded, setExpanded] = React20.useState(false);
12169
12435
  const cols = gridCols(photos.length);
12170
12436
  const hasMore = photos.length > initialVisible;
12171
12437
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -12197,7 +12463,7 @@ function CompactGridGallery({
12197
12463
  onOpen,
12198
12464
  labels
12199
12465
  }) {
12200
- const [expanded, setExpanded] = React32.useState(false);
12466
+ const [expanded, setExpanded] = React20.useState(false);
12201
12467
  const hasMore = photos.length > initialVisible;
12202
12468
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
12203
12469
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -12228,7 +12494,7 @@ function MasonryGallery({
12228
12494
  onOpen,
12229
12495
  labels
12230
12496
  }) {
12231
- const [expanded, setExpanded] = React32.useState(false);
12497
+ const [expanded, setExpanded] = React20.useState(false);
12232
12498
  const hasMore = photos.length > initialVisible;
12233
12499
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
12234
12500
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -12305,7 +12571,7 @@ function FeaturedGallery({
12305
12571
  onOpen,
12306
12572
  labels
12307
12573
  }) {
12308
- const [expanded, setExpanded] = React32.useState(false);
12574
+ const [expanded, setExpanded] = React20.useState(false);
12309
12575
  const featured = photos.slice(0, 3);
12310
12576
  const extra = photos.slice(3);
12311
12577
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -12420,11 +12686,33 @@ function CarouselGallery({
12420
12686
  const photo = photos[index];
12421
12687
  const prev = () => onIndexChange((index - 1 + total) % total);
12422
12688
  const next = () => onIndexChange((index + 1) % total);
12689
+ const touchStart = React20.useRef(null);
12690
+ const swiped = React20.useRef(false);
12691
+ const onTouchStart = (e) => {
12692
+ const t = e.touches[0];
12693
+ touchStart.current = { x: t.clientX, y: t.clientY };
12694
+ swiped.current = false;
12695
+ };
12696
+ const onTouchEnd = (e) => {
12697
+ const start = touchStart.current;
12698
+ touchStart.current = null;
12699
+ if (!start || total <= 1) return;
12700
+ const t = e.changedTouches[0];
12701
+ const dx = t.clientX - start.x;
12702
+ const dy = t.clientY - start.y;
12703
+ if (Math.abs(dx) > 40 && Math.abs(dx) > Math.abs(dy)) {
12704
+ swiped.current = true;
12705
+ if (dx < 0) next();
12706
+ else prev();
12707
+ }
12708
+ };
12423
12709
  return /* @__PURE__ */ jsxs(
12424
12710
  "div",
12425
12711
  {
12712
+ onTouchStart,
12713
+ onTouchEnd,
12426
12714
  className: cn(
12427
- "relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted group/photo",
12715
+ "relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted group/photo touch-pan-y select-none",
12428
12716
  className
12429
12717
  ),
12430
12718
  children: [
@@ -12432,7 +12720,13 @@ function CarouselGallery({
12432
12720
  "button",
12433
12721
  {
12434
12722
  type: "button",
12435
- onClick: () => onOpen(index),
12723
+ onClick: () => {
12724
+ if (swiped.current) {
12725
+ swiped.current = false;
12726
+ return;
12727
+ }
12728
+ onOpen(index);
12729
+ },
12436
12730
  "aria-label": `Open photo ${index + 1} fullscreen`,
12437
12731
  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",
12438
12732
  children: /* @__PURE__ */ jsx(
@@ -12505,17 +12799,46 @@ function PhotoGallery({
12505
12799
  initialVisible = 6,
12506
12800
  onPhotoClick,
12507
12801
  labels,
12802
+ lightbox: lightboxMode = "classic",
12803
+ tourSection,
12508
12804
  className
12509
12805
  }) {
12510
- const [lightboxIndex, setLightboxIndex] = React32.useState(null);
12511
- const [carouselIndex, setCarouselIndex] = React32.useState(0);
12512
- const normalised = React32.useMemo(() => photos.map(normalise), [photos]);
12806
+ const [lightboxIndex, setLightboxIndex] = React20.useState(null);
12807
+ const [carouselIndex, setCarouselIndex] = React20.useState(0);
12808
+ const normalised = React20.useMemo(() => photos.map(normalise), [photos]);
12809
+ const tour = React20.useContext(PhotoTourContext);
12810
+ const tourId = React20.useId();
12811
+ const markerRef = React20.useRef(null);
12812
+ const inTour = !!((tour == null ? void 0 : tour.enabled) && tourSection);
12813
+ React20.useEffect(() => {
12814
+ if (!inTour || !tour) return;
12815
+ tour.register({
12816
+ id: tourId,
12817
+ label: tourSection,
12818
+ getEl: () => markerRef.current,
12819
+ photos: normalised
12820
+ });
12821
+ return () => tour.unregister(tourId);
12822
+ }, [inTour, tour, tourId, tourSection, normalised]);
12513
12823
  const handleOpen = (index) => {
12514
- setLightboxIndex(index);
12515
12824
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
12825
+ if (inTour && tour) {
12826
+ tour.open(tourId, index);
12827
+ return;
12828
+ }
12829
+ setLightboxIndex(index);
12516
12830
  };
12517
12831
  if (normalised.length === 0) return null;
12518
- const lightbox = lightboxIndex !== null && /* @__PURE__ */ jsx(
12832
+ const tourMarker = inTour && /* @__PURE__ */ jsx("span", { ref: markerRef, "aria-hidden": true, className: "hidden" });
12833
+ const lightbox = lightboxIndex !== null && (lightboxMode === "feed" ? /* @__PURE__ */ jsx(
12834
+ FeedLightbox,
12835
+ {
12836
+ sections: [{ photos: normalised }],
12837
+ initialIndex: lightboxIndex,
12838
+ onClose: () => setLightboxIndex(null),
12839
+ labels
12840
+ }
12841
+ ) : /* @__PURE__ */ jsx(
12519
12842
  Lightbox,
12520
12843
  {
12521
12844
  photos: normalised,
@@ -12523,9 +12846,10 @@ function PhotoGallery({
12523
12846
  onClose: () => setLightboxIndex(null),
12524
12847
  labels
12525
12848
  }
12526
- );
12849
+ ));
12527
12850
  if (variant === "carousel" || variant === "fullBleed") {
12528
12851
  return /* @__PURE__ */ jsxs(Fragment, { children: [
12852
+ tourMarker,
12529
12853
  /* @__PURE__ */ jsx(
12530
12854
  CarouselGallery,
12531
12855
  {
@@ -12544,6 +12868,7 @@ function PhotoGallery({
12544
12868
  ] });
12545
12869
  }
12546
12870
  return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), children: [
12871
+ tourMarker,
12547
12872
  variant === "grid" && /* @__PURE__ */ jsx(
12548
12873
  GridGallery,
12549
12874
  {
@@ -12599,14 +12924,15 @@ function ItineraryDay({
12599
12924
  photoLayout = "rounded",
12600
12925
  className
12601
12926
  }) {
12602
- const photoList = React32.useMemo(() => normalisePhotos(photos), [photos]);
12927
+ const photoList = React20.useMemo(() => normalisePhotos(photos), [photos]);
12603
12928
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
12604
12929
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
12605
12930
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsx(
12606
12931
  PhotoGallery,
12607
12932
  {
12608
12933
  photos: photoList,
12609
- variant: isFullBleed ? "fullBleed" : "carousel"
12934
+ variant: isFullBleed ? "fullBleed" : "carousel",
12935
+ tourSection: dayLabel != null ? dayLabel : `Day ${dayNumber}`
12610
12936
  }
12611
12937
  );
12612
12938
  return /* @__PURE__ */ jsxs("article", { className: cn("w-full flex flex-col gap-5", className), children: [
@@ -12654,8 +12980,8 @@ function MenuTrip({
12654
12980
  bold = true,
12655
12981
  className
12656
12982
  }) {
12657
- const scrollRef = React32.useRef(null);
12658
- React32.useEffect(() => {
12983
+ const scrollRef = React20.useRef(null);
12984
+ React20.useEffect(() => {
12659
12985
  if (!scrollRef.current || !activeSection) return;
12660
12986
  const container = scrollRef.current;
12661
12987
  const btn = container.querySelector(
@@ -12853,8 +13179,8 @@ function PricingTrip({
12853
13179
  className
12854
13180
  }) {
12855
13181
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
12856
- const [showEstimates, setShowEstimates] = React32.useState(false);
12857
- const [showPriceInfo, setShowPriceInfo] = React32.useState(false);
13182
+ const [showEstimates, setShowEstimates] = React20.useState(false);
13183
+ const [showPriceInfo, setShowPriceInfo] = React20.useState(false);
12858
13184
  if (variant === "compact") {
12859
13185
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
12860
13186
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -13290,6 +13616,7 @@ function SiteHeader({
13290
13616
  logoSrcDark = "/logo-planetaexo-green.png",
13291
13617
  logoSrc,
13292
13618
  logoAlt = "Planeta Exo",
13619
+ logoHref = "#",
13293
13620
  languages = DEFAULT_LANGUAGES,
13294
13621
  currentLanguage = "EN",
13295
13622
  onLanguageChange,
@@ -13302,14 +13629,14 @@ function SiteHeader({
13302
13629
  var _a, _b, _c, _d, _e, _f, _g;
13303
13630
  const t = VARIANT[variant];
13304
13631
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
13305
- const [openMenu, setOpenMenu] = React32.useState(null);
13306
- const [langOpen, setLangOpen] = React32.useState(false);
13307
- const [mobileOpen, setMobileOpen] = React32.useState(false);
13308
- const [openMobileSection, setOpenMobileSection] = React32.useState(null);
13309
- const [activeLang, setActiveLang] = React32.useState(currentLanguage);
13632
+ const [openMenu, setOpenMenu] = React20.useState(null);
13633
+ const [langOpen, setLangOpen] = React20.useState(false);
13634
+ const [mobileOpen, setMobileOpen] = React20.useState(false);
13635
+ const [openMobileSection, setOpenMobileSection] = React20.useState(null);
13636
+ const [activeLang, setActiveLang] = React20.useState(currentLanguage);
13310
13637
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
13311
- const menuCloseTimer = React32.useRef(void 0);
13312
- const langCloseTimer = React32.useRef(void 0);
13638
+ const menuCloseTimer = React20.useRef(void 0);
13639
+ const langCloseTimer = React20.useRef(void 0);
13313
13640
  const handleMenuEnter = (label) => {
13314
13641
  clearTimeout(menuCloseTimer.current);
13315
13642
  setOpenMenu(label);
@@ -13330,7 +13657,7 @@ function SiteHeader({
13330
13657
  setOpenMenu(null);
13331
13658
  setLangOpen(false);
13332
13659
  };
13333
- React32.useEffect(() => () => {
13660
+ React20.useEffect(() => () => {
13334
13661
  clearTimeout(menuCloseTimer.current);
13335
13662
  clearTimeout(langCloseTimer.current);
13336
13663
  }, []);
@@ -13368,7 +13695,7 @@ function SiteHeader({
13368
13695
  /* @__PURE__ */ jsx(
13369
13696
  "a",
13370
13697
  {
13371
- href: "#",
13698
+ href: logoHref,
13372
13699
  className: cn(
13373
13700
  "shrink-0 flex items-center",
13374
13701
  "absolute left-1/2 -translate-x-1/2",
@@ -13520,7 +13847,7 @@ function SiteHeader({
13520
13847
  ),
13521
13848
  children: [
13522
13849
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 h-[72px] shrink-0 border-b border-white/8", children: [
13523
- /* @__PURE__ */ jsx("a", { href: "#", className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsx(
13850
+ /* @__PURE__ */ jsx("a", { href: logoHref, className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsx(
13524
13851
  "img",
13525
13852
  {
13526
13853
  src: resolvedLogo,
@@ -13606,7 +13933,7 @@ function SiteHeader({
13606
13933
  ), children: [
13607
13934
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
13608
13935
  const isActive = lang.code === activeLang;
13609
- return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
13936
+ return /* @__PURE__ */ jsxs(React20.Fragment, { children: [
13610
13937
  i > 0 && /* @__PURE__ */ jsx("span", { className: cn(
13611
13938
  "text-xs select-none",
13612
13939
  variant === "white" ? "text-border" : "text-white/15"
@@ -13668,8 +13995,8 @@ function SiteHeader({
13668
13995
  );
13669
13996
  }
13670
13997
  function ThemeToggle({ className }) {
13671
- const [dark, setDark] = React32.useState(false);
13672
- React32.useEffect(() => {
13998
+ const [dark, setDark] = React20.useState(false);
13999
+ React20.useEffect(() => {
13673
14000
  const saved = localStorage.getItem("theme");
13674
14001
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
13675
14002
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -13719,7 +14046,7 @@ var chipVariants = cva(
13719
14046
  }
13720
14047
  }
13721
14048
  );
13722
- var Chip = React32.forwardRef(function Chip2(_a, ref) {
14049
+ var Chip = React20.forwardRef(function Chip2(_a, ref) {
13723
14050
  var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
13724
14051
  const classes = cn(chipVariants({ variant, size }), className);
13725
14052
  if (href) {
@@ -13786,6 +14113,19 @@ var statusConfig = {
13786
14113
  icon: /* @__PURE__ */ jsx(TrendingIcon, {})
13787
14114
  }
13788
14115
  };
14116
+ function StarIcon() {
14117
+ return /* @__PURE__ */ jsx(
14118
+ "svg",
14119
+ {
14120
+ width: "15",
14121
+ height: "15",
14122
+ viewBox: "0 0 24 24",
14123
+ fill: "currentColor",
14124
+ "aria-hidden": "true",
14125
+ children: /* @__PURE__ */ 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" })
14126
+ }
14127
+ );
14128
+ }
13789
14129
  function HeartIcon({ filled = false }) {
13790
14130
  return /* @__PURE__ */ jsx(
13791
14131
  "svg",
@@ -13803,7 +14143,7 @@ function HeartIcon({ filled = false }) {
13803
14143
  );
13804
14144
  }
13805
14145
  function TripCardEditorial(props) {
13806
- var _a, _b, _c, _d;
14146
+ var _a, _b, _c, _d, _e, _f;
13807
14147
  const {
13808
14148
  image,
13809
14149
  imageAlt = "",
@@ -13820,10 +14160,14 @@ function TripCardEditorial(props) {
13820
14160
  location,
13821
14161
  locationHref,
13822
14162
  difficulty,
14163
+ rating,
14164
+ reviewCount,
13823
14165
  tag,
13824
14166
  tagHref
13825
14167
  } = props;
13826
- const [internalFav, setInternalFav] = React32.useState(false);
14168
+ const hasRating = typeof rating === "number" && rating > 0;
14169
+ const reviewsWord = reviewCount === 1 ? (_a = labels == null ? void 0 : labels.review) != null ? _a : "review" : (_b = labels == null ? void 0 : labels.reviews) != null ? _b : "reviews";
14170
+ const [internalFav, setInternalFav] = React20.useState(false);
13827
14171
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
13828
14172
  const handleFav = (e) => {
13829
14173
  e.preventDefault();
@@ -13865,7 +14209,7 @@ function TripCardEditorial(props) {
13865
14209
  "button",
13866
14210
  {
13867
14211
  type: "button",
13868
- "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",
14212
+ "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",
13869
14213
  "aria-pressed": favorited,
13870
14214
  onClick: handleFav,
13871
14215
  className: cn(
@@ -13879,7 +14223,24 @@ function TripCardEditorial(props) {
13879
14223
  ),
13880
14224
  /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0 p-5 text-white", children: /* @__PURE__ */ jsx("h3", { className: "text-lg sm:text-xl font-bold font-heading leading-tight", children: title }) })
13881
14225
  ] }),
13882
- (description || price || nights || location || difficulty) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
14226
+ (description || price || nights || location || difficulty || hasRating) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
14227
+ hasRating && /* @__PURE__ */ jsxs(
14228
+ "div",
14229
+ {
14230
+ className: "flex items-center gap-1.5 text-foreground/85",
14231
+ "aria-label": reviewCount ? `${rating.toFixed(1)} (${reviewCount} ${reviewsWord})` : `${rating.toFixed(1)}`,
14232
+ children: [
14233
+ /* @__PURE__ */ jsx("span", { className: "text-amber-500", children: /* @__PURE__ */ jsx(StarIcon, {}) }),
14234
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-ui font-semibold", children: rating.toFixed(1) }),
14235
+ reviewCount ? /* @__PURE__ */ jsxs("span", { className: "text-xs font-ui text-muted-foreground", children: [
14236
+ "\xB7 ",
14237
+ reviewCount,
14238
+ " ",
14239
+ reviewsWord
14240
+ ] }) : null
14241
+ ]
14242
+ }
14243
+ ),
13883
14244
  (location || difficulty) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
13884
14245
  location ? locationHref ? (
13885
14246
  // Above the card's stretched link (z-20) so the location is
@@ -13909,7 +14270,7 @@ function TripCardEditorial(props) {
13909
14270
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13910
14271
  nights,
13911
14272
  " ",
13912
- nights === 1 ? (_c = labels == null ? void 0 : labels.night) != null ? _c : "night" : (_d = labels == null ? void 0 : labels.nights) != null ? _d : "nights"
14273
+ nights === 1 ? (_e = labels == null ? void 0 : labels.night) != null ? _e : "night" : (_f = labels == null ? void 0 : labels.nights) != null ? _f : "nights"
13913
14274
  ] })
13914
14275
  ] }) : /* @__PURE__ */ jsx("span", {}),
13915
14276
  price && /* @__PURE__ */ jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
@@ -14338,7 +14699,7 @@ function BlogPost({
14338
14699
  ) }),
14339
14700
  /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
14340
14701
  /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-3xl px-6 sm:px-8 pb-9 sm:pb-11", children: [
14341
- breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
14702
+ breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(React20.Fragment, { children: [
14342
14703
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
14343
14704
  crumb.href ? /* @__PURE__ */ jsx(
14344
14705
  "a",
@@ -14392,7 +14753,7 @@ function BlogPost({
14392
14753
  ] });
14393
14754
  }
14394
14755
  function useHlsVideo(videoRef, src) {
14395
- React32.useEffect(() => {
14756
+ React20.useEffect(() => {
14396
14757
  if (!src || !videoRef.current) return;
14397
14758
  const video = videoRef.current;
14398
14759
  if (!src.includes(".m3u8")) return;
@@ -14438,11 +14799,11 @@ function TripHeader({
14438
14799
  className
14439
14800
  }) {
14440
14801
  var _a, _b, _c, _d, _e, _f, _g;
14441
- const [heroIndex, setHeroIndex] = React32.useState(0);
14442
- const [videoReady, setVideoReady] = React32.useState(false);
14443
- const videoRef = React32.useRef(null);
14802
+ const [heroIndex, setHeroIndex] = React20.useState(0);
14803
+ const [videoReady, setVideoReady] = React20.useState(false);
14804
+ const videoRef = React20.useRef(null);
14444
14805
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
14445
- const validImages = React32.useMemo(
14806
+ const validImages = React20.useMemo(
14446
14807
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
14447
14808
  [images]
14448
14809
  );
@@ -14457,7 +14818,7 @@ function TripHeader({
14457
14818
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
14458
14819
  const hasMeta = !!(destination || duration || groupSize);
14459
14820
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
14460
- React32.useEffect(() => {
14821
+ React20.useEffect(() => {
14461
14822
  if (!videoUrl) return;
14462
14823
  const el = videoRef.current;
14463
14824
  if (!el) return;
@@ -14600,7 +14961,7 @@ function TripHeader({
14600
14961
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
14601
14962
  ),
14602
14963
  children: [
14603
- breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
14964
+ breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(React20.Fragment, { children: [
14604
14965
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
14605
14966
  /* @__PURE__ */ jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
14606
14967
  ] }, i)) }),
@@ -14770,10 +15131,10 @@ function LanguagePicker({
14770
15131
  }) {
14771
15132
  var _a;
14772
15133
  const t = VARIANT2[variant];
14773
- const [open, setOpen] = React32.useState(false);
14774
- const ref = React32.useRef(null);
15134
+ const [open, setOpen] = React20.useState(false);
15135
+ const ref = React20.useRef(null);
14775
15136
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
14776
- React32.useEffect(() => {
15137
+ React20.useEffect(() => {
14777
15138
  if (!open) return;
14778
15139
  const onDocClick = (e) => {
14779
15140
  if (ref.current && !ref.current.contains(e.target)) {
@@ -14981,7 +15342,7 @@ function SiteFooter({
14981
15342
  children: wrapper
14982
15343
  },
14983
15344
  b.alt + i
14984
- ) : /* @__PURE__ */ jsx(React32.Fragment, { children: wrapper }, b.alt + i);
15345
+ ) : /* @__PURE__ */ jsx(React20.Fragment, { children: wrapper }, b.alt + i);
14985
15346
  }) })
14986
15347
  ] }),
14987
15348
  themes.length > 0 && /* @__PURE__ */ jsxs("div", { className: "lg:col-span-3", children: [
@@ -15069,7 +15430,7 @@ function SiteFooter({
15069
15430
  }
15070
15431
  function Stars({ count = 5 }) {
15071
15432
  return /* @__PURE__ */ jsx("span", { className: "flex gap-0.5", children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx(
15072
- StarIcon,
15433
+ StarIcon$1,
15073
15434
  {
15074
15435
  className: cn(
15075
15436
  "h-3.5 w-3.5",
@@ -15123,6 +15484,7 @@ function TripPage({
15123
15484
  itinerary,
15124
15485
  itineraryDays,
15125
15486
  gallery,
15487
+ galleryLightbox = "classic",
15126
15488
  included,
15127
15489
  notIncluded,
15128
15490
  whatToBring,
@@ -15162,15 +15524,16 @@ function TripPage({
15162
15524
  fromLabel,
15163
15525
  perPersonLabel,
15164
15526
  siteHeader,
15527
+ footerBadges,
15165
15528
  uiVariant = "v1",
15166
15529
  features,
15167
15530
  className
15168
15531
  }) {
15169
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
15170
- const [activeSection, setActiveSection] = React32.useState("");
15171
- const [accordionValue, setAccordionValue] = React32.useState([]);
15172
- const [faqsExpanded, setFaqsExpanded] = React32.useState(false);
15173
- const accordionSectionIds = React32.useMemo(
15532
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
15533
+ const [activeSection, setActiveSection] = React20.useState("");
15534
+ const [accordionValue, setAccordionValue] = React20.useState([]);
15535
+ const [faqsExpanded, setFaqsExpanded] = React20.useState(false);
15536
+ const accordionSectionIds = React20.useMemo(
15174
15537
  () => /* @__PURE__ */ new Set([
15175
15538
  "when-it-operates",
15176
15539
  "how-to-get-there",
@@ -15184,18 +15547,18 @@ function TripPage({
15184
15547
  ]),
15185
15548
  []
15186
15549
  );
15187
- const [navFloating, setNavFloating] = React32.useState(false);
15188
- const [navHidden, setNavHidden] = React32.useState(false);
15189
- const [isFloating, setIsFloating] = React32.useState(false);
15190
- const [sidebarPos, setSidebarPos] = React32.useState(null);
15191
- const [pricingBarVisible, setPricingBarVisible] = React32.useState(false);
15192
- const navRef = React32.useRef(null);
15193
- const navSentinelRef = React32.useRef(null);
15194
- const sentinelRef = React32.useRef(null);
15195
- const sidebarPlaceholderRef = React32.useRef(null);
15196
- const pricingBarRef = React32.useRef(null);
15197
- const galleryRef = React32.useRef(null);
15198
- const sections = React32.useMemo(
15550
+ const [navFloating, setNavFloating] = React20.useState(false);
15551
+ const [navHidden, setNavHidden] = React20.useState(false);
15552
+ const [isFloating, setIsFloating] = React20.useState(false);
15553
+ const [sidebarPos, setSidebarPos] = React20.useState(null);
15554
+ const [pricingBarVisible, setPricingBarVisible] = React20.useState(false);
15555
+ const navRef = React20.useRef(null);
15556
+ const navSentinelRef = React20.useRef(null);
15557
+ const sentinelRef = React20.useRef(null);
15558
+ const sidebarPlaceholderRef = React20.useRef(null);
15559
+ const pricingBarRef = React20.useRef(null);
15560
+ const galleryRef = React20.useRef(null);
15561
+ const sections = React20.useMemo(
15199
15562
  () => {
15200
15563
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
15201
15564
  return [
@@ -15217,7 +15580,7 @@ function TripPage({
15217
15580
  // eslint-disable-next-line react-hooks/exhaustive-deps
15218
15581
  []
15219
15582
  );
15220
- React32.useEffect(() => {
15583
+ React20.useEffect(() => {
15221
15584
  const sentinel = navSentinelRef.current;
15222
15585
  if (!sentinel) return;
15223
15586
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -15225,7 +15588,7 @@ function TripPage({
15225
15588
  update();
15226
15589
  return () => document.removeEventListener("scroll", update, { capture: true });
15227
15590
  }, []);
15228
- React32.useEffect(() => {
15591
+ React20.useEffect(() => {
15229
15592
  const sentinel = sentinelRef.current;
15230
15593
  if (!sentinel) return;
15231
15594
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -15233,7 +15596,7 @@ function TripPage({
15233
15596
  update();
15234
15597
  return () => document.removeEventListener("scroll", update, { capture: true });
15235
15598
  }, []);
15236
- React32.useEffect(() => {
15599
+ React20.useEffect(() => {
15237
15600
  const measure = () => {
15238
15601
  if (!sidebarPlaceholderRef.current) return;
15239
15602
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -15243,7 +15606,7 @@ function TripPage({
15243
15606
  window.addEventListener("resize", measure);
15244
15607
  return () => window.removeEventListener("resize", measure);
15245
15608
  }, [isFloating]);
15246
- React32.useEffect(() => {
15609
+ React20.useEffect(() => {
15247
15610
  const check = () => {
15248
15611
  var _a2;
15249
15612
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -15254,7 +15617,7 @@ function TripPage({
15254
15617
  check();
15255
15618
  return () => document.removeEventListener("scroll", check, { capture: true });
15256
15619
  }, []);
15257
- React32.useEffect(() => {
15620
+ React20.useEffect(() => {
15258
15621
  const check = () => {
15259
15622
  if (!pricingBarRef.current) return;
15260
15623
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -15263,7 +15626,7 @@ function TripPage({
15263
15626
  check();
15264
15627
  return () => document.removeEventListener("scroll", check, { capture: true });
15265
15628
  }, []);
15266
- React32.useEffect(() => {
15629
+ React20.useEffect(() => {
15267
15630
  if (sections.length === 0) return;
15268
15631
  setActiveSection(sections[0].id);
15269
15632
  const update = () => {
@@ -15321,468 +15684,483 @@ function TripPage({
15321
15684
  }
15322
15685
  performScroll();
15323
15686
  };
15324
- return /* @__PURE__ */ jsxs(
15325
- "div",
15687
+ return /* @__PURE__ */ jsx(
15688
+ PhotoTourProvider,
15326
15689
  {
15327
- className: cn("w-full overflow-x-hidden", className),
15328
- "data-ui-variant": uiVariant,
15329
- "data-features": features ? JSON.stringify(features) : void 0,
15330
- children: [
15331
- /* @__PURE__ */ jsx(
15332
- TripHeader,
15333
- {
15334
- images,
15335
- videoUrl,
15336
- title,
15337
- breadcrumb,
15338
- destination,
15339
- duration,
15340
- groupSize,
15341
- labels: {
15342
- night: labels == null ? void 0 : labels.night,
15343
- nights: labels == null ? void 0 : labels.nights,
15344
- day: labels == null ? void 0 : labels.day,
15345
- days: labels == null ? void 0 : labels.days,
15346
- previousImage: labels == null ? void 0 : labels.previousImage,
15347
- nextImage: labels == null ? void 0 : labels.nextImage
15348
- },
15349
- tagline,
15350
- chips,
15351
- siteHeader,
15352
- uiVariant,
15353
- belowMeta: trustpilotHero ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
15354
- }
15355
- ),
15356
- /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
15357
- highlights && highlights.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-6 flex flex-wrap justify-center gap-6 py-2", children: highlights.map((h, i) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 text-center", children: [
15358
- h.icon && /* @__PURE__ */ jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full border-2 border-border text-foreground", children: h.icon }),
15359
- /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
15360
- ] }, i)) }),
15361
- /* @__PURE__ */ jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
15362
- sections.length > 0 ? /* @__PURE__ */ jsx(
15363
- "div",
15364
- {
15365
- className: cn(
15366
- "pt-8 pb-2 flex justify-center transition-opacity duration-150",
15367
- navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
15368
- ),
15369
- children: /* @__PURE__ */ jsx(
15370
- MenuTrip,
15690
+ enabled: galleryLightbox === "feed",
15691
+ labels: {
15692
+ close: labels == null ? void 0 : labels.galleryClose,
15693
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15694
+ next: labels == null ? void 0 : labels.galleryNext
15695
+ },
15696
+ children: /* @__PURE__ */ jsxs(
15697
+ "div",
15698
+ {
15699
+ className: cn("w-full overflow-x-hidden", className),
15700
+ "data-ui-variant": uiVariant,
15701
+ "data-features": features ? JSON.stringify(features) : void 0,
15702
+ children: [
15703
+ /* @__PURE__ */ jsx(
15704
+ TripHeader,
15705
+ {
15706
+ images,
15707
+ videoUrl,
15708
+ title,
15709
+ breadcrumb,
15710
+ destination,
15711
+ duration,
15712
+ groupSize,
15713
+ labels: {
15714
+ night: labels == null ? void 0 : labels.night,
15715
+ nights: labels == null ? void 0 : labels.nights,
15716
+ day: labels == null ? void 0 : labels.day,
15717
+ days: labels == null ? void 0 : labels.days,
15718
+ previousImage: labels == null ? void 0 : labels.previousImage,
15719
+ nextImage: labels == null ? void 0 : labels.nextImage
15720
+ },
15721
+ tagline,
15722
+ chips,
15723
+ siteHeader,
15724
+ uiVariant,
15725
+ belowMeta: trustpilotHero ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
15726
+ }
15727
+ ),
15728
+ /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
15729
+ highlights && highlights.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-6 flex flex-wrap justify-center gap-6 py-2", children: highlights.map((h, i) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 text-center", children: [
15730
+ h.icon && /* @__PURE__ */ jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full border-2 border-border text-foreground", children: h.icon }),
15731
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
15732
+ ] }, i)) }),
15733
+ /* @__PURE__ */ jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
15734
+ sections.length > 0 ? /* @__PURE__ */ jsx(
15735
+ "div",
15371
15736
  {
15372
- sections,
15373
- activeSection,
15374
- onSelect: scrollToSection,
15375
- variant: "floating"
15737
+ className: cn(
15738
+ "pt-8 pb-2 flex justify-center transition-opacity duration-150",
15739
+ navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
15740
+ ),
15741
+ children: /* @__PURE__ */ jsx(
15742
+ MenuTrip,
15743
+ {
15744
+ sections,
15745
+ activeSection,
15746
+ onSelect: scrollToSection,
15747
+ variant: "floating"
15748
+ }
15749
+ )
15376
15750
  }
15377
- )
15378
- }
15379
- ) : /* @__PURE__ */ jsx(Separator, { className: "my-6" }),
15380
- /* @__PURE__ */ jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
15381
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
15382
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
15383
- (overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
15384
- /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-4", children: (_a = labels == null ? void 0 : labels.overview) != null ? _a : "Overview" }),
15385
- overview && /* @__PURE__ */ jsx("div", { className: "text-lg text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview }),
15386
- overviewHighlights && overviewHighlights.length > 0 && /* @__PURE__ */ jsx("ul", { className: cn("flex flex-col gap-5", overview && "mt-8"), children: overviewHighlights.map((h, i) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-4", children: [
15387
- h.icon && /* @__PURE__ */ 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 }),
15388
- /* @__PURE__ */ jsx("div", { className: "flex-1 pt-1 text-base text-foreground leading-relaxed [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: h.description })
15389
- ] }, i)) }),
15390
- recommendedFor && /* @__PURE__ */ jsxs("div", { className: "mt-6 flex items-start gap-2.5 rounded-xl bg-primary/8 border border-primary/20 p-4", children: [
15391
- /* @__PURE__ */ jsx(UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
15392
- /* @__PURE__ */ jsxs("p", { className: "text-base text-foreground font-ui", children: [
15393
- /* @__PURE__ */ jsx("span", { className: "font-semibold", children: "Recommended for: " }),
15394
- recommendedFor
15395
- ] })
15396
- ] })
15397
- ] }),
15398
- itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15399
- /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_b = labels == null ? void 0 : labels.itinerary) != null ? _b : "Itinerary" }),
15400
- /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsx(
15401
- ItineraryDay,
15402
- __spreadProps(__spreadValues({}, day), {
15403
- photoLayout: "fullBleedBottom"
15404
- }),
15405
- day.dayNumber
15406
- )) })
15407
- ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15408
- /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
15409
- /* @__PURE__ */ jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
15410
- ] }),
15411
- included && included.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
15412
- /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15413
- (sectionIcons == null ? void 0 : sectionIcons.whatIsIncluded) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatIsIncluded }) : /* @__PURE__ */ jsx(PackageIcon, { className: "h-5 w-5 text-primary" }),
15414
- (_d = labels == null ? void 0 : labels.whatIsIncluded) != null ? _d : "Included"
15415
- ] }),
15416
- /* @__PURE__ */ jsx(Checklist, { items: included })
15417
- ] }),
15418
- notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
15419
- /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15420
- /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5 text-muted-foreground" }),
15421
- (_e = labels == null ? void 0 : labels.notIncluded) != null ? _e : "Not included"
15422
- ] }),
15423
- /* @__PURE__ */ jsx(
15424
- Checklist,
15425
- {
15426
- items: notIncluded,
15427
- icon: /* @__PURE__ */ jsx(XIcon, { className: "h-4 w-4 text-muted-foreground" })
15428
- }
15429
- )
15430
- ] }),
15431
- (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__ */ jsxs(
15432
- Accordion,
15433
- {
15434
- multiple: false,
15435
- value: accordionValue,
15436
- onValueChange: setAccordionValue,
15437
- className: "border-t border-border",
15438
- children: [
15439
- whenItOperates && /* @__PURE__ */ jsxs(
15440
- AccordionItem,
15441
- {
15442
- value: "when-it-operates",
15443
- id: "trip-section-when-it-operates",
15444
- className: "scroll-mt-20 border-b border-border",
15445
- children: [
15446
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15447
- (sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsx(CalendarIcon, { className: "h-5 w-5 text-primary" }),
15448
- (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
15449
- ] }) }),
15450
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-bold [&_a]:text-primary [&_a]:underline", children: whenItOperates }) })
15451
- ]
15452
- }
15453
- ),
15454
- (accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxs(
15455
- AccordionItem,
15456
- {
15457
- value: "accommodation",
15458
- id: "trip-section-accommodation",
15459
- className: "scroll-mt-20 border-b border-border",
15460
- children: [
15461
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15462
- (sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsx(BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
15463
- (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
15464
- ] }) }),
15465
- /* @__PURE__ */ jsxs(AccordionContent, { className: "pb-6", children: [
15466
- accommodation && /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }),
15467
- accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsx(
15468
- PhotoGallery,
15469
- {
15470
- labels: {
15471
- seeMore: labels == null ? void 0 : labels.seeMore,
15472
- showLess: labels == null ? void 0 : labels.showLess,
15473
- close: labels == null ? void 0 : labels.galleryClose,
15474
- previous: labels == null ? void 0 : labels.galleryPrevious,
15475
- next: labels == null ? void 0 : labels.galleryNext
15476
- },
15477
- photos: accommodationGallery,
15478
- variant: accommodationGalleryVariant,
15479
- initialVisible: 6
15480
- }
15481
- ) })
15482
- ] })
15483
- ]
15484
- }
15485
- ),
15486
- (food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxs(
15487
- AccordionItem,
15488
- {
15489
- value: "food",
15490
- id: "trip-section-food",
15491
- className: "scroll-mt-20 border-b border-border",
15492
- children: [
15493
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15494
- (sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsx(UtensilsIcon, { className: "h-5 w-5 text-primary" }),
15495
- (_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
15496
- ] }) }),
15497
- /* @__PURE__ */ jsxs(AccordionContent, { className: "pb-6", children: [
15498
- food && /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }),
15499
- foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsx(
15500
- PhotoGallery,
15501
- {
15502
- labels: {
15503
- seeMore: labels == null ? void 0 : labels.seeMore,
15504
- showLess: labels == null ? void 0 : labels.showLess,
15505
- close: labels == null ? void 0 : labels.galleryClose,
15506
- previous: labels == null ? void 0 : labels.galleryPrevious,
15507
- next: labels == null ? void 0 : labels.galleryNext
15508
- },
15509
- photos: foodGallery,
15510
- variant: foodGalleryVariant,
15511
- initialVisible: 6
15512
- }
15513
- ) })
15514
- ] })
15515
- ]
15516
- }
15517
- ),
15518
- (meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxs(
15519
- AccordionItem,
15520
- {
15521
- value: "meeting",
15522
- id: "trip-section-meeting",
15523
- className: "scroll-mt-20 border-b border-border",
15524
- children: [
15525
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15526
- (sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsx(MapPinIcon, { className: "h-5 w-5 text-primary" }),
15527
- (_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
15528
- ] }) }),
15529
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
15530
- var _a2, _b2, _c2;
15531
- return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15532
- /* @__PURE__ */ jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
15533
- /* @__PURE__ */ jsxs("div", { children: [
15534
- mp.type && /* @__PURE__ */ 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" }),
15535
- /* @__PURE__ */ jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15536
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15537
- ] })
15538
- ] }, i);
15539
- }) }) })
15540
- ]
15541
- }
15542
- ),
15543
- howToGetThere && /* @__PURE__ */ jsxs(
15544
- AccordionItem,
15545
- {
15546
- value: "how-to-get-there",
15547
- id: "trip-section-how-to-get-there",
15548
- className: "scroll-mt-20 border-b border-border",
15549
- children: [
15550
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15551
- (sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsx(CompassIcon, { className: "h-5 w-5 text-primary" }),
15552
- (_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
15553
- ] }) }),
15554
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: howToGetThere }) })
15555
- ]
15556
- }
15557
- ),
15558
- weather && /* @__PURE__ */ jsxs(
15559
- AccordionItem,
15560
- {
15561
- value: "weather",
15562
- id: "trip-section-weather",
15563
- className: "scroll-mt-20 border-b border-border",
15564
- children: [
15565
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15566
- (sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsx(SunIcon, { className: "h-5 w-5 text-primary" }),
15567
- (_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
15568
- ] }) }),
15569
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: weather }) })
15570
- ]
15571
- }
15572
- ),
15573
- whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxs(
15574
- AccordionItem,
15575
- {
15576
- value: "what-to-bring",
15577
- id: "trip-section-what-to-bring",
15578
- className: "scroll-mt-20 border-b border-border",
15579
- children: [
15580
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15581
- (sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsx(BackpackIcon, { className: "h-5 w-5 text-primary" }),
15582
- (_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
15583
- ] }) }),
15584
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsx(InfoIcon, { className: "h-4 w-4" }) }) })
15585
- ]
15586
- }
15587
- ),
15588
- optionalExtras && /* @__PURE__ */ jsxs(
15589
- AccordionItem,
15590
- {
15591
- value: "optional-extras",
15592
- id: "trip-section-optional-extras",
15593
- className: "scroll-mt-20 border-b border-border",
15594
- children: [
15595
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15596
- (sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsx(CherryIcon, { className: "h-5 w-5 text-primary" }),
15597
- (_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
15598
- ] }) }),
15599
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: optionalExtras }) })
15600
- ]
15601
- }
15602
- ),
15603
- termsAndConditions && /* @__PURE__ */ jsxs(
15604
- AccordionItem,
15751
+ ) : /* @__PURE__ */ jsx(Separator, { className: "my-6" }),
15752
+ /* @__PURE__ */ jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
15753
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
15754
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
15755
+ (overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
15756
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-4", children: (_a = labels == null ? void 0 : labels.overview) != null ? _a : "Overview" }),
15757
+ overview && /* @__PURE__ */ jsx("div", { className: "text-lg text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview }),
15758
+ overviewHighlights && overviewHighlights.length > 0 && /* @__PURE__ */ jsx("ul", { className: cn("flex flex-col gap-5", overview && "mt-8"), children: overviewHighlights.map((h, i) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-4", children: [
15759
+ h.icon && /* @__PURE__ */ 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 }),
15760
+ /* @__PURE__ */ jsx("div", { className: "flex-1 pt-1 text-base text-foreground leading-relaxed [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: h.description })
15761
+ ] }, i)) }),
15762
+ recommendedFor && /* @__PURE__ */ jsxs("div", { className: "mt-6 flex items-start gap-2.5 rounded-xl bg-primary/8 border border-primary/20 p-4", children: [
15763
+ /* @__PURE__ */ jsx(UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
15764
+ /* @__PURE__ */ jsxs("p", { className: "text-base text-foreground font-ui", children: [
15765
+ /* @__PURE__ */ jsx("span", { className: "font-semibold", children: "Recommended for: " }),
15766
+ recommendedFor
15767
+ ] })
15768
+ ] })
15769
+ ] }),
15770
+ itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15771
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_b = labels == null ? void 0 : labels.itinerary) != null ? _b : "Itinerary" }),
15772
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsx(
15773
+ ItineraryDay,
15774
+ __spreadProps(__spreadValues({}, day), {
15775
+ photoLayout: "fullBleedBottom"
15776
+ }),
15777
+ day.dayNumber
15778
+ )) })
15779
+ ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15780
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
15781
+ /* @__PURE__ */ jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
15782
+ ] }),
15783
+ included && included.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
15784
+ /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15785
+ (sectionIcons == null ? void 0 : sectionIcons.whatIsIncluded) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatIsIncluded }) : /* @__PURE__ */ jsx(PackageIcon, { className: "h-5 w-5 text-primary" }),
15786
+ (_d = labels == null ? void 0 : labels.whatIsIncluded) != null ? _d : "Included"
15787
+ ] }),
15788
+ /* @__PURE__ */ jsx(Checklist, { items: included })
15789
+ ] }),
15790
+ notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
15791
+ /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15792
+ /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5 text-muted-foreground" }),
15793
+ (_e = labels == null ? void 0 : labels.notIncluded) != null ? _e : "Not included"
15794
+ ] }),
15795
+ /* @__PURE__ */ jsx(
15796
+ Checklist,
15605
15797
  {
15606
- value: "terms",
15607
- id: "trip-section-terms",
15608
- className: "scroll-mt-20 border-b border-border",
15609
- children: [
15610
- /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15611
- (sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsx(ReceiptIcon, { className: "h-5 w-5 text-primary" }),
15612
- (_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
15613
- ] }) }),
15614
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: termsAndConditions }) })
15615
- ]
15798
+ items: notIncluded,
15799
+ icon: /* @__PURE__ */ jsx(XIcon, { className: "h-4 w-4 text-muted-foreground" })
15616
15800
  }
15617
15801
  )
15618
- ]
15619
- }
15620
- ),
15621
- faqs && faqs.length > 0 && (() => {
15622
- var _a2, _b2, _c2;
15623
- const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
15624
- const hiddenCount = faqs.length - visibleFaqs.length;
15625
- return /* @__PURE__ */ jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
15626
- /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_a2 = labels == null ? void 0 : labels.faq) != null ? _a2 : "FAQ" }),
15627
- /* @__PURE__ */ jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxs(AccordionItem, { value: `faq-${i}`, children: [
15628
- /* @__PURE__ */ jsx(AccordionTrigger, { children: faq.question }),
15629
- /* @__PURE__ */ jsx(AccordionContent, { children: faq.answer })
15630
- ] }, i)) }),
15631
- faqs.length > faqInitialCount && /* @__PURE__ */ jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsx(
15632
- "button",
15802
+ ] }),
15803
+ (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__ */ jsxs(
15804
+ Accordion,
15633
15805
  {
15634
- type: "button",
15635
- onClick: () => setFaqsExpanded((v) => !v),
15636
- className: cn(
15637
- "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15638
- "text-sm font-semibold text-foreground shadow-sm",
15639
- "hover:bg-muted transition-colors duration-150",
15640
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15641
- ),
15642
- children: faqsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
15643
- /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15644
- (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
15645
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15646
- /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15647
- (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
15648
- " (",
15649
- hiddenCount,
15650
- ")"
15651
- ] })
15806
+ multiple: false,
15807
+ value: accordionValue,
15808
+ onValueChange: setAccordionValue,
15809
+ className: "border-t border-border",
15810
+ children: [
15811
+ whenItOperates && /* @__PURE__ */ jsxs(
15812
+ AccordionItem,
15813
+ {
15814
+ value: "when-it-operates",
15815
+ id: "trip-section-when-it-operates",
15816
+ className: "scroll-mt-20 border-b border-border",
15817
+ children: [
15818
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15819
+ (sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsx(CalendarIcon, { className: "h-5 w-5 text-primary" }),
15820
+ (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
15821
+ ] }) }),
15822
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-bold [&_a]:text-primary [&_a]:underline", children: whenItOperates }) })
15823
+ ]
15824
+ }
15825
+ ),
15826
+ (accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxs(
15827
+ AccordionItem,
15828
+ {
15829
+ value: "accommodation",
15830
+ id: "trip-section-accommodation",
15831
+ className: "scroll-mt-20 border-b border-border",
15832
+ children: [
15833
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15834
+ (sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsx(BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
15835
+ (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
15836
+ ] }) }),
15837
+ /* @__PURE__ */ jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
15838
+ accommodation && /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }),
15839
+ accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsx(
15840
+ PhotoGallery,
15841
+ {
15842
+ labels: {
15843
+ seeMore: labels == null ? void 0 : labels.seeMore,
15844
+ showLess: labels == null ? void 0 : labels.showLess,
15845
+ close: labels == null ? void 0 : labels.galleryClose,
15846
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15847
+ next: labels == null ? void 0 : labels.galleryNext
15848
+ },
15849
+ photos: accommodationGallery,
15850
+ variant: accommodationGalleryVariant,
15851
+ initialVisible: 6,
15852
+ tourSection: (_h = labels == null ? void 0 : labels.accommodation) != null ? _h : "Accommodation"
15853
+ }
15854
+ ) })
15855
+ ] })
15856
+ ]
15857
+ }
15858
+ ),
15859
+ (food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxs(
15860
+ AccordionItem,
15861
+ {
15862
+ value: "food",
15863
+ id: "trip-section-food",
15864
+ className: "scroll-mt-20 border-b border-border",
15865
+ children: [
15866
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15867
+ (sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsx(UtensilsIcon, { className: "h-5 w-5 text-primary" }),
15868
+ (_i = labels == null ? void 0 : labels.food) != null ? _i : "Food"
15869
+ ] }) }),
15870
+ /* @__PURE__ */ jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
15871
+ food && /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }),
15872
+ foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsx(
15873
+ PhotoGallery,
15874
+ {
15875
+ labels: {
15876
+ seeMore: labels == null ? void 0 : labels.seeMore,
15877
+ showLess: labels == null ? void 0 : labels.showLess,
15878
+ close: labels == null ? void 0 : labels.galleryClose,
15879
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15880
+ next: labels == null ? void 0 : labels.galleryNext
15881
+ },
15882
+ photos: foodGallery,
15883
+ variant: foodGalleryVariant,
15884
+ initialVisible: 6,
15885
+ tourSection: (_j = labels == null ? void 0 : labels.food) != null ? _j : "Food"
15886
+ }
15887
+ ) })
15888
+ ] })
15889
+ ]
15890
+ }
15891
+ ),
15892
+ (meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxs(
15893
+ AccordionItem,
15894
+ {
15895
+ value: "meeting",
15896
+ id: "trip-section-meeting",
15897
+ className: "scroll-mt-20 border-b border-border",
15898
+ children: [
15899
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15900
+ (sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsx(MapPinIcon, { className: "h-5 w-5 text-primary" }),
15901
+ (_k = labels == null ? void 0 : labels.meetingPoint) != null ? _k : "Meeting point"
15902
+ ] }) }),
15903
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
15904
+ var _a2, _b2, _c2;
15905
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15906
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
15907
+ /* @__PURE__ */ jsxs("div", { children: [
15908
+ mp.type && /* @__PURE__ */ 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" }),
15909
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15910
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15911
+ ] })
15912
+ ] }, i);
15913
+ }) }) })
15914
+ ]
15915
+ }
15916
+ ),
15917
+ howToGetThere && /* @__PURE__ */ jsxs(
15918
+ AccordionItem,
15919
+ {
15920
+ value: "how-to-get-there",
15921
+ id: "trip-section-how-to-get-there",
15922
+ className: "scroll-mt-20 border-b border-border",
15923
+ children: [
15924
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15925
+ (sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsx(CompassIcon, { className: "h-5 w-5 text-primary" }),
15926
+ (_l = labels == null ? void 0 : labels.howToGetThere) != null ? _l : "How to get there"
15927
+ ] }) }),
15928
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: howToGetThere }) })
15929
+ ]
15930
+ }
15931
+ ),
15932
+ weather && /* @__PURE__ */ jsxs(
15933
+ AccordionItem,
15934
+ {
15935
+ value: "weather",
15936
+ id: "trip-section-weather",
15937
+ className: "scroll-mt-20 border-b border-border",
15938
+ children: [
15939
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15940
+ (sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsx(SunIcon, { className: "h-5 w-5 text-primary" }),
15941
+ (_m = labels == null ? void 0 : labels.weather) != null ? _m : "Weather"
15942
+ ] }) }),
15943
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: weather }) })
15944
+ ]
15945
+ }
15946
+ ),
15947
+ whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxs(
15948
+ AccordionItem,
15949
+ {
15950
+ value: "what-to-bring",
15951
+ id: "trip-section-what-to-bring",
15952
+ className: "scroll-mt-20 border-b border-border",
15953
+ children: [
15954
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15955
+ (sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsx(BackpackIcon, { className: "h-5 w-5 text-primary" }),
15956
+ (_n = labels == null ? void 0 : labels.whatToBring) != null ? _n : "What to bring"
15957
+ ] }) }),
15958
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsx(InfoIcon, { className: "h-4 w-4" }) }) })
15959
+ ]
15960
+ }
15961
+ ),
15962
+ optionalExtras && /* @__PURE__ */ jsxs(
15963
+ AccordionItem,
15964
+ {
15965
+ value: "optional-extras",
15966
+ id: "trip-section-optional-extras",
15967
+ className: "scroll-mt-20 border-b border-border",
15968
+ children: [
15969
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15970
+ (sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsx(CherryIcon, { className: "h-5 w-5 text-primary" }),
15971
+ (_o = labels == null ? void 0 : labels.optionalExtras) != null ? _o : "Optional extras"
15972
+ ] }) }),
15973
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: optionalExtras }) })
15974
+ ]
15975
+ }
15976
+ ),
15977
+ termsAndConditions && /* @__PURE__ */ jsxs(
15978
+ AccordionItem,
15979
+ {
15980
+ value: "terms",
15981
+ id: "trip-section-terms",
15982
+ className: "scroll-mt-20 border-b border-border",
15983
+ children: [
15984
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15985
+ (sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsx(ReceiptIcon, { className: "h-5 w-5 text-primary" }),
15986
+ (_p = labels == null ? void 0 : labels.terms) != null ? _p : "Terms & conditions"
15987
+ ] }) }),
15988
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: termsAndConditions }) })
15989
+ ]
15990
+ }
15991
+ )
15992
+ ]
15652
15993
  }
15653
- ) })
15654
- ] });
15655
- })(),
15656
- trustpilot ? /* @__PURE__ */ jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
15657
- /* @__PURE__ */ jsx(Separator, { className: "mb-10" }),
15658
- /* @__PURE__ */ 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" }),
15659
- /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilot })
15660
- ] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
15661
- /* @__PURE__ */ jsx(Separator, { className: "mb-10" }),
15662
- /* @__PURE__ */ 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" }),
15663
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
15664
- var _a2;
15665
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
15666
- /* @__PURE__ */ jsx(Stars, { count: (_a2 = r.rating) != null ? _a2 : 5 }),
15667
- /* @__PURE__ */ jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
15668
- "\u201C",
15669
- r.text,
15670
- "\u201D"
15671
- ] }),
15672
- /* @__PURE__ */ jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
15673
- "\u2014 ",
15674
- r.author
15675
- ] })
15676
- ] }, i);
15677
- }) })
15994
+ ),
15995
+ faqs && faqs.length > 0 && (() => {
15996
+ var _a2, _b2, _c2;
15997
+ const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
15998
+ const hiddenCount = faqs.length - visibleFaqs.length;
15999
+ return /* @__PURE__ */ jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
16000
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_a2 = labels == null ? void 0 : labels.faq) != null ? _a2 : "FAQ" }),
16001
+ /* @__PURE__ */ jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxs(AccordionItem, { value: `faq-${i}`, children: [
16002
+ /* @__PURE__ */ jsx(AccordionTrigger, { children: faq.question }),
16003
+ /* @__PURE__ */ jsx(AccordionContent, { children: faq.answer })
16004
+ ] }, i)) }),
16005
+ faqs.length > faqInitialCount && /* @__PURE__ */ jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsx(
16006
+ "button",
16007
+ {
16008
+ type: "button",
16009
+ onClick: () => setFaqsExpanded((v) => !v),
16010
+ className: cn(
16011
+ "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
16012
+ "text-sm font-semibold text-foreground shadow-sm",
16013
+ "hover:bg-muted transition-colors duration-150",
16014
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
16015
+ ),
16016
+ children: faqsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
16017
+ /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
16018
+ (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
16019
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
16020
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
16021
+ (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
16022
+ " (",
16023
+ hiddenCount,
16024
+ ")"
16025
+ ] })
16026
+ }
16027
+ ) })
16028
+ ] });
16029
+ })(),
16030
+ trustpilot ? /* @__PURE__ */ jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
16031
+ /* @__PURE__ */ jsx(Separator, { className: "mb-10" }),
16032
+ /* @__PURE__ */ 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" }),
16033
+ /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilot })
16034
+ ] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
16035
+ /* @__PURE__ */ jsx(Separator, { className: "mb-10" }),
16036
+ /* @__PURE__ */ 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" }),
16037
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
16038
+ var _a2;
16039
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
16040
+ /* @__PURE__ */ jsx(Stars, { count: (_a2 = r.rating) != null ? _a2 : 5 }),
16041
+ /* @__PURE__ */ jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
16042
+ "\u201C",
16043
+ r.text,
16044
+ "\u201D"
16045
+ ] }),
16046
+ /* @__PURE__ */ jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
16047
+ "\u2014 ",
16048
+ r.author
16049
+ ] })
16050
+ ] }, i);
16051
+ }) })
16052
+ ] })
16053
+ ] }),
16054
+ /* @__PURE__ */ jsx("div", { ref: sidebarPlaceholderRef, className: "hidden lg:block lg:w-72 xl:w-80 shrink-0", children: !isFloating && /* @__PURE__ */ jsx("div", { className: "sticky top-20 rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsx(
16055
+ PricingTrip,
16056
+ {
16057
+ priceFrom,
16058
+ currency,
16059
+ season,
16060
+ departureTimes,
16061
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
16062
+ bookLabel: bookLabel != null ? bookLabel : "Check availability",
16063
+ fromLabel,
16064
+ perPersonLabel,
16065
+ variant: "card",
16066
+ belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
16067
+ benefits,
16068
+ currencyEstimates,
16069
+ priceInfo
16070
+ }
16071
+ ) }) })
15678
16072
  ] })
15679
16073
  ] }),
15680
- /* @__PURE__ */ jsx("div", { ref: sidebarPlaceholderRef, className: "hidden lg:block lg:w-72 xl:w-80 shrink-0", children: !isFloating && /* @__PURE__ */ jsx("div", { className: "sticky top-20 rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsx(
15681
- PricingTrip,
16074
+ sections.length > 0 && /* @__PURE__ */ jsx(
16075
+ "div",
15682
16076
  {
15683
- priceFrom,
15684
- currency,
15685
- season,
15686
- departureTimes,
15687
- onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15688
- bookLabel: bookLabel != null ? bookLabel : "Check availability",
15689
- fromLabel,
15690
- perPersonLabel,
15691
- variant: "card",
15692
- belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15693
- benefits,
15694
- currencyEstimates,
15695
- priceInfo
16077
+ ref: navRef,
16078
+ className: cn(
16079
+ "fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
16080
+ navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
16081
+ ),
16082
+ children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 flex justify-center", children: /* @__PURE__ */ jsx(
16083
+ MenuTrip,
16084
+ {
16085
+ sections,
16086
+ activeSection,
16087
+ onSelect: scrollToSection,
16088
+ variant: "floating"
16089
+ }
16090
+ ) })
15696
16091
  }
15697
- ) }) })
15698
- ] })
15699
- ] }),
15700
- sections.length > 0 && /* @__PURE__ */ jsx(
15701
- "div",
15702
- {
15703
- ref: navRef,
15704
- className: cn(
15705
- "fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
15706
- navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
15707
16092
  ),
15708
- children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 flex justify-center", children: /* @__PURE__ */ jsx(
15709
- MenuTrip,
16093
+ isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsx(
16094
+ "div",
15710
16095
  {
15711
- sections,
15712
- activeSection,
15713
- onSelect: scrollToSection,
15714
- variant: "floating"
16096
+ className: "hidden lg:block fixed z-20",
16097
+ style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
16098
+ children: /* @__PURE__ */ jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsx(
16099
+ PricingTrip,
16100
+ {
16101
+ priceFrom,
16102
+ currency,
16103
+ season,
16104
+ departureTimes,
16105
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
16106
+ bookLabel: bookLabel != null ? bookLabel : "Check availability",
16107
+ fromLabel,
16108
+ perPersonLabel,
16109
+ variant: "card",
16110
+ belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
16111
+ benefits,
16112
+ currencyEstimates,
16113
+ priceInfo
16114
+ }
16115
+ ) })
15715
16116
  }
15716
- ) })
15717
- }
15718
- ),
15719
- isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsx(
15720
- "div",
15721
- {
15722
- className: "hidden lg:block fixed z-20",
15723
- style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
15724
- children: /* @__PURE__ */ jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsx(
16117
+ ),
16118
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsx(
16119
+ PhotoGallery,
16120
+ {
16121
+ labels: {
16122
+ seeMore: labels == null ? void 0 : labels.seeMore,
16123
+ showLess: labels == null ? void 0 : labels.showLess,
16124
+ close: labels == null ? void 0 : labels.galleryClose,
16125
+ previous: labels == null ? void 0 : labels.galleryPrevious,
16126
+ next: labels == null ? void 0 : labels.galleryNext
16127
+ },
16128
+ photos: gallery,
16129
+ variant: "gridCompact",
16130
+ initialVisible: 8,
16131
+ lightbox: galleryLightbox,
16132
+ tourSection: (_s = labels == null ? void 0 : labels.gallery) != null ? _s : "Gallery"
16133
+ }
16134
+ ) }),
16135
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsx(
16136
+ BookingForm,
16137
+ {
16138
+ labels: bookingLabels,
16139
+ defaultValues: bookingDefaults,
16140
+ onSubmit: onBookingSubmit,
16141
+ loading: bookingLoading
16142
+ }
16143
+ ) }) }),
16144
+ /* @__PURE__ */ 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__ */ jsx(
15725
16145
  PricingTrip,
15726
16146
  {
15727
16147
  priceFrom,
15728
16148
  currency,
15729
- season,
15730
- departureTimes,
15731
16149
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15732
- bookLabel: bookLabel != null ? bookLabel : "Check availability",
16150
+ bookLabel: bookLabel != null ? bookLabel : "Book now",
15733
16151
  fromLabel,
15734
16152
  perPersonLabel,
15735
- variant: "card",
15736
- belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15737
- benefits,
15738
- currencyEstimates,
15739
- priceInfo
16153
+ variant: "compact",
16154
+ sharp: true,
16155
+ priceInfo,
16156
+ currencyEstimates
15740
16157
  }
15741
- ) })
15742
- }
15743
- ),
15744
- gallery && gallery.length > 0 && /* @__PURE__ */ jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsx(
15745
- PhotoGallery,
15746
- {
15747
- labels: {
15748
- seeMore: labels == null ? void 0 : labels.seeMore,
15749
- showLess: labels == null ? void 0 : labels.showLess,
15750
- close: labels == null ? void 0 : labels.galleryClose,
15751
- previous: labels == null ? void 0 : labels.galleryPrevious,
15752
- next: labels == null ? void 0 : labels.galleryNext
15753
- },
15754
- photos: gallery,
15755
- variant: "gridCompact",
15756
- initialVisible: 8
15757
- }
15758
- ) }),
15759
- gallery && gallery.length > 0 && /* @__PURE__ */ jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsx(
15760
- BookingForm,
15761
- {
15762
- labels: bookingLabels,
15763
- defaultValues: bookingDefaults,
15764
- onSubmit: onBookingSubmit,
15765
- loading: bookingLoading
15766
- }
15767
- ) }) }),
15768
- /* @__PURE__ */ 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__ */ jsx(
15769
- PricingTrip,
15770
- {
15771
- priceFrom,
15772
- currency,
15773
- onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15774
- bookLabel: bookLabel != null ? bookLabel : "Book now",
15775
- fromLabel,
15776
- perPersonLabel,
15777
- variant: "compact",
15778
- sharp: true,
15779
- priceInfo,
15780
- currencyEstimates
15781
- }
15782
- ) }),
15783
- /* @__PURE__ */ jsx("div", { className: "h-20 lg:hidden" }),
15784
- /* @__PURE__ */ jsx(SiteFooter, {})
15785
- ]
16158
+ ) }),
16159
+ /* @__PURE__ */ jsx("div", { className: "h-20 lg:hidden" }),
16160
+ /* @__PURE__ */ jsx(SiteFooter, { badges: footerBadges })
16161
+ ]
16162
+ }
16163
+ )
15786
16164
  }
15787
16165
  );
15788
16166
  }
@@ -15841,14 +16219,15 @@ function CategoryPage2({
15841
16219
  viewAllPostsLabel,
15842
16220
  cardLabels,
15843
16221
  filterLabels,
16222
+ footerBadges,
15844
16223
  className
15845
16224
  }) {
15846
16225
  var _a;
15847
- const [videoReady, setVideoReady] = React32.useState(false);
15848
- const videoRef = React32.useRef(null);
16226
+ const [videoReady, setVideoReady] = React20.useState(false);
16227
+ const videoRef = React20.useRef(null);
15849
16228
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
15850
16229
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
15851
- React32.useEffect(() => {
16230
+ React20.useEffect(() => {
15852
16231
  if (!videoUrl) return;
15853
16232
  const el = videoRef.current;
15854
16233
  if (!el) return;
@@ -15863,13 +16242,13 @@ function CategoryPage2({
15863
16242
  io.observe(el);
15864
16243
  return () => io.disconnect();
15865
16244
  }, [videoUrl]);
15866
- const [faqsExpanded, setFaqsExpanded] = React32.useState(false);
15867
- const [tripsExpanded, setTripsExpanded] = React32.useState(false);
15868
- const [filterValue, setFilterValue] = React32.useState({});
15869
- const [sort, setSort] = React32.useState(
16245
+ const [faqsExpanded, setFaqsExpanded] = React20.useState(false);
16246
+ const [tripsExpanded, setTripsExpanded] = React20.useState(false);
16247
+ const [filterValue, setFilterValue] = React20.useState({});
16248
+ const [sort, setSort] = React20.useState(
15870
16249
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
15871
16250
  );
15872
- const sortedTrips = React32.useMemo(() => {
16251
+ const sortedTrips = React20.useMemo(() => {
15873
16252
  const active = Object.entries(filterValue).filter(
15874
16253
  ([, vals]) => vals && vals.length > 0
15875
16254
  );
@@ -15973,7 +16352,7 @@ function CategoryPage2({
15973
16352
  /* @__PURE__ */ jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
15974
16353
  breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
15975
16354
  const isLast = i === breadcrumb.length - 1;
15976
- return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
16355
+ return /* @__PURE__ */ jsxs(React20.Fragment, { children: [
15977
16356
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
15978
16357
  crumb.href && !isLast ? /* @__PURE__ */ jsx(
15979
16358
  "a",
@@ -16165,7 +16544,7 @@ function CategoryPage2({
16165
16544
  ) })
16166
16545
  ] });
16167
16546
  })(),
16168
- /* @__PURE__ */ jsx(SiteFooter, {})
16547
+ /* @__PURE__ */ jsx(SiteFooter, { badges: footerBadges })
16169
16548
  ] });
16170
16549
  }
16171
16550
  var sizeConfig3 = {
@@ -16270,12 +16649,12 @@ function Toast({
16270
16649
  duration = 6e3,
16271
16650
  className
16272
16651
  }) {
16273
- const [mounted, setMounted] = React32.useState(false);
16274
- const [visible, setVisible] = React32.useState(true);
16275
- React32.useEffect(() => {
16652
+ const [mounted, setMounted] = React20.useState(false);
16653
+ const [visible, setVisible] = React20.useState(true);
16654
+ React20.useEffect(() => {
16276
16655
  setMounted(true);
16277
16656
  }, []);
16278
- React32.useEffect(() => {
16657
+ React20.useEffect(() => {
16279
16658
  if (duration === 0) return;
16280
16659
  const t = setTimeout(() => {
16281
16660
  setVisible(false);
@@ -17777,8 +18156,8 @@ function ShareWidget({
17777
18156
  title = "Invite friends & lower the price",
17778
18157
  className
17779
18158
  }) {
17780
- const [copied, setCopied] = React32.useState(false);
17781
- const [showToast, setShowToast] = React32.useState(false);
18159
+ const [copied, setCopied] = React20.useState(false);
18160
+ const [showToast, setShowToast] = React20.useState(false);
17782
18161
  const encodedUrl = encodeURIComponent(url);
17783
18162
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
17784
18163
  const channels = [
@@ -17948,7 +18327,7 @@ function RatingStars({ stars = 5 }) {
17948
18327
  "flex h-5 w-5 items-center justify-center rounded-[3px]",
17949
18328
  filled ? "bg-primary" : "bg-white/30"
17950
18329
  ),
17951
- children: /* @__PURE__ */ jsx(StarIcon, { className: "h-3 w-3 fill-white text-white" })
18330
+ children: /* @__PURE__ */ jsx(StarIcon$1, { className: "h-3 w-3 fill-white text-white" })
17952
18331
  },
17953
18332
  i
17954
18333
  );
@@ -17959,7 +18338,7 @@ function Rating({ label, stars = 5, provider, href }) {
17959
18338
  label && /* @__PURE__ */ jsx("span", { className: "text-sm font-ui font-bold text-white", children: label }),
17960
18339
  /* @__PURE__ */ jsx(RatingStars, { stars }),
17961
18340
  provider && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-sm font-ui font-bold text-white", children: [
17962
- /* @__PURE__ */ jsx(StarIcon, { className: "h-4 w-4 fill-primary text-primary" }),
18341
+ /* @__PURE__ */ jsx(StarIcon$1, { className: "h-4 w-4 fill-primary text-primary" }),
17963
18342
  provider
17964
18343
  ] })
17965
18344
  ] });
@@ -17995,11 +18374,11 @@ function HomeHeader({
17995
18374
  className
17996
18375
  }) {
17997
18376
  var _a;
17998
- const [heroIndex, setHeroIndex] = React32.useState(0);
17999
- const [videoReady, setVideoReady] = React32.useState(false);
18000
- const videoRef = React32.useRef(null);
18377
+ const [heroIndex, setHeroIndex] = React20.useState(0);
18378
+ const [videoReady, setVideoReady] = React20.useState(false);
18379
+ const videoRef = React20.useRef(null);
18001
18380
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
18002
- const validImages = React32.useMemo(
18381
+ const validImages = React20.useMemo(
18003
18382
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
18004
18383
  [images]
18005
18384
  );
@@ -18013,7 +18392,7 @@ function HomeHeader({
18013
18392
  const showCarousel = !videoUrl && validImages.length > 1;
18014
18393
  const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
18015
18394
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
18016
- React32.useEffect(() => {
18395
+ React20.useEffect(() => {
18017
18396
  if (!videoUrl) return;
18018
18397
  const el = videoRef.current;
18019
18398
  if (!el) return;
@@ -18371,7 +18750,7 @@ function AdventureExplorer({
18371
18750
  className
18372
18751
  }) {
18373
18752
  var _a, _b, _c, _d, _e;
18374
- const [activeId, setActiveId] = React32.useState(
18753
+ const [activeId, setActiveId] = React20.useState(
18375
18754
  defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
18376
18755
  );
18377
18756
  const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
@@ -18711,8 +19090,8 @@ function RotatingSubtitle({
18711
19090
  interval,
18712
19091
  className
18713
19092
  }) {
18714
- const [index, setIndex] = React32.useState(0);
18715
- React32.useEffect(() => {
19093
+ const [index, setIndex] = React20.useState(0);
19094
+ React20.useEffect(() => {
18716
19095
  var _a;
18717
19096
  if (phrases.length < 2) return;
18718
19097
  const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
@@ -18751,7 +19130,7 @@ function CtaBanner({
18751
19130
  overlayOpacity = 35,
18752
19131
  className
18753
19132
  }) {
18754
- const phrases = React32.useMemo(
19133
+ const phrases = React20.useMemo(
18755
19134
  () => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
18756
19135
  [subtitle]
18757
19136
  );
@@ -19032,7 +19411,7 @@ function SectionHead({
19032
19411
  }
19033
19412
  function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
19034
19413
  var _a;
19035
- const railRef = React32.useRef(null);
19414
+ const railRef = React20.useRef(null);
19036
19415
  const scrollByCard = (dir) => {
19037
19416
  const rail = railRef.current;
19038
19417
  if (!rail) return;
@@ -19134,7 +19513,7 @@ function StatsBand({ items }) {
19134
19513
  }
19135
19514
  function ReviewStars({ stars = 5 }) {
19136
19515
  return /* @__PURE__ */ jsx("div", { className: "mb-4 flex items-center gap-0.5", "aria-label": `${stars} out of 5 stars`, children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx(
19137
- StarIcon,
19516
+ StarIcon$1,
19138
19517
  {
19139
19518
  className: cn(
19140
19519
  "h-4 w-4",
@@ -19240,7 +19619,7 @@ function SegmentedControl({
19240
19619
  }) {
19241
19620
  var _a;
19242
19621
  const isControlled = value != null;
19243
- const [internal, setInternal] = React32.useState(
19622
+ const [internal, setInternal] = React20.useState(
19244
19623
  defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
19245
19624
  );
19246
19625
  const active = isControlled ? value : internal;
@@ -19323,6 +19702,6 @@ function SegmentedControl({
19323
19702
  );
19324
19703
  }
19325
19704
 
19326
- export { ActivityCard, AdventureExplorer, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogJournal, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPartialCancellationEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CancellationForm, CancellationRequestReceivedEmail, CategoryPage2, Chip, CounterField, CountrySearchField, CtaBanner, DEFAULT_FOOTER_BADGES, DEFAULT_FOOTER_DESTINATIONS, DEFAULT_FOOTER_LANGUAGES, DEFAULT_FOOTER_LEGAL, DEFAULT_FOOTER_PAGES, DEFAULT_FOOTER_SOCIALS, DEFAULT_FOOTER_THEMES, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, HomeHeader, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NewHome, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, SegmentedControl, ShareWidget, SiteFooter, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, USP, buttonVariants, chipVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
19705
+ export { ActivityCard, AdventureExplorer, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogJournal, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPartialCancellationEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CancellationForm, CancellationRequestReceivedEmail, CategoryPage2, Chip, CounterField, CountrySearchField, CtaBanner, DEFAULT_FOOTER_BADGES, DEFAULT_FOOTER_DESTINATIONS, DEFAULT_FOOTER_LANGUAGES, DEFAULT_FOOTER_LEGAL, DEFAULT_FOOTER_PAGES, DEFAULT_FOOTER_SOCIALS, DEFAULT_FOOTER_THEMES, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, HomeHeader, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NewHome, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, PhotoTourProvider, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, SegmentedControl, ShareWidget, SiteFooter, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, USP, buttonVariants, chipVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
19327
19706
  //# sourceMappingURL=index.js.map
19328
19707
  //# sourceMappingURL=index.js.map