@planetaexo/design-system 0.69.1 → 0.72.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;
@@ -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;
@@ -5669,7 +5669,7 @@ function BookingCreatedEmail({
5669
5669
  }, children: i + 1 }) }),
5670
5670
  /* @__PURE__ */ jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
5671
5671
  ] }) }) }, i)) }),
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(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: [
5673
5673
  idx === 0 ? /* @__PURE__ */ jsx("strong", { children: line }) : line,
5674
5674
  idx < arr.length - 1 ? /* @__PURE__ */ jsx("br", {}) : null
5675
5675
  ] }, idx)) })
@@ -8452,11 +8452,11 @@ function DatePickerField({
8452
8452
  className,
8453
8453
  error
8454
8454
  }) {
8455
- const [open, setOpen] = React32.useState(false);
8456
- const containerRef = React32.useRef(null);
8457
- const [calendarWidth, setCalendarWidth] = React32.useState();
8455
+ const [open, setOpen] = React20.useState(false);
8456
+ const containerRef = React20.useRef(null);
8457
+ const [calendarWidth, setCalendarWidth] = React20.useState();
8458
8458
  const hasValue = !!value;
8459
- React32.useEffect(() => {
8459
+ React20.useEffect(() => {
8460
8460
  if (!containerRef.current) return;
8461
8461
  const observer = new ResizeObserver(([entry]) => {
8462
8462
  setCalendarWidth(entry.contentRect.width);
@@ -8585,15 +8585,15 @@ function BookingForm({
8585
8585
  const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
8586
8586
  const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
8587
8587
  const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
8588
- const [values, setValues] = React32.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8589
- const [errors, setErrors] = React32.useState({});
8588
+ const [values, setValues] = React20.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8589
+ const [errors, setErrors] = React20.useState({});
8590
8590
  const set = (key, value) => {
8591
8591
  setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8592
8592
  setErrors(
8593
8593
  (prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
8594
8594
  );
8595
8595
  };
8596
- React32.useEffect(() => {
8596
+ React20.useEffect(() => {
8597
8597
  if (!defaultValues) return;
8598
8598
  setValues((prev) => {
8599
8599
  let changed = false;
@@ -9232,11 +9232,11 @@ function FloatingTextarea({
9232
9232
  }
9233
9233
  function SelectField({ field, value, onChange, error, disabled }) {
9234
9234
  var _a, _b, _c;
9235
- const [open, setOpen] = React32.useState(false);
9236
- const containerRef = React32.useRef(null);
9235
+ const [open, setOpen] = React20.useState(false);
9236
+ const containerRef = React20.useRef(null);
9237
9237
  const options = (_a = field.options) != null ? _a : [];
9238
9238
  const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
9239
- React32.useEffect(() => {
9239
+ React20.useEffect(() => {
9240
9240
  if (!open) return;
9241
9241
  const handleOutside = (e) => {
9242
9242
  if (containerRef.current && !containerRef.current.contains(e.target)) {
@@ -9704,11 +9704,11 @@ function RegistrationForm({
9704
9704
  readOnly = false
9705
9705
  }) {
9706
9706
  var _a;
9707
- const L = React32.useMemo(
9707
+ const L = React20.useMemo(
9708
9708
  () => __spreadValues(__spreadValues({}, DEFAULT_LABELS14), labels != null ? labels : {}),
9709
9709
  [labels]
9710
9710
  );
9711
- const sortedFields = React32.useMemo(
9711
+ const sortedFields = React20.useMemo(
9712
9712
  () => [...fields].sort((a, b) => {
9713
9713
  var _a2, _b;
9714
9714
  return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
@@ -9716,7 +9716,7 @@ function RegistrationForm({
9716
9716
  [fields]
9717
9717
  );
9718
9718
  const isControlled = values !== void 0;
9719
- const [internal, setInternal] = React32.useState(
9719
+ const [internal, setInternal] = React20.useState(
9720
9720
  () => initializeValues(
9721
9721
  sortedFields,
9722
9722
  defaultValues != null ? defaultValues : {},
@@ -9724,9 +9724,9 @@ function RegistrationForm({
9724
9724
  includeTerms
9725
9725
  )
9726
9726
  );
9727
- const [submitAttempted, setSubmitAttempted] = React32.useState(false);
9728
- const [validationErrors, setValidationErrors] = React32.useState({});
9729
- React32.useEffect(() => {
9727
+ const [submitAttempted, setSubmitAttempted] = React20.useState(false);
9728
+ const [validationErrors, setValidationErrors] = React20.useState({});
9729
+ React20.useEffect(() => {
9730
9730
  if (isControlled) return;
9731
9731
  setInternal((prev) => {
9732
9732
  const next = initializeValues(
@@ -9783,7 +9783,7 @@ function RegistrationForm({
9783
9783
  const termsError = submitAttempted && termsEnabled && !termsAccepted;
9784
9784
  const firstErrorFieldId = Object.keys(fieldErrors)[0];
9785
9785
  const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
9786
- React32.useEffect(() => {
9786
+ React20.useEffect(() => {
9787
9787
  if (!submitAttempted || !scrollTargetId) return;
9788
9788
  const timer = setTimeout(() => {
9789
9789
  const elem = document.getElementById(scrollTargetId);
@@ -10254,18 +10254,18 @@ function CancellationForm({
10254
10254
  className
10255
10255
  }) {
10256
10256
  var _a, _b, _c;
10257
- const [selectedAdventureIds, setSelectedAdventureIds] = React32.useState(/* @__PURE__ */ new Set());
10258
- const [participantsByAdventure, setParticipantsByAdventure] = React32.useState({});
10259
- const [reasonCode, setReasonCode] = React32.useState("");
10260
- const [reasonOther, setReasonOther] = React32.useState("");
10261
- const [refundPreference, setRefundPreference] = React32.useState("");
10262
- const [refundOther, setRefundOther] = React32.useState("");
10263
- const [agreedToPolicy, setAgreedToPolicy] = React32.useState(false);
10264
- const [contactName, setContactName] = React32.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
10265
- const [contactEmail, setContactEmail] = React32.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
10266
- const [contactPhone, setContactPhone] = React32.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
10267
- const [errors, setErrors] = React32.useState({});
10268
- 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(
10269
10269
  (advId) => {
10270
10270
  var _a2, _b2;
10271
10271
  return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
@@ -10522,10 +10522,10 @@ var OTPCodeInput = ({
10522
10522
  id,
10523
10523
  required
10524
10524
  }) => {
10525
- const baseId = id != null ? id : React32.useId();
10526
- const inputRef = React32.useRef(null);
10527
- const [focused, setFocused] = React32.useState(false);
10528
- 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(() => {
10529
10529
  const arr = value.split("").slice(0, length);
10530
10530
  while (arr.length < length) arr.push("");
10531
10531
  return arr;
@@ -10638,7 +10638,7 @@ function Checkbox(_a) {
10638
10638
  })
10639
10639
  );
10640
10640
  }
10641
- var AccordionVariantContext = React32.createContext("default");
10641
+ var AccordionVariantContext = React20.createContext("default");
10642
10642
  function Accordion(_a) {
10643
10643
  var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
10644
10644
  return /* @__PURE__ */ jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(
@@ -10656,7 +10656,7 @@ function Accordion(_a) {
10656
10656
  }
10657
10657
  function AccordionItem(_a) {
10658
10658
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
10659
- const variant = React32.useContext(AccordionVariantContext);
10659
+ const variant = React20.useContext(AccordionVariantContext);
10660
10660
  return /* @__PURE__ */ jsx(
10661
10661
  Accordion$1.Item,
10662
10662
  __spreadValues({
@@ -10679,7 +10679,7 @@ function AccordionTrigger(_a) {
10679
10679
  "children",
10680
10680
  "headingLevel"
10681
10681
  ]);
10682
- const variant = React32.useContext(AccordionVariantContext);
10682
+ const variant = React20.useContext(AccordionVariantContext);
10683
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;
10684
10684
  return /* @__PURE__ */ jsx(
10685
10685
  Accordion$1.Header,
@@ -10741,7 +10741,7 @@ function AccordionContent(_a) {
10741
10741
  "className",
10742
10742
  "children"
10743
10743
  ]);
10744
- const variant = React32.useContext(AccordionVariantContext);
10744
+ const variant = React20.useContext(AccordionVariantContext);
10745
10745
  return /* @__PURE__ */ jsx(
10746
10746
  Accordion$1.Panel,
10747
10747
  __spreadProps(__spreadValues({
@@ -10960,15 +10960,15 @@ function FilterPanel({
10960
10960
  labels
10961
10961
  }) {
10962
10962
  var _a, _b, _c, _d, _e, _f, _g, _h;
10963
- const resolvedGroups = React32.useMemo(() => resolveGroups(groups), [groups]);
10964
- const [internalValue, setInternalValue] = React32.useState(
10963
+ const resolvedGroups = React20.useMemo(() => resolveGroups(groups), [groups]);
10964
+ const [internalValue, setInternalValue] = React20.useState(
10965
10965
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
10966
10966
  );
10967
10967
  const selected = value != null ? value : internalValue;
10968
- const [expandedItems, setExpandedItems] = React32.useState(
10968
+ const [expandedItems, setExpandedItems] = React20.useState(
10969
10969
  () => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
10970
10970
  );
10971
- const toggleExpanded = React32.useCallback((id) => {
10971
+ const toggleExpanded = React20.useCallback((id) => {
10972
10972
  setExpandedItems((prev) => {
10973
10973
  const next = new Set(prev);
10974
10974
  if (next.has(id)) next.delete(id);
@@ -11352,11 +11352,11 @@ function FilterPanel({
11352
11352
  var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
11353
11353
  function TrustpilotEmbed({ config }) {
11354
11354
  var _a, _b, _c, _d, _e, _f;
11355
- const ref = React32.useRef(null);
11356
- const [widgetReady, setWidgetReady] = React32.useState(false);
11357
- 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);
11358
11358
  const showFallback = delayPassed && !widgetReady;
11359
- React32.useEffect(() => {
11359
+ React20.useEffect(() => {
11360
11360
  var _a2;
11361
11361
  if (typeof document === "undefined" || !ref.current) return;
11362
11362
  const node = ref.current;
@@ -11544,7 +11544,7 @@ function webpVariantUrl(src) {
11544
11544
  return `${withoutQuery}.webp${query}`;
11545
11545
  }
11546
11546
  function PictureLoader() {
11547
- const gradientId = React32.useId();
11547
+ const gradientId = React20.useId();
11548
11548
  return /* @__PURE__ */ jsx(
11549
11549
  "span",
11550
11550
  {
@@ -11614,10 +11614,10 @@ function Picture(_a) {
11614
11614
  "onError"
11615
11615
  ]);
11616
11616
  var _a2, _b2;
11617
- const ref = React32.useRef(null);
11618
- const [visible, setVisible] = React32.useState(eager);
11619
- const [loaded, setLoaded] = React32.useState(false);
11620
- 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(() => {
11621
11621
  if (eager || visible) return;
11622
11622
  const el = ref.current;
11623
11623
  if (!el || typeof IntersectionObserver === "undefined") {
@@ -11636,7 +11636,7 @@ function Picture(_a) {
11636
11636
  io.observe(el);
11637
11637
  return () => io.disconnect();
11638
11638
  }, [eager, visible, rootMargin]);
11639
- React32.useEffect(() => {
11639
+ React20.useEffect(() => {
11640
11640
  setLoaded(false);
11641
11641
  }, [src]);
11642
11642
  const webp = webpVariantUrl(src);
@@ -11767,11 +11767,11 @@ function ItineraryModal({
11767
11767
  onNext
11768
11768
  }) {
11769
11769
  var _a, _b, _c;
11770
- const [imgIndex, setImgIndex] = React32.useState(0);
11770
+ const [imgIndex, setImgIndex] = React20.useState(0);
11771
11771
  const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
11772
11772
  const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
11773
11773
  const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
11774
- React32.useEffect(() => {
11774
+ React20.useEffect(() => {
11775
11775
  setImgIndex(0);
11776
11776
  }, [stop == null ? void 0 : stop.dayNumber]);
11777
11777
  if (!stop) return null;
@@ -11898,8 +11898,8 @@ function ItineraryModal({
11898
11898
  ) });
11899
11899
  }
11900
11900
  function Itinerary({ title, subtitle, stops, className }) {
11901
- const [activeIndex, setActiveIndex] = React32.useState(null);
11902
- const scrollRef = React32.useRef(null);
11901
+ const [activeIndex, setActiveIndex] = React20.useState(null);
11902
+ const scrollRef = React20.useRef(null);
11903
11903
  const activeStop = activeIndex !== null ? stops[activeIndex] : null;
11904
11904
  const scrollBy = (dir) => {
11905
11905
  if (!scrollRef.current) return;
@@ -11992,18 +11992,18 @@ function Lightbox({
11992
11992
  labels
11993
11993
  }) {
11994
11994
  var _a, _b, _c, _d;
11995
- const [index, setIndex] = React32.useState(initialIndex);
11995
+ const [index, setIndex] = React20.useState(initialIndex);
11996
11996
  const total = photos.length;
11997
11997
  const photo = photos[index];
11998
- const prev = React32.useCallback(
11998
+ const prev = React20.useCallback(
11999
11999
  () => setIndex((i) => (i - 1 + total) % total),
12000
12000
  [total]
12001
12001
  );
12002
- const next = React32.useCallback(
12002
+ const next = React20.useCallback(
12003
12003
  () => setIndex((i) => (i + 1) % total),
12004
12004
  [total]
12005
12005
  );
12006
- React32.useEffect(() => {
12006
+ React20.useEffect(() => {
12007
12007
  const onKey = (e) => {
12008
12008
  if (e.key === "Escape") onClose();
12009
12009
  if (e.key === "ArrowLeft") prev();
@@ -12105,6 +12105,260 @@ function Lightbox({
12105
12105
  }
12106
12106
  );
12107
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
+ }
12108
12362
  function PhotoTile({
12109
12363
  photo,
12110
12364
  index,
@@ -12177,7 +12431,7 @@ function GridGallery({
12177
12431
  onOpen,
12178
12432
  labels
12179
12433
  }) {
12180
- const [expanded, setExpanded] = React32.useState(false);
12434
+ const [expanded, setExpanded] = React20.useState(false);
12181
12435
  const cols = gridCols(photos.length);
12182
12436
  const hasMore = photos.length > initialVisible;
12183
12437
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
@@ -12209,7 +12463,7 @@ function CompactGridGallery({
12209
12463
  onOpen,
12210
12464
  labels
12211
12465
  }) {
12212
- const [expanded, setExpanded] = React32.useState(false);
12466
+ const [expanded, setExpanded] = React20.useState(false);
12213
12467
  const hasMore = photos.length > initialVisible;
12214
12468
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
12215
12469
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -12240,7 +12494,7 @@ function MasonryGallery({
12240
12494
  onOpen,
12241
12495
  labels
12242
12496
  }) {
12243
- const [expanded, setExpanded] = React32.useState(false);
12497
+ const [expanded, setExpanded] = React20.useState(false);
12244
12498
  const hasMore = photos.length > initialVisible;
12245
12499
  const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
12246
12500
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -12317,7 +12571,7 @@ function FeaturedGallery({
12317
12571
  onOpen,
12318
12572
  labels
12319
12573
  }) {
12320
- const [expanded, setExpanded] = React32.useState(false);
12574
+ const [expanded, setExpanded] = React20.useState(false);
12321
12575
  const featured = photos.slice(0, 3);
12322
12576
  const extra = photos.slice(3);
12323
12577
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -12427,37 +12681,114 @@ function CarouselGallery({
12427
12681
  onOpen,
12428
12682
  className
12429
12683
  }) {
12430
- var _a;
12431
12684
  const total = photos.length;
12432
- const photo = photos[index];
12433
- const prev = () => onIndexChange((index - 1 + total) % total);
12434
- const next = () => onIndexChange((index + 1) % total);
12685
+ const go = (i) => onIndexChange(Math.max(0, Math.min(total - 1, i)));
12686
+ const prev = () => go(index - 1);
12687
+ const next = () => go(index + 1);
12688
+ const containerRef = React20.useRef(null);
12689
+ const [drag, setDrag] = React20.useState(0);
12690
+ const [dragging, setDragging] = React20.useState(false);
12691
+ const gesture = React20.useRef(null);
12692
+ const movedRef = React20.useRef(false);
12693
+ const onPointerDown = (e) => {
12694
+ var _a, _b;
12695
+ if (total <= 1) return;
12696
+ movedRef.current = false;
12697
+ gesture.current = {
12698
+ x: e.clientX,
12699
+ y: e.clientY,
12700
+ w: (_b = (_a = containerRef.current) == null ? void 0 : _a.clientWidth) != null ? _b : 1,
12701
+ axis: null,
12702
+ id: e.pointerId
12703
+ };
12704
+ };
12705
+ const onPointerMove = (e) => {
12706
+ var _a;
12707
+ const g = gesture.current;
12708
+ if (!g || e.pointerId !== g.id) return;
12709
+ const dx = e.clientX - g.x;
12710
+ const dy = e.clientY - g.y;
12711
+ if (g.axis === null) {
12712
+ if (Math.abs(dx) > 8 && Math.abs(dx) > Math.abs(dy)) {
12713
+ g.axis = "x";
12714
+ setDragging(true);
12715
+ (_a = containerRef.current) == null ? void 0 : _a.setPointerCapture(g.id);
12716
+ } else if (Math.abs(dy) > 8) {
12717
+ gesture.current = null;
12718
+ return;
12719
+ } else {
12720
+ return;
12721
+ }
12722
+ }
12723
+ if (g.axis !== "x") return;
12724
+ movedRef.current = true;
12725
+ let d = dx;
12726
+ if (index === 0 && d > 0 || index === total - 1 && d < 0) d *= 0.35;
12727
+ setDrag(d);
12728
+ };
12729
+ const endGesture = (e) => {
12730
+ const g = gesture.current;
12731
+ gesture.current = null;
12732
+ setDragging(false);
12733
+ setDrag(0);
12734
+ if (!g || g.axis !== "x") return;
12735
+ const dx = e.clientX - g.x;
12736
+ const threshold = Math.min(110, g.w * 0.18);
12737
+ if (dx <= -threshold) next();
12738
+ else if (dx >= threshold) prev();
12739
+ };
12435
12740
  return /* @__PURE__ */ jsxs(
12436
12741
  "div",
12437
12742
  {
12743
+ ref: containerRef,
12744
+ onPointerDown,
12745
+ onPointerMove,
12746
+ onPointerUp: endGesture,
12747
+ onPointerCancel: endGesture,
12748
+ onClick: () => {
12749
+ if (movedRef.current) {
12750
+ movedRef.current = false;
12751
+ return;
12752
+ }
12753
+ onOpen(index);
12754
+ },
12755
+ onKeyDown: (e) => {
12756
+ if (e.key === "Enter" || e.key === " ") {
12757
+ e.preventDefault();
12758
+ onOpen(index);
12759
+ }
12760
+ },
12761
+ role: "button",
12762
+ tabIndex: 0,
12763
+ "aria-label": `Open photo ${index + 1} fullscreen`,
12438
12764
  className: cn(
12439
- "relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted group/photo",
12765
+ "relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted",
12766
+ "touch-pan-y select-none cursor-zoom-in",
12767
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
12440
12768
  className
12441
12769
  ),
12442
12770
  children: [
12443
12771
  /* @__PURE__ */ jsx(
12444
- "button",
12772
+ "div",
12445
12773
  {
12446
- type: "button",
12447
- onClick: () => onOpen(index),
12448
- "aria-label": `Open photo ${index + 1} fullscreen`,
12449
- 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",
12450
- children: /* @__PURE__ */ jsx(
12451
- Picture,
12452
- {
12453
- src: photo.src,
12454
- alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
12455
- title: photo.caption,
12456
- className: "h-full w-full object-cover transition-transform duration-500 group-hover/photo:scale-[1.02]",
12457
- loading: "lazy"
12458
- },
12459
- photo.src
12460
- )
12774
+ className: "flex h-full w-full",
12775
+ style: {
12776
+ transform: `translateX(calc(${-index * 100}% + ${drag}px))`,
12777
+ transition: dragging ? "none" : "transform 0.35s cubic-bezier(0.22, 0.61, 0.36, 1)"
12778
+ },
12779
+ children: photos.map((p, i) => {
12780
+ var _a;
12781
+ return /* @__PURE__ */ jsx("div", { className: "h-full w-full shrink-0", children: /* @__PURE__ */ jsx(
12782
+ Picture,
12783
+ {
12784
+ src: p.src,
12785
+ alt: (_a = p.alt) != null ? _a : `Photo ${i + 1}`,
12786
+ title: p.caption,
12787
+ className: "pointer-events-none h-full w-full object-cover",
12788
+ rootMargin: "400px"
12789
+ }
12790
+ ) }, i);
12791
+ })
12461
12792
  }
12462
12793
  ),
12463
12794
  total > 1 && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -12465,7 +12796,10 @@ function CarouselGallery({
12465
12796
  "button",
12466
12797
  {
12467
12798
  type: "button",
12468
- onClick: prev,
12799
+ onClick: (e) => {
12800
+ e.stopPropagation();
12801
+ prev();
12802
+ },
12469
12803
  "aria-label": "Previous photo",
12470
12804
  className: cn(
12471
12805
  "absolute left-3 sm:left-4 top-1/2 -translate-y-1/2 z-10",
@@ -12481,7 +12815,10 @@ function CarouselGallery({
12481
12815
  "button",
12482
12816
  {
12483
12817
  type: "button",
12484
- onClick: next,
12818
+ onClick: (e) => {
12819
+ e.stopPropagation();
12820
+ next();
12821
+ },
12485
12822
  "aria-label": "Next photo",
12486
12823
  className: cn(
12487
12824
  "absolute right-3 sm:right-4 top-1/2 -translate-y-1/2 z-10",
@@ -12498,7 +12835,10 @@ function CarouselGallery({
12498
12835
  "button",
12499
12836
  {
12500
12837
  type: "button",
12501
- onClick: () => onIndexChange(i),
12838
+ onClick: (e) => {
12839
+ e.stopPropagation();
12840
+ onIndexChange(i);
12841
+ },
12502
12842
  "aria-label": `Go to photo ${i + 1}`,
12503
12843
  className: cn(
12504
12844
  "h-1.5 rounded-full transition-all duration-300",
@@ -12517,17 +12857,46 @@ function PhotoGallery({
12517
12857
  initialVisible = 6,
12518
12858
  onPhotoClick,
12519
12859
  labels,
12860
+ lightbox: lightboxMode = "classic",
12861
+ tourSection,
12520
12862
  className
12521
12863
  }) {
12522
- const [lightboxIndex, setLightboxIndex] = React32.useState(null);
12523
- const [carouselIndex, setCarouselIndex] = React32.useState(0);
12524
- const normalised = React32.useMemo(() => photos.map(normalise), [photos]);
12864
+ const [lightboxIndex, setLightboxIndex] = React20.useState(null);
12865
+ const [carouselIndex, setCarouselIndex] = React20.useState(0);
12866
+ const normalised = React20.useMemo(() => photos.map(normalise), [photos]);
12867
+ const tour = React20.useContext(PhotoTourContext);
12868
+ const tourId = React20.useId();
12869
+ const markerRef = React20.useRef(null);
12870
+ const inTour = !!((tour == null ? void 0 : tour.enabled) && tourSection);
12871
+ React20.useEffect(() => {
12872
+ if (!inTour || !tour) return;
12873
+ tour.register({
12874
+ id: tourId,
12875
+ label: tourSection,
12876
+ getEl: () => markerRef.current,
12877
+ photos: normalised
12878
+ });
12879
+ return () => tour.unregister(tourId);
12880
+ }, [inTour, tour, tourId, tourSection, normalised]);
12525
12881
  const handleOpen = (index) => {
12526
- setLightboxIndex(index);
12527
12882
  onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
12883
+ if (inTour && tour) {
12884
+ tour.open(tourId, index);
12885
+ return;
12886
+ }
12887
+ setLightboxIndex(index);
12528
12888
  };
12529
12889
  if (normalised.length === 0) return null;
12530
- const lightbox = lightboxIndex !== null && /* @__PURE__ */ jsx(
12890
+ const tourMarker = inTour && /* @__PURE__ */ jsx("span", { ref: markerRef, "aria-hidden": true, className: "hidden" });
12891
+ const lightbox = lightboxIndex !== null && (lightboxMode === "feed" ? /* @__PURE__ */ jsx(
12892
+ FeedLightbox,
12893
+ {
12894
+ sections: [{ photos: normalised }],
12895
+ initialIndex: lightboxIndex,
12896
+ onClose: () => setLightboxIndex(null),
12897
+ labels
12898
+ }
12899
+ ) : /* @__PURE__ */ jsx(
12531
12900
  Lightbox,
12532
12901
  {
12533
12902
  photos: normalised,
@@ -12535,9 +12904,10 @@ function PhotoGallery({
12535
12904
  onClose: () => setLightboxIndex(null),
12536
12905
  labels
12537
12906
  }
12538
- );
12907
+ ));
12539
12908
  if (variant === "carousel" || variant === "fullBleed") {
12540
12909
  return /* @__PURE__ */ jsxs(Fragment, { children: [
12910
+ tourMarker,
12541
12911
  /* @__PURE__ */ jsx(
12542
12912
  CarouselGallery,
12543
12913
  {
@@ -12556,6 +12926,7 @@ function PhotoGallery({
12556
12926
  ] });
12557
12927
  }
12558
12928
  return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), children: [
12929
+ tourMarker,
12559
12930
  variant === "grid" && /* @__PURE__ */ jsx(
12560
12931
  GridGallery,
12561
12932
  {
@@ -12611,14 +12982,15 @@ function ItineraryDay({
12611
12982
  photoLayout = "rounded",
12612
12983
  className
12613
12984
  }) {
12614
- const photoList = React32.useMemo(() => normalisePhotos(photos), [photos]);
12985
+ const photoList = React20.useMemo(() => normalisePhotos(photos), [photos]);
12615
12986
  const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
12616
12987
  const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
12617
12988
  const gallery = photoList.length > 0 && /* @__PURE__ */ jsx(
12618
12989
  PhotoGallery,
12619
12990
  {
12620
12991
  photos: photoList,
12621
- variant: isFullBleed ? "fullBleed" : "carousel"
12992
+ variant: isFullBleed ? "fullBleed" : "carousel",
12993
+ tourSection: dayLabel != null ? dayLabel : `Day ${dayNumber}`
12622
12994
  }
12623
12995
  );
12624
12996
  return /* @__PURE__ */ jsxs("article", { className: cn("w-full flex flex-col gap-5", className), children: [
@@ -12666,8 +13038,8 @@ function MenuTrip({
12666
13038
  bold = true,
12667
13039
  className
12668
13040
  }) {
12669
- const scrollRef = React32.useRef(null);
12670
- React32.useEffect(() => {
13041
+ const scrollRef = React20.useRef(null);
13042
+ React20.useEffect(() => {
12671
13043
  if (!scrollRef.current || !activeSection) return;
12672
13044
  const container = scrollRef.current;
12673
13045
  const btn = container.querySelector(
@@ -12865,8 +13237,8 @@ function PricingTrip({
12865
13237
  className
12866
13238
  }) {
12867
13239
  const rOuter = sharp ? "rounded-none" : "rounded-2xl";
12868
- const [showEstimates, setShowEstimates] = React32.useState(false);
12869
- const [showPriceInfo, setShowPriceInfo] = React32.useState(false);
13240
+ const [showEstimates, setShowEstimates] = React20.useState(false);
13241
+ const [showPriceInfo, setShowPriceInfo] = React20.useState(false);
12870
13242
  if (variant === "compact") {
12871
13243
  const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
12872
13244
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
@@ -13302,6 +13674,7 @@ function SiteHeader({
13302
13674
  logoSrcDark = "/logo-planetaexo-green.png",
13303
13675
  logoSrc,
13304
13676
  logoAlt = "Planeta Exo",
13677
+ logoHref = "#",
13305
13678
  languages = DEFAULT_LANGUAGES,
13306
13679
  currentLanguage = "EN",
13307
13680
  onLanguageChange,
@@ -13314,14 +13687,14 @@ function SiteHeader({
13314
13687
  var _a, _b, _c, _d, _e, _f, _g;
13315
13688
  const t = VARIANT[variant];
13316
13689
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
13317
- const [openMenu, setOpenMenu] = React32.useState(null);
13318
- const [langOpen, setLangOpen] = React32.useState(false);
13319
- const [mobileOpen, setMobileOpen] = React32.useState(false);
13320
- const [openMobileSection, setOpenMobileSection] = React32.useState(null);
13321
- const [activeLang, setActiveLang] = React32.useState(currentLanguage);
13690
+ const [openMenu, setOpenMenu] = React20.useState(null);
13691
+ const [langOpen, setLangOpen] = React20.useState(false);
13692
+ const [mobileOpen, setMobileOpen] = React20.useState(false);
13693
+ const [openMobileSection, setOpenMobileSection] = React20.useState(null);
13694
+ const [activeLang, setActiveLang] = React20.useState(currentLanguage);
13322
13695
  const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
13323
- const menuCloseTimer = React32.useRef(void 0);
13324
- const langCloseTimer = React32.useRef(void 0);
13696
+ const menuCloseTimer = React20.useRef(void 0);
13697
+ const langCloseTimer = React20.useRef(void 0);
13325
13698
  const handleMenuEnter = (label) => {
13326
13699
  clearTimeout(menuCloseTimer.current);
13327
13700
  setOpenMenu(label);
@@ -13342,7 +13715,7 @@ function SiteHeader({
13342
13715
  setOpenMenu(null);
13343
13716
  setLangOpen(false);
13344
13717
  };
13345
- React32.useEffect(() => () => {
13718
+ React20.useEffect(() => () => {
13346
13719
  clearTimeout(menuCloseTimer.current);
13347
13720
  clearTimeout(langCloseTimer.current);
13348
13721
  }, []);
@@ -13380,7 +13753,7 @@ function SiteHeader({
13380
13753
  /* @__PURE__ */ jsx(
13381
13754
  "a",
13382
13755
  {
13383
- href: "#",
13756
+ href: logoHref,
13384
13757
  className: cn(
13385
13758
  "shrink-0 flex items-center",
13386
13759
  "absolute left-1/2 -translate-x-1/2",
@@ -13532,7 +13905,7 @@ function SiteHeader({
13532
13905
  ),
13533
13906
  children: [
13534
13907
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 h-[72px] shrink-0 border-b border-white/8", children: [
13535
- /* @__PURE__ */ jsx("a", { href: "#", className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsx(
13908
+ /* @__PURE__ */ jsx("a", { href: logoHref, className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsx(
13536
13909
  "img",
13537
13910
  {
13538
13911
  src: resolvedLogo,
@@ -13618,7 +13991,7 @@ function SiteHeader({
13618
13991
  ), children: [
13619
13992
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
13620
13993
  const isActive = lang.code === activeLang;
13621
- return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
13994
+ return /* @__PURE__ */ jsxs(React20.Fragment, { children: [
13622
13995
  i > 0 && /* @__PURE__ */ jsx("span", { className: cn(
13623
13996
  "text-xs select-none",
13624
13997
  variant === "white" ? "text-border" : "text-white/15"
@@ -13680,8 +14053,8 @@ function SiteHeader({
13680
14053
  );
13681
14054
  }
13682
14055
  function ThemeToggle({ className }) {
13683
- const [dark, setDark] = React32.useState(false);
13684
- React32.useEffect(() => {
14056
+ const [dark, setDark] = React20.useState(false);
14057
+ React20.useEffect(() => {
13685
14058
  const saved = localStorage.getItem("theme");
13686
14059
  const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
13687
14060
  const isDark = saved === "dark" || !saved && prefersDark;
@@ -13731,7 +14104,7 @@ var chipVariants = cva(
13731
14104
  }
13732
14105
  }
13733
14106
  );
13734
- var Chip = React32.forwardRef(function Chip2(_a, ref) {
14107
+ var Chip = React20.forwardRef(function Chip2(_a, ref) {
13735
14108
  var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
13736
14109
  const classes = cn(chipVariants({ variant, size }), className);
13737
14110
  if (href) {
@@ -13798,6 +14171,19 @@ var statusConfig = {
13798
14171
  icon: /* @__PURE__ */ jsx(TrendingIcon, {})
13799
14172
  }
13800
14173
  };
14174
+ function StarIcon() {
14175
+ return /* @__PURE__ */ jsx(
14176
+ "svg",
14177
+ {
14178
+ width: "15",
14179
+ height: "15",
14180
+ viewBox: "0 0 24 24",
14181
+ fill: "currentColor",
14182
+ "aria-hidden": "true",
14183
+ 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" })
14184
+ }
14185
+ );
14186
+ }
13801
14187
  function HeartIcon({ filled = false }) {
13802
14188
  return /* @__PURE__ */ jsx(
13803
14189
  "svg",
@@ -13815,7 +14201,7 @@ function HeartIcon({ filled = false }) {
13815
14201
  );
13816
14202
  }
13817
14203
  function TripCardEditorial(props) {
13818
- var _a, _b, _c, _d;
14204
+ var _a, _b, _c, _d, _e, _f;
13819
14205
  const {
13820
14206
  image,
13821
14207
  imageAlt = "",
@@ -13832,10 +14218,14 @@ function TripCardEditorial(props) {
13832
14218
  location,
13833
14219
  locationHref,
13834
14220
  difficulty,
14221
+ rating,
14222
+ reviewCount,
13835
14223
  tag,
13836
14224
  tagHref
13837
14225
  } = props;
13838
- const [internalFav, setInternalFav] = React32.useState(false);
14226
+ const hasRating = typeof rating === "number" && rating > 0;
14227
+ const reviewsWord = reviewCount === 1 ? (_a = labels == null ? void 0 : labels.review) != null ? _a : "review" : (_b = labels == null ? void 0 : labels.reviews) != null ? _b : "reviews";
14228
+ const [internalFav, setInternalFav] = React20.useState(false);
13839
14229
  const favorited = favoritedProp != null ? favoritedProp : internalFav;
13840
14230
  const handleFav = (e) => {
13841
14231
  e.preventDefault();
@@ -13877,7 +14267,7 @@ function TripCardEditorial(props) {
13877
14267
  "button",
13878
14268
  {
13879
14269
  type: "button",
13880
- "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",
14270
+ "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",
13881
14271
  "aria-pressed": favorited,
13882
14272
  onClick: handleFav,
13883
14273
  className: cn(
@@ -13891,7 +14281,24 @@ function TripCardEditorial(props) {
13891
14281
  ),
13892
14282
  /* @__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 }) })
13893
14283
  ] }),
13894
- (description || price || nights || location || difficulty) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
14284
+ (description || price || nights || location || difficulty || hasRating) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
14285
+ hasRating && /* @__PURE__ */ jsxs(
14286
+ "div",
14287
+ {
14288
+ className: "flex items-center gap-1.5 text-foreground/85",
14289
+ "aria-label": reviewCount ? `${rating.toFixed(1)} (${reviewCount} ${reviewsWord})` : `${rating.toFixed(1)}`,
14290
+ children: [
14291
+ /* @__PURE__ */ jsx("span", { className: "text-amber-500", children: /* @__PURE__ */ jsx(StarIcon, {}) }),
14292
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-ui font-semibold", children: rating.toFixed(1) }),
14293
+ reviewCount ? /* @__PURE__ */ jsxs("span", { className: "text-xs font-ui text-muted-foreground", children: [
14294
+ "\xB7 ",
14295
+ reviewCount,
14296
+ " ",
14297
+ reviewsWord
14298
+ ] }) : null
14299
+ ]
14300
+ }
14301
+ ),
13895
14302
  (location || difficulty) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
13896
14303
  location ? locationHref ? (
13897
14304
  // Above the card's stretched link (z-20) so the location is
@@ -13921,7 +14328,7 @@ function TripCardEditorial(props) {
13921
14328
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13922
14329
  nights,
13923
14330
  " ",
13924
- nights === 1 ? (_c = labels == null ? void 0 : labels.night) != null ? _c : "night" : (_d = labels == null ? void 0 : labels.nights) != null ? _d : "nights"
14331
+ nights === 1 ? (_e = labels == null ? void 0 : labels.night) != null ? _e : "night" : (_f = labels == null ? void 0 : labels.nights) != null ? _f : "nights"
13925
14332
  ] })
13926
14333
  ] }) : /* @__PURE__ */ jsx("span", {}),
13927
14334
  price && /* @__PURE__ */ jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
@@ -14350,7 +14757,7 @@ function BlogPost({
14350
14757
  ) }),
14351
14758
  /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
14352
14759
  /* @__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: [
14353
- 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: [
14760
+ 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: [
14354
14761
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
14355
14762
  crumb.href ? /* @__PURE__ */ jsx(
14356
14763
  "a",
@@ -14404,7 +14811,7 @@ function BlogPost({
14404
14811
  ] });
14405
14812
  }
14406
14813
  function useHlsVideo(videoRef, src) {
14407
- React32.useEffect(() => {
14814
+ React20.useEffect(() => {
14408
14815
  if (!src || !videoRef.current) return;
14409
14816
  const video = videoRef.current;
14410
14817
  if (!src.includes(".m3u8")) return;
@@ -14450,11 +14857,11 @@ function TripHeader({
14450
14857
  className
14451
14858
  }) {
14452
14859
  var _a, _b, _c, _d, _e, _f, _g;
14453
- const [heroIndex, setHeroIndex] = React32.useState(0);
14454
- const [videoReady, setVideoReady] = React32.useState(false);
14455
- const videoRef = React32.useRef(null);
14860
+ const [heroIndex, setHeroIndex] = React20.useState(0);
14861
+ const [videoReady, setVideoReady] = React20.useState(false);
14862
+ const videoRef = React20.useRef(null);
14456
14863
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
14457
- const validImages = React32.useMemo(
14864
+ const validImages = React20.useMemo(
14458
14865
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
14459
14866
  [images]
14460
14867
  );
@@ -14469,7 +14876,7 @@ function TripHeader({
14469
14876
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
14470
14877
  const hasMeta = !!(destination || duration || groupSize);
14471
14878
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
14472
- React32.useEffect(() => {
14879
+ React20.useEffect(() => {
14473
14880
  if (!videoUrl) return;
14474
14881
  const el = videoRef.current;
14475
14882
  if (!el) return;
@@ -14612,7 +15019,7 @@ function TripHeader({
14612
15019
  chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
14613
15020
  ),
14614
15021
  children: [
14615
- 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: [
15022
+ 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: [
14616
15023
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
14617
15024
  /* @__PURE__ */ jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
14618
15025
  ] }, i)) }),
@@ -14782,10 +15189,10 @@ function LanguagePicker({
14782
15189
  }) {
14783
15190
  var _a;
14784
15191
  const t = VARIANT2[variant];
14785
- const [open, setOpen] = React32.useState(false);
14786
- const ref = React32.useRef(null);
15192
+ const [open, setOpen] = React20.useState(false);
15193
+ const ref = React20.useRef(null);
14787
15194
  const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
14788
- React32.useEffect(() => {
15195
+ React20.useEffect(() => {
14789
15196
  if (!open) return;
14790
15197
  const onDocClick = (e) => {
14791
15198
  if (ref.current && !ref.current.contains(e.target)) {
@@ -14993,7 +15400,7 @@ function SiteFooter({
14993
15400
  children: wrapper
14994
15401
  },
14995
15402
  b.alt + i
14996
- ) : /* @__PURE__ */ jsx(React32.Fragment, { children: wrapper }, b.alt + i);
15403
+ ) : /* @__PURE__ */ jsx(React20.Fragment, { children: wrapper }, b.alt + i);
14997
15404
  }) })
14998
15405
  ] }),
14999
15406
  themes.length > 0 && /* @__PURE__ */ jsxs("div", { className: "lg:col-span-3", children: [
@@ -15081,7 +15488,7 @@ function SiteFooter({
15081
15488
  }
15082
15489
  function Stars({ count = 5 }) {
15083
15490
  return /* @__PURE__ */ jsx("span", { className: "flex gap-0.5", children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx(
15084
- StarIcon,
15491
+ StarIcon$1,
15085
15492
  {
15086
15493
  className: cn(
15087
15494
  "h-3.5 w-3.5",
@@ -15135,6 +15542,7 @@ function TripPage({
15135
15542
  itinerary,
15136
15543
  itineraryDays,
15137
15544
  gallery,
15545
+ galleryLightbox = "classic",
15138
15546
  included,
15139
15547
  notIncluded,
15140
15548
  whatToBring,
@@ -15174,15 +15582,16 @@ function TripPage({
15174
15582
  fromLabel,
15175
15583
  perPersonLabel,
15176
15584
  siteHeader,
15585
+ footerBadges,
15177
15586
  uiVariant = "v1",
15178
15587
  features,
15179
15588
  className
15180
15589
  }) {
15181
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
15182
- const [activeSection, setActiveSection] = React32.useState("");
15183
- const [accordionValue, setAccordionValue] = React32.useState([]);
15184
- const [faqsExpanded, setFaqsExpanded] = React32.useState(false);
15185
- const accordionSectionIds = React32.useMemo(
15590
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
15591
+ const [activeSection, setActiveSection] = React20.useState("");
15592
+ const [accordionValue, setAccordionValue] = React20.useState([]);
15593
+ const [faqsExpanded, setFaqsExpanded] = React20.useState(false);
15594
+ const accordionSectionIds = React20.useMemo(
15186
15595
  () => /* @__PURE__ */ new Set([
15187
15596
  "when-it-operates",
15188
15597
  "how-to-get-there",
@@ -15196,18 +15605,18 @@ function TripPage({
15196
15605
  ]),
15197
15606
  []
15198
15607
  );
15199
- const [navFloating, setNavFloating] = React32.useState(false);
15200
- const [navHidden, setNavHidden] = React32.useState(false);
15201
- const [isFloating, setIsFloating] = React32.useState(false);
15202
- const [sidebarPos, setSidebarPos] = React32.useState(null);
15203
- const [pricingBarVisible, setPricingBarVisible] = React32.useState(false);
15204
- const navRef = React32.useRef(null);
15205
- const navSentinelRef = React32.useRef(null);
15206
- const sentinelRef = React32.useRef(null);
15207
- const sidebarPlaceholderRef = React32.useRef(null);
15208
- const pricingBarRef = React32.useRef(null);
15209
- const galleryRef = React32.useRef(null);
15210
- const sections = React32.useMemo(
15608
+ const [navFloating, setNavFloating] = React20.useState(false);
15609
+ const [navHidden, setNavHidden] = React20.useState(false);
15610
+ const [isFloating, setIsFloating] = React20.useState(false);
15611
+ const [sidebarPos, setSidebarPos] = React20.useState(null);
15612
+ const [pricingBarVisible, setPricingBarVisible] = React20.useState(false);
15613
+ const navRef = React20.useRef(null);
15614
+ const navSentinelRef = React20.useRef(null);
15615
+ const sentinelRef = React20.useRef(null);
15616
+ const sidebarPlaceholderRef = React20.useRef(null);
15617
+ const pricingBarRef = React20.useRef(null);
15618
+ const galleryRef = React20.useRef(null);
15619
+ const sections = React20.useMemo(
15211
15620
  () => {
15212
15621
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
15213
15622
  return [
@@ -15229,7 +15638,7 @@ function TripPage({
15229
15638
  // eslint-disable-next-line react-hooks/exhaustive-deps
15230
15639
  []
15231
15640
  );
15232
- React32.useEffect(() => {
15641
+ React20.useEffect(() => {
15233
15642
  const sentinel = navSentinelRef.current;
15234
15643
  if (!sentinel) return;
15235
15644
  const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
@@ -15237,7 +15646,7 @@ function TripPage({
15237
15646
  update();
15238
15647
  return () => document.removeEventListener("scroll", update, { capture: true });
15239
15648
  }, []);
15240
- React32.useEffect(() => {
15649
+ React20.useEffect(() => {
15241
15650
  const sentinel = sentinelRef.current;
15242
15651
  if (!sentinel) return;
15243
15652
  const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
@@ -15245,7 +15654,7 @@ function TripPage({
15245
15654
  update();
15246
15655
  return () => document.removeEventListener("scroll", update, { capture: true });
15247
15656
  }, []);
15248
- React32.useEffect(() => {
15657
+ React20.useEffect(() => {
15249
15658
  const measure = () => {
15250
15659
  if (!sidebarPlaceholderRef.current) return;
15251
15660
  const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
@@ -15255,7 +15664,7 @@ function TripPage({
15255
15664
  window.addEventListener("resize", measure);
15256
15665
  return () => window.removeEventListener("resize", measure);
15257
15666
  }, [isFloating]);
15258
- React32.useEffect(() => {
15667
+ React20.useEffect(() => {
15259
15668
  const check = () => {
15260
15669
  var _a2;
15261
15670
  const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
@@ -15266,7 +15675,7 @@ function TripPage({
15266
15675
  check();
15267
15676
  return () => document.removeEventListener("scroll", check, { capture: true });
15268
15677
  }, []);
15269
- React32.useEffect(() => {
15678
+ React20.useEffect(() => {
15270
15679
  const check = () => {
15271
15680
  if (!pricingBarRef.current) return;
15272
15681
  setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
@@ -15275,7 +15684,7 @@ function TripPage({
15275
15684
  check();
15276
15685
  return () => document.removeEventListener("scroll", check, { capture: true });
15277
15686
  }, []);
15278
- React32.useEffect(() => {
15687
+ React20.useEffect(() => {
15279
15688
  if (sections.length === 0) return;
15280
15689
  setActiveSection(sections[0].id);
15281
15690
  const update = () => {
@@ -15333,468 +15742,483 @@ function TripPage({
15333
15742
  }
15334
15743
  performScroll();
15335
15744
  };
15336
- return /* @__PURE__ */ jsxs(
15337
- "div",
15745
+ return /* @__PURE__ */ jsx(
15746
+ PhotoTourProvider,
15338
15747
  {
15339
- className: cn("w-full overflow-x-hidden", className),
15340
- "data-ui-variant": uiVariant,
15341
- "data-features": features ? JSON.stringify(features) : void 0,
15342
- children: [
15343
- /* @__PURE__ */ jsx(
15344
- TripHeader,
15345
- {
15346
- images,
15347
- videoUrl,
15348
- title,
15349
- breadcrumb,
15350
- destination,
15351
- duration,
15352
- groupSize,
15353
- labels: {
15354
- night: labels == null ? void 0 : labels.night,
15355
- nights: labels == null ? void 0 : labels.nights,
15356
- day: labels == null ? void 0 : labels.day,
15357
- days: labels == null ? void 0 : labels.days,
15358
- previousImage: labels == null ? void 0 : labels.previousImage,
15359
- nextImage: labels == null ? void 0 : labels.nextImage
15360
- },
15361
- tagline,
15362
- chips,
15363
- siteHeader,
15364
- uiVariant,
15365
- belowMeta: trustpilotHero ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
15366
- }
15367
- ),
15368
- /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
15369
- 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: [
15370
- 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 }),
15371
- /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
15372
- ] }, i)) }),
15373
- /* @__PURE__ */ jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
15374
- sections.length > 0 ? /* @__PURE__ */ jsx(
15375
- "div",
15376
- {
15377
- className: cn(
15378
- "pt-8 pb-2 flex justify-center transition-opacity duration-150",
15379
- navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
15380
- ),
15381
- children: /* @__PURE__ */ jsx(
15382
- MenuTrip,
15748
+ enabled: galleryLightbox === "feed",
15749
+ labels: {
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
+ children: /* @__PURE__ */ jsxs(
15755
+ "div",
15756
+ {
15757
+ className: cn("w-full overflow-x-hidden", className),
15758
+ "data-ui-variant": uiVariant,
15759
+ "data-features": features ? JSON.stringify(features) : void 0,
15760
+ children: [
15761
+ /* @__PURE__ */ jsx(
15762
+ TripHeader,
15763
+ {
15764
+ images,
15765
+ videoUrl,
15766
+ title,
15767
+ breadcrumb,
15768
+ destination,
15769
+ duration,
15770
+ groupSize,
15771
+ labels: {
15772
+ night: labels == null ? void 0 : labels.night,
15773
+ nights: labels == null ? void 0 : labels.nights,
15774
+ day: labels == null ? void 0 : labels.day,
15775
+ days: labels == null ? void 0 : labels.days,
15776
+ previousImage: labels == null ? void 0 : labels.previousImage,
15777
+ nextImage: labels == null ? void 0 : labels.nextImage
15778
+ },
15779
+ tagline,
15780
+ chips,
15781
+ siteHeader,
15782
+ uiVariant,
15783
+ belowMeta: trustpilotHero ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
15784
+ }
15785
+ ),
15786
+ /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
15787
+ 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: [
15788
+ 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 }),
15789
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
15790
+ ] }, i)) }),
15791
+ /* @__PURE__ */ jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
15792
+ sections.length > 0 ? /* @__PURE__ */ jsx(
15793
+ "div",
15383
15794
  {
15384
- sections,
15385
- activeSection,
15386
- onSelect: scrollToSection,
15387
- variant: "floating"
15795
+ className: cn(
15796
+ "pt-8 pb-2 flex justify-center transition-opacity duration-150",
15797
+ navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
15798
+ ),
15799
+ children: /* @__PURE__ */ jsx(
15800
+ MenuTrip,
15801
+ {
15802
+ sections,
15803
+ activeSection,
15804
+ onSelect: scrollToSection,
15805
+ variant: "floating"
15806
+ }
15807
+ )
15388
15808
  }
15389
- )
15390
- }
15391
- ) : /* @__PURE__ */ jsx(Separator, { className: "my-6" }),
15392
- /* @__PURE__ */ jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
15393
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
15394
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
15395
- (overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
15396
- /* @__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" }),
15397
- overview && /* @__PURE__ */ jsx("div", { className: "text-lg text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview }),
15398
- 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: [
15399
- 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 }),
15400
- /* @__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 })
15401
- ] }, i)) }),
15402
- 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: [
15403
- /* @__PURE__ */ jsx(UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
15404
- /* @__PURE__ */ jsxs("p", { className: "text-base text-foreground font-ui", children: [
15405
- /* @__PURE__ */ jsx("span", { className: "font-semibold", children: "Recommended for: " }),
15406
- recommendedFor
15407
- ] })
15408
- ] })
15409
- ] }),
15410
- itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15411
- /* @__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" }),
15412
- /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsx(
15413
- ItineraryDay,
15414
- __spreadProps(__spreadValues({}, day), {
15415
- photoLayout: "fullBleedBottom"
15416
- }),
15417
- day.dayNumber
15418
- )) })
15419
- ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15420
- /* @__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" }),
15421
- /* @__PURE__ */ jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
15422
- ] }),
15423
- included && included.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
15424
- /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15425
- (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" }),
15426
- (_d = labels == null ? void 0 : labels.whatIsIncluded) != null ? _d : "Included"
15427
- ] }),
15428
- /* @__PURE__ */ jsx(Checklist, { items: included })
15429
- ] }),
15430
- notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
15431
- /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15432
- /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5 text-muted-foreground" }),
15433
- (_e = labels == null ? void 0 : labels.notIncluded) != null ? _e : "Not included"
15434
- ] }),
15435
- /* @__PURE__ */ jsx(
15436
- Checklist,
15437
- {
15438
- items: notIncluded,
15439
- icon: /* @__PURE__ */ jsx(XIcon, { className: "h-4 w-4 text-muted-foreground" })
15440
- }
15441
- )
15442
- ] }),
15443
- (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(
15444
- Accordion,
15445
- {
15446
- multiple: false,
15447
- value: accordionValue,
15448
- onValueChange: setAccordionValue,
15449
- className: "border-t border-border",
15450
- children: [
15451
- whenItOperates && /* @__PURE__ */ jsxs(
15452
- AccordionItem,
15453
- {
15454
- value: "when-it-operates",
15455
- id: "trip-section-when-it-operates",
15456
- className: "scroll-mt-20 border-b border-border",
15457
- children: [
15458
- /* @__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: [
15459
- (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" }),
15460
- (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
15461
- ] }) }),
15462
- /* @__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 }) })
15463
- ]
15464
- }
15465
- ),
15466
- (accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxs(
15467
- AccordionItem,
15468
- {
15469
- value: "accommodation",
15470
- id: "trip-section-accommodation",
15471
- className: "scroll-mt-20 border-b border-border",
15472
- children: [
15473
- /* @__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: [
15474
- (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" }),
15475
- (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
15476
- ] }) }),
15477
- /* @__PURE__ */ jsxs(AccordionContent, { className: "pb-6", children: [
15478
- accommodation && /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }),
15479
- accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsx(
15480
- PhotoGallery,
15481
- {
15482
- labels: {
15483
- seeMore: labels == null ? void 0 : labels.seeMore,
15484
- showLess: labels == null ? void 0 : labels.showLess,
15485
- close: labels == null ? void 0 : labels.galleryClose,
15486
- previous: labels == null ? void 0 : labels.galleryPrevious,
15487
- next: labels == null ? void 0 : labels.galleryNext
15488
- },
15489
- photos: accommodationGallery,
15490
- variant: accommodationGalleryVariant,
15491
- initialVisible: 6
15492
- }
15493
- ) })
15494
- ] })
15495
- ]
15496
- }
15497
- ),
15498
- (food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxs(
15499
- AccordionItem,
15500
- {
15501
- value: "food",
15502
- id: "trip-section-food",
15503
- className: "scroll-mt-20 border-b border-border",
15504
- children: [
15505
- /* @__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: [
15506
- (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" }),
15507
- (_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
15508
- ] }) }),
15509
- /* @__PURE__ */ jsxs(AccordionContent, { className: "pb-6", children: [
15510
- food && /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }),
15511
- foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsx(
15512
- PhotoGallery,
15513
- {
15514
- labels: {
15515
- seeMore: labels == null ? void 0 : labels.seeMore,
15516
- showLess: labels == null ? void 0 : labels.showLess,
15517
- close: labels == null ? void 0 : labels.galleryClose,
15518
- previous: labels == null ? void 0 : labels.galleryPrevious,
15519
- next: labels == null ? void 0 : labels.galleryNext
15520
- },
15521
- photos: foodGallery,
15522
- variant: foodGalleryVariant,
15523
- initialVisible: 6
15524
- }
15525
- ) })
15526
- ] })
15527
- ]
15528
- }
15529
- ),
15530
- (meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxs(
15531
- AccordionItem,
15532
- {
15533
- value: "meeting",
15534
- id: "trip-section-meeting",
15535
- className: "scroll-mt-20 border-b border-border",
15536
- children: [
15537
- /* @__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: [
15538
- (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" }),
15539
- (_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
15540
- ] }) }),
15541
- /* @__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) => {
15542
- var _a2, _b2, _c2;
15543
- return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15544
- /* @__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" }) }),
15545
- /* @__PURE__ */ jsxs("div", { children: [
15546
- 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" }),
15547
- /* @__PURE__ */ jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15548
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15549
- ] })
15550
- ] }, i);
15551
- }) }) })
15552
- ]
15553
- }
15554
- ),
15555
- howToGetThere && /* @__PURE__ */ jsxs(
15556
- AccordionItem,
15557
- {
15558
- value: "how-to-get-there",
15559
- id: "trip-section-how-to-get-there",
15560
- className: "scroll-mt-20 border-b border-border",
15561
- children: [
15562
- /* @__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: [
15563
- (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" }),
15564
- (_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
15565
- ] }) }),
15566
- /* @__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 }) })
15567
- ]
15568
- }
15569
- ),
15570
- weather && /* @__PURE__ */ jsxs(
15571
- AccordionItem,
15572
- {
15573
- value: "weather",
15574
- id: "trip-section-weather",
15575
- className: "scroll-mt-20 border-b border-border",
15576
- children: [
15577
- /* @__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: [
15578
- (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" }),
15579
- (_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
15580
- ] }) }),
15581
- /* @__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 }) })
15582
- ]
15583
- }
15584
- ),
15585
- whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxs(
15586
- AccordionItem,
15587
- {
15588
- value: "what-to-bring",
15589
- id: "trip-section-what-to-bring",
15590
- className: "scroll-mt-20 border-b border-border",
15591
- children: [
15592
- /* @__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: [
15593
- (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" }),
15594
- (_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
15595
- ] }) }),
15596
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsx(InfoIcon, { className: "h-4 w-4" }) }) })
15597
- ]
15598
- }
15599
- ),
15600
- optionalExtras && /* @__PURE__ */ jsxs(
15601
- AccordionItem,
15602
- {
15603
- value: "optional-extras",
15604
- id: "trip-section-optional-extras",
15605
- className: "scroll-mt-20 border-b border-border",
15606
- children: [
15607
- /* @__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: [
15608
- (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" }),
15609
- (_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
15610
- ] }) }),
15611
- /* @__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 }) })
15612
- ]
15613
- }
15614
- ),
15615
- termsAndConditions && /* @__PURE__ */ jsxs(
15616
- AccordionItem,
15809
+ ) : /* @__PURE__ */ jsx(Separator, { className: "my-6" }),
15810
+ /* @__PURE__ */ jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
15811
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
15812
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
15813
+ (overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
15814
+ /* @__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" }),
15815
+ overview && /* @__PURE__ */ jsx("div", { className: "text-lg text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview }),
15816
+ 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: [
15817
+ 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 }),
15818
+ /* @__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 })
15819
+ ] }, i)) }),
15820
+ 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: [
15821
+ /* @__PURE__ */ jsx(UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
15822
+ /* @__PURE__ */ jsxs("p", { className: "text-base text-foreground font-ui", children: [
15823
+ /* @__PURE__ */ jsx("span", { className: "font-semibold", children: "Recommended for: " }),
15824
+ recommendedFor
15825
+ ] })
15826
+ ] })
15827
+ ] }),
15828
+ itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15829
+ /* @__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" }),
15830
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsx(
15831
+ ItineraryDay,
15832
+ __spreadProps(__spreadValues({}, day), {
15833
+ photoLayout: "fullBleedBottom"
15834
+ }),
15835
+ day.dayNumber
15836
+ )) })
15837
+ ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
15838
+ /* @__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" }),
15839
+ /* @__PURE__ */ jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
15840
+ ] }),
15841
+ included && included.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
15842
+ /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15843
+ (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" }),
15844
+ (_d = labels == null ? void 0 : labels.whatIsIncluded) != null ? _d : "Included"
15845
+ ] }),
15846
+ /* @__PURE__ */ jsx(Checklist, { items: included })
15847
+ ] }),
15848
+ notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
15849
+ /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
15850
+ /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5 text-muted-foreground" }),
15851
+ (_e = labels == null ? void 0 : labels.notIncluded) != null ? _e : "Not included"
15852
+ ] }),
15853
+ /* @__PURE__ */ jsx(
15854
+ Checklist,
15617
15855
  {
15618
- value: "terms",
15619
- id: "trip-section-terms",
15620
- className: "scroll-mt-20 border-b border-border",
15621
- children: [
15622
- /* @__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: [
15623
- (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" }),
15624
- (_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
15625
- ] }) }),
15626
- /* @__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 }) })
15627
- ]
15856
+ items: notIncluded,
15857
+ icon: /* @__PURE__ */ jsx(XIcon, { className: "h-4 w-4 text-muted-foreground" })
15628
15858
  }
15629
15859
  )
15630
- ]
15631
- }
15632
- ),
15633
- faqs && faqs.length > 0 && (() => {
15634
- var _a2, _b2, _c2;
15635
- const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
15636
- const hiddenCount = faqs.length - visibleFaqs.length;
15637
- return /* @__PURE__ */ jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
15638
- /* @__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" }),
15639
- /* @__PURE__ */ jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxs(AccordionItem, { value: `faq-${i}`, children: [
15640
- /* @__PURE__ */ jsx(AccordionTrigger, { children: faq.question }),
15641
- /* @__PURE__ */ jsx(AccordionContent, { children: faq.answer })
15642
- ] }, i)) }),
15643
- faqs.length > faqInitialCount && /* @__PURE__ */ jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsx(
15644
- "button",
15860
+ ] }),
15861
+ (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(
15862
+ Accordion,
15645
15863
  {
15646
- type: "button",
15647
- onClick: () => setFaqsExpanded((v) => !v),
15648
- className: cn(
15649
- "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15650
- "text-sm font-semibold text-foreground shadow-sm",
15651
- "hover:bg-muted transition-colors duration-150",
15652
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15653
- ),
15654
- children: faqsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
15655
- /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15656
- (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
15657
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15658
- /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15659
- (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
15660
- " (",
15661
- hiddenCount,
15662
- ")"
15663
- ] })
15864
+ multiple: false,
15865
+ value: accordionValue,
15866
+ onValueChange: setAccordionValue,
15867
+ className: "border-t border-border",
15868
+ children: [
15869
+ whenItOperates && /* @__PURE__ */ jsxs(
15870
+ AccordionItem,
15871
+ {
15872
+ value: "when-it-operates",
15873
+ id: "trip-section-when-it-operates",
15874
+ className: "scroll-mt-20 border-b border-border",
15875
+ children: [
15876
+ /* @__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: [
15877
+ (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" }),
15878
+ (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
15879
+ ] }) }),
15880
+ /* @__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 }) })
15881
+ ]
15882
+ }
15883
+ ),
15884
+ (accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxs(
15885
+ AccordionItem,
15886
+ {
15887
+ value: "accommodation",
15888
+ id: "trip-section-accommodation",
15889
+ className: "scroll-mt-20 border-b border-border",
15890
+ children: [
15891
+ /* @__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: [
15892
+ (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" }),
15893
+ (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
15894
+ ] }) }),
15895
+ /* @__PURE__ */ jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
15896
+ accommodation && /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }),
15897
+ accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsx(
15898
+ PhotoGallery,
15899
+ {
15900
+ labels: {
15901
+ seeMore: labels == null ? void 0 : labels.seeMore,
15902
+ showLess: labels == null ? void 0 : labels.showLess,
15903
+ close: labels == null ? void 0 : labels.galleryClose,
15904
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15905
+ next: labels == null ? void 0 : labels.galleryNext
15906
+ },
15907
+ photos: accommodationGallery,
15908
+ variant: accommodationGalleryVariant,
15909
+ initialVisible: 6,
15910
+ tourSection: (_h = labels == null ? void 0 : labels.accommodation) != null ? _h : "Accommodation"
15911
+ }
15912
+ ) })
15913
+ ] })
15914
+ ]
15915
+ }
15916
+ ),
15917
+ (food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxs(
15918
+ AccordionItem,
15919
+ {
15920
+ value: "food",
15921
+ id: "trip-section-food",
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.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" }),
15926
+ (_i = labels == null ? void 0 : labels.food) != null ? _i : "Food"
15927
+ ] }) }),
15928
+ /* @__PURE__ */ jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
15929
+ food && /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }),
15930
+ foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsx(
15931
+ PhotoGallery,
15932
+ {
15933
+ labels: {
15934
+ seeMore: labels == null ? void 0 : labels.seeMore,
15935
+ showLess: labels == null ? void 0 : labels.showLess,
15936
+ close: labels == null ? void 0 : labels.galleryClose,
15937
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15938
+ next: labels == null ? void 0 : labels.galleryNext
15939
+ },
15940
+ photos: foodGallery,
15941
+ variant: foodGalleryVariant,
15942
+ initialVisible: 6,
15943
+ tourSection: (_j = labels == null ? void 0 : labels.food) != null ? _j : "Food"
15944
+ }
15945
+ ) })
15946
+ ] })
15947
+ ]
15948
+ }
15949
+ ),
15950
+ (meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxs(
15951
+ AccordionItem,
15952
+ {
15953
+ value: "meeting",
15954
+ id: "trip-section-meeting",
15955
+ className: "scroll-mt-20 border-b border-border",
15956
+ children: [
15957
+ /* @__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: [
15958
+ (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" }),
15959
+ (_k = labels == null ? void 0 : labels.meetingPoint) != null ? _k : "Meeting point"
15960
+ ] }) }),
15961
+ /* @__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) => {
15962
+ var _a2, _b2, _c2;
15963
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15964
+ /* @__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" }) }),
15965
+ /* @__PURE__ */ jsxs("div", { children: [
15966
+ 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" }),
15967
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15968
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15969
+ ] })
15970
+ ] }, i);
15971
+ }) }) })
15972
+ ]
15973
+ }
15974
+ ),
15975
+ howToGetThere && /* @__PURE__ */ jsxs(
15976
+ AccordionItem,
15977
+ {
15978
+ value: "how-to-get-there",
15979
+ id: "trip-section-how-to-get-there",
15980
+ className: "scroll-mt-20 border-b border-border",
15981
+ children: [
15982
+ /* @__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: [
15983
+ (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" }),
15984
+ (_l = labels == null ? void 0 : labels.howToGetThere) != null ? _l : "How to get there"
15985
+ ] }) }),
15986
+ /* @__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 }) })
15987
+ ]
15988
+ }
15989
+ ),
15990
+ weather && /* @__PURE__ */ jsxs(
15991
+ AccordionItem,
15992
+ {
15993
+ value: "weather",
15994
+ id: "trip-section-weather",
15995
+ className: "scroll-mt-20 border-b border-border",
15996
+ children: [
15997
+ /* @__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: [
15998
+ (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" }),
15999
+ (_m = labels == null ? void 0 : labels.weather) != null ? _m : "Weather"
16000
+ ] }) }),
16001
+ /* @__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 }) })
16002
+ ]
16003
+ }
16004
+ ),
16005
+ whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxs(
16006
+ AccordionItem,
16007
+ {
16008
+ value: "what-to-bring",
16009
+ id: "trip-section-what-to-bring",
16010
+ className: "scroll-mt-20 border-b border-border",
16011
+ children: [
16012
+ /* @__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: [
16013
+ (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" }),
16014
+ (_n = labels == null ? void 0 : labels.whatToBring) != null ? _n : "What to bring"
16015
+ ] }) }),
16016
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsx(InfoIcon, { className: "h-4 w-4" }) }) })
16017
+ ]
16018
+ }
16019
+ ),
16020
+ optionalExtras && /* @__PURE__ */ jsxs(
16021
+ AccordionItem,
16022
+ {
16023
+ value: "optional-extras",
16024
+ id: "trip-section-optional-extras",
16025
+ className: "scroll-mt-20 border-b border-border",
16026
+ children: [
16027
+ /* @__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: [
16028
+ (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" }),
16029
+ (_o = labels == null ? void 0 : labels.optionalExtras) != null ? _o : "Optional extras"
16030
+ ] }) }),
16031
+ /* @__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 }) })
16032
+ ]
16033
+ }
16034
+ ),
16035
+ termsAndConditions && /* @__PURE__ */ jsxs(
16036
+ AccordionItem,
16037
+ {
16038
+ value: "terms",
16039
+ id: "trip-section-terms",
16040
+ className: "scroll-mt-20 border-b border-border",
16041
+ children: [
16042
+ /* @__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: [
16043
+ (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" }),
16044
+ (_p = labels == null ? void 0 : labels.terms) != null ? _p : "Terms & conditions"
16045
+ ] }) }),
16046
+ /* @__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 }) })
16047
+ ]
16048
+ }
16049
+ )
16050
+ ]
15664
16051
  }
15665
- ) })
15666
- ] });
15667
- })(),
15668
- trustpilot ? /* @__PURE__ */ jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
15669
- /* @__PURE__ */ jsx(Separator, { className: "mb-10" }),
15670
- /* @__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" }),
15671
- /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilot })
15672
- ] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
15673
- /* @__PURE__ */ jsx(Separator, { className: "mb-10" }),
15674
- /* @__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" }),
15675
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
15676
- var _a2;
15677
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
15678
- /* @__PURE__ */ jsx(Stars, { count: (_a2 = r.rating) != null ? _a2 : 5 }),
15679
- /* @__PURE__ */ jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
15680
- "\u201C",
15681
- r.text,
15682
- "\u201D"
15683
- ] }),
15684
- /* @__PURE__ */ jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
15685
- "\u2014 ",
15686
- r.author
15687
- ] })
15688
- ] }, i);
15689
- }) })
16052
+ ),
16053
+ faqs && faqs.length > 0 && (() => {
16054
+ var _a2, _b2, _c2;
16055
+ const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
16056
+ const hiddenCount = faqs.length - visibleFaqs.length;
16057
+ return /* @__PURE__ */ jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
16058
+ /* @__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" }),
16059
+ /* @__PURE__ */ jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxs(AccordionItem, { value: `faq-${i}`, children: [
16060
+ /* @__PURE__ */ jsx(AccordionTrigger, { children: faq.question }),
16061
+ /* @__PURE__ */ jsx(AccordionContent, { children: faq.answer })
16062
+ ] }, i)) }),
16063
+ faqs.length > faqInitialCount && /* @__PURE__ */ jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsx(
16064
+ "button",
16065
+ {
16066
+ type: "button",
16067
+ onClick: () => setFaqsExpanded((v) => !v),
16068
+ className: cn(
16069
+ "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
16070
+ "text-sm font-semibold text-foreground shadow-sm",
16071
+ "hover:bg-muted transition-colors duration-150",
16072
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
16073
+ ),
16074
+ children: faqsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
16075
+ /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
16076
+ (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
16077
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
16078
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
16079
+ (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
16080
+ " (",
16081
+ hiddenCount,
16082
+ ")"
16083
+ ] })
16084
+ }
16085
+ ) })
16086
+ ] });
16087
+ })(),
16088
+ trustpilot ? /* @__PURE__ */ jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
16089
+ /* @__PURE__ */ jsx(Separator, { className: "mb-10" }),
16090
+ /* @__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" }),
16091
+ /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilot })
16092
+ ] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
16093
+ /* @__PURE__ */ jsx(Separator, { className: "mb-10" }),
16094
+ /* @__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" }),
16095
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
16096
+ var _a2;
16097
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
16098
+ /* @__PURE__ */ jsx(Stars, { count: (_a2 = r.rating) != null ? _a2 : 5 }),
16099
+ /* @__PURE__ */ jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
16100
+ "\u201C",
16101
+ r.text,
16102
+ "\u201D"
16103
+ ] }),
16104
+ /* @__PURE__ */ jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
16105
+ "\u2014 ",
16106
+ r.author
16107
+ ] })
16108
+ ] }, i);
16109
+ }) })
16110
+ ] })
16111
+ ] }),
16112
+ /* @__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(
16113
+ PricingTrip,
16114
+ {
16115
+ priceFrom,
16116
+ currency,
16117
+ season,
16118
+ departureTimes,
16119
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
16120
+ bookLabel: bookLabel != null ? bookLabel : "Check availability",
16121
+ fromLabel,
16122
+ perPersonLabel,
16123
+ variant: "card",
16124
+ belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
16125
+ benefits,
16126
+ currencyEstimates,
16127
+ priceInfo
16128
+ }
16129
+ ) }) })
15690
16130
  ] })
15691
16131
  ] }),
15692
- /* @__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(
15693
- PricingTrip,
16132
+ sections.length > 0 && /* @__PURE__ */ jsx(
16133
+ "div",
15694
16134
  {
15695
- priceFrom,
15696
- currency,
15697
- season,
15698
- departureTimes,
15699
- onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15700
- bookLabel: bookLabel != null ? bookLabel : "Check availability",
15701
- fromLabel,
15702
- perPersonLabel,
15703
- variant: "card",
15704
- belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15705
- benefits,
15706
- currencyEstimates,
15707
- priceInfo
16135
+ ref: navRef,
16136
+ className: cn(
16137
+ "fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
16138
+ navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
16139
+ ),
16140
+ children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 flex justify-center", children: /* @__PURE__ */ jsx(
16141
+ MenuTrip,
16142
+ {
16143
+ sections,
16144
+ activeSection,
16145
+ onSelect: scrollToSection,
16146
+ variant: "floating"
16147
+ }
16148
+ ) })
15708
16149
  }
15709
- ) }) })
15710
- ] })
15711
- ] }),
15712
- sections.length > 0 && /* @__PURE__ */ jsx(
15713
- "div",
15714
- {
15715
- ref: navRef,
15716
- className: cn(
15717
- "fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
15718
- navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
15719
16150
  ),
15720
- children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 flex justify-center", children: /* @__PURE__ */ jsx(
15721
- MenuTrip,
16151
+ isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsx(
16152
+ "div",
15722
16153
  {
15723
- sections,
15724
- activeSection,
15725
- onSelect: scrollToSection,
15726
- variant: "floating"
16154
+ className: "hidden lg:block fixed z-20",
16155
+ style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
16156
+ children: /* @__PURE__ */ jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsx(
16157
+ PricingTrip,
16158
+ {
16159
+ priceFrom,
16160
+ currency,
16161
+ season,
16162
+ departureTimes,
16163
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
16164
+ bookLabel: bookLabel != null ? bookLabel : "Check availability",
16165
+ fromLabel,
16166
+ perPersonLabel,
16167
+ variant: "card",
16168
+ belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
16169
+ benefits,
16170
+ currencyEstimates,
16171
+ priceInfo
16172
+ }
16173
+ ) })
15727
16174
  }
15728
- ) })
15729
- }
15730
- ),
15731
- isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsx(
15732
- "div",
15733
- {
15734
- className: "hidden lg:block fixed z-20",
15735
- style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
15736
- children: /* @__PURE__ */ jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsx(
16175
+ ),
16176
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsx(
16177
+ PhotoGallery,
16178
+ {
16179
+ labels: {
16180
+ seeMore: labels == null ? void 0 : labels.seeMore,
16181
+ showLess: labels == null ? void 0 : labels.showLess,
16182
+ close: labels == null ? void 0 : labels.galleryClose,
16183
+ previous: labels == null ? void 0 : labels.galleryPrevious,
16184
+ next: labels == null ? void 0 : labels.galleryNext
16185
+ },
16186
+ photos: gallery,
16187
+ variant: "gridCompact",
16188
+ initialVisible: 8,
16189
+ lightbox: galleryLightbox,
16190
+ tourSection: (_s = labels == null ? void 0 : labels.gallery) != null ? _s : "Gallery"
16191
+ }
16192
+ ) }),
16193
+ 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(
16194
+ BookingForm,
16195
+ {
16196
+ labels: bookingLabels,
16197
+ defaultValues: bookingDefaults,
16198
+ onSubmit: onBookingSubmit,
16199
+ loading: bookingLoading
16200
+ }
16201
+ ) }) }),
16202
+ /* @__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(
15737
16203
  PricingTrip,
15738
16204
  {
15739
16205
  priceFrom,
15740
16206
  currency,
15741
- season,
15742
- departureTimes,
15743
16207
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15744
- bookLabel: bookLabel != null ? bookLabel : "Check availability",
16208
+ bookLabel: bookLabel != null ? bookLabel : "Book now",
15745
16209
  fromLabel,
15746
16210
  perPersonLabel,
15747
- variant: "card",
15748
- belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15749
- benefits,
15750
- currencyEstimates,
15751
- priceInfo
16211
+ variant: "compact",
16212
+ sharp: true,
16213
+ priceInfo,
16214
+ currencyEstimates
15752
16215
  }
15753
- ) })
15754
- }
15755
- ),
15756
- gallery && gallery.length > 0 && /* @__PURE__ */ jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsx(
15757
- PhotoGallery,
15758
- {
15759
- labels: {
15760
- seeMore: labels == null ? void 0 : labels.seeMore,
15761
- showLess: labels == null ? void 0 : labels.showLess,
15762
- close: labels == null ? void 0 : labels.galleryClose,
15763
- previous: labels == null ? void 0 : labels.galleryPrevious,
15764
- next: labels == null ? void 0 : labels.galleryNext
15765
- },
15766
- photos: gallery,
15767
- variant: "gridCompact",
15768
- initialVisible: 8
15769
- }
15770
- ) }),
15771
- 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(
15772
- BookingForm,
15773
- {
15774
- labels: bookingLabels,
15775
- defaultValues: bookingDefaults,
15776
- onSubmit: onBookingSubmit,
15777
- loading: bookingLoading
15778
- }
15779
- ) }) }),
15780
- /* @__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(
15781
- PricingTrip,
15782
- {
15783
- priceFrom,
15784
- currency,
15785
- onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15786
- bookLabel: bookLabel != null ? bookLabel : "Book now",
15787
- fromLabel,
15788
- perPersonLabel,
15789
- variant: "compact",
15790
- sharp: true,
15791
- priceInfo,
15792
- currencyEstimates
15793
- }
15794
- ) }),
15795
- /* @__PURE__ */ jsx("div", { className: "h-20 lg:hidden" }),
15796
- /* @__PURE__ */ jsx(SiteFooter, {})
15797
- ]
16216
+ ) }),
16217
+ /* @__PURE__ */ jsx("div", { className: "h-20 lg:hidden" }),
16218
+ /* @__PURE__ */ jsx(SiteFooter, { badges: footerBadges })
16219
+ ]
16220
+ }
16221
+ )
15798
16222
  }
15799
16223
  );
15800
16224
  }
@@ -15853,14 +16277,15 @@ function CategoryPage2({
15853
16277
  viewAllPostsLabel,
15854
16278
  cardLabels,
15855
16279
  filterLabels,
16280
+ footerBadges,
15856
16281
  className
15857
16282
  }) {
15858
16283
  var _a;
15859
- const [videoReady, setVideoReady] = React32.useState(false);
15860
- const videoRef = React32.useRef(null);
16284
+ const [videoReady, setVideoReady] = React20.useState(false);
16285
+ const videoRef = React20.useRef(null);
15861
16286
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
15862
16287
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
15863
- React32.useEffect(() => {
16288
+ React20.useEffect(() => {
15864
16289
  if (!videoUrl) return;
15865
16290
  const el = videoRef.current;
15866
16291
  if (!el) return;
@@ -15875,13 +16300,13 @@ function CategoryPage2({
15875
16300
  io.observe(el);
15876
16301
  return () => io.disconnect();
15877
16302
  }, [videoUrl]);
15878
- const [faqsExpanded, setFaqsExpanded] = React32.useState(false);
15879
- const [tripsExpanded, setTripsExpanded] = React32.useState(false);
15880
- const [filterValue, setFilterValue] = React32.useState({});
15881
- const [sort, setSort] = React32.useState(
16303
+ const [faqsExpanded, setFaqsExpanded] = React20.useState(false);
16304
+ const [tripsExpanded, setTripsExpanded] = React20.useState(false);
16305
+ const [filterValue, setFilterValue] = React20.useState({});
16306
+ const [sort, setSort] = React20.useState(
15882
16307
  defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
15883
16308
  );
15884
- const sortedTrips = React32.useMemo(() => {
16309
+ const sortedTrips = React20.useMemo(() => {
15885
16310
  const active = Object.entries(filterValue).filter(
15886
16311
  ([, vals]) => vals && vals.length > 0
15887
16312
  );
@@ -15985,7 +16410,7 @@ function CategoryPage2({
15985
16410
  /* @__PURE__ */ jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
15986
16411
  breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
15987
16412
  const isLast = i === breadcrumb.length - 1;
15988
- return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
16413
+ return /* @__PURE__ */ jsxs(React20.Fragment, { children: [
15989
16414
  i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
15990
16415
  crumb.href && !isLast ? /* @__PURE__ */ jsx(
15991
16416
  "a",
@@ -16177,7 +16602,7 @@ function CategoryPage2({
16177
16602
  ) })
16178
16603
  ] });
16179
16604
  })(),
16180
- /* @__PURE__ */ jsx(SiteFooter, {})
16605
+ /* @__PURE__ */ jsx(SiteFooter, { badges: footerBadges })
16181
16606
  ] });
16182
16607
  }
16183
16608
  var sizeConfig3 = {
@@ -16282,12 +16707,12 @@ function Toast({
16282
16707
  duration = 6e3,
16283
16708
  className
16284
16709
  }) {
16285
- const [mounted, setMounted] = React32.useState(false);
16286
- const [visible, setVisible] = React32.useState(true);
16287
- React32.useEffect(() => {
16710
+ const [mounted, setMounted] = React20.useState(false);
16711
+ const [visible, setVisible] = React20.useState(true);
16712
+ React20.useEffect(() => {
16288
16713
  setMounted(true);
16289
16714
  }, []);
16290
- React32.useEffect(() => {
16715
+ React20.useEffect(() => {
16291
16716
  if (duration === 0) return;
16292
16717
  const t = setTimeout(() => {
16293
16718
  setVisible(false);
@@ -17789,8 +18214,8 @@ function ShareWidget({
17789
18214
  title = "Invite friends & lower the price",
17790
18215
  className
17791
18216
  }) {
17792
- const [copied, setCopied] = React32.useState(false);
17793
- const [showToast, setShowToast] = React32.useState(false);
18217
+ const [copied, setCopied] = React20.useState(false);
18218
+ const [showToast, setShowToast] = React20.useState(false);
17794
18219
  const encodedUrl = encodeURIComponent(url);
17795
18220
  const encodedMsg = encodeURIComponent(`${message} ${url}`);
17796
18221
  const channels = [
@@ -17960,7 +18385,7 @@ function RatingStars({ stars = 5 }) {
17960
18385
  "flex h-5 w-5 items-center justify-center rounded-[3px]",
17961
18386
  filled ? "bg-primary" : "bg-white/30"
17962
18387
  ),
17963
- children: /* @__PURE__ */ jsx(StarIcon, { className: "h-3 w-3 fill-white text-white" })
18388
+ children: /* @__PURE__ */ jsx(StarIcon$1, { className: "h-3 w-3 fill-white text-white" })
17964
18389
  },
17965
18390
  i
17966
18391
  );
@@ -17971,7 +18396,7 @@ function Rating({ label, stars = 5, provider, href }) {
17971
18396
  label && /* @__PURE__ */ jsx("span", { className: "text-sm font-ui font-bold text-white", children: label }),
17972
18397
  /* @__PURE__ */ jsx(RatingStars, { stars }),
17973
18398
  provider && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-sm font-ui font-bold text-white", children: [
17974
- /* @__PURE__ */ jsx(StarIcon, { className: "h-4 w-4 fill-primary text-primary" }),
18399
+ /* @__PURE__ */ jsx(StarIcon$1, { className: "h-4 w-4 fill-primary text-primary" }),
17975
18400
  provider
17976
18401
  ] })
17977
18402
  ] });
@@ -18007,11 +18432,11 @@ function HomeHeader({
18007
18432
  className
18008
18433
  }) {
18009
18434
  var _a;
18010
- const [heroIndex, setHeroIndex] = React32.useState(0);
18011
- const [videoReady, setVideoReady] = React32.useState(false);
18012
- const videoRef = React32.useRef(null);
18435
+ const [heroIndex, setHeroIndex] = React20.useState(0);
18436
+ const [videoReady, setVideoReady] = React20.useState(false);
18437
+ const videoRef = React20.useRef(null);
18013
18438
  const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
18014
- const validImages = React32.useMemo(
18439
+ const validImages = React20.useMemo(
18015
18440
  () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
18016
18441
  [images]
18017
18442
  );
@@ -18025,7 +18450,7 @@ function HomeHeader({
18025
18450
  const showCarousel = !videoUrl && validImages.length > 1;
18026
18451
  const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
18027
18452
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
18028
- React32.useEffect(() => {
18453
+ React20.useEffect(() => {
18029
18454
  if (!videoUrl) return;
18030
18455
  const el = videoRef.current;
18031
18456
  if (!el) return;
@@ -18383,7 +18808,7 @@ function AdventureExplorer({
18383
18808
  className
18384
18809
  }) {
18385
18810
  var _a, _b, _c, _d, _e;
18386
- const [activeId, setActiveId] = React32.useState(
18811
+ const [activeId, setActiveId] = React20.useState(
18387
18812
  defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
18388
18813
  );
18389
18814
  const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
@@ -18723,8 +19148,8 @@ function RotatingSubtitle({
18723
19148
  interval,
18724
19149
  className
18725
19150
  }) {
18726
- const [index, setIndex] = React32.useState(0);
18727
- React32.useEffect(() => {
19151
+ const [index, setIndex] = React20.useState(0);
19152
+ React20.useEffect(() => {
18728
19153
  var _a;
18729
19154
  if (phrases.length < 2) return;
18730
19155
  const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
@@ -18763,7 +19188,7 @@ function CtaBanner({
18763
19188
  overlayOpacity = 35,
18764
19189
  className
18765
19190
  }) {
18766
- const phrases = React32.useMemo(
19191
+ const phrases = React20.useMemo(
18767
19192
  () => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
18768
19193
  [subtitle]
18769
19194
  );
@@ -19044,7 +19469,7 @@ function SectionHead({
19044
19469
  }
19045
19470
  function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
19046
19471
  var _a;
19047
- const railRef = React32.useRef(null);
19472
+ const railRef = React20.useRef(null);
19048
19473
  const scrollByCard = (dir) => {
19049
19474
  const rail = railRef.current;
19050
19475
  if (!rail) return;
@@ -19146,7 +19571,7 @@ function StatsBand({ items }) {
19146
19571
  }
19147
19572
  function ReviewStars({ stars = 5 }) {
19148
19573
  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(
19149
- StarIcon,
19574
+ StarIcon$1,
19150
19575
  {
19151
19576
  className: cn(
19152
19577
  "h-4 w-4",
@@ -19252,7 +19677,7 @@ function SegmentedControl({
19252
19677
  }) {
19253
19678
  var _a;
19254
19679
  const isControlled = value != null;
19255
- const [internal, setInternal] = React32.useState(
19680
+ const [internal, setInternal] = React20.useState(
19256
19681
  defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
19257
19682
  );
19258
19683
  const active = isControlled ? value : internal;
@@ -19335,6 +19760,6 @@ function SegmentedControl({
19335
19760
  );
19336
19761
  }
19337
19762
 
19338
- 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 };
19763
+ 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 };
19339
19764
  //# sourceMappingURL=index.js.map
19340
19765
  //# sourceMappingURL=index.js.map