@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.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React20 = require('react');
|
|
4
4
|
var classVarianceAuthority = require('class-variance-authority');
|
|
5
5
|
var clsx = require('clsx');
|
|
6
6
|
var tailwindMerge = require('tailwind-merge');
|
|
@@ -37,7 +37,7 @@ function _interopNamespace(e) {
|
|
|
37
37
|
return Object.freeze(n);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
var
|
|
40
|
+
var React20__namespace = /*#__PURE__*/_interopNamespace(React20);
|
|
41
41
|
|
|
42
42
|
var __defProp = Object.defineProperty;
|
|
43
43
|
var __defProps = Object.defineProperties;
|
|
@@ -102,7 +102,7 @@ var buttonVariants = classVarianceAuthority.cva(
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
);
|
|
105
|
-
var Button =
|
|
105
|
+
var Button = React20__namespace.forwardRef(
|
|
106
106
|
(_a, ref) => {
|
|
107
107
|
var _b = _a, { className, variant, size } = _b, props = __objRest(_b, ["className", "variant", "size"]);
|
|
108
108
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -331,10 +331,10 @@ function DialogDescription(_a) {
|
|
|
331
331
|
}, props)
|
|
332
332
|
);
|
|
333
333
|
}
|
|
334
|
-
var FloatingInput =
|
|
334
|
+
var FloatingInput = React20__namespace.forwardRef(
|
|
335
335
|
(_a, ref) => {
|
|
336
336
|
var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
|
|
337
|
-
const inputId = id != null ? id :
|
|
337
|
+
const inputId = id != null ? id : React20__namespace.useId();
|
|
338
338
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
|
|
339
339
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
340
340
|
"input",
|
|
@@ -374,10 +374,10 @@ var FloatingInput = React32__namespace.forwardRef(
|
|
|
374
374
|
}
|
|
375
375
|
);
|
|
376
376
|
FloatingInput.displayName = "FloatingInput";
|
|
377
|
-
var FloatingSelect =
|
|
377
|
+
var FloatingSelect = React20__namespace.forwardRef(
|
|
378
378
|
(_a, ref) => {
|
|
379
379
|
var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
|
|
380
|
-
const inputId = id != null ? id :
|
|
380
|
+
const inputId = id != null ? id : React20__namespace.useId();
|
|
381
381
|
const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
|
|
382
382
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
|
|
383
383
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -642,11 +642,11 @@ function PhoneCountrySelect({
|
|
|
642
642
|
showDial = true
|
|
643
643
|
}) {
|
|
644
644
|
var _a;
|
|
645
|
-
const [open, setOpen] =
|
|
646
|
-
const containerRef =
|
|
647
|
-
const listRef =
|
|
645
|
+
const [open, setOpen] = React20__namespace.useState(false);
|
|
646
|
+
const containerRef = React20__namespace.useRef(null);
|
|
647
|
+
const listRef = React20__namespace.useRef(null);
|
|
648
648
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
649
|
-
|
|
649
|
+
React20__namespace.useEffect(() => {
|
|
650
650
|
if (!open) return;
|
|
651
651
|
const handler = (e) => {
|
|
652
652
|
var _a2;
|
|
@@ -657,7 +657,7 @@ function PhoneCountrySelect({
|
|
|
657
657
|
document.addEventListener("mousedown", handler);
|
|
658
658
|
return () => document.removeEventListener("mousedown", handler);
|
|
659
659
|
}, [open]);
|
|
660
|
-
|
|
660
|
+
React20__namespace.useEffect(() => {
|
|
661
661
|
if (!open || !listRef.current) return;
|
|
662
662
|
const activeEl = listRef.current.querySelector("[data-selected=true]");
|
|
663
663
|
activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
|
|
@@ -927,8 +927,8 @@ function CalendarDayButton(_a) {
|
|
|
927
927
|
"locale"
|
|
928
928
|
]);
|
|
929
929
|
const defaultClassNames = reactDayPicker.getDefaultClassNames();
|
|
930
|
-
const ref =
|
|
931
|
-
|
|
930
|
+
const ref = React20__namespace.useRef(null);
|
|
931
|
+
React20__namespace.useEffect(() => {
|
|
932
932
|
var _a2;
|
|
933
933
|
if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
|
|
934
934
|
}, [modifiers.focused]);
|
|
@@ -959,16 +959,16 @@ function BirthDateField({
|
|
|
959
959
|
className,
|
|
960
960
|
disabled
|
|
961
961
|
}) {
|
|
962
|
-
const [open, setOpen] =
|
|
963
|
-
const [text, setText] =
|
|
962
|
+
const [open, setOpen] = React20__namespace.useState(false);
|
|
963
|
+
const [text, setText] = React20__namespace.useState(
|
|
964
964
|
value ? dateFns.format(value, "dd/MM/yyyy") : ""
|
|
965
965
|
);
|
|
966
|
-
const containerRef =
|
|
967
|
-
const inputId =
|
|
968
|
-
|
|
966
|
+
const containerRef = React20__namespace.useRef(null);
|
|
967
|
+
const inputId = React20__namespace.useId();
|
|
968
|
+
React20__namespace.useEffect(() => {
|
|
969
969
|
setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
|
|
970
970
|
}, [value]);
|
|
971
|
-
|
|
971
|
+
React20__namespace.useEffect(() => {
|
|
972
972
|
if (!open) return;
|
|
973
973
|
const handler = (e) => {
|
|
974
974
|
var _a;
|
|
@@ -1177,14 +1177,14 @@ function CountrySearchField({
|
|
|
1177
1177
|
}) {
|
|
1178
1178
|
var _a;
|
|
1179
1179
|
const list = countries != null ? countries : COUNTRIES;
|
|
1180
|
-
const [query, setQuery] =
|
|
1181
|
-
const [open, setOpen] =
|
|
1182
|
-
const containerRef =
|
|
1183
|
-
const searchRef =
|
|
1180
|
+
const [query, setQuery] = React20__namespace.useState("");
|
|
1181
|
+
const [open, setOpen] = React20__namespace.useState(false);
|
|
1182
|
+
const containerRef = React20__namespace.useRef(null);
|
|
1183
|
+
const searchRef = React20__namespace.useRef(null);
|
|
1184
1184
|
const selected = list.find((c) => c.code === value);
|
|
1185
1185
|
const isFloated = open || !!selected;
|
|
1186
1186
|
const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
|
|
1187
|
-
|
|
1187
|
+
React20__namespace.useEffect(() => {
|
|
1188
1188
|
if (!open) return;
|
|
1189
1189
|
const handler = (e) => {
|
|
1190
1190
|
var _a2;
|
|
@@ -1329,10 +1329,10 @@ function AdventureCard({
|
|
|
1329
1329
|
}) {
|
|
1330
1330
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
1331
1331
|
const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
|
|
1332
|
-
const [checkedInternal, setCheckedInternal] =
|
|
1332
|
+
const [checkedInternal, setCheckedInternal] = React20__namespace.useState(
|
|
1333
1333
|
new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
|
|
1334
1334
|
);
|
|
1335
|
-
const [openDescriptionId, setOpenDescriptionId] =
|
|
1335
|
+
const [openDescriptionId, setOpenDescriptionId] = React20__namespace.useState(null);
|
|
1336
1336
|
const openDescriptionOptional = openDescriptionId ? (_e = adventure.optionals) == null ? void 0 : _e.find((o) => o.id === openDescriptionId) : void 0;
|
|
1337
1337
|
const isChecked = (opt) => {
|
|
1338
1338
|
var _a2;
|
|
@@ -1784,7 +1784,7 @@ function BookingShell({
|
|
|
1784
1784
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1785
1785
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
|
|
1786
1786
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
|
|
1787
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1787
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
1788
1788
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1789
1789
|
"span",
|
|
1790
1790
|
{
|
|
@@ -1983,7 +1983,7 @@ function TermsSection({
|
|
|
1983
1983
|
termsContent
|
|
1984
1984
|
}) {
|
|
1985
1985
|
var _a;
|
|
1986
|
-
const [modalOpen, setModalOpen] =
|
|
1986
|
+
const [modalOpen, setModalOpen] = React20__namespace.useState(false);
|
|
1987
1987
|
const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
|
|
1988
1988
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
|
|
1989
1989
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
|
|
@@ -2121,9 +2121,9 @@ function BookingWizard({
|
|
|
2121
2121
|
}) {
|
|
2122
2122
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T;
|
|
2123
2123
|
const wizardSteps = WIZARD_STEPS_FN(labels);
|
|
2124
|
-
const [step, setStep] =
|
|
2125
|
-
const [error, setError] =
|
|
2126
|
-
const [responsible, setResponsible] =
|
|
2124
|
+
const [step, setStep] = React20__namespace.useState("responsible");
|
|
2125
|
+
const [error, setError] = React20__namespace.useState(null);
|
|
2126
|
+
const [responsible, setResponsible] = React20__namespace.useState({
|
|
2127
2127
|
firstName: "",
|
|
2128
2128
|
lastName: "",
|
|
2129
2129
|
email: "",
|
|
@@ -2142,7 +2142,7 @@ function BookingWizard({
|
|
|
2142
2142
|
return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
|
|
2143
2143
|
}, 0);
|
|
2144
2144
|
const totalPax = totalAdults + totalChildren;
|
|
2145
|
-
const [travellers, setTravellers] =
|
|
2145
|
+
const [travellers, setTravellers] = React20__namespace.useState(
|
|
2146
2146
|
Array.from({ length: Math.max(totalPax, 1) }, () => ({
|
|
2147
2147
|
firstName: "",
|
|
2148
2148
|
lastName: "",
|
|
@@ -2150,9 +2150,9 @@ function BookingWizard({
|
|
|
2150
2150
|
email: ""
|
|
2151
2151
|
}))
|
|
2152
2152
|
);
|
|
2153
|
-
const [payAmount, setPayAmount] =
|
|
2154
|
-
const [payMethod, setPayMethod] =
|
|
2155
|
-
const [termsAccepted, setTermsAccepted] =
|
|
2153
|
+
const [payAmount, setPayAmount] = React20__namespace.useState("full");
|
|
2154
|
+
const [payMethod, setPayMethod] = React20__namespace.useState("stripe");
|
|
2155
|
+
const [termsAccepted, setTermsAccepted] = React20__namespace.useState(false);
|
|
2156
2156
|
const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
2157
2157
|
const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
|
|
2158
2158
|
const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
|
|
@@ -2380,7 +2380,7 @@ function Offer({
|
|
|
2380
2380
|
className
|
|
2381
2381
|
}) {
|
|
2382
2382
|
var _a, _b, _c;
|
|
2383
|
-
const [showBooking, setShowBooking] =
|
|
2383
|
+
const [showBooking, setShowBooking] = React20__namespace.useState(false);
|
|
2384
2384
|
const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
|
|
2385
2385
|
const handleBook = () => {
|
|
2386
2386
|
if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
|
|
@@ -2747,7 +2747,7 @@ function AdventureSection({
|
|
|
2747
2747
|
labels
|
|
2748
2748
|
}) {
|
|
2749
2749
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
2750
|
-
const [detailsOpen, setDetailsOpen] =
|
|
2750
|
+
const [detailsOpen, setDetailsOpen] = React20__namespace.useState(false);
|
|
2751
2751
|
const handleCopyUrl = (url) => {
|
|
2752
2752
|
if (onCopyFormLink) {
|
|
2753
2753
|
onCopyFormLink(url);
|
|
@@ -3286,8 +3286,8 @@ function AddTravellerDialog({
|
|
|
3286
3286
|
errorMessage
|
|
3287
3287
|
}) {
|
|
3288
3288
|
var _a, _b, _c, _d, _e;
|
|
3289
|
-
const [form, setForm] =
|
|
3290
|
-
|
|
3289
|
+
const [form, setForm] = React20__namespace.useState(() => createInitialAddFormData(config));
|
|
3290
|
+
React20__namespace.useEffect(() => {
|
|
3291
3291
|
if (open) {
|
|
3292
3292
|
setForm(createInitialAddFormData(config));
|
|
3293
3293
|
}
|
|
@@ -3347,7 +3347,7 @@ function EditTravellerDialog({
|
|
|
3347
3347
|
errorMessage
|
|
3348
3348
|
}) {
|
|
3349
3349
|
var _a, _b, _c, _d, _e;
|
|
3350
|
-
const [form, setForm] =
|
|
3350
|
+
const [form, setForm] = React20__namespace.useState(() => ({
|
|
3351
3351
|
firstName: "",
|
|
3352
3352
|
lastName: "",
|
|
3353
3353
|
email: "",
|
|
@@ -3356,7 +3356,7 @@ function EditTravellerDialog({
|
|
|
3356
3356
|
birthDate: "",
|
|
3357
3357
|
personType: "ADULT"
|
|
3358
3358
|
}));
|
|
3359
|
-
|
|
3359
|
+
React20__namespace.useEffect(() => {
|
|
3360
3360
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3361
3361
|
if (open && traveller) {
|
|
3362
3362
|
setForm({
|
|
@@ -3692,48 +3692,48 @@ function BookingDetails({
|
|
|
3692
3692
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3693
3693
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3694
3694
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3695
|
-
const [addModalState, setAddModalState] =
|
|
3695
|
+
const [addModalState, setAddModalState] = React20__namespace.useState({
|
|
3696
3696
|
open: false,
|
|
3697
3697
|
adventureId: null
|
|
3698
3698
|
});
|
|
3699
|
-
const [editModalState, setEditModalState] =
|
|
3700
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3701
|
-
const [resendInviteDialogState, setResendInviteDialogState] =
|
|
3702
|
-
const handleRequestOpenAddModal =
|
|
3699
|
+
const [editModalState, setEditModalState] = React20__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3700
|
+
const [deleteModalState, setDeleteModalState] = React20__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3701
|
+
const [resendInviteDialogState, setResendInviteDialogState] = React20__namespace.useState({ open: false, traveller: null });
|
|
3702
|
+
const handleRequestOpenAddModal = React20__namespace.useCallback((adventureId) => {
|
|
3703
3703
|
setAddModalState({ open: true, adventureId });
|
|
3704
3704
|
}, []);
|
|
3705
|
-
const handleRequestOpenEditModal =
|
|
3705
|
+
const handleRequestOpenEditModal = React20__namespace.useCallback(
|
|
3706
3706
|
(adventureId, traveller) => {
|
|
3707
3707
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3708
3708
|
},
|
|
3709
3709
|
[]
|
|
3710
3710
|
);
|
|
3711
|
-
const handleRequestOpenDeleteModal =
|
|
3711
|
+
const handleRequestOpenDeleteModal = React20__namespace.useCallback(
|
|
3712
3712
|
(adventureId, traveller) => {
|
|
3713
3713
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3714
3714
|
},
|
|
3715
3715
|
[]
|
|
3716
3716
|
);
|
|
3717
|
-
const handleRequestOpenResendInviteDialog =
|
|
3717
|
+
const handleRequestOpenResendInviteDialog = React20__namespace.useCallback(
|
|
3718
3718
|
(traveller) => {
|
|
3719
3719
|
setResendInviteDialogState({ open: true, traveller });
|
|
3720
3720
|
},
|
|
3721
3721
|
[]
|
|
3722
3722
|
);
|
|
3723
|
-
const closeAddModal =
|
|
3723
|
+
const closeAddModal = React20__namespace.useCallback(() => {
|
|
3724
3724
|
setAddModalState({ open: false, adventureId: null });
|
|
3725
3725
|
}, []);
|
|
3726
|
-
const closeEditModal =
|
|
3726
|
+
const closeEditModal = React20__namespace.useCallback(() => {
|
|
3727
3727
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3728
3728
|
}, []);
|
|
3729
|
-
const closeDeleteModal =
|
|
3729
|
+
const closeDeleteModal = React20__namespace.useCallback(() => {
|
|
3730
3730
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3731
3731
|
}, []);
|
|
3732
|
-
const closeResendInviteDialog =
|
|
3732
|
+
const closeResendInviteDialog = React20__namespace.useCallback(() => {
|
|
3733
3733
|
setResendInviteDialogState({ open: false, traveller: null });
|
|
3734
3734
|
}, []);
|
|
3735
|
-
const submitInFlightRef =
|
|
3736
|
-
const handleAddSubmit =
|
|
3735
|
+
const submitInFlightRef = React20__namespace.useRef(false);
|
|
3736
|
+
const handleAddSubmit = React20__namespace.useCallback(
|
|
3737
3737
|
async (adventureId, data) => {
|
|
3738
3738
|
if (!onSubmitAddTraveller) return;
|
|
3739
3739
|
if (submitInFlightRef.current) return;
|
|
@@ -3748,7 +3748,7 @@ function BookingDetails({
|
|
|
3748
3748
|
},
|
|
3749
3749
|
[onSubmitAddTraveller, closeAddModal]
|
|
3750
3750
|
);
|
|
3751
|
-
const handleEditSubmit =
|
|
3751
|
+
const handleEditSubmit = React20__namespace.useCallback(
|
|
3752
3752
|
async (adventureId, travellerId, data) => {
|
|
3753
3753
|
if (!onSubmitEditTraveller) return;
|
|
3754
3754
|
if (submitInFlightRef.current) return;
|
|
@@ -3763,7 +3763,7 @@ function BookingDetails({
|
|
|
3763
3763
|
},
|
|
3764
3764
|
[onSubmitEditTraveller, closeEditModal]
|
|
3765
3765
|
);
|
|
3766
|
-
const handleDeleteConfirm =
|
|
3766
|
+
const handleDeleteConfirm = React20__namespace.useCallback(
|
|
3767
3767
|
async (adventureId, travellerId) => {
|
|
3768
3768
|
if (!onConfirmRemoveTraveller) return;
|
|
3769
3769
|
if (submitInFlightRef.current) return;
|
|
@@ -5690,7 +5690,7 @@ function BookingCreatedEmail({
|
|
|
5690
5690
|
}, children: i + 1 }) }),
|
|
5691
5691
|
/* @__PURE__ */ jsxRuntime.jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
|
|
5692
5692
|
] }) }) }, i)) }),
|
|
5693
|
-
nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5693
|
+
nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
5694
5694
|
idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
|
|
5695
5695
|
idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
|
|
5696
5696
|
] }, idx)) })
|
|
@@ -8473,11 +8473,11 @@ function DatePickerField({
|
|
|
8473
8473
|
className,
|
|
8474
8474
|
error
|
|
8475
8475
|
}) {
|
|
8476
|
-
const [open, setOpen] =
|
|
8477
|
-
const containerRef =
|
|
8478
|
-
const [calendarWidth, setCalendarWidth] =
|
|
8476
|
+
const [open, setOpen] = React20__namespace.useState(false);
|
|
8477
|
+
const containerRef = React20__namespace.useRef(null);
|
|
8478
|
+
const [calendarWidth, setCalendarWidth] = React20__namespace.useState();
|
|
8479
8479
|
const hasValue = !!value;
|
|
8480
|
-
|
|
8480
|
+
React20__namespace.useEffect(() => {
|
|
8481
8481
|
if (!containerRef.current) return;
|
|
8482
8482
|
const observer = new ResizeObserver(([entry]) => {
|
|
8483
8483
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -8606,15 +8606,15 @@ function BookingForm({
|
|
|
8606
8606
|
const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
|
|
8607
8607
|
const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
|
|
8608
8608
|
const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
|
|
8609
|
-
const [values, setValues] =
|
|
8610
|
-
const [errors, setErrors] =
|
|
8609
|
+
const [values, setValues] = React20__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
8610
|
+
const [errors, setErrors] = React20__namespace.useState({});
|
|
8611
8611
|
const set = (key, value) => {
|
|
8612
8612
|
setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
8613
8613
|
setErrors(
|
|
8614
8614
|
(prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
|
|
8615
8615
|
);
|
|
8616
8616
|
};
|
|
8617
|
-
|
|
8617
|
+
React20__namespace.useEffect(() => {
|
|
8618
8618
|
if (!defaultValues) return;
|
|
8619
8619
|
setValues((prev) => {
|
|
8620
8620
|
let changed = false;
|
|
@@ -9253,11 +9253,11 @@ function FloatingTextarea({
|
|
|
9253
9253
|
}
|
|
9254
9254
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
9255
9255
|
var _a, _b, _c;
|
|
9256
|
-
const [open, setOpen] =
|
|
9257
|
-
const containerRef =
|
|
9256
|
+
const [open, setOpen] = React20__namespace.useState(false);
|
|
9257
|
+
const containerRef = React20__namespace.useRef(null);
|
|
9258
9258
|
const options = (_a = field.options) != null ? _a : [];
|
|
9259
9259
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
9260
|
-
|
|
9260
|
+
React20__namespace.useEffect(() => {
|
|
9261
9261
|
if (!open) return;
|
|
9262
9262
|
const handleOutside = (e) => {
|
|
9263
9263
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -9725,11 +9725,11 @@ function RegistrationForm({
|
|
|
9725
9725
|
readOnly = false
|
|
9726
9726
|
}) {
|
|
9727
9727
|
var _a;
|
|
9728
|
-
const L =
|
|
9728
|
+
const L = React20__namespace.useMemo(
|
|
9729
9729
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS14), labels != null ? labels : {}),
|
|
9730
9730
|
[labels]
|
|
9731
9731
|
);
|
|
9732
|
-
const sortedFields =
|
|
9732
|
+
const sortedFields = React20__namespace.useMemo(
|
|
9733
9733
|
() => [...fields].sort((a, b) => {
|
|
9734
9734
|
var _a2, _b;
|
|
9735
9735
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -9737,7 +9737,7 @@ function RegistrationForm({
|
|
|
9737
9737
|
[fields]
|
|
9738
9738
|
);
|
|
9739
9739
|
const isControlled = values !== void 0;
|
|
9740
|
-
const [internal, setInternal] =
|
|
9740
|
+
const [internal, setInternal] = React20__namespace.useState(
|
|
9741
9741
|
() => initializeValues(
|
|
9742
9742
|
sortedFields,
|
|
9743
9743
|
defaultValues != null ? defaultValues : {},
|
|
@@ -9745,9 +9745,9 @@ function RegistrationForm({
|
|
|
9745
9745
|
includeTerms
|
|
9746
9746
|
)
|
|
9747
9747
|
);
|
|
9748
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
9749
|
-
const [validationErrors, setValidationErrors] =
|
|
9750
|
-
|
|
9748
|
+
const [submitAttempted, setSubmitAttempted] = React20__namespace.useState(false);
|
|
9749
|
+
const [validationErrors, setValidationErrors] = React20__namespace.useState({});
|
|
9750
|
+
React20__namespace.useEffect(() => {
|
|
9751
9751
|
if (isControlled) return;
|
|
9752
9752
|
setInternal((prev) => {
|
|
9753
9753
|
const next = initializeValues(
|
|
@@ -9804,7 +9804,7 @@ function RegistrationForm({
|
|
|
9804
9804
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
9805
9805
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
9806
9806
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
9807
|
-
|
|
9807
|
+
React20__namespace.useEffect(() => {
|
|
9808
9808
|
if (!submitAttempted || !scrollTargetId) return;
|
|
9809
9809
|
const timer = setTimeout(() => {
|
|
9810
9810
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -10275,18 +10275,18 @@ function CancellationForm({
|
|
|
10275
10275
|
className
|
|
10276
10276
|
}) {
|
|
10277
10277
|
var _a, _b, _c;
|
|
10278
|
-
const [selectedAdventureIds, setSelectedAdventureIds] =
|
|
10279
|
-
const [participantsByAdventure, setParticipantsByAdventure] =
|
|
10280
|
-
const [reasonCode, setReasonCode] =
|
|
10281
|
-
const [reasonOther, setReasonOther] =
|
|
10282
|
-
const [refundPreference, setRefundPreference] =
|
|
10283
|
-
const [refundOther, setRefundOther] =
|
|
10284
|
-
const [agreedToPolicy, setAgreedToPolicy] =
|
|
10285
|
-
const [contactName, setContactName] =
|
|
10286
|
-
const [contactEmail, setContactEmail] =
|
|
10287
|
-
const [contactPhone, setContactPhone] =
|
|
10288
|
-
const [errors, setErrors] =
|
|
10289
|
-
const allParticipantsOf =
|
|
10278
|
+
const [selectedAdventureIds, setSelectedAdventureIds] = React20__namespace.useState(/* @__PURE__ */ new Set());
|
|
10279
|
+
const [participantsByAdventure, setParticipantsByAdventure] = React20__namespace.useState({});
|
|
10280
|
+
const [reasonCode, setReasonCode] = React20__namespace.useState("");
|
|
10281
|
+
const [reasonOther, setReasonOther] = React20__namespace.useState("");
|
|
10282
|
+
const [refundPreference, setRefundPreference] = React20__namespace.useState("");
|
|
10283
|
+
const [refundOther, setRefundOther] = React20__namespace.useState("");
|
|
10284
|
+
const [agreedToPolicy, setAgreedToPolicy] = React20__namespace.useState(false);
|
|
10285
|
+
const [contactName, setContactName] = React20__namespace.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
|
|
10286
|
+
const [contactEmail, setContactEmail] = React20__namespace.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
|
|
10287
|
+
const [contactPhone, setContactPhone] = React20__namespace.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
|
|
10288
|
+
const [errors, setErrors] = React20__namespace.useState({});
|
|
10289
|
+
const allParticipantsOf = React20__namespace.useCallback(
|
|
10290
10290
|
(advId) => {
|
|
10291
10291
|
var _a2, _b2;
|
|
10292
10292
|
return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
|
|
@@ -10543,10 +10543,10 @@ var OTPCodeInput = ({
|
|
|
10543
10543
|
id,
|
|
10544
10544
|
required
|
|
10545
10545
|
}) => {
|
|
10546
|
-
const baseId = id != null ? id :
|
|
10547
|
-
const inputRef =
|
|
10548
|
-
const [focused, setFocused] =
|
|
10549
|
-
const digits =
|
|
10546
|
+
const baseId = id != null ? id : React20__namespace.useId();
|
|
10547
|
+
const inputRef = React20__namespace.useRef(null);
|
|
10548
|
+
const [focused, setFocused] = React20__namespace.useState(false);
|
|
10549
|
+
const digits = React20__namespace.useMemo(() => {
|
|
10550
10550
|
const arr = value.split("").slice(0, length);
|
|
10551
10551
|
while (arr.length < length) arr.push("");
|
|
10552
10552
|
return arr;
|
|
@@ -10659,7 +10659,7 @@ function Checkbox(_a) {
|
|
|
10659
10659
|
})
|
|
10660
10660
|
);
|
|
10661
10661
|
}
|
|
10662
|
-
var AccordionVariantContext =
|
|
10662
|
+
var AccordionVariantContext = React20__namespace.createContext("default");
|
|
10663
10663
|
function Accordion(_a) {
|
|
10664
10664
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
10665
10665
|
return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10677,7 +10677,7 @@ function Accordion(_a) {
|
|
|
10677
10677
|
}
|
|
10678
10678
|
function AccordionItem(_a) {
|
|
10679
10679
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
10680
|
-
const variant =
|
|
10680
|
+
const variant = React20__namespace.useContext(AccordionVariantContext);
|
|
10681
10681
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10682
10682
|
accordion.Accordion.Item,
|
|
10683
10683
|
__spreadValues({
|
|
@@ -10700,7 +10700,7 @@ function AccordionTrigger(_a) {
|
|
|
10700
10700
|
"children",
|
|
10701
10701
|
"headingLevel"
|
|
10702
10702
|
]);
|
|
10703
|
-
const variant =
|
|
10703
|
+
const variant = React20__namespace.useContext(AccordionVariantContext);
|
|
10704
10704
|
const headingRender = headingLevel === 2 ? /* @__PURE__ */ jsxRuntime.jsx("h2", {}) : headingLevel === 4 ? /* @__PURE__ */ jsxRuntime.jsx("h4", {}) : headingLevel === 5 ? /* @__PURE__ */ jsxRuntime.jsx("h5", {}) : headingLevel === 6 ? /* @__PURE__ */ jsxRuntime.jsx("h6", {}) : void 0;
|
|
10705
10705
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10706
10706
|
accordion.Accordion.Header,
|
|
@@ -10762,7 +10762,7 @@ function AccordionContent(_a) {
|
|
|
10762
10762
|
"className",
|
|
10763
10763
|
"children"
|
|
10764
10764
|
]);
|
|
10765
|
-
const variant =
|
|
10765
|
+
const variant = React20__namespace.useContext(AccordionVariantContext);
|
|
10766
10766
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10767
10767
|
accordion.Accordion.Panel,
|
|
10768
10768
|
__spreadProps(__spreadValues({
|
|
@@ -10981,15 +10981,15 @@ function FilterPanel({
|
|
|
10981
10981
|
labels
|
|
10982
10982
|
}) {
|
|
10983
10983
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
10984
|
-
const resolvedGroups =
|
|
10985
|
-
const [internalValue, setInternalValue] =
|
|
10984
|
+
const resolvedGroups = React20__namespace.useMemo(() => resolveGroups(groups), [groups]);
|
|
10985
|
+
const [internalValue, setInternalValue] = React20__namespace.useState(
|
|
10986
10986
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
10987
10987
|
);
|
|
10988
10988
|
const selected = value != null ? value : internalValue;
|
|
10989
|
-
const [expandedItems, setExpandedItems] =
|
|
10989
|
+
const [expandedItems, setExpandedItems] = React20__namespace.useState(
|
|
10990
10990
|
() => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
|
|
10991
10991
|
);
|
|
10992
|
-
const toggleExpanded =
|
|
10992
|
+
const toggleExpanded = React20__namespace.useCallback((id) => {
|
|
10993
10993
|
setExpandedItems((prev) => {
|
|
10994
10994
|
const next = new Set(prev);
|
|
10995
10995
|
if (next.has(id)) next.delete(id);
|
|
@@ -11373,11 +11373,11 @@ function FilterPanel({
|
|
|
11373
11373
|
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
11374
11374
|
function TrustpilotEmbed({ config }) {
|
|
11375
11375
|
var _a, _b, _c, _d, _e, _f;
|
|
11376
|
-
const ref =
|
|
11377
|
-
const [widgetReady, setWidgetReady] =
|
|
11378
|
-
const [delayPassed, setDelayPassed] =
|
|
11376
|
+
const ref = React20__namespace.useRef(null);
|
|
11377
|
+
const [widgetReady, setWidgetReady] = React20__namespace.useState(false);
|
|
11378
|
+
const [delayPassed, setDelayPassed] = React20__namespace.useState(false);
|
|
11379
11379
|
const showFallback = delayPassed && !widgetReady;
|
|
11380
|
-
|
|
11380
|
+
React20__namespace.useEffect(() => {
|
|
11381
11381
|
var _a2;
|
|
11382
11382
|
if (typeof document === "undefined" || !ref.current) return;
|
|
11383
11383
|
const node = ref.current;
|
|
@@ -11565,7 +11565,7 @@ function webpVariantUrl(src) {
|
|
|
11565
11565
|
return `${withoutQuery}.webp${query}`;
|
|
11566
11566
|
}
|
|
11567
11567
|
function PictureLoader() {
|
|
11568
|
-
const gradientId =
|
|
11568
|
+
const gradientId = React20__namespace.useId();
|
|
11569
11569
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11570
11570
|
"span",
|
|
11571
11571
|
{
|
|
@@ -11635,10 +11635,10 @@ function Picture(_a) {
|
|
|
11635
11635
|
"onError"
|
|
11636
11636
|
]);
|
|
11637
11637
|
var _a2, _b2;
|
|
11638
|
-
const ref =
|
|
11639
|
-
const [visible, setVisible] =
|
|
11640
|
-
const [loaded, setLoaded] =
|
|
11641
|
-
|
|
11638
|
+
const ref = React20__namespace.useRef(null);
|
|
11639
|
+
const [visible, setVisible] = React20__namespace.useState(eager);
|
|
11640
|
+
const [loaded, setLoaded] = React20__namespace.useState(false);
|
|
11641
|
+
React20__namespace.useEffect(() => {
|
|
11642
11642
|
if (eager || visible) return;
|
|
11643
11643
|
const el = ref.current;
|
|
11644
11644
|
if (!el || typeof IntersectionObserver === "undefined") {
|
|
@@ -11657,7 +11657,7 @@ function Picture(_a) {
|
|
|
11657
11657
|
io.observe(el);
|
|
11658
11658
|
return () => io.disconnect();
|
|
11659
11659
|
}, [eager, visible, rootMargin]);
|
|
11660
|
-
|
|
11660
|
+
React20__namespace.useEffect(() => {
|
|
11661
11661
|
setLoaded(false);
|
|
11662
11662
|
}, [src]);
|
|
11663
11663
|
const webp = webpVariantUrl(src);
|
|
@@ -11788,11 +11788,11 @@ function ItineraryModal({
|
|
|
11788
11788
|
onNext
|
|
11789
11789
|
}) {
|
|
11790
11790
|
var _a, _b, _c;
|
|
11791
|
-
const [imgIndex, setImgIndex] =
|
|
11791
|
+
const [imgIndex, setImgIndex] = React20__namespace.useState(0);
|
|
11792
11792
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
11793
11793
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
11794
11794
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
11795
|
-
|
|
11795
|
+
React20__namespace.useEffect(() => {
|
|
11796
11796
|
setImgIndex(0);
|
|
11797
11797
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
11798
11798
|
if (!stop) return null;
|
|
@@ -11919,8 +11919,8 @@ function ItineraryModal({
|
|
|
11919
11919
|
) });
|
|
11920
11920
|
}
|
|
11921
11921
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
11922
|
-
const [activeIndex, setActiveIndex] =
|
|
11923
|
-
const scrollRef =
|
|
11922
|
+
const [activeIndex, setActiveIndex] = React20__namespace.useState(null);
|
|
11923
|
+
const scrollRef = React20__namespace.useRef(null);
|
|
11924
11924
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
11925
11925
|
const scrollBy = (dir) => {
|
|
11926
11926
|
if (!scrollRef.current) return;
|
|
@@ -12013,18 +12013,18 @@ function Lightbox({
|
|
|
12013
12013
|
labels
|
|
12014
12014
|
}) {
|
|
12015
12015
|
var _a, _b, _c, _d;
|
|
12016
|
-
const [index, setIndex] =
|
|
12016
|
+
const [index, setIndex] = React20__namespace.useState(initialIndex);
|
|
12017
12017
|
const total = photos.length;
|
|
12018
12018
|
const photo = photos[index];
|
|
12019
|
-
const prev =
|
|
12019
|
+
const prev = React20__namespace.useCallback(
|
|
12020
12020
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
12021
12021
|
[total]
|
|
12022
12022
|
);
|
|
12023
|
-
const next =
|
|
12023
|
+
const next = React20__namespace.useCallback(
|
|
12024
12024
|
() => setIndex((i) => (i + 1) % total),
|
|
12025
12025
|
[total]
|
|
12026
12026
|
);
|
|
12027
|
-
|
|
12027
|
+
React20__namespace.useEffect(() => {
|
|
12028
12028
|
const onKey = (e) => {
|
|
12029
12029
|
if (e.key === "Escape") onClose();
|
|
12030
12030
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -12126,6 +12126,260 @@ function Lightbox({
|
|
|
12126
12126
|
}
|
|
12127
12127
|
);
|
|
12128
12128
|
}
|
|
12129
|
+
function FeedLightbox({
|
|
12130
|
+
sections,
|
|
12131
|
+
initialIndex,
|
|
12132
|
+
onClose,
|
|
12133
|
+
labels
|
|
12134
|
+
}) {
|
|
12135
|
+
var _a;
|
|
12136
|
+
const { items, total, bounds } = React20__namespace.useMemo(() => {
|
|
12137
|
+
const items2 = [];
|
|
12138
|
+
const bounds2 = [];
|
|
12139
|
+
let i = 0;
|
|
12140
|
+
for (const section of sections) {
|
|
12141
|
+
if (!section.photos.length) continue;
|
|
12142
|
+
bounds2.push({
|
|
12143
|
+
label: section.label,
|
|
12144
|
+
start: i,
|
|
12145
|
+
end: i + section.photos.length - 1
|
|
12146
|
+
});
|
|
12147
|
+
section.photos.forEach((photo, p) => {
|
|
12148
|
+
items2.push({
|
|
12149
|
+
photo,
|
|
12150
|
+
index: i,
|
|
12151
|
+
sectionLabel: section.label,
|
|
12152
|
+
isSectionStart: p === 0
|
|
12153
|
+
});
|
|
12154
|
+
i += 1;
|
|
12155
|
+
});
|
|
12156
|
+
}
|
|
12157
|
+
return { items: items2, total: i, bounds: bounds2 };
|
|
12158
|
+
}, [sections]);
|
|
12159
|
+
const scrollRef = React20__namespace.useRef(null);
|
|
12160
|
+
const itemRefs = React20__namespace.useRef([]);
|
|
12161
|
+
const [active, setActive] = React20__namespace.useState(initialIndex);
|
|
12162
|
+
const activeLabel = React20__namespace.useMemo(
|
|
12163
|
+
() => {
|
|
12164
|
+
var _a2;
|
|
12165
|
+
return (_a2 = bounds.find((b) => active >= b.start && active <= b.end)) == null ? void 0 : _a2.label;
|
|
12166
|
+
},
|
|
12167
|
+
[bounds, active]
|
|
12168
|
+
);
|
|
12169
|
+
React20__namespace.useEffect(() => {
|
|
12170
|
+
const previous = document.body.style.overflow;
|
|
12171
|
+
document.body.style.overflow = "hidden";
|
|
12172
|
+
return () => {
|
|
12173
|
+
document.body.style.overflow = previous;
|
|
12174
|
+
};
|
|
12175
|
+
}, []);
|
|
12176
|
+
React20__namespace.useEffect(() => {
|
|
12177
|
+
const onKey = (e) => {
|
|
12178
|
+
if (e.key === "Escape") onClose();
|
|
12179
|
+
};
|
|
12180
|
+
document.addEventListener("keydown", onKey);
|
|
12181
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
12182
|
+
}, [onClose]);
|
|
12183
|
+
React20__namespace.useEffect(() => {
|
|
12184
|
+
const root = scrollRef.current;
|
|
12185
|
+
if (!root) return;
|
|
12186
|
+
let frame = 0;
|
|
12187
|
+
let userMoved = false;
|
|
12188
|
+
const recompute = () => {
|
|
12189
|
+
var _a2;
|
|
12190
|
+
frame = 0;
|
|
12191
|
+
if (!userMoved) {
|
|
12192
|
+
(_a2 = itemRefs.current[initialIndex]) == null ? void 0 : _a2.scrollIntoView({ block: "start" });
|
|
12193
|
+
}
|
|
12194
|
+
const anchorY = root.getBoundingClientRect().top + 64;
|
|
12195
|
+
let current = 0;
|
|
12196
|
+
itemRefs.current.forEach((el, i) => {
|
|
12197
|
+
if (el && el.getBoundingClientRect().top <= anchorY) current = i;
|
|
12198
|
+
});
|
|
12199
|
+
if (root.scrollTop + root.clientHeight >= root.scrollHeight - 2) {
|
|
12200
|
+
current = total - 1;
|
|
12201
|
+
}
|
|
12202
|
+
setActive(current);
|
|
12203
|
+
};
|
|
12204
|
+
const schedule = () => {
|
|
12205
|
+
if (!frame) frame = requestAnimationFrame(recompute);
|
|
12206
|
+
};
|
|
12207
|
+
const onScroll = () => schedule();
|
|
12208
|
+
const onUserMove = () => {
|
|
12209
|
+
userMoved = true;
|
|
12210
|
+
};
|
|
12211
|
+
root.addEventListener("scroll", onScroll, { passive: true });
|
|
12212
|
+
root.addEventListener("wheel", onUserMove, { passive: true });
|
|
12213
|
+
root.addEventListener("touchmove", onUserMove, { passive: true });
|
|
12214
|
+
window.addEventListener("keydown", onUserMove);
|
|
12215
|
+
const ro = new ResizeObserver(schedule);
|
|
12216
|
+
itemRefs.current.forEach((el) => el && ro.observe(el));
|
|
12217
|
+
recompute();
|
|
12218
|
+
return () => {
|
|
12219
|
+
root.removeEventListener("scroll", onScroll);
|
|
12220
|
+
root.removeEventListener("wheel", onUserMove);
|
|
12221
|
+
root.removeEventListener("touchmove", onUserMove);
|
|
12222
|
+
window.removeEventListener("keydown", onUserMove);
|
|
12223
|
+
ro.disconnect();
|
|
12224
|
+
if (frame) cancelAnimationFrame(frame);
|
|
12225
|
+
};
|
|
12226
|
+
}, []);
|
|
12227
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 flex flex-col bg-background", children: [
|
|
12228
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sticky top-0 z-10 flex items-center gap-3 border-b border-border/60 bg-background/85 px-3 py-2.5 backdrop-blur-md", children: [
|
|
12229
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12230
|
+
"button",
|
|
12231
|
+
{
|
|
12232
|
+
type: "button",
|
|
12233
|
+
onClick: onClose,
|
|
12234
|
+
className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
12235
|
+
"aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
|
|
12236
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5" })
|
|
12237
|
+
}
|
|
12238
|
+
),
|
|
12239
|
+
activeLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-center font-heading text-sm font-bold uppercase tracking-wide text-foreground", children: activeLabel }),
|
|
12240
|
+
total > 1 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12241
|
+
"span",
|
|
12242
|
+
{
|
|
12243
|
+
className: cn(
|
|
12244
|
+
"shrink-0 font-ui text-sm font-medium tabular-nums text-muted-foreground",
|
|
12245
|
+
!activeLabel && "ml-auto"
|
|
12246
|
+
),
|
|
12247
|
+
children: [
|
|
12248
|
+
active + 1,
|
|
12249
|
+
" / ",
|
|
12250
|
+
total
|
|
12251
|
+
]
|
|
12252
|
+
}
|
|
12253
|
+
)
|
|
12254
|
+
] }),
|
|
12255
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12256
|
+
"div",
|
|
12257
|
+
{
|
|
12258
|
+
ref: scrollRef,
|
|
12259
|
+
className: "flex-1 overflow-y-auto overscroll-contain",
|
|
12260
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex w-full max-w-3xl flex-col gap-3 py-4", children: items.map(({ photo, index, sectionLabel, isSectionStart }) => {
|
|
12261
|
+
var _a2;
|
|
12262
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
12263
|
+
sectionLabel && isSectionStart && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12264
|
+
"h2",
|
|
12265
|
+
{
|
|
12266
|
+
className: cn(
|
|
12267
|
+
"px-3 font-heading text-lg font-bold uppercase tracking-wide text-foreground sm:px-4",
|
|
12268
|
+
index > 0 && "mt-3"
|
|
12269
|
+
),
|
|
12270
|
+
children: sectionLabel
|
|
12271
|
+
}
|
|
12272
|
+
),
|
|
12273
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
12274
|
+
"figure",
|
|
12275
|
+
{
|
|
12276
|
+
"data-index": index,
|
|
12277
|
+
ref: (el) => {
|
|
12278
|
+
itemRefs.current[index] = el;
|
|
12279
|
+
},
|
|
12280
|
+
children: [
|
|
12281
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden bg-muted", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12282
|
+
Picture,
|
|
12283
|
+
{
|
|
12284
|
+
src: photo.src,
|
|
12285
|
+
alt: (_a2 = photo.alt) != null ? _a2 : `Photo ${index + 1}`,
|
|
12286
|
+
title: photo.caption,
|
|
12287
|
+
className: "block h-auto w-full",
|
|
12288
|
+
eager: index < 2,
|
|
12289
|
+
rootMargin: "800px"
|
|
12290
|
+
}
|
|
12291
|
+
) }),
|
|
12292
|
+
(photo.caption || photo.credit) && /* @__PURE__ */ jsxRuntime.jsxs("figcaption", { className: "px-3 pt-2 sm:px-4", children: [
|
|
12293
|
+
photo.caption && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-ui text-sm leading-snug text-foreground/80", children: photo.caption }),
|
|
12294
|
+
photo.credit && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "font-ui text-xs text-muted-foreground", children: [
|
|
12295
|
+
"\xA9 ",
|
|
12296
|
+
photo.credit
|
|
12297
|
+
] })
|
|
12298
|
+
] })
|
|
12299
|
+
]
|
|
12300
|
+
}
|
|
12301
|
+
)
|
|
12302
|
+
] }, index);
|
|
12303
|
+
}) })
|
|
12304
|
+
}
|
|
12305
|
+
)
|
|
12306
|
+
] });
|
|
12307
|
+
}
|
|
12308
|
+
var PhotoTourContext = React20__namespace.createContext(null);
|
|
12309
|
+
function PhotoTourProvider({
|
|
12310
|
+
enabled = true,
|
|
12311
|
+
labels,
|
|
12312
|
+
children
|
|
12313
|
+
}) {
|
|
12314
|
+
const entries = React20__namespace.useRef(/* @__PURE__ */ new Map());
|
|
12315
|
+
const [open, setOpen] = React20__namespace.useState(null);
|
|
12316
|
+
const register = React20__namespace.useCallback((entry) => {
|
|
12317
|
+
entries.current.set(entry.id, entry);
|
|
12318
|
+
}, []);
|
|
12319
|
+
const unregister = React20__namespace.useCallback((id) => {
|
|
12320
|
+
entries.current.delete(id);
|
|
12321
|
+
}, []);
|
|
12322
|
+
const openTour = React20__namespace.useCallback((id, localIndex) => {
|
|
12323
|
+
var _a, _b;
|
|
12324
|
+
const ordered = [...entries.current.values()].filter((e) => e.photos.length).sort((a, b) => {
|
|
12325
|
+
const ea = a.getEl();
|
|
12326
|
+
const eb = b.getEl();
|
|
12327
|
+
if (!ea || !eb) return 0;
|
|
12328
|
+
const pos = ea.compareDocumentPosition(eb);
|
|
12329
|
+
if (pos & Node.DOCUMENT_POSITION_FOLLOWING) return -1;
|
|
12330
|
+
if (pos & Node.DOCUMENT_POSITION_PRECEDING) return 1;
|
|
12331
|
+
return 0;
|
|
12332
|
+
});
|
|
12333
|
+
const targetSrc = (_b = (_a = entries.current.get(id)) == null ? void 0 : _a.photos[localIndex]) == null ? void 0 : _b.src;
|
|
12334
|
+
const seen = /* @__PURE__ */ new Set();
|
|
12335
|
+
const sections = [];
|
|
12336
|
+
for (const entry of ordered) {
|
|
12337
|
+
const photos = entry.photos.filter((p) => {
|
|
12338
|
+
if (seen.has(p.src)) return false;
|
|
12339
|
+
seen.add(p.src);
|
|
12340
|
+
return true;
|
|
12341
|
+
});
|
|
12342
|
+
if (!photos.length) continue;
|
|
12343
|
+
const prev = sections[sections.length - 1];
|
|
12344
|
+
if (prev && prev.label === entry.label) {
|
|
12345
|
+
prev.photos.push(...photos);
|
|
12346
|
+
} else {
|
|
12347
|
+
sections.push({ label: entry.label, photos: [...photos] });
|
|
12348
|
+
}
|
|
12349
|
+
}
|
|
12350
|
+
let index = 0;
|
|
12351
|
+
let running = 0;
|
|
12352
|
+
let done = false;
|
|
12353
|
+
for (const section of sections) {
|
|
12354
|
+
for (const photo of section.photos) {
|
|
12355
|
+
if (photo.src === targetSrc) {
|
|
12356
|
+
index = running;
|
|
12357
|
+
done = true;
|
|
12358
|
+
break;
|
|
12359
|
+
}
|
|
12360
|
+
running += 1;
|
|
12361
|
+
}
|
|
12362
|
+
if (done) break;
|
|
12363
|
+
}
|
|
12364
|
+
setOpen({ sections, index });
|
|
12365
|
+
}, []);
|
|
12366
|
+
const value = React20__namespace.useMemo(
|
|
12367
|
+
() => ({ enabled, register, unregister, open: openTour }),
|
|
12368
|
+
[enabled, register, unregister, openTour]
|
|
12369
|
+
);
|
|
12370
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(PhotoTourContext.Provider, { value, children: [
|
|
12371
|
+
children,
|
|
12372
|
+
open && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12373
|
+
FeedLightbox,
|
|
12374
|
+
{
|
|
12375
|
+
sections: open.sections,
|
|
12376
|
+
initialIndex: open.index,
|
|
12377
|
+
labels,
|
|
12378
|
+
onClose: () => setOpen(null)
|
|
12379
|
+
}
|
|
12380
|
+
)
|
|
12381
|
+
] });
|
|
12382
|
+
}
|
|
12129
12383
|
function PhotoTile({
|
|
12130
12384
|
photo,
|
|
12131
12385
|
index,
|
|
@@ -12198,7 +12452,7 @@ function GridGallery({
|
|
|
12198
12452
|
onOpen,
|
|
12199
12453
|
labels
|
|
12200
12454
|
}) {
|
|
12201
|
-
const [expanded, setExpanded] =
|
|
12455
|
+
const [expanded, setExpanded] = React20__namespace.useState(false);
|
|
12202
12456
|
const cols = gridCols(photos.length);
|
|
12203
12457
|
const hasMore = photos.length > initialVisible;
|
|
12204
12458
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -12230,7 +12484,7 @@ function CompactGridGallery({
|
|
|
12230
12484
|
onOpen,
|
|
12231
12485
|
labels
|
|
12232
12486
|
}) {
|
|
12233
|
-
const [expanded, setExpanded] =
|
|
12487
|
+
const [expanded, setExpanded] = React20__namespace.useState(false);
|
|
12234
12488
|
const hasMore = photos.length > initialVisible;
|
|
12235
12489
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
12236
12490
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -12261,7 +12515,7 @@ function MasonryGallery({
|
|
|
12261
12515
|
onOpen,
|
|
12262
12516
|
labels
|
|
12263
12517
|
}) {
|
|
12264
|
-
const [expanded, setExpanded] =
|
|
12518
|
+
const [expanded, setExpanded] = React20__namespace.useState(false);
|
|
12265
12519
|
const hasMore = photos.length > initialVisible;
|
|
12266
12520
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
12267
12521
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -12338,7 +12592,7 @@ function FeaturedGallery({
|
|
|
12338
12592
|
onOpen,
|
|
12339
12593
|
labels
|
|
12340
12594
|
}) {
|
|
12341
|
-
const [expanded, setExpanded] =
|
|
12595
|
+
const [expanded, setExpanded] = React20__namespace.useState(false);
|
|
12342
12596
|
const featured = photos.slice(0, 3);
|
|
12343
12597
|
const extra = photos.slice(3);
|
|
12344
12598
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -12448,37 +12702,114 @@ function CarouselGallery({
|
|
|
12448
12702
|
onOpen,
|
|
12449
12703
|
className
|
|
12450
12704
|
}) {
|
|
12451
|
-
var _a;
|
|
12452
12705
|
const total = photos.length;
|
|
12453
|
-
const
|
|
12454
|
-
const prev = () =>
|
|
12455
|
-
const next = () =>
|
|
12706
|
+
const go = (i) => onIndexChange(Math.max(0, Math.min(total - 1, i)));
|
|
12707
|
+
const prev = () => go(index - 1);
|
|
12708
|
+
const next = () => go(index + 1);
|
|
12709
|
+
const containerRef = React20__namespace.useRef(null);
|
|
12710
|
+
const [drag, setDrag] = React20__namespace.useState(0);
|
|
12711
|
+
const [dragging, setDragging] = React20__namespace.useState(false);
|
|
12712
|
+
const gesture = React20__namespace.useRef(null);
|
|
12713
|
+
const movedRef = React20__namespace.useRef(false);
|
|
12714
|
+
const onPointerDown = (e) => {
|
|
12715
|
+
var _a, _b;
|
|
12716
|
+
if (total <= 1) return;
|
|
12717
|
+
movedRef.current = false;
|
|
12718
|
+
gesture.current = {
|
|
12719
|
+
x: e.clientX,
|
|
12720
|
+
y: e.clientY,
|
|
12721
|
+
w: (_b = (_a = containerRef.current) == null ? void 0 : _a.clientWidth) != null ? _b : 1,
|
|
12722
|
+
axis: null,
|
|
12723
|
+
id: e.pointerId
|
|
12724
|
+
};
|
|
12725
|
+
};
|
|
12726
|
+
const onPointerMove = (e) => {
|
|
12727
|
+
var _a;
|
|
12728
|
+
const g = gesture.current;
|
|
12729
|
+
if (!g || e.pointerId !== g.id) return;
|
|
12730
|
+
const dx = e.clientX - g.x;
|
|
12731
|
+
const dy = e.clientY - g.y;
|
|
12732
|
+
if (g.axis === null) {
|
|
12733
|
+
if (Math.abs(dx) > 8 && Math.abs(dx) > Math.abs(dy)) {
|
|
12734
|
+
g.axis = "x";
|
|
12735
|
+
setDragging(true);
|
|
12736
|
+
(_a = containerRef.current) == null ? void 0 : _a.setPointerCapture(g.id);
|
|
12737
|
+
} else if (Math.abs(dy) > 8) {
|
|
12738
|
+
gesture.current = null;
|
|
12739
|
+
return;
|
|
12740
|
+
} else {
|
|
12741
|
+
return;
|
|
12742
|
+
}
|
|
12743
|
+
}
|
|
12744
|
+
if (g.axis !== "x") return;
|
|
12745
|
+
movedRef.current = true;
|
|
12746
|
+
let d = dx;
|
|
12747
|
+
if (index === 0 && d > 0 || index === total - 1 && d < 0) d *= 0.35;
|
|
12748
|
+
setDrag(d);
|
|
12749
|
+
};
|
|
12750
|
+
const endGesture = (e) => {
|
|
12751
|
+
const g = gesture.current;
|
|
12752
|
+
gesture.current = null;
|
|
12753
|
+
setDragging(false);
|
|
12754
|
+
setDrag(0);
|
|
12755
|
+
if (!g || g.axis !== "x") return;
|
|
12756
|
+
const dx = e.clientX - g.x;
|
|
12757
|
+
const threshold = Math.min(110, g.w * 0.18);
|
|
12758
|
+
if (dx <= -threshold) next();
|
|
12759
|
+
else if (dx >= threshold) prev();
|
|
12760
|
+
};
|
|
12456
12761
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12457
12762
|
"div",
|
|
12458
12763
|
{
|
|
12764
|
+
ref: containerRef,
|
|
12765
|
+
onPointerDown,
|
|
12766
|
+
onPointerMove,
|
|
12767
|
+
onPointerUp: endGesture,
|
|
12768
|
+
onPointerCancel: endGesture,
|
|
12769
|
+
onClick: () => {
|
|
12770
|
+
if (movedRef.current) {
|
|
12771
|
+
movedRef.current = false;
|
|
12772
|
+
return;
|
|
12773
|
+
}
|
|
12774
|
+
onOpen(index);
|
|
12775
|
+
},
|
|
12776
|
+
onKeyDown: (e) => {
|
|
12777
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
12778
|
+
e.preventDefault();
|
|
12779
|
+
onOpen(index);
|
|
12780
|
+
}
|
|
12781
|
+
},
|
|
12782
|
+
role: "button",
|
|
12783
|
+
tabIndex: 0,
|
|
12784
|
+
"aria-label": `Open photo ${index + 1} fullscreen`,
|
|
12459
12785
|
className: cn(
|
|
12460
|
-
"relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted
|
|
12786
|
+
"relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted",
|
|
12787
|
+
"touch-pan-y select-none cursor-zoom-in",
|
|
12788
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
12461
12789
|
className
|
|
12462
12790
|
),
|
|
12463
12791
|
children: [
|
|
12464
12792
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12465
|
-
"
|
|
12793
|
+
"div",
|
|
12466
12794
|
{
|
|
12467
|
-
|
|
12468
|
-
|
|
12469
|
-
|
|
12470
|
-
|
|
12471
|
-
|
|
12472
|
-
|
|
12473
|
-
|
|
12474
|
-
|
|
12475
|
-
|
|
12476
|
-
|
|
12477
|
-
|
|
12478
|
-
|
|
12479
|
-
|
|
12480
|
-
|
|
12481
|
-
|
|
12795
|
+
className: "flex h-full w-full",
|
|
12796
|
+
style: {
|
|
12797
|
+
transform: `translateX(calc(${-index * 100}% + ${drag}px))`,
|
|
12798
|
+
transition: dragging ? "none" : "transform 0.35s cubic-bezier(0.22, 0.61, 0.36, 1)"
|
|
12799
|
+
},
|
|
12800
|
+
children: photos.map((p, i) => {
|
|
12801
|
+
var _a;
|
|
12802
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full w-full shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12803
|
+
Picture,
|
|
12804
|
+
{
|
|
12805
|
+
src: p.src,
|
|
12806
|
+
alt: (_a = p.alt) != null ? _a : `Photo ${i + 1}`,
|
|
12807
|
+
title: p.caption,
|
|
12808
|
+
className: "pointer-events-none h-full w-full object-cover",
|
|
12809
|
+
rootMargin: "400px"
|
|
12810
|
+
}
|
|
12811
|
+
) }, i);
|
|
12812
|
+
})
|
|
12482
12813
|
}
|
|
12483
12814
|
),
|
|
12484
12815
|
total > 1 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -12486,7 +12817,10 @@ function CarouselGallery({
|
|
|
12486
12817
|
"button",
|
|
12487
12818
|
{
|
|
12488
12819
|
type: "button",
|
|
12489
|
-
onClick:
|
|
12820
|
+
onClick: (e) => {
|
|
12821
|
+
e.stopPropagation();
|
|
12822
|
+
prev();
|
|
12823
|
+
},
|
|
12490
12824
|
"aria-label": "Previous photo",
|
|
12491
12825
|
className: cn(
|
|
12492
12826
|
"absolute left-3 sm:left-4 top-1/2 -translate-y-1/2 z-10",
|
|
@@ -12502,7 +12836,10 @@ function CarouselGallery({
|
|
|
12502
12836
|
"button",
|
|
12503
12837
|
{
|
|
12504
12838
|
type: "button",
|
|
12505
|
-
onClick:
|
|
12839
|
+
onClick: (e) => {
|
|
12840
|
+
e.stopPropagation();
|
|
12841
|
+
next();
|
|
12842
|
+
},
|
|
12506
12843
|
"aria-label": "Next photo",
|
|
12507
12844
|
className: cn(
|
|
12508
12845
|
"absolute right-3 sm:right-4 top-1/2 -translate-y-1/2 z-10",
|
|
@@ -12519,7 +12856,10 @@ function CarouselGallery({
|
|
|
12519
12856
|
"button",
|
|
12520
12857
|
{
|
|
12521
12858
|
type: "button",
|
|
12522
|
-
onClick: () =>
|
|
12859
|
+
onClick: (e) => {
|
|
12860
|
+
e.stopPropagation();
|
|
12861
|
+
onIndexChange(i);
|
|
12862
|
+
},
|
|
12523
12863
|
"aria-label": `Go to photo ${i + 1}`,
|
|
12524
12864
|
className: cn(
|
|
12525
12865
|
"h-1.5 rounded-full transition-all duration-300",
|
|
@@ -12538,17 +12878,46 @@ function PhotoGallery({
|
|
|
12538
12878
|
initialVisible = 6,
|
|
12539
12879
|
onPhotoClick,
|
|
12540
12880
|
labels,
|
|
12881
|
+
lightbox: lightboxMode = "classic",
|
|
12882
|
+
tourSection,
|
|
12541
12883
|
className
|
|
12542
12884
|
}) {
|
|
12543
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
12544
|
-
const [carouselIndex, setCarouselIndex] =
|
|
12545
|
-
const normalised =
|
|
12885
|
+
const [lightboxIndex, setLightboxIndex] = React20__namespace.useState(null);
|
|
12886
|
+
const [carouselIndex, setCarouselIndex] = React20__namespace.useState(0);
|
|
12887
|
+
const normalised = React20__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
12888
|
+
const tour = React20__namespace.useContext(PhotoTourContext);
|
|
12889
|
+
const tourId = React20__namespace.useId();
|
|
12890
|
+
const markerRef = React20__namespace.useRef(null);
|
|
12891
|
+
const inTour = !!((tour == null ? void 0 : tour.enabled) && tourSection);
|
|
12892
|
+
React20__namespace.useEffect(() => {
|
|
12893
|
+
if (!inTour || !tour) return;
|
|
12894
|
+
tour.register({
|
|
12895
|
+
id: tourId,
|
|
12896
|
+
label: tourSection,
|
|
12897
|
+
getEl: () => markerRef.current,
|
|
12898
|
+
photos: normalised
|
|
12899
|
+
});
|
|
12900
|
+
return () => tour.unregister(tourId);
|
|
12901
|
+
}, [inTour, tour, tourId, tourSection, normalised]);
|
|
12546
12902
|
const handleOpen = (index) => {
|
|
12547
|
-
setLightboxIndex(index);
|
|
12548
12903
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
12904
|
+
if (inTour && tour) {
|
|
12905
|
+
tour.open(tourId, index);
|
|
12906
|
+
return;
|
|
12907
|
+
}
|
|
12908
|
+
setLightboxIndex(index);
|
|
12549
12909
|
};
|
|
12550
12910
|
if (normalised.length === 0) return null;
|
|
12551
|
-
const
|
|
12911
|
+
const tourMarker = inTour && /* @__PURE__ */ jsxRuntime.jsx("span", { ref: markerRef, "aria-hidden": true, className: "hidden" });
|
|
12912
|
+
const lightbox = lightboxIndex !== null && (lightboxMode === "feed" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12913
|
+
FeedLightbox,
|
|
12914
|
+
{
|
|
12915
|
+
sections: [{ photos: normalised }],
|
|
12916
|
+
initialIndex: lightboxIndex,
|
|
12917
|
+
onClose: () => setLightboxIndex(null),
|
|
12918
|
+
labels
|
|
12919
|
+
}
|
|
12920
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
12552
12921
|
Lightbox,
|
|
12553
12922
|
{
|
|
12554
12923
|
photos: normalised,
|
|
@@ -12556,9 +12925,10 @@ function PhotoGallery({
|
|
|
12556
12925
|
onClose: () => setLightboxIndex(null),
|
|
12557
12926
|
labels
|
|
12558
12927
|
}
|
|
12559
|
-
);
|
|
12928
|
+
));
|
|
12560
12929
|
if (variant === "carousel" || variant === "fullBleed") {
|
|
12561
12930
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
12931
|
+
tourMarker,
|
|
12562
12932
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12563
12933
|
CarouselGallery,
|
|
12564
12934
|
{
|
|
@@ -12577,6 +12947,7 @@ function PhotoGallery({
|
|
|
12577
12947
|
] });
|
|
12578
12948
|
}
|
|
12579
12949
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", className), children: [
|
|
12950
|
+
tourMarker,
|
|
12580
12951
|
variant === "grid" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12581
12952
|
GridGallery,
|
|
12582
12953
|
{
|
|
@@ -12632,14 +13003,15 @@ function ItineraryDay({
|
|
|
12632
13003
|
photoLayout = "rounded",
|
|
12633
13004
|
className
|
|
12634
13005
|
}) {
|
|
12635
|
-
const photoList =
|
|
13006
|
+
const photoList = React20__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
12636
13007
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
12637
13008
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
12638
13009
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12639
13010
|
PhotoGallery,
|
|
12640
13011
|
{
|
|
12641
13012
|
photos: photoList,
|
|
12642
|
-
variant: isFullBleed ? "fullBleed" : "carousel"
|
|
13013
|
+
variant: isFullBleed ? "fullBleed" : "carousel",
|
|
13014
|
+
tourSection: dayLabel != null ? dayLabel : `Day ${dayNumber}`
|
|
12643
13015
|
}
|
|
12644
13016
|
);
|
|
12645
13017
|
return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn("w-full flex flex-col gap-5", className), children: [
|
|
@@ -12687,8 +13059,8 @@ function MenuTrip({
|
|
|
12687
13059
|
bold = true,
|
|
12688
13060
|
className
|
|
12689
13061
|
}) {
|
|
12690
|
-
const scrollRef =
|
|
12691
|
-
|
|
13062
|
+
const scrollRef = React20__namespace.useRef(null);
|
|
13063
|
+
React20__namespace.useEffect(() => {
|
|
12692
13064
|
if (!scrollRef.current || !activeSection) return;
|
|
12693
13065
|
const container = scrollRef.current;
|
|
12694
13066
|
const btn = container.querySelector(
|
|
@@ -12886,8 +13258,8 @@ function PricingTrip({
|
|
|
12886
13258
|
className
|
|
12887
13259
|
}) {
|
|
12888
13260
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
12889
|
-
const [showEstimates, setShowEstimates] =
|
|
12890
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
13261
|
+
const [showEstimates, setShowEstimates] = React20__namespace.useState(false);
|
|
13262
|
+
const [showPriceInfo, setShowPriceInfo] = React20__namespace.useState(false);
|
|
12891
13263
|
if (variant === "compact") {
|
|
12892
13264
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
12893
13265
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -13323,6 +13695,7 @@ function SiteHeader({
|
|
|
13323
13695
|
logoSrcDark = "/logo-planetaexo-green.png",
|
|
13324
13696
|
logoSrc,
|
|
13325
13697
|
logoAlt = "Planeta Exo",
|
|
13698
|
+
logoHref = "#",
|
|
13326
13699
|
languages = DEFAULT_LANGUAGES,
|
|
13327
13700
|
currentLanguage = "EN",
|
|
13328
13701
|
onLanguageChange,
|
|
@@ -13335,14 +13708,14 @@ function SiteHeader({
|
|
|
13335
13708
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
13336
13709
|
const t = VARIANT[variant];
|
|
13337
13710
|
const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
|
|
13338
|
-
const [openMenu, setOpenMenu] =
|
|
13339
|
-
const [langOpen, setLangOpen] =
|
|
13340
|
-
const [mobileOpen, setMobileOpen] =
|
|
13341
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
13342
|
-
const [activeLang, setActiveLang] =
|
|
13711
|
+
const [openMenu, setOpenMenu] = React20__namespace.useState(null);
|
|
13712
|
+
const [langOpen, setLangOpen] = React20__namespace.useState(false);
|
|
13713
|
+
const [mobileOpen, setMobileOpen] = React20__namespace.useState(false);
|
|
13714
|
+
const [openMobileSection, setOpenMobileSection] = React20__namespace.useState(null);
|
|
13715
|
+
const [activeLang, setActiveLang] = React20__namespace.useState(currentLanguage);
|
|
13343
13716
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
13344
|
-
const menuCloseTimer =
|
|
13345
|
-
const langCloseTimer =
|
|
13717
|
+
const menuCloseTimer = React20__namespace.useRef(void 0);
|
|
13718
|
+
const langCloseTimer = React20__namespace.useRef(void 0);
|
|
13346
13719
|
const handleMenuEnter = (label) => {
|
|
13347
13720
|
clearTimeout(menuCloseTimer.current);
|
|
13348
13721
|
setOpenMenu(label);
|
|
@@ -13363,7 +13736,7 @@ function SiteHeader({
|
|
|
13363
13736
|
setOpenMenu(null);
|
|
13364
13737
|
setLangOpen(false);
|
|
13365
13738
|
};
|
|
13366
|
-
|
|
13739
|
+
React20__namespace.useEffect(() => () => {
|
|
13367
13740
|
clearTimeout(menuCloseTimer.current);
|
|
13368
13741
|
clearTimeout(langCloseTimer.current);
|
|
13369
13742
|
}, []);
|
|
@@ -13401,7 +13774,7 @@ function SiteHeader({
|
|
|
13401
13774
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
13402
13775
|
"a",
|
|
13403
13776
|
{
|
|
13404
|
-
href:
|
|
13777
|
+
href: logoHref,
|
|
13405
13778
|
className: cn(
|
|
13406
13779
|
"shrink-0 flex items-center",
|
|
13407
13780
|
"absolute left-1/2 -translate-x-1/2",
|
|
@@ -13553,7 +13926,7 @@ function SiteHeader({
|
|
|
13553
13926
|
),
|
|
13554
13927
|
children: [
|
|
13555
13928
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 h-[72px] shrink-0 border-b border-white/8", children: [
|
|
13556
|
-
/* @__PURE__ */ jsxRuntime.jsx("a", { href:
|
|
13929
|
+
/* @__PURE__ */ jsxRuntime.jsx("a", { href: logoHref, className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
13557
13930
|
"img",
|
|
13558
13931
|
{
|
|
13559
13932
|
src: resolvedLogo,
|
|
@@ -13639,7 +14012,7 @@ function SiteHeader({
|
|
|
13639
14012
|
), children: [
|
|
13640
14013
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
13641
14014
|
const isActive = lang.code === activeLang;
|
|
13642
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14015
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
13643
14016
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
13644
14017
|
"text-xs select-none",
|
|
13645
14018
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -13701,8 +14074,8 @@ function SiteHeader({
|
|
|
13701
14074
|
);
|
|
13702
14075
|
}
|
|
13703
14076
|
function ThemeToggle({ className }) {
|
|
13704
|
-
const [dark, setDark] =
|
|
13705
|
-
|
|
14077
|
+
const [dark, setDark] = React20__namespace.useState(false);
|
|
14078
|
+
React20__namespace.useEffect(() => {
|
|
13706
14079
|
const saved = localStorage.getItem("theme");
|
|
13707
14080
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
13708
14081
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -13752,7 +14125,7 @@ var chipVariants = classVarianceAuthority.cva(
|
|
|
13752
14125
|
}
|
|
13753
14126
|
}
|
|
13754
14127
|
);
|
|
13755
|
-
var Chip =
|
|
14128
|
+
var Chip = React20__namespace.forwardRef(function Chip2(_a, ref) {
|
|
13756
14129
|
var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
|
|
13757
14130
|
const classes = cn(chipVariants({ variant, size }), className);
|
|
13758
14131
|
if (href) {
|
|
@@ -13819,6 +14192,19 @@ var statusConfig = {
|
|
|
13819
14192
|
icon: /* @__PURE__ */ jsxRuntime.jsx(TrendingIcon, {})
|
|
13820
14193
|
}
|
|
13821
14194
|
};
|
|
14195
|
+
function StarIcon() {
|
|
14196
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
14197
|
+
"svg",
|
|
14198
|
+
{
|
|
14199
|
+
width: "15",
|
|
14200
|
+
height: "15",
|
|
14201
|
+
viewBox: "0 0 24 24",
|
|
14202
|
+
fill: "currentColor",
|
|
14203
|
+
"aria-hidden": "true",
|
|
14204
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 17.27l-5.4 3.27 1.43-6.16-4.78-4.14 6.3-.54L12 4l2.45 5.7 6.3.54-4.78 4.14 1.43 6.16z" })
|
|
14205
|
+
}
|
|
14206
|
+
);
|
|
14207
|
+
}
|
|
13822
14208
|
function HeartIcon({ filled = false }) {
|
|
13823
14209
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
13824
14210
|
"svg",
|
|
@@ -13836,7 +14222,7 @@ function HeartIcon({ filled = false }) {
|
|
|
13836
14222
|
);
|
|
13837
14223
|
}
|
|
13838
14224
|
function TripCardEditorial(props) {
|
|
13839
|
-
var _a, _b, _c, _d;
|
|
14225
|
+
var _a, _b, _c, _d, _e, _f;
|
|
13840
14226
|
const {
|
|
13841
14227
|
image,
|
|
13842
14228
|
imageAlt = "",
|
|
@@ -13853,10 +14239,14 @@ function TripCardEditorial(props) {
|
|
|
13853
14239
|
location,
|
|
13854
14240
|
locationHref,
|
|
13855
14241
|
difficulty,
|
|
14242
|
+
rating,
|
|
14243
|
+
reviewCount,
|
|
13856
14244
|
tag,
|
|
13857
14245
|
tagHref
|
|
13858
14246
|
} = props;
|
|
13859
|
-
const
|
|
14247
|
+
const hasRating = typeof rating === "number" && rating > 0;
|
|
14248
|
+
const reviewsWord = reviewCount === 1 ? (_a = labels == null ? void 0 : labels.review) != null ? _a : "review" : (_b = labels == null ? void 0 : labels.reviews) != null ? _b : "reviews";
|
|
14249
|
+
const [internalFav, setInternalFav] = React20__namespace.useState(false);
|
|
13860
14250
|
const favorited = favoritedProp != null ? favoritedProp : internalFav;
|
|
13861
14251
|
const handleFav = (e) => {
|
|
13862
14252
|
e.preventDefault();
|
|
@@ -13898,7 +14288,7 @@ function TripCardEditorial(props) {
|
|
|
13898
14288
|
"button",
|
|
13899
14289
|
{
|
|
13900
14290
|
type: "button",
|
|
13901
|
-
"aria-label": favorited ? (
|
|
14291
|
+
"aria-label": favorited ? (_c = labels == null ? void 0 : labels.removeFromFavorites) != null ? _c : "Remove from favorites" : (_d = labels == null ? void 0 : labels.addToFavorites) != null ? _d : "Add to favorites",
|
|
13902
14292
|
"aria-pressed": favorited,
|
|
13903
14293
|
onClick: handleFav,
|
|
13904
14294
|
className: cn(
|
|
@@ -13912,7 +14302,24 @@ function TripCardEditorial(props) {
|
|
|
13912
14302
|
),
|
|
13913
14303
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0 p-5 text-white", children: /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg sm:text-xl font-bold font-heading leading-tight", children: title }) })
|
|
13914
14304
|
] }),
|
|
13915
|
-
(description || price || nights || location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
|
|
14305
|
+
(description || price || nights || location || difficulty || hasRating) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
|
|
14306
|
+
hasRating && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14307
|
+
"div",
|
|
14308
|
+
{
|
|
14309
|
+
className: "flex items-center gap-1.5 text-foreground/85",
|
|
14310
|
+
"aria-label": reviewCount ? `${rating.toFixed(1)} (${reviewCount} ${reviewsWord})` : `${rating.toFixed(1)}`,
|
|
14311
|
+
children: [
|
|
14312
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-amber-500", children: /* @__PURE__ */ jsxRuntime.jsx(StarIcon, {}) }),
|
|
14313
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: rating.toFixed(1) }),
|
|
14314
|
+
reviewCount ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-ui text-muted-foreground", children: [
|
|
14315
|
+
"\xB7 ",
|
|
14316
|
+
reviewCount,
|
|
14317
|
+
" ",
|
|
14318
|
+
reviewsWord
|
|
14319
|
+
] }) : null
|
|
14320
|
+
]
|
|
14321
|
+
}
|
|
14322
|
+
),
|
|
13916
14323
|
(location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
|
|
13917
14324
|
location ? locationHref ? (
|
|
13918
14325
|
// Above the card's stretched link (z-20) so the location is
|
|
@@ -13942,7 +14349,7 @@ function TripCardEditorial(props) {
|
|
|
13942
14349
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
|
|
13943
14350
|
nights,
|
|
13944
14351
|
" ",
|
|
13945
|
-
nights === 1 ? (
|
|
14352
|
+
nights === 1 ? (_e = labels == null ? void 0 : labels.night) != null ? _e : "night" : (_f = labels == null ? void 0 : labels.nights) != null ? _f : "nights"
|
|
13946
14353
|
] })
|
|
13947
14354
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
13948
14355
|
price && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
|
|
@@ -14371,7 +14778,7 @@ function BlogPost({
|
|
|
14371
14778
|
) }),
|
|
14372
14779
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
|
|
14373
14780
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-3xl px-6 sm:px-8 pb-9 sm:pb-11", children: [
|
|
14374
|
-
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14781
|
+
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
14375
14782
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
14376
14783
|
crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
14377
14784
|
"a",
|
|
@@ -14425,7 +14832,7 @@ function BlogPost({
|
|
|
14425
14832
|
] });
|
|
14426
14833
|
}
|
|
14427
14834
|
function useHlsVideo(videoRef, src) {
|
|
14428
|
-
|
|
14835
|
+
React20__namespace.useEffect(() => {
|
|
14429
14836
|
if (!src || !videoRef.current) return;
|
|
14430
14837
|
const video = videoRef.current;
|
|
14431
14838
|
if (!src.includes(".m3u8")) return;
|
|
@@ -14471,11 +14878,11 @@ function TripHeader({
|
|
|
14471
14878
|
className
|
|
14472
14879
|
}) {
|
|
14473
14880
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
14474
|
-
const [heroIndex, setHeroIndex] =
|
|
14475
|
-
const [videoReady, setVideoReady] =
|
|
14476
|
-
const videoRef =
|
|
14881
|
+
const [heroIndex, setHeroIndex] = React20__namespace.useState(0);
|
|
14882
|
+
const [videoReady, setVideoReady] = React20__namespace.useState(false);
|
|
14883
|
+
const videoRef = React20__namespace.useRef(null);
|
|
14477
14884
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
14478
|
-
const validImages =
|
|
14885
|
+
const validImages = React20__namespace.useMemo(
|
|
14479
14886
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
14480
14887
|
[images]
|
|
14481
14888
|
);
|
|
@@ -14490,7 +14897,7 @@ function TripHeader({
|
|
|
14490
14897
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
14491
14898
|
const hasMeta = !!(destination || duration || groupSize);
|
|
14492
14899
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
14493
|
-
|
|
14900
|
+
React20__namespace.useEffect(() => {
|
|
14494
14901
|
if (!videoUrl) return;
|
|
14495
14902
|
const el = videoRef.current;
|
|
14496
14903
|
if (!el) return;
|
|
@@ -14633,7 +15040,7 @@ function TripHeader({
|
|
|
14633
15040
|
chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
|
|
14634
15041
|
),
|
|
14635
15042
|
children: [
|
|
14636
|
-
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15043
|
+
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
14637
15044
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
14638
15045
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
14639
15046
|
] }, i)) }),
|
|
@@ -14803,10 +15210,10 @@ function LanguagePicker({
|
|
|
14803
15210
|
}) {
|
|
14804
15211
|
var _a;
|
|
14805
15212
|
const t = VARIANT2[variant];
|
|
14806
|
-
const [open, setOpen] =
|
|
14807
|
-
const ref =
|
|
15213
|
+
const [open, setOpen] = React20__namespace.useState(false);
|
|
15214
|
+
const ref = React20__namespace.useRef(null);
|
|
14808
15215
|
const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
|
|
14809
|
-
|
|
15216
|
+
React20__namespace.useEffect(() => {
|
|
14810
15217
|
if (!open) return;
|
|
14811
15218
|
const onDocClick = (e) => {
|
|
14812
15219
|
if (ref.current && !ref.current.contains(e.target)) {
|
|
@@ -15014,7 +15421,7 @@ function SiteFooter({
|
|
|
15014
15421
|
children: wrapper
|
|
15015
15422
|
},
|
|
15016
15423
|
b.alt + i
|
|
15017
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
15424
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(React20__namespace.Fragment, { children: wrapper }, b.alt + i);
|
|
15018
15425
|
}) })
|
|
15019
15426
|
] }),
|
|
15020
15427
|
themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
|
|
@@ -15156,6 +15563,7 @@ function TripPage({
|
|
|
15156
15563
|
itinerary,
|
|
15157
15564
|
itineraryDays,
|
|
15158
15565
|
gallery,
|
|
15566
|
+
galleryLightbox = "classic",
|
|
15159
15567
|
included,
|
|
15160
15568
|
notIncluded,
|
|
15161
15569
|
whatToBring,
|
|
@@ -15195,15 +15603,16 @@ function TripPage({
|
|
|
15195
15603
|
fromLabel,
|
|
15196
15604
|
perPersonLabel,
|
|
15197
15605
|
siteHeader,
|
|
15606
|
+
footerBadges,
|
|
15198
15607
|
uiVariant = "v1",
|
|
15199
15608
|
features,
|
|
15200
15609
|
className
|
|
15201
15610
|
}) {
|
|
15202
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
|
|
15203
|
-
const [activeSection, setActiveSection] =
|
|
15204
|
-
const [accordionValue, setAccordionValue] =
|
|
15205
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
15206
|
-
const accordionSectionIds =
|
|
15611
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
15612
|
+
const [activeSection, setActiveSection] = React20__namespace.useState("");
|
|
15613
|
+
const [accordionValue, setAccordionValue] = React20__namespace.useState([]);
|
|
15614
|
+
const [faqsExpanded, setFaqsExpanded] = React20__namespace.useState(false);
|
|
15615
|
+
const accordionSectionIds = React20__namespace.useMemo(
|
|
15207
15616
|
() => /* @__PURE__ */ new Set([
|
|
15208
15617
|
"when-it-operates",
|
|
15209
15618
|
"how-to-get-there",
|
|
@@ -15217,18 +15626,18 @@ function TripPage({
|
|
|
15217
15626
|
]),
|
|
15218
15627
|
[]
|
|
15219
15628
|
);
|
|
15220
|
-
const [navFloating, setNavFloating] =
|
|
15221
|
-
const [navHidden, setNavHidden] =
|
|
15222
|
-
const [isFloating, setIsFloating] =
|
|
15223
|
-
const [sidebarPos, setSidebarPos] =
|
|
15224
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
15225
|
-
const navRef =
|
|
15226
|
-
const navSentinelRef =
|
|
15227
|
-
const sentinelRef =
|
|
15228
|
-
const sidebarPlaceholderRef =
|
|
15229
|
-
const pricingBarRef =
|
|
15230
|
-
const galleryRef =
|
|
15231
|
-
const sections =
|
|
15629
|
+
const [navFloating, setNavFloating] = React20__namespace.useState(false);
|
|
15630
|
+
const [navHidden, setNavHidden] = React20__namespace.useState(false);
|
|
15631
|
+
const [isFloating, setIsFloating] = React20__namespace.useState(false);
|
|
15632
|
+
const [sidebarPos, setSidebarPos] = React20__namespace.useState(null);
|
|
15633
|
+
const [pricingBarVisible, setPricingBarVisible] = React20__namespace.useState(false);
|
|
15634
|
+
const navRef = React20__namespace.useRef(null);
|
|
15635
|
+
const navSentinelRef = React20__namespace.useRef(null);
|
|
15636
|
+
const sentinelRef = React20__namespace.useRef(null);
|
|
15637
|
+
const sidebarPlaceholderRef = React20__namespace.useRef(null);
|
|
15638
|
+
const pricingBarRef = React20__namespace.useRef(null);
|
|
15639
|
+
const galleryRef = React20__namespace.useRef(null);
|
|
15640
|
+
const sections = React20__namespace.useMemo(
|
|
15232
15641
|
() => {
|
|
15233
15642
|
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
|
|
15234
15643
|
return [
|
|
@@ -15250,7 +15659,7 @@ function TripPage({
|
|
|
15250
15659
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
15251
15660
|
[]
|
|
15252
15661
|
);
|
|
15253
|
-
|
|
15662
|
+
React20__namespace.useEffect(() => {
|
|
15254
15663
|
const sentinel = navSentinelRef.current;
|
|
15255
15664
|
if (!sentinel) return;
|
|
15256
15665
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -15258,7 +15667,7 @@ function TripPage({
|
|
|
15258
15667
|
update();
|
|
15259
15668
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
15260
15669
|
}, []);
|
|
15261
|
-
|
|
15670
|
+
React20__namespace.useEffect(() => {
|
|
15262
15671
|
const sentinel = sentinelRef.current;
|
|
15263
15672
|
if (!sentinel) return;
|
|
15264
15673
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -15266,7 +15675,7 @@ function TripPage({
|
|
|
15266
15675
|
update();
|
|
15267
15676
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
15268
15677
|
}, []);
|
|
15269
|
-
|
|
15678
|
+
React20__namespace.useEffect(() => {
|
|
15270
15679
|
const measure = () => {
|
|
15271
15680
|
if (!sidebarPlaceholderRef.current) return;
|
|
15272
15681
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -15276,7 +15685,7 @@ function TripPage({
|
|
|
15276
15685
|
window.addEventListener("resize", measure);
|
|
15277
15686
|
return () => window.removeEventListener("resize", measure);
|
|
15278
15687
|
}, [isFloating]);
|
|
15279
|
-
|
|
15688
|
+
React20__namespace.useEffect(() => {
|
|
15280
15689
|
const check = () => {
|
|
15281
15690
|
var _a2;
|
|
15282
15691
|
const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
|
|
@@ -15287,7 +15696,7 @@ function TripPage({
|
|
|
15287
15696
|
check();
|
|
15288
15697
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
15289
15698
|
}, []);
|
|
15290
|
-
|
|
15699
|
+
React20__namespace.useEffect(() => {
|
|
15291
15700
|
const check = () => {
|
|
15292
15701
|
if (!pricingBarRef.current) return;
|
|
15293
15702
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -15296,7 +15705,7 @@ function TripPage({
|
|
|
15296
15705
|
check();
|
|
15297
15706
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
15298
15707
|
}, []);
|
|
15299
|
-
|
|
15708
|
+
React20__namespace.useEffect(() => {
|
|
15300
15709
|
if (sections.length === 0) return;
|
|
15301
15710
|
setActiveSection(sections[0].id);
|
|
15302
15711
|
const update = () => {
|
|
@@ -15354,468 +15763,483 @@ function TripPage({
|
|
|
15354
15763
|
}
|
|
15355
15764
|
performScroll();
|
|
15356
15765
|
};
|
|
15357
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
15358
|
-
|
|
15766
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
15767
|
+
PhotoTourProvider,
|
|
15359
15768
|
{
|
|
15360
|
-
|
|
15361
|
-
|
|
15362
|
-
|
|
15363
|
-
|
|
15364
|
-
|
|
15365
|
-
|
|
15366
|
-
|
|
15367
|
-
|
|
15368
|
-
|
|
15369
|
-
|
|
15370
|
-
|
|
15371
|
-
|
|
15372
|
-
|
|
15373
|
-
|
|
15374
|
-
|
|
15375
|
-
|
|
15376
|
-
|
|
15377
|
-
|
|
15378
|
-
|
|
15379
|
-
|
|
15380
|
-
|
|
15381
|
-
|
|
15382
|
-
|
|
15383
|
-
|
|
15384
|
-
|
|
15385
|
-
|
|
15386
|
-
|
|
15387
|
-
|
|
15388
|
-
|
|
15389
|
-
|
|
15390
|
-
|
|
15391
|
-
|
|
15392
|
-
|
|
15393
|
-
|
|
15394
|
-
|
|
15395
|
-
|
|
15396
|
-
|
|
15397
|
-
|
|
15398
|
-
|
|
15399
|
-
|
|
15400
|
-
|
|
15401
|
-
|
|
15402
|
-
|
|
15403
|
-
|
|
15769
|
+
enabled: galleryLightbox === "feed",
|
|
15770
|
+
labels: {
|
|
15771
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
15772
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15773
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
15774
|
+
},
|
|
15775
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15776
|
+
"div",
|
|
15777
|
+
{
|
|
15778
|
+
className: cn("w-full overflow-x-hidden", className),
|
|
15779
|
+
"data-ui-variant": uiVariant,
|
|
15780
|
+
"data-features": features ? JSON.stringify(features) : void 0,
|
|
15781
|
+
children: [
|
|
15782
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15783
|
+
TripHeader,
|
|
15784
|
+
{
|
|
15785
|
+
images,
|
|
15786
|
+
videoUrl,
|
|
15787
|
+
title,
|
|
15788
|
+
breadcrumb,
|
|
15789
|
+
destination,
|
|
15790
|
+
duration,
|
|
15791
|
+
groupSize,
|
|
15792
|
+
labels: {
|
|
15793
|
+
night: labels == null ? void 0 : labels.night,
|
|
15794
|
+
nights: labels == null ? void 0 : labels.nights,
|
|
15795
|
+
day: labels == null ? void 0 : labels.day,
|
|
15796
|
+
days: labels == null ? void 0 : labels.days,
|
|
15797
|
+
previousImage: labels == null ? void 0 : labels.previousImage,
|
|
15798
|
+
nextImage: labels == null ? void 0 : labels.nextImage
|
|
15799
|
+
},
|
|
15800
|
+
tagline,
|
|
15801
|
+
chips,
|
|
15802
|
+
siteHeader,
|
|
15803
|
+
uiVariant,
|
|
15804
|
+
belowMeta: trustpilotHero ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
|
|
15805
|
+
}
|
|
15806
|
+
),
|
|
15807
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
15808
|
+
highlights && highlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 flex flex-wrap justify-center gap-6 py-2", children: highlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2 text-center", children: [
|
|
15809
|
+
h.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full border-2 border-border text-foreground", children: h.icon }),
|
|
15810
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
|
|
15811
|
+
] }, i)) }),
|
|
15812
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
|
|
15813
|
+
sections.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
15814
|
+
"div",
|
|
15404
15815
|
{
|
|
15405
|
-
|
|
15406
|
-
|
|
15407
|
-
|
|
15408
|
-
|
|
15816
|
+
className: cn(
|
|
15817
|
+
"pt-8 pb-2 flex justify-center transition-opacity duration-150",
|
|
15818
|
+
navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
|
|
15819
|
+
),
|
|
15820
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15821
|
+
MenuTrip,
|
|
15822
|
+
{
|
|
15823
|
+
sections,
|
|
15824
|
+
activeSection,
|
|
15825
|
+
onSelect: scrollToSection,
|
|
15826
|
+
variant: "floating"
|
|
15827
|
+
}
|
|
15828
|
+
)
|
|
15409
15829
|
}
|
|
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
|
-
|
|
15436
|
-
|
|
15437
|
-
|
|
15438
|
-
|
|
15439
|
-
|
|
15440
|
-
|
|
15441
|
-
|
|
15442
|
-
|
|
15443
|
-
|
|
15444
|
-
|
|
15445
|
-
|
|
15446
|
-
|
|
15447
|
-
|
|
15448
|
-
|
|
15449
|
-
|
|
15450
|
-
|
|
15451
|
-
|
|
15452
|
-
|
|
15453
|
-
|
|
15454
|
-
|
|
15455
|
-
|
|
15456
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15457
|
-
Checklist,
|
|
15458
|
-
{
|
|
15459
|
-
items: notIncluded,
|
|
15460
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-4 w-4 text-muted-foreground" })
|
|
15461
|
-
}
|
|
15462
|
-
)
|
|
15463
|
-
] }),
|
|
15464
|
-
(howToGetThere || (whatToBring == null ? void 0 : whatToBring.length) || weather || optionalExtras || accommodation || (accommodationGallery == null ? void 0 : accommodationGallery.length) || food || (foodGallery == null ? void 0 : foodGallery.length) || (meetingPoints == null ? void 0 : meetingPoints.length) || meetingPoint || termsAndConditions || whenItOperates) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15465
|
-
Accordion,
|
|
15466
|
-
{
|
|
15467
|
-
multiple: false,
|
|
15468
|
-
value: accordionValue,
|
|
15469
|
-
onValueChange: setAccordionValue,
|
|
15470
|
-
className: "border-t border-border",
|
|
15471
|
-
children: [
|
|
15472
|
-
whenItOperates && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15473
|
-
AccordionItem,
|
|
15474
|
-
{
|
|
15475
|
-
value: "when-it-operates",
|
|
15476
|
-
id: "trip-section-when-it-operates",
|
|
15477
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15478
|
-
children: [
|
|
15479
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15480
|
-
(sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-5 w-5 text-primary" }),
|
|
15481
|
-
(_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
|
|
15482
|
-
] }) }),
|
|
15483
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-bold [&_a]:text-primary [&_a]:underline", children: whenItOperates }) })
|
|
15484
|
-
]
|
|
15485
|
-
}
|
|
15486
|
-
),
|
|
15487
|
-
(accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15488
|
-
AccordionItem,
|
|
15489
|
-
{
|
|
15490
|
-
value: "accommodation",
|
|
15491
|
-
id: "trip-section-accommodation",
|
|
15492
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15493
|
-
children: [
|
|
15494
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15495
|
-
(sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
|
|
15496
|
-
(_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
|
|
15497
|
-
] }) }),
|
|
15498
|
-
/* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", children: [
|
|
15499
|
-
accommodation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }),
|
|
15500
|
-
accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15501
|
-
PhotoGallery,
|
|
15502
|
-
{
|
|
15503
|
-
labels: {
|
|
15504
|
-
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15505
|
-
showLess: labels == null ? void 0 : labels.showLess,
|
|
15506
|
-
close: labels == null ? void 0 : labels.galleryClose,
|
|
15507
|
-
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15508
|
-
next: labels == null ? void 0 : labels.galleryNext
|
|
15509
|
-
},
|
|
15510
|
-
photos: accommodationGallery,
|
|
15511
|
-
variant: accommodationGalleryVariant,
|
|
15512
|
-
initialVisible: 6
|
|
15513
|
-
}
|
|
15514
|
-
) })
|
|
15515
|
-
] })
|
|
15516
|
-
]
|
|
15517
|
-
}
|
|
15518
|
-
),
|
|
15519
|
-
(food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15520
|
-
AccordionItem,
|
|
15521
|
-
{
|
|
15522
|
-
value: "food",
|
|
15523
|
-
id: "trip-section-food",
|
|
15524
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15525
|
-
children: [
|
|
15526
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15527
|
-
(sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UtensilsIcon, { className: "h-5 w-5 text-primary" }),
|
|
15528
|
-
(_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
|
|
15529
|
-
] }) }),
|
|
15530
|
-
/* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", children: [
|
|
15531
|
-
food && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }),
|
|
15532
|
-
foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15533
|
-
PhotoGallery,
|
|
15534
|
-
{
|
|
15535
|
-
labels: {
|
|
15536
|
-
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15537
|
-
showLess: labels == null ? void 0 : labels.showLess,
|
|
15538
|
-
close: labels == null ? void 0 : labels.galleryClose,
|
|
15539
|
-
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15540
|
-
next: labels == null ? void 0 : labels.galleryNext
|
|
15541
|
-
},
|
|
15542
|
-
photos: foodGallery,
|
|
15543
|
-
variant: foodGalleryVariant,
|
|
15544
|
-
initialVisible: 6
|
|
15545
|
-
}
|
|
15546
|
-
) })
|
|
15547
|
-
] })
|
|
15548
|
-
]
|
|
15549
|
-
}
|
|
15550
|
-
),
|
|
15551
|
-
(meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15552
|
-
AccordionItem,
|
|
15553
|
-
{
|
|
15554
|
-
value: "meeting",
|
|
15555
|
-
id: "trip-section-meeting",
|
|
15556
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15557
|
-
children: [
|
|
15558
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15559
|
-
(sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-5 w-5 text-primary" }),
|
|
15560
|
-
(_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
|
|
15561
|
-
] }) }),
|
|
15562
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
|
|
15563
|
-
var _a2, _b2, _c2;
|
|
15564
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
|
|
15565
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
|
|
15566
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15567
|
-
mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? (_a2 = labels == null ? void 0 : labels.meetingPointActivity) != null ? _a2 : "Activity location" : mp.type === "alternative" ? (_b2 = labels == null ? void 0 : labels.meetingPointAlternative) != null ? _b2 : "Alternative meeting point" : (_c2 = labels == null ? void 0 : labels.meetingPoint) != null ? _c2 : "Meeting point" }),
|
|
15568
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
|
|
15569
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
|
|
15570
|
-
] })
|
|
15571
|
-
] }, i);
|
|
15572
|
-
}) }) })
|
|
15573
|
-
]
|
|
15574
|
-
}
|
|
15575
|
-
),
|
|
15576
|
-
howToGetThere && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15577
|
-
AccordionItem,
|
|
15578
|
-
{
|
|
15579
|
-
value: "how-to-get-there",
|
|
15580
|
-
id: "trip-section-how-to-get-there",
|
|
15581
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15582
|
-
children: [
|
|
15583
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15584
|
-
(sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CompassIcon, { className: "h-5 w-5 text-primary" }),
|
|
15585
|
-
(_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
|
|
15586
|
-
] }) }),
|
|
15587
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: howToGetThere }) })
|
|
15588
|
-
]
|
|
15589
|
-
}
|
|
15590
|
-
),
|
|
15591
|
-
weather && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15592
|
-
AccordionItem,
|
|
15593
|
-
{
|
|
15594
|
-
value: "weather",
|
|
15595
|
-
id: "trip-section-weather",
|
|
15596
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15597
|
-
children: [
|
|
15598
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15599
|
-
(sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-5 w-5 text-primary" }),
|
|
15600
|
-
(_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
|
|
15601
|
-
] }) }),
|
|
15602
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: weather }) })
|
|
15603
|
-
]
|
|
15604
|
-
}
|
|
15605
|
-
),
|
|
15606
|
-
whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15607
|
-
AccordionItem,
|
|
15608
|
-
{
|
|
15609
|
-
value: "what-to-bring",
|
|
15610
|
-
id: "trip-section-what-to-bring",
|
|
15611
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15612
|
-
children: [
|
|
15613
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15614
|
-
(sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BackpackIcon, { className: "h-5 w-5 text-primary" }),
|
|
15615
|
-
(_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
|
|
15616
|
-
] }) }),
|
|
15617
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-4 w-4" }) }) })
|
|
15618
|
-
]
|
|
15619
|
-
}
|
|
15620
|
-
),
|
|
15621
|
-
optionalExtras && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15622
|
-
AccordionItem,
|
|
15623
|
-
{
|
|
15624
|
-
value: "optional-extras",
|
|
15625
|
-
id: "trip-section-optional-extras",
|
|
15626
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15627
|
-
children: [
|
|
15628
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15629
|
-
(sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CherryIcon, { className: "h-5 w-5 text-primary" }),
|
|
15630
|
-
(_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
|
|
15631
|
-
] }) }),
|
|
15632
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: optionalExtras }) })
|
|
15633
|
-
]
|
|
15634
|
-
}
|
|
15635
|
-
),
|
|
15636
|
-
termsAndConditions && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15637
|
-
AccordionItem,
|
|
15830
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "my-6" }),
|
|
15831
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
|
|
15832
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
|
|
15833
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
|
|
15834
|
+
(overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
|
|
15835
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-4", children: (_a = labels == null ? void 0 : labels.overview) != null ? _a : "Overview" }),
|
|
15836
|
+
overview && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-lg text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview }),
|
|
15837
|
+
overviewHighlights && overviewHighlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("flex flex-col gap-5", overview && "mt-8"), children: overviewHighlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-4", children: [
|
|
15838
|
+
h.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center text-foreground [&_svg]:h-8 [&_svg]:w-8", children: h.icon }),
|
|
15839
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 pt-1 text-base text-foreground leading-relaxed [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: h.description })
|
|
15840
|
+
] }, i)) }),
|
|
15841
|
+
recommendedFor && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 flex items-start gap-2.5 rounded-xl bg-primary/8 border border-primary/20 p-4", children: [
|
|
15842
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
|
|
15843
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground font-ui", children: [
|
|
15844
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: "Recommended for: " }),
|
|
15845
|
+
recommendedFor
|
|
15846
|
+
] })
|
|
15847
|
+
] })
|
|
15848
|
+
] }),
|
|
15849
|
+
itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
|
|
15850
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_b = labels == null ? void 0 : labels.itinerary) != null ? _b : "Itinerary" }),
|
|
15851
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
15852
|
+
ItineraryDay,
|
|
15853
|
+
__spreadProps(__spreadValues({}, day), {
|
|
15854
|
+
photoLayout: "fullBleedBottom"
|
|
15855
|
+
}),
|
|
15856
|
+
day.dayNumber
|
|
15857
|
+
)) })
|
|
15858
|
+
] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
|
|
15859
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
|
|
15860
|
+
/* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
|
|
15861
|
+
] }),
|
|
15862
|
+
included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
|
|
15863
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
15864
|
+
(sectionIcons == null ? void 0 : sectionIcons.whatIsIncluded) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatIsIncluded }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
|
|
15865
|
+
(_d = labels == null ? void 0 : labels.whatIsIncluded) != null ? _d : "Included"
|
|
15866
|
+
] }),
|
|
15867
|
+
/* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: included })
|
|
15868
|
+
] }),
|
|
15869
|
+
notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
|
|
15870
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
15871
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5 text-muted-foreground" }),
|
|
15872
|
+
(_e = labels == null ? void 0 : labels.notIncluded) != null ? _e : "Not included"
|
|
15873
|
+
] }),
|
|
15874
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15875
|
+
Checklist,
|
|
15638
15876
|
{
|
|
15639
|
-
|
|
15640
|
-
|
|
15641
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15642
|
-
children: [
|
|
15643
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15644
|
-
(sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ReceiptIcon, { className: "h-5 w-5 text-primary" }),
|
|
15645
|
-
(_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
|
|
15646
|
-
] }) }),
|
|
15647
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: termsAndConditions }) })
|
|
15648
|
-
]
|
|
15877
|
+
items: notIncluded,
|
|
15878
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-4 w-4 text-muted-foreground" })
|
|
15649
15879
|
}
|
|
15650
15880
|
)
|
|
15651
|
-
]
|
|
15652
|
-
|
|
15653
|
-
|
|
15654
|
-
faqs && faqs.length > 0 && (() => {
|
|
15655
|
-
var _a2, _b2, _c2;
|
|
15656
|
-
const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
|
|
15657
|
-
const hiddenCount = faqs.length - visibleFaqs.length;
|
|
15658
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
|
|
15659
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_a2 = labels == null ? void 0 : labels.faq) != null ? _a2 : "FAQ" }),
|
|
15660
|
-
/* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
|
|
15661
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { children: faq.question }),
|
|
15662
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
|
|
15663
|
-
] }, i)) }),
|
|
15664
|
-
faqs.length > faqInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15665
|
-
"button",
|
|
15881
|
+
] }),
|
|
15882
|
+
(howToGetThere || (whatToBring == null ? void 0 : whatToBring.length) || weather || optionalExtras || accommodation || (accommodationGallery == null ? void 0 : accommodationGallery.length) || food || (foodGallery == null ? void 0 : foodGallery.length) || (meetingPoints == null ? void 0 : meetingPoints.length) || meetingPoint || termsAndConditions || whenItOperates) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15883
|
+
Accordion,
|
|
15666
15884
|
{
|
|
15667
|
-
|
|
15668
|
-
|
|
15669
|
-
|
|
15670
|
-
|
|
15671
|
-
|
|
15672
|
-
|
|
15673
|
-
|
|
15674
|
-
|
|
15675
|
-
|
|
15676
|
-
|
|
15677
|
-
|
|
15678
|
-
|
|
15679
|
-
|
|
15680
|
-
|
|
15681
|
-
|
|
15682
|
-
|
|
15683
|
-
|
|
15684
|
-
|
|
15885
|
+
multiple: false,
|
|
15886
|
+
value: accordionValue,
|
|
15887
|
+
onValueChange: setAccordionValue,
|
|
15888
|
+
className: "border-t border-border",
|
|
15889
|
+
children: [
|
|
15890
|
+
whenItOperates && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15891
|
+
AccordionItem,
|
|
15892
|
+
{
|
|
15893
|
+
value: "when-it-operates",
|
|
15894
|
+
id: "trip-section-when-it-operates",
|
|
15895
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15896
|
+
children: [
|
|
15897
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15898
|
+
(sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-5 w-5 text-primary" }),
|
|
15899
|
+
(_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
|
|
15900
|
+
] }) }),
|
|
15901
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-bold [&_a]:text-primary [&_a]:underline", children: whenItOperates }) })
|
|
15902
|
+
]
|
|
15903
|
+
}
|
|
15904
|
+
),
|
|
15905
|
+
(accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15906
|
+
AccordionItem,
|
|
15907
|
+
{
|
|
15908
|
+
value: "accommodation",
|
|
15909
|
+
id: "trip-section-accommodation",
|
|
15910
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15911
|
+
children: [
|
|
15912
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15913
|
+
(sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
|
|
15914
|
+
(_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
|
|
15915
|
+
] }) }),
|
|
15916
|
+
/* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
|
|
15917
|
+
accommodation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }),
|
|
15918
|
+
accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15919
|
+
PhotoGallery,
|
|
15920
|
+
{
|
|
15921
|
+
labels: {
|
|
15922
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15923
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
15924
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
15925
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15926
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
15927
|
+
},
|
|
15928
|
+
photos: accommodationGallery,
|
|
15929
|
+
variant: accommodationGalleryVariant,
|
|
15930
|
+
initialVisible: 6,
|
|
15931
|
+
tourSection: (_h = labels == null ? void 0 : labels.accommodation) != null ? _h : "Accommodation"
|
|
15932
|
+
}
|
|
15933
|
+
) })
|
|
15934
|
+
] })
|
|
15935
|
+
]
|
|
15936
|
+
}
|
|
15937
|
+
),
|
|
15938
|
+
(food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15939
|
+
AccordionItem,
|
|
15940
|
+
{
|
|
15941
|
+
value: "food",
|
|
15942
|
+
id: "trip-section-food",
|
|
15943
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15944
|
+
children: [
|
|
15945
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15946
|
+
(sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UtensilsIcon, { className: "h-5 w-5 text-primary" }),
|
|
15947
|
+
(_i = labels == null ? void 0 : labels.food) != null ? _i : "Food"
|
|
15948
|
+
] }) }),
|
|
15949
|
+
/* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
|
|
15950
|
+
food && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }),
|
|
15951
|
+
foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15952
|
+
PhotoGallery,
|
|
15953
|
+
{
|
|
15954
|
+
labels: {
|
|
15955
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15956
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
15957
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
15958
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15959
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
15960
|
+
},
|
|
15961
|
+
photos: foodGallery,
|
|
15962
|
+
variant: foodGalleryVariant,
|
|
15963
|
+
initialVisible: 6,
|
|
15964
|
+
tourSection: (_j = labels == null ? void 0 : labels.food) != null ? _j : "Food"
|
|
15965
|
+
}
|
|
15966
|
+
) })
|
|
15967
|
+
] })
|
|
15968
|
+
]
|
|
15969
|
+
}
|
|
15970
|
+
),
|
|
15971
|
+
(meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15972
|
+
AccordionItem,
|
|
15973
|
+
{
|
|
15974
|
+
value: "meeting",
|
|
15975
|
+
id: "trip-section-meeting",
|
|
15976
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15977
|
+
children: [
|
|
15978
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15979
|
+
(sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-5 w-5 text-primary" }),
|
|
15980
|
+
(_k = labels == null ? void 0 : labels.meetingPoint) != null ? _k : "Meeting point"
|
|
15981
|
+
] }) }),
|
|
15982
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
|
|
15983
|
+
var _a2, _b2, _c2;
|
|
15984
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
|
|
15985
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
|
|
15986
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15987
|
+
mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? (_a2 = labels == null ? void 0 : labels.meetingPointActivity) != null ? _a2 : "Activity location" : mp.type === "alternative" ? (_b2 = labels == null ? void 0 : labels.meetingPointAlternative) != null ? _b2 : "Alternative meeting point" : (_c2 = labels == null ? void 0 : labels.meetingPoint) != null ? _c2 : "Meeting point" }),
|
|
15988
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
|
|
15989
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
|
|
15990
|
+
] })
|
|
15991
|
+
] }, i);
|
|
15992
|
+
}) }) })
|
|
15993
|
+
]
|
|
15994
|
+
}
|
|
15995
|
+
),
|
|
15996
|
+
howToGetThere && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15997
|
+
AccordionItem,
|
|
15998
|
+
{
|
|
15999
|
+
value: "how-to-get-there",
|
|
16000
|
+
id: "trip-section-how-to-get-there",
|
|
16001
|
+
className: "scroll-mt-20 border-b border-border",
|
|
16002
|
+
children: [
|
|
16003
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
16004
|
+
(sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CompassIcon, { className: "h-5 w-5 text-primary" }),
|
|
16005
|
+
(_l = labels == null ? void 0 : labels.howToGetThere) != null ? _l : "How to get there"
|
|
16006
|
+
] }) }),
|
|
16007
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: howToGetThere }) })
|
|
16008
|
+
]
|
|
16009
|
+
}
|
|
16010
|
+
),
|
|
16011
|
+
weather && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16012
|
+
AccordionItem,
|
|
16013
|
+
{
|
|
16014
|
+
value: "weather",
|
|
16015
|
+
id: "trip-section-weather",
|
|
16016
|
+
className: "scroll-mt-20 border-b border-border",
|
|
16017
|
+
children: [
|
|
16018
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
16019
|
+
(sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-5 w-5 text-primary" }),
|
|
16020
|
+
(_m = labels == null ? void 0 : labels.weather) != null ? _m : "Weather"
|
|
16021
|
+
] }) }),
|
|
16022
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: weather }) })
|
|
16023
|
+
]
|
|
16024
|
+
}
|
|
16025
|
+
),
|
|
16026
|
+
whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16027
|
+
AccordionItem,
|
|
16028
|
+
{
|
|
16029
|
+
value: "what-to-bring",
|
|
16030
|
+
id: "trip-section-what-to-bring",
|
|
16031
|
+
className: "scroll-mt-20 border-b border-border",
|
|
16032
|
+
children: [
|
|
16033
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
16034
|
+
(sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BackpackIcon, { className: "h-5 w-5 text-primary" }),
|
|
16035
|
+
(_n = labels == null ? void 0 : labels.whatToBring) != null ? _n : "What to bring"
|
|
16036
|
+
] }) }),
|
|
16037
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-4 w-4" }) }) })
|
|
16038
|
+
]
|
|
16039
|
+
}
|
|
16040
|
+
),
|
|
16041
|
+
optionalExtras && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16042
|
+
AccordionItem,
|
|
16043
|
+
{
|
|
16044
|
+
value: "optional-extras",
|
|
16045
|
+
id: "trip-section-optional-extras",
|
|
16046
|
+
className: "scroll-mt-20 border-b border-border",
|
|
16047
|
+
children: [
|
|
16048
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
16049
|
+
(sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CherryIcon, { className: "h-5 w-5 text-primary" }),
|
|
16050
|
+
(_o = labels == null ? void 0 : labels.optionalExtras) != null ? _o : "Optional extras"
|
|
16051
|
+
] }) }),
|
|
16052
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: optionalExtras }) })
|
|
16053
|
+
]
|
|
16054
|
+
}
|
|
16055
|
+
),
|
|
16056
|
+
termsAndConditions && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16057
|
+
AccordionItem,
|
|
16058
|
+
{
|
|
16059
|
+
value: "terms",
|
|
16060
|
+
id: "trip-section-terms",
|
|
16061
|
+
className: "scroll-mt-20 border-b border-border",
|
|
16062
|
+
children: [
|
|
16063
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
16064
|
+
(sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ReceiptIcon, { className: "h-5 w-5 text-primary" }),
|
|
16065
|
+
(_p = labels == null ? void 0 : labels.terms) != null ? _p : "Terms & conditions"
|
|
16066
|
+
] }) }),
|
|
16067
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: termsAndConditions }) })
|
|
16068
|
+
]
|
|
16069
|
+
}
|
|
16070
|
+
)
|
|
16071
|
+
]
|
|
15685
16072
|
}
|
|
15686
|
-
)
|
|
15687
|
-
|
|
15688
|
-
|
|
15689
|
-
|
|
15690
|
-
|
|
15691
|
-
|
|
15692
|
-
|
|
15693
|
-
|
|
15694
|
-
|
|
15695
|
-
|
|
15696
|
-
|
|
15697
|
-
|
|
15698
|
-
|
|
15699
|
-
|
|
15700
|
-
|
|
15701
|
-
|
|
15702
|
-
|
|
15703
|
-
|
|
15704
|
-
|
|
15705
|
-
|
|
15706
|
-
|
|
15707
|
-
|
|
15708
|
-
|
|
15709
|
-
|
|
15710
|
-
|
|
16073
|
+
),
|
|
16074
|
+
faqs && faqs.length > 0 && (() => {
|
|
16075
|
+
var _a2, _b2, _c2;
|
|
16076
|
+
const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
|
|
16077
|
+
const hiddenCount = faqs.length - visibleFaqs.length;
|
|
16078
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
|
|
16079
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_a2 = labels == null ? void 0 : labels.faq) != null ? _a2 : "FAQ" }),
|
|
16080
|
+
/* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
|
|
16081
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { children: faq.question }),
|
|
16082
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
|
|
16083
|
+
] }, i)) }),
|
|
16084
|
+
faqs.length > faqInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16085
|
+
"button",
|
|
16086
|
+
{
|
|
16087
|
+
type: "button",
|
|
16088
|
+
onClick: () => setFaqsExpanded((v) => !v),
|
|
16089
|
+
className: cn(
|
|
16090
|
+
"inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
|
|
16091
|
+
"text-sm font-semibold text-foreground shadow-sm",
|
|
16092
|
+
"hover:bg-muted transition-colors duration-150",
|
|
16093
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
16094
|
+
),
|
|
16095
|
+
children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
16096
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
16097
|
+
(_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
|
|
16098
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
16099
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
16100
|
+
(_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
|
|
16101
|
+
" (",
|
|
16102
|
+
hiddenCount,
|
|
16103
|
+
")"
|
|
16104
|
+
] })
|
|
16105
|
+
}
|
|
16106
|
+
) })
|
|
16107
|
+
] });
|
|
16108
|
+
})(),
|
|
16109
|
+
trustpilot ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
|
|
16110
|
+
/* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
|
|
16111
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: (_q = labels == null ? void 0 : labels.reviews) != null ? _q : "What our guests think" }),
|
|
16112
|
+
/* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilot })
|
|
16113
|
+
] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
|
|
16114
|
+
/* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
|
|
16115
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: (_r = labels == null ? void 0 : labels.reviews) != null ? _r : "What our guests think" }),
|
|
16116
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
|
|
16117
|
+
var _a2;
|
|
16118
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
|
|
16119
|
+
/* @__PURE__ */ jsxRuntime.jsx(Stars, { count: (_a2 = r.rating) != null ? _a2 : 5 }),
|
|
16120
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
|
|
16121
|
+
"\u201C",
|
|
16122
|
+
r.text,
|
|
16123
|
+
"\u201D"
|
|
16124
|
+
] }),
|
|
16125
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
|
|
16126
|
+
"\u2014 ",
|
|
16127
|
+
r.author
|
|
16128
|
+
] })
|
|
16129
|
+
] }, i);
|
|
16130
|
+
}) })
|
|
16131
|
+
] })
|
|
16132
|
+
] }),
|
|
16133
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: sidebarPlaceholderRef, className: "hidden lg:block lg:w-72 xl:w-80 shrink-0", children: !isFloating && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sticky top-20 rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16134
|
+
PricingTrip,
|
|
16135
|
+
{
|
|
16136
|
+
priceFrom,
|
|
16137
|
+
currency,
|
|
16138
|
+
season,
|
|
16139
|
+
departureTimes,
|
|
16140
|
+
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
16141
|
+
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
16142
|
+
fromLabel,
|
|
16143
|
+
perPersonLabel,
|
|
16144
|
+
variant: "card",
|
|
16145
|
+
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
16146
|
+
benefits,
|
|
16147
|
+
currencyEstimates,
|
|
16148
|
+
priceInfo
|
|
16149
|
+
}
|
|
16150
|
+
) }) })
|
|
15711
16151
|
] })
|
|
15712
16152
|
] }),
|
|
15713
|
-
|
|
15714
|
-
|
|
16153
|
+
sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
16154
|
+
"div",
|
|
15715
16155
|
{
|
|
15716
|
-
|
|
15717
|
-
|
|
15718
|
-
|
|
15719
|
-
|
|
15720
|
-
|
|
15721
|
-
|
|
15722
|
-
|
|
15723
|
-
|
|
15724
|
-
|
|
15725
|
-
|
|
15726
|
-
|
|
15727
|
-
|
|
15728
|
-
|
|
16156
|
+
ref: navRef,
|
|
16157
|
+
className: cn(
|
|
16158
|
+
"fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
|
|
16159
|
+
navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
|
|
16160
|
+
),
|
|
16161
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16162
|
+
MenuTrip,
|
|
16163
|
+
{
|
|
16164
|
+
sections,
|
|
16165
|
+
activeSection,
|
|
16166
|
+
onSelect: scrollToSection,
|
|
16167
|
+
variant: "floating"
|
|
16168
|
+
}
|
|
16169
|
+
) })
|
|
15729
16170
|
}
|
|
15730
|
-
) }) })
|
|
15731
|
-
] })
|
|
15732
|
-
] }),
|
|
15733
|
-
sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15734
|
-
"div",
|
|
15735
|
-
{
|
|
15736
|
-
ref: navRef,
|
|
15737
|
-
className: cn(
|
|
15738
|
-
"fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
|
|
15739
|
-
navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
|
|
15740
16171
|
),
|
|
15741
|
-
|
|
15742
|
-
|
|
16172
|
+
isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsxRuntime.jsx(
|
|
16173
|
+
"div",
|
|
15743
16174
|
{
|
|
15744
|
-
|
|
15745
|
-
|
|
15746
|
-
|
|
15747
|
-
|
|
16175
|
+
className: "hidden lg:block fixed z-20",
|
|
16176
|
+
style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
|
|
16177
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16178
|
+
PricingTrip,
|
|
16179
|
+
{
|
|
16180
|
+
priceFrom,
|
|
16181
|
+
currency,
|
|
16182
|
+
season,
|
|
16183
|
+
departureTimes,
|
|
16184
|
+
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
16185
|
+
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
16186
|
+
fromLabel,
|
|
16187
|
+
perPersonLabel,
|
|
16188
|
+
variant: "card",
|
|
16189
|
+
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
16190
|
+
benefits,
|
|
16191
|
+
currencyEstimates,
|
|
16192
|
+
priceInfo
|
|
16193
|
+
}
|
|
16194
|
+
) })
|
|
15748
16195
|
}
|
|
15749
|
-
)
|
|
15750
|
-
|
|
15751
|
-
|
|
15752
|
-
|
|
15753
|
-
|
|
15754
|
-
|
|
15755
|
-
|
|
15756
|
-
|
|
15757
|
-
|
|
16196
|
+
),
|
|
16197
|
+
gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16198
|
+
PhotoGallery,
|
|
16199
|
+
{
|
|
16200
|
+
labels: {
|
|
16201
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
16202
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
16203
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
16204
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
16205
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
16206
|
+
},
|
|
16207
|
+
photos: gallery,
|
|
16208
|
+
variant: "gridCompact",
|
|
16209
|
+
initialVisible: 8,
|
|
16210
|
+
lightbox: galleryLightbox,
|
|
16211
|
+
tourSection: (_s = labels == null ? void 0 : labels.gallery) != null ? _s : "Gallery"
|
|
16212
|
+
}
|
|
16213
|
+
) }),
|
|
16214
|
+
gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16215
|
+
BookingForm,
|
|
16216
|
+
{
|
|
16217
|
+
labels: bookingLabels,
|
|
16218
|
+
defaultValues: bookingDefaults,
|
|
16219
|
+
onSubmit: onBookingSubmit,
|
|
16220
|
+
loading: bookingLoading
|
|
16221
|
+
}
|
|
16222
|
+
) }) }),
|
|
16223
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed bottom-0 inset-x-0 z-30 lg:hidden border-t border-border bg-background/95 backdrop-blur-sm px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15758
16224
|
PricingTrip,
|
|
15759
16225
|
{
|
|
15760
16226
|
priceFrom,
|
|
15761
16227
|
currency,
|
|
15762
|
-
season,
|
|
15763
|
-
departureTimes,
|
|
15764
16228
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
15765
|
-
bookLabel: bookLabel != null ? bookLabel : "
|
|
16229
|
+
bookLabel: bookLabel != null ? bookLabel : "Book now",
|
|
15766
16230
|
fromLabel,
|
|
15767
16231
|
perPersonLabel,
|
|
15768
|
-
variant: "
|
|
15769
|
-
|
|
15770
|
-
|
|
15771
|
-
currencyEstimates
|
|
15772
|
-
priceInfo
|
|
16232
|
+
variant: "compact",
|
|
16233
|
+
sharp: true,
|
|
16234
|
+
priceInfo,
|
|
16235
|
+
currencyEstimates
|
|
15773
16236
|
}
|
|
15774
|
-
) })
|
|
15775
|
-
|
|
15776
|
-
|
|
15777
|
-
|
|
15778
|
-
|
|
15779
|
-
|
|
15780
|
-
labels: {
|
|
15781
|
-
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15782
|
-
showLess: labels == null ? void 0 : labels.showLess,
|
|
15783
|
-
close: labels == null ? void 0 : labels.galleryClose,
|
|
15784
|
-
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15785
|
-
next: labels == null ? void 0 : labels.galleryNext
|
|
15786
|
-
},
|
|
15787
|
-
photos: gallery,
|
|
15788
|
-
variant: "gridCompact",
|
|
15789
|
-
initialVisible: 8
|
|
15790
|
-
}
|
|
15791
|
-
) }),
|
|
15792
|
-
gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15793
|
-
BookingForm,
|
|
15794
|
-
{
|
|
15795
|
-
labels: bookingLabels,
|
|
15796
|
-
defaultValues: bookingDefaults,
|
|
15797
|
-
onSubmit: onBookingSubmit,
|
|
15798
|
-
loading: bookingLoading
|
|
15799
|
-
}
|
|
15800
|
-
) }) }),
|
|
15801
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed bottom-0 inset-x-0 z-30 lg:hidden border-t border-border bg-background/95 backdrop-blur-sm px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15802
|
-
PricingTrip,
|
|
15803
|
-
{
|
|
15804
|
-
priceFrom,
|
|
15805
|
-
currency,
|
|
15806
|
-
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
15807
|
-
bookLabel: bookLabel != null ? bookLabel : "Book now",
|
|
15808
|
-
fromLabel,
|
|
15809
|
-
perPersonLabel,
|
|
15810
|
-
variant: "compact",
|
|
15811
|
-
sharp: true,
|
|
15812
|
-
priceInfo,
|
|
15813
|
-
currencyEstimates
|
|
15814
|
-
}
|
|
15815
|
-
) }),
|
|
15816
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" }),
|
|
15817
|
-
/* @__PURE__ */ jsxRuntime.jsx(SiteFooter, {})
|
|
15818
|
-
]
|
|
16237
|
+
) }),
|
|
16238
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" }),
|
|
16239
|
+
/* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { badges: footerBadges })
|
|
16240
|
+
]
|
|
16241
|
+
}
|
|
16242
|
+
)
|
|
15819
16243
|
}
|
|
15820
16244
|
);
|
|
15821
16245
|
}
|
|
@@ -15874,14 +16298,15 @@ function CategoryPage2({
|
|
|
15874
16298
|
viewAllPostsLabel,
|
|
15875
16299
|
cardLabels,
|
|
15876
16300
|
filterLabels,
|
|
16301
|
+
footerBadges,
|
|
15877
16302
|
className
|
|
15878
16303
|
}) {
|
|
15879
16304
|
var _a;
|
|
15880
|
-
const [videoReady, setVideoReady] =
|
|
15881
|
-
const videoRef =
|
|
16305
|
+
const [videoReady, setVideoReady] = React20__namespace.useState(false);
|
|
16306
|
+
const videoRef = React20__namespace.useRef(null);
|
|
15882
16307
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
15883
16308
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
15884
|
-
|
|
16309
|
+
React20__namespace.useEffect(() => {
|
|
15885
16310
|
if (!videoUrl) return;
|
|
15886
16311
|
const el = videoRef.current;
|
|
15887
16312
|
if (!el) return;
|
|
@@ -15896,13 +16321,13 @@ function CategoryPage2({
|
|
|
15896
16321
|
io.observe(el);
|
|
15897
16322
|
return () => io.disconnect();
|
|
15898
16323
|
}, [videoUrl]);
|
|
15899
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
15900
|
-
const [tripsExpanded, setTripsExpanded] =
|
|
15901
|
-
const [filterValue, setFilterValue] =
|
|
15902
|
-
const [sort, setSort] =
|
|
16324
|
+
const [faqsExpanded, setFaqsExpanded] = React20__namespace.useState(false);
|
|
16325
|
+
const [tripsExpanded, setTripsExpanded] = React20__namespace.useState(false);
|
|
16326
|
+
const [filterValue, setFilterValue] = React20__namespace.useState({});
|
|
16327
|
+
const [sort, setSort] = React20__namespace.useState(
|
|
15903
16328
|
defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
|
|
15904
16329
|
);
|
|
15905
|
-
const sortedTrips =
|
|
16330
|
+
const sortedTrips = React20__namespace.useMemo(() => {
|
|
15906
16331
|
const active = Object.entries(filterValue).filter(
|
|
15907
16332
|
([, vals]) => vals && vals.length > 0
|
|
15908
16333
|
);
|
|
@@ -16006,7 +16431,7 @@ function CategoryPage2({
|
|
|
16006
16431
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
16007
16432
|
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
|
|
16008
16433
|
const isLast = i === breadcrumb.length - 1;
|
|
16009
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16434
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
16010
16435
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
16011
16436
|
crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
16012
16437
|
"a",
|
|
@@ -16198,7 +16623,7 @@ function CategoryPage2({
|
|
|
16198
16623
|
) })
|
|
16199
16624
|
] });
|
|
16200
16625
|
})(),
|
|
16201
|
-
/* @__PURE__ */ jsxRuntime.jsx(SiteFooter, {})
|
|
16626
|
+
/* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { badges: footerBadges })
|
|
16202
16627
|
] });
|
|
16203
16628
|
}
|
|
16204
16629
|
var sizeConfig3 = {
|
|
@@ -16303,12 +16728,12 @@ function Toast({
|
|
|
16303
16728
|
duration = 6e3,
|
|
16304
16729
|
className
|
|
16305
16730
|
}) {
|
|
16306
|
-
const [mounted, setMounted] =
|
|
16307
|
-
const [visible, setVisible] =
|
|
16308
|
-
|
|
16731
|
+
const [mounted, setMounted] = React20__namespace.useState(false);
|
|
16732
|
+
const [visible, setVisible] = React20__namespace.useState(true);
|
|
16733
|
+
React20__namespace.useEffect(() => {
|
|
16309
16734
|
setMounted(true);
|
|
16310
16735
|
}, []);
|
|
16311
|
-
|
|
16736
|
+
React20__namespace.useEffect(() => {
|
|
16312
16737
|
if (duration === 0) return;
|
|
16313
16738
|
const t = setTimeout(() => {
|
|
16314
16739
|
setVisible(false);
|
|
@@ -16715,21 +17140,21 @@ function LeadCapturePopup({
|
|
|
16715
17140
|
}) {
|
|
16716
17141
|
var _a;
|
|
16717
17142
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
16718
|
-
const [open, setOpen] =
|
|
16719
|
-
const [closing, setClosing] =
|
|
16720
|
-
const [submitted, setSubmitted] =
|
|
16721
|
-
const [submitting, setSubmitting] =
|
|
16722
|
-
const [error, setError] =
|
|
16723
|
-
const [name, setName] =
|
|
16724
|
-
const [email, setEmail] =
|
|
16725
|
-
const [travelDate, setTravelDate] =
|
|
16726
|
-
const panelRef =
|
|
16727
|
-
const nameRef =
|
|
16728
|
-
const show =
|
|
17143
|
+
const [open, setOpen] = React20.useState(false);
|
|
17144
|
+
const [closing, setClosing] = React20.useState(false);
|
|
17145
|
+
const [submitted, setSubmitted] = React20.useState(false);
|
|
17146
|
+
const [submitting, setSubmitting] = React20.useState(false);
|
|
17147
|
+
const [error, setError] = React20.useState(null);
|
|
17148
|
+
const [name, setName] = React20.useState("");
|
|
17149
|
+
const [email, setEmail] = React20.useState("");
|
|
17150
|
+
const [travelDate, setTravelDate] = React20.useState("");
|
|
17151
|
+
const panelRef = React20.useRef(null);
|
|
17152
|
+
const nameRef = React20.useRef(null);
|
|
17153
|
+
const show = React20.useCallback(() => {
|
|
16729
17154
|
if (isDismissed()) return;
|
|
16730
17155
|
setOpen(true);
|
|
16731
17156
|
}, []);
|
|
16732
|
-
|
|
17157
|
+
React20.useEffect(() => {
|
|
16733
17158
|
var _a2;
|
|
16734
17159
|
if (isDismissed()) return;
|
|
16735
17160
|
if (config.trigger === "delay") {
|
|
@@ -16756,7 +17181,7 @@ function LeadCapturePopup({
|
|
|
16756
17181
|
return () => window.removeEventListener("scroll", handler);
|
|
16757
17182
|
}
|
|
16758
17183
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
16759
|
-
|
|
17184
|
+
React20.useEffect(() => {
|
|
16760
17185
|
if (open && !submitted) {
|
|
16761
17186
|
requestAnimationFrame(() => {
|
|
16762
17187
|
var _a2;
|
|
@@ -16764,7 +17189,7 @@ function LeadCapturePopup({
|
|
|
16764
17189
|
});
|
|
16765
17190
|
}
|
|
16766
17191
|
}, [open, submitted]);
|
|
16767
|
-
const close =
|
|
17192
|
+
const close = React20.useCallback(() => {
|
|
16768
17193
|
setClosing(true);
|
|
16769
17194
|
setDismissed(config.dismissDays);
|
|
16770
17195
|
setTimeout(() => {
|
|
@@ -16772,7 +17197,7 @@ function LeadCapturePopup({
|
|
|
16772
17197
|
setClosing(false);
|
|
16773
17198
|
}, 250);
|
|
16774
17199
|
}, [config.dismissDays]);
|
|
16775
|
-
|
|
17200
|
+
React20.useEffect(() => {
|
|
16776
17201
|
if (!open) return;
|
|
16777
17202
|
const handler = (e) => {
|
|
16778
17203
|
if (e.key === "Escape") close();
|
|
@@ -16780,7 +17205,7 @@ function LeadCapturePopup({
|
|
|
16780
17205
|
document.addEventListener("keydown", handler);
|
|
16781
17206
|
return () => document.removeEventListener("keydown", handler);
|
|
16782
17207
|
}, [open, close]);
|
|
16783
|
-
const onOverlayClick =
|
|
17208
|
+
const onOverlayClick = React20.useCallback(
|
|
16784
17209
|
(e) => {
|
|
16785
17210
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
16786
17211
|
close();
|
|
@@ -17018,11 +17443,11 @@ function ExoOrb({
|
|
|
17018
17443
|
trackCursor = true,
|
|
17019
17444
|
className
|
|
17020
17445
|
}) {
|
|
17021
|
-
const uid =
|
|
17446
|
+
const uid = React20.useId().replace(/:/g, "");
|
|
17022
17447
|
const id = (name) => `exo-orb-${uid}-${name}`;
|
|
17023
|
-
const rootRef =
|
|
17024
|
-
const pupilRef =
|
|
17025
|
-
|
|
17448
|
+
const rootRef = React20.useRef(null);
|
|
17449
|
+
const pupilRef = React20.useRef(null);
|
|
17450
|
+
React20.useEffect(() => {
|
|
17026
17451
|
if (!trackCursor) return;
|
|
17027
17452
|
if (typeof window === "undefined") return;
|
|
17028
17453
|
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
@@ -17218,13 +17643,13 @@ function AskExo({
|
|
|
17218
17643
|
teaserDelayMs = 2500,
|
|
17219
17644
|
teaserDurationMs = 6e3
|
|
17220
17645
|
}) {
|
|
17221
|
-
const [open, setOpen] =
|
|
17222
|
-
const [question, setQuestion] =
|
|
17223
|
-
const [teaserVisible, setTeaserVisible] =
|
|
17646
|
+
const [open, setOpen] = React20.useState(false);
|
|
17647
|
+
const [question, setQuestion] = React20.useState("");
|
|
17648
|
+
const [teaserVisible, setTeaserVisible] = React20.useState(false);
|
|
17224
17649
|
const teaserEnabled = !!teaser && teaser !== "";
|
|
17225
|
-
const inputRef =
|
|
17226
|
-
const textareaRef =
|
|
17227
|
-
|
|
17650
|
+
const inputRef = React20.useRef(null);
|
|
17651
|
+
const textareaRef = React20.useRef(null);
|
|
17652
|
+
React20.useEffect(() => {
|
|
17228
17653
|
if (!open) {
|
|
17229
17654
|
setQuestion("");
|
|
17230
17655
|
return;
|
|
@@ -17236,7 +17661,7 @@ function AskExo({
|
|
|
17236
17661
|
}, 200);
|
|
17237
17662
|
return () => clearTimeout(t);
|
|
17238
17663
|
}, [open, variant]);
|
|
17239
|
-
|
|
17664
|
+
React20.useEffect(() => {
|
|
17240
17665
|
if (!open) return;
|
|
17241
17666
|
const onKey = (e) => {
|
|
17242
17667
|
if (e.key === "Escape") setOpen(false);
|
|
@@ -17244,7 +17669,7 @@ function AskExo({
|
|
|
17244
17669
|
document.addEventListener("keydown", onKey);
|
|
17245
17670
|
return () => document.removeEventListener("keydown", onKey);
|
|
17246
17671
|
}, [open]);
|
|
17247
|
-
|
|
17672
|
+
React20.useEffect(() => {
|
|
17248
17673
|
if (!teaserEnabled || open) return;
|
|
17249
17674
|
if (typeof window === "undefined") return;
|
|
17250
17675
|
const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
|
|
@@ -17257,7 +17682,7 @@ function AskExo({
|
|
|
17257
17682
|
clearTimeout(hideTimer);
|
|
17258
17683
|
};
|
|
17259
17684
|
}, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
|
|
17260
|
-
|
|
17685
|
+
React20.useEffect(() => {
|
|
17261
17686
|
if (open) setTeaserVisible(false);
|
|
17262
17687
|
}, [open]);
|
|
17263
17688
|
const askExo = (q) => {
|
|
@@ -17810,8 +18235,8 @@ function ShareWidget({
|
|
|
17810
18235
|
title = "Invite friends & lower the price",
|
|
17811
18236
|
className
|
|
17812
18237
|
}) {
|
|
17813
|
-
const [copied, setCopied] =
|
|
17814
|
-
const [showToast, setShowToast] =
|
|
18238
|
+
const [copied, setCopied] = React20__namespace.useState(false);
|
|
18239
|
+
const [showToast, setShowToast] = React20__namespace.useState(false);
|
|
17815
18240
|
const encodedUrl = encodeURIComponent(url);
|
|
17816
18241
|
const encodedMsg = encodeURIComponent(`${message} ${url}`);
|
|
17817
18242
|
const channels = [
|
|
@@ -18028,11 +18453,11 @@ function HomeHeader({
|
|
|
18028
18453
|
className
|
|
18029
18454
|
}) {
|
|
18030
18455
|
var _a;
|
|
18031
|
-
const [heroIndex, setHeroIndex] =
|
|
18032
|
-
const [videoReady, setVideoReady] =
|
|
18033
|
-
const videoRef =
|
|
18456
|
+
const [heroIndex, setHeroIndex] = React20__namespace.useState(0);
|
|
18457
|
+
const [videoReady, setVideoReady] = React20__namespace.useState(false);
|
|
18458
|
+
const videoRef = React20__namespace.useRef(null);
|
|
18034
18459
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
18035
|
-
const validImages =
|
|
18460
|
+
const validImages = React20__namespace.useMemo(
|
|
18036
18461
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
18037
18462
|
[images]
|
|
18038
18463
|
);
|
|
@@ -18046,7 +18471,7 @@ function HomeHeader({
|
|
|
18046
18471
|
const showCarousel = !videoUrl && validImages.length > 1;
|
|
18047
18472
|
const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
|
|
18048
18473
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
18049
|
-
|
|
18474
|
+
React20__namespace.useEffect(() => {
|
|
18050
18475
|
if (!videoUrl) return;
|
|
18051
18476
|
const el = videoRef.current;
|
|
18052
18477
|
if (!el) return;
|
|
@@ -18404,7 +18829,7 @@ function AdventureExplorer({
|
|
|
18404
18829
|
className
|
|
18405
18830
|
}) {
|
|
18406
18831
|
var _a, _b, _c, _d, _e;
|
|
18407
|
-
const [activeId, setActiveId] =
|
|
18832
|
+
const [activeId, setActiveId] = React20__namespace.useState(
|
|
18408
18833
|
defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
|
|
18409
18834
|
);
|
|
18410
18835
|
const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
|
|
@@ -18744,8 +19169,8 @@ function RotatingSubtitle({
|
|
|
18744
19169
|
interval,
|
|
18745
19170
|
className
|
|
18746
19171
|
}) {
|
|
18747
|
-
const [index, setIndex] =
|
|
18748
|
-
|
|
19172
|
+
const [index, setIndex] = React20__namespace.useState(0);
|
|
19173
|
+
React20__namespace.useEffect(() => {
|
|
18749
19174
|
var _a;
|
|
18750
19175
|
if (phrases.length < 2) return;
|
|
18751
19176
|
const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
|
|
@@ -18784,7 +19209,7 @@ function CtaBanner({
|
|
|
18784
19209
|
overlayOpacity = 35,
|
|
18785
19210
|
className
|
|
18786
19211
|
}) {
|
|
18787
|
-
const phrases =
|
|
19212
|
+
const phrases = React20__namespace.useMemo(
|
|
18788
19213
|
() => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
|
|
18789
19214
|
[subtitle]
|
|
18790
19215
|
);
|
|
@@ -19065,7 +19490,7 @@ function SectionHead({
|
|
|
19065
19490
|
}
|
|
19066
19491
|
function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
|
|
19067
19492
|
var _a;
|
|
19068
|
-
const railRef =
|
|
19493
|
+
const railRef = React20__namespace.useRef(null);
|
|
19069
19494
|
const scrollByCard = (dir) => {
|
|
19070
19495
|
const rail = railRef.current;
|
|
19071
19496
|
if (!rail) return;
|
|
@@ -19273,7 +19698,7 @@ function SegmentedControl({
|
|
|
19273
19698
|
}) {
|
|
19274
19699
|
var _a;
|
|
19275
19700
|
const isControlled = value != null;
|
|
19276
|
-
const [internal, setInternal] =
|
|
19701
|
+
const [internal, setInternal] = React20__namespace.useState(
|
|
19277
19702
|
defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
|
|
19278
19703
|
);
|
|
19279
19704
|
const active = isControlled ? value : internal;
|
|
@@ -19432,6 +19857,7 @@ exports.PaymentReceiptEmail = PaymentReceiptEmail;
|
|
|
19432
19857
|
exports.PaymentReminderEmail = PaymentReminderEmail;
|
|
19433
19858
|
exports.PhoneCountrySelect = PhoneCountrySelect;
|
|
19434
19859
|
exports.PhotoGallery = PhotoGallery;
|
|
19860
|
+
exports.PhotoTourProvider = PhotoTourProvider;
|
|
19435
19861
|
exports.Picture = Picture;
|
|
19436
19862
|
exports.PriceProgress = PriceProgress;
|
|
19437
19863
|
exports.PricingMatrixCard = PricingMatrixCard;
|