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