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