@planetaexo/design-system 0.69.0 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1076 -696
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +177 -95
- package/dist/index.d.ts +177 -95
- package/dist/index.js +1051 -672
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.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;
|
|
@@ -1503,7 +1503,7 @@ function AdventureCard({
|
|
|
1503
1503
|
] }),
|
|
1504
1504
|
adventure.rooms && adventure.rooms.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-5 mt-1", children: adventure.rooms.map((room, i) => {
|
|
1505
1505
|
var _a2, _b2;
|
|
1506
|
-
const bedLabel = (_b2 = (_a2 = adventure.bedArrangementLabels) == null ? void 0 : _a2[room.bedArrangement]) != null ? _b2 : room.bedArrangement === "DOUBLE" ? "Double" : room.bedArrangement === "TWIN" ? "Twin" : room.bedArrangement === "SINGLE" ? "Single" : "Triple";
|
|
1506
|
+
const bedLabel = (_b2 = (_a2 = adventure.bedArrangementLabels) == null ? void 0 : _a2[room.bedArrangement]) != null ? _b2 : room.bedArrangement === "DOUBLE" ? "Double" : room.bedArrangement === "TWIN" ? "Twin" : room.bedArrangement === "SINGLE" ? "Single" : room.bedArrangement === "TRIPLE" ? "Triple" : room.bedArrangement === "QUADRUPLE" ? "Quadruple" : "Quintuple";
|
|
1507
1507
|
const heading = adventure.accommodationRoomHeading ? adventure.accommodationRoomHeading(room.accommodationName) : `Accommodation: ${room.accommodationName}`;
|
|
1508
1508
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
1509
1509
|
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-lg font-semibold text-foreground font-heading", children: heading }),
|
|
@@ -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;
|
|
@@ -4148,7 +4148,9 @@ var DEFAULT_LABELS = {
|
|
|
4148
4148
|
DOUBLE: "Double",
|
|
4149
4149
|
TWIN: "Twin",
|
|
4150
4150
|
SINGLE: "Single",
|
|
4151
|
-
TRIPLE: "Triple"
|
|
4151
|
+
TRIPLE: "Triple",
|
|
4152
|
+
QUADRUPLE: "Quadruple",
|
|
4153
|
+
QUINTUPLE: "Quintuple"
|
|
4152
4154
|
}
|
|
4153
4155
|
};
|
|
4154
4156
|
function BookingAdventureCard({
|
|
@@ -4175,7 +4177,7 @@ function BookingAdventureCard({
|
|
|
4175
4177
|
labels,
|
|
4176
4178
|
className
|
|
4177
4179
|
}) {
|
|
4178
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
|
|
4180
|
+
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;
|
|
4179
4181
|
const l = {
|
|
4180
4182
|
travellersHeading: (_a = labels == null ? void 0 : labels.travellersHeading) != null ? _a : DEFAULT_LABELS.travellersHeading,
|
|
4181
4183
|
detailsHeading: (_b = labels == null ? void 0 : labels.detailsHeading) != null ? _b : DEFAULT_LABELS.detailsHeading,
|
|
@@ -4195,7 +4197,9 @@ function BookingAdventureCard({
|
|
|
4195
4197
|
DOUBLE: (_p = (_o = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _o.DOUBLE) != null ? _p : DEFAULT_LABELS.bedArrangementLabels.DOUBLE,
|
|
4196
4198
|
TWIN: (_r = (_q = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _q.TWIN) != null ? _r : DEFAULT_LABELS.bedArrangementLabels.TWIN,
|
|
4197
4199
|
SINGLE: (_t = (_s = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _s.SINGLE) != null ? _t : DEFAULT_LABELS.bedArrangementLabels.SINGLE,
|
|
4198
|
-
TRIPLE: (_v = (_u = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _u.TRIPLE) != null ? _v : DEFAULT_LABELS.bedArrangementLabels.TRIPLE
|
|
4200
|
+
TRIPLE: (_v = (_u = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _u.TRIPLE) != null ? _v : DEFAULT_LABELS.bedArrangementLabels.TRIPLE,
|
|
4201
|
+
QUADRUPLE: (_x = (_w = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _w.QUADRUPLE) != null ? _x : DEFAULT_LABELS.bedArrangementLabels.QUADRUPLE,
|
|
4202
|
+
QUINTUPLE: (_z = (_y = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _y.QUINTUPLE) != null ? _z : DEFAULT_LABELS.bedArrangementLabels.QUINTUPLE
|
|
4199
4203
|
}
|
|
4200
4204
|
};
|
|
4201
4205
|
const hasTravellers = !!travellers && travellers.length > 0;
|
|
@@ -5007,16 +5011,20 @@ var DEFAULT_BED_LABELS = {
|
|
|
5007
5011
|
DOUBLE: "Double",
|
|
5008
5012
|
TWIN: "Twin",
|
|
5009
5013
|
SINGLE: "Single",
|
|
5010
|
-
TRIPLE: "Triple"
|
|
5014
|
+
TRIPLE: "Triple",
|
|
5015
|
+
QUADRUPLE: "Quadruple",
|
|
5016
|
+
QUINTUPLE: "Quintuple"
|
|
5011
5017
|
};
|
|
5012
5018
|
function BookingSummary({ heading, rows, rooms, roomsHeading, bedArrangementLabels, footer, className }) {
|
|
5013
|
-
var _a, _b, _c, _d, _e, _f;
|
|
5019
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
5014
5020
|
const hasRooms = !!rooms && rooms.length > 0;
|
|
5015
5021
|
const bedLabels = {
|
|
5016
5022
|
DOUBLE: (_a = bedArrangementLabels == null ? void 0 : bedArrangementLabels.DOUBLE) != null ? _a : DEFAULT_BED_LABELS.DOUBLE,
|
|
5017
5023
|
TWIN: (_b = bedArrangementLabels == null ? void 0 : bedArrangementLabels.TWIN) != null ? _b : DEFAULT_BED_LABELS.TWIN,
|
|
5018
5024
|
SINGLE: (_c = bedArrangementLabels == null ? void 0 : bedArrangementLabels.SINGLE) != null ? _c : DEFAULT_BED_LABELS.SINGLE,
|
|
5019
|
-
TRIPLE: (_d = bedArrangementLabels == null ? void 0 : bedArrangementLabels.TRIPLE) != null ? _d : DEFAULT_BED_LABELS.TRIPLE
|
|
5025
|
+
TRIPLE: (_d = bedArrangementLabels == null ? void 0 : bedArrangementLabels.TRIPLE) != null ? _d : DEFAULT_BED_LABELS.TRIPLE,
|
|
5026
|
+
QUADRUPLE: (_e = bedArrangementLabels == null ? void 0 : bedArrangementLabels.QUADRUPLE) != null ? _e : DEFAULT_BED_LABELS.QUADRUPLE,
|
|
5027
|
+
QUINTUPLE: (_f = bedArrangementLabels == null ? void 0 : bedArrangementLabels.QUINTUPLE) != null ? _f : DEFAULT_BED_LABELS.QUINTUPLE
|
|
5020
5028
|
};
|
|
5021
5029
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, style: { marginBottom: "24px" }, children: [
|
|
5022
5030
|
heading && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -5141,8 +5149,8 @@ function BookingSummary({ heading, rows, rooms, roomsHeading, bedArrangementLabe
|
|
|
5141
5149
|
style: {
|
|
5142
5150
|
padding: "12px 20px",
|
|
5143
5151
|
textAlign: "center",
|
|
5144
|
-
fontWeight: (
|
|
5145
|
-
color: (
|
|
5152
|
+
fontWeight: (_g = footer.fontWeight) != null ? _g : 600,
|
|
5153
|
+
color: (_h = footer.color) != null ? _h : emailTokens.foreground,
|
|
5146
5154
|
backgroundColor: footer.backgroundColor
|
|
5147
5155
|
},
|
|
5148
5156
|
children: footer.text
|
|
@@ -5284,7 +5292,9 @@ var DEFAULT_LABELS3 = {
|
|
|
5284
5292
|
DOUBLE: "Double",
|
|
5285
5293
|
TWIN: "Twin",
|
|
5286
5294
|
SINGLE: "Single",
|
|
5287
|
-
TRIPLE: "Triple"
|
|
5295
|
+
TRIPLE: "Triple",
|
|
5296
|
+
QUADRUPLE: "Quadruple",
|
|
5297
|
+
QUINTUPLE: "Quintuple"
|
|
5288
5298
|
},
|
|
5289
5299
|
paymentSummaryHeading: "\u{1F4B0} Payment Summary",
|
|
5290
5300
|
paymentDetailsHeading: "Payment Details",
|
|
@@ -5680,7 +5690,7 @@ function BookingCreatedEmail({
|
|
|
5680
5690
|
}, children: i + 1 }) }),
|
|
5681
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 }) })
|
|
5682
5692
|
] }) }) }, i)) }),
|
|
5683
|
-
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: [
|
|
5684
5694
|
idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
|
|
5685
5695
|
idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
|
|
5686
5696
|
] }, idx)) })
|
|
@@ -7245,7 +7255,9 @@ var DEFAULT_LABELS11 = {
|
|
|
7245
7255
|
DOUBLE: "Double",
|
|
7246
7256
|
TWIN: "Twin",
|
|
7247
7257
|
SINGLE: "Single",
|
|
7248
|
-
TRIPLE: "Triple"
|
|
7258
|
+
TRIPLE: "Triple",
|
|
7259
|
+
QUADRUPLE: "Quadruple",
|
|
7260
|
+
QUINTUPLE: "Quintuple"
|
|
7249
7261
|
},
|
|
7250
7262
|
registrationPendingNotice: "The travellers' registration details will be sent to you as soon as all travellers have completed their forms.",
|
|
7251
7263
|
mustReplyToConfirm: "Please reply to this email to confirm the booking.",
|
|
@@ -8461,11 +8473,11 @@ function DatePickerField({
|
|
|
8461
8473
|
className,
|
|
8462
8474
|
error
|
|
8463
8475
|
}) {
|
|
8464
|
-
const [open, setOpen] =
|
|
8465
|
-
const containerRef =
|
|
8466
|
-
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();
|
|
8467
8479
|
const hasValue = !!value;
|
|
8468
|
-
|
|
8480
|
+
React20__namespace.useEffect(() => {
|
|
8469
8481
|
if (!containerRef.current) return;
|
|
8470
8482
|
const observer = new ResizeObserver(([entry]) => {
|
|
8471
8483
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -8594,15 +8606,15 @@ function BookingForm({
|
|
|
8594
8606
|
const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
|
|
8595
8607
|
const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
|
|
8596
8608
|
const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
|
|
8597
|
-
const [values, setValues] =
|
|
8598
|
-
const [errors, setErrors] =
|
|
8609
|
+
const [values, setValues] = React20__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
8610
|
+
const [errors, setErrors] = React20__namespace.useState({});
|
|
8599
8611
|
const set = (key, value) => {
|
|
8600
8612
|
setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
8601
8613
|
setErrors(
|
|
8602
8614
|
(prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
|
|
8603
8615
|
);
|
|
8604
8616
|
};
|
|
8605
|
-
|
|
8617
|
+
React20__namespace.useEffect(() => {
|
|
8606
8618
|
if (!defaultValues) return;
|
|
8607
8619
|
setValues((prev) => {
|
|
8608
8620
|
let changed = false;
|
|
@@ -9241,11 +9253,11 @@ function FloatingTextarea({
|
|
|
9241
9253
|
}
|
|
9242
9254
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
9243
9255
|
var _a, _b, _c;
|
|
9244
|
-
const [open, setOpen] =
|
|
9245
|
-
const containerRef =
|
|
9256
|
+
const [open, setOpen] = React20__namespace.useState(false);
|
|
9257
|
+
const containerRef = React20__namespace.useRef(null);
|
|
9246
9258
|
const options = (_a = field.options) != null ? _a : [];
|
|
9247
9259
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
9248
|
-
|
|
9260
|
+
React20__namespace.useEffect(() => {
|
|
9249
9261
|
if (!open) return;
|
|
9250
9262
|
const handleOutside = (e) => {
|
|
9251
9263
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -9713,11 +9725,11 @@ function RegistrationForm({
|
|
|
9713
9725
|
readOnly = false
|
|
9714
9726
|
}) {
|
|
9715
9727
|
var _a;
|
|
9716
|
-
const L =
|
|
9728
|
+
const L = React20__namespace.useMemo(
|
|
9717
9729
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS14), labels != null ? labels : {}),
|
|
9718
9730
|
[labels]
|
|
9719
9731
|
);
|
|
9720
|
-
const sortedFields =
|
|
9732
|
+
const sortedFields = React20__namespace.useMemo(
|
|
9721
9733
|
() => [...fields].sort((a, b) => {
|
|
9722
9734
|
var _a2, _b;
|
|
9723
9735
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -9725,7 +9737,7 @@ function RegistrationForm({
|
|
|
9725
9737
|
[fields]
|
|
9726
9738
|
);
|
|
9727
9739
|
const isControlled = values !== void 0;
|
|
9728
|
-
const [internal, setInternal] =
|
|
9740
|
+
const [internal, setInternal] = React20__namespace.useState(
|
|
9729
9741
|
() => initializeValues(
|
|
9730
9742
|
sortedFields,
|
|
9731
9743
|
defaultValues != null ? defaultValues : {},
|
|
@@ -9733,9 +9745,9 @@ function RegistrationForm({
|
|
|
9733
9745
|
includeTerms
|
|
9734
9746
|
)
|
|
9735
9747
|
);
|
|
9736
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
9737
|
-
const [validationErrors, setValidationErrors] =
|
|
9738
|
-
|
|
9748
|
+
const [submitAttempted, setSubmitAttempted] = React20__namespace.useState(false);
|
|
9749
|
+
const [validationErrors, setValidationErrors] = React20__namespace.useState({});
|
|
9750
|
+
React20__namespace.useEffect(() => {
|
|
9739
9751
|
if (isControlled) return;
|
|
9740
9752
|
setInternal((prev) => {
|
|
9741
9753
|
const next = initializeValues(
|
|
@@ -9792,7 +9804,7 @@ function RegistrationForm({
|
|
|
9792
9804
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
9793
9805
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
9794
9806
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
9795
|
-
|
|
9807
|
+
React20__namespace.useEffect(() => {
|
|
9796
9808
|
if (!submitAttempted || !scrollTargetId) return;
|
|
9797
9809
|
const timer = setTimeout(() => {
|
|
9798
9810
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -10263,18 +10275,18 @@ function CancellationForm({
|
|
|
10263
10275
|
className
|
|
10264
10276
|
}) {
|
|
10265
10277
|
var _a, _b, _c;
|
|
10266
|
-
const [selectedAdventureIds, setSelectedAdventureIds] =
|
|
10267
|
-
const [participantsByAdventure, setParticipantsByAdventure] =
|
|
10268
|
-
const [reasonCode, setReasonCode] =
|
|
10269
|
-
const [reasonOther, setReasonOther] =
|
|
10270
|
-
const [refundPreference, setRefundPreference] =
|
|
10271
|
-
const [refundOther, setRefundOther] =
|
|
10272
|
-
const [agreedToPolicy, setAgreedToPolicy] =
|
|
10273
|
-
const [contactName, setContactName] =
|
|
10274
|
-
const [contactEmail, setContactEmail] =
|
|
10275
|
-
const [contactPhone, setContactPhone] =
|
|
10276
|
-
const [errors, setErrors] =
|
|
10277
|
-
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(
|
|
10278
10290
|
(advId) => {
|
|
10279
10291
|
var _a2, _b2;
|
|
10280
10292
|
return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
|
|
@@ -10531,10 +10543,10 @@ var OTPCodeInput = ({
|
|
|
10531
10543
|
id,
|
|
10532
10544
|
required
|
|
10533
10545
|
}) => {
|
|
10534
|
-
const baseId = id != null ? id :
|
|
10535
|
-
const inputRef =
|
|
10536
|
-
const [focused, setFocused] =
|
|
10537
|
-
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(() => {
|
|
10538
10550
|
const arr = value.split("").slice(0, length);
|
|
10539
10551
|
while (arr.length < length) arr.push("");
|
|
10540
10552
|
return arr;
|
|
@@ -10647,7 +10659,7 @@ function Checkbox(_a) {
|
|
|
10647
10659
|
})
|
|
10648
10660
|
);
|
|
10649
10661
|
}
|
|
10650
|
-
var AccordionVariantContext =
|
|
10662
|
+
var AccordionVariantContext = React20__namespace.createContext("default");
|
|
10651
10663
|
function Accordion(_a) {
|
|
10652
10664
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
10653
10665
|
return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10665,7 +10677,7 @@ function Accordion(_a) {
|
|
|
10665
10677
|
}
|
|
10666
10678
|
function AccordionItem(_a) {
|
|
10667
10679
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
10668
|
-
const variant =
|
|
10680
|
+
const variant = React20__namespace.useContext(AccordionVariantContext);
|
|
10669
10681
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10670
10682
|
accordion.Accordion.Item,
|
|
10671
10683
|
__spreadValues({
|
|
@@ -10688,7 +10700,7 @@ function AccordionTrigger(_a) {
|
|
|
10688
10700
|
"children",
|
|
10689
10701
|
"headingLevel"
|
|
10690
10702
|
]);
|
|
10691
|
-
const variant =
|
|
10703
|
+
const variant = React20__namespace.useContext(AccordionVariantContext);
|
|
10692
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;
|
|
10693
10705
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10694
10706
|
accordion.Accordion.Header,
|
|
@@ -10750,7 +10762,7 @@ function AccordionContent(_a) {
|
|
|
10750
10762
|
"className",
|
|
10751
10763
|
"children"
|
|
10752
10764
|
]);
|
|
10753
|
-
const variant =
|
|
10765
|
+
const variant = React20__namespace.useContext(AccordionVariantContext);
|
|
10754
10766
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10755
10767
|
accordion.Accordion.Panel,
|
|
10756
10768
|
__spreadProps(__spreadValues({
|
|
@@ -10969,15 +10981,15 @@ function FilterPanel({
|
|
|
10969
10981
|
labels
|
|
10970
10982
|
}) {
|
|
10971
10983
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
10972
|
-
const resolvedGroups =
|
|
10973
|
-
const [internalValue, setInternalValue] =
|
|
10984
|
+
const resolvedGroups = React20__namespace.useMemo(() => resolveGroups(groups), [groups]);
|
|
10985
|
+
const [internalValue, setInternalValue] = React20__namespace.useState(
|
|
10974
10986
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
10975
10987
|
);
|
|
10976
10988
|
const selected = value != null ? value : internalValue;
|
|
10977
|
-
const [expandedItems, setExpandedItems] =
|
|
10989
|
+
const [expandedItems, setExpandedItems] = React20__namespace.useState(
|
|
10978
10990
|
() => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
|
|
10979
10991
|
);
|
|
10980
|
-
const toggleExpanded =
|
|
10992
|
+
const toggleExpanded = React20__namespace.useCallback((id) => {
|
|
10981
10993
|
setExpandedItems((prev) => {
|
|
10982
10994
|
const next = new Set(prev);
|
|
10983
10995
|
if (next.has(id)) next.delete(id);
|
|
@@ -11361,11 +11373,11 @@ function FilterPanel({
|
|
|
11361
11373
|
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
11362
11374
|
function TrustpilotEmbed({ config }) {
|
|
11363
11375
|
var _a, _b, _c, _d, _e, _f;
|
|
11364
|
-
const ref =
|
|
11365
|
-
const [widgetReady, setWidgetReady] =
|
|
11366
|
-
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);
|
|
11367
11379
|
const showFallback = delayPassed && !widgetReady;
|
|
11368
|
-
|
|
11380
|
+
React20__namespace.useEffect(() => {
|
|
11369
11381
|
var _a2;
|
|
11370
11382
|
if (typeof document === "undefined" || !ref.current) return;
|
|
11371
11383
|
const node = ref.current;
|
|
@@ -11553,7 +11565,7 @@ function webpVariantUrl(src) {
|
|
|
11553
11565
|
return `${withoutQuery}.webp${query}`;
|
|
11554
11566
|
}
|
|
11555
11567
|
function PictureLoader() {
|
|
11556
|
-
const gradientId =
|
|
11568
|
+
const gradientId = React20__namespace.useId();
|
|
11557
11569
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11558
11570
|
"span",
|
|
11559
11571
|
{
|
|
@@ -11623,10 +11635,10 @@ function Picture(_a) {
|
|
|
11623
11635
|
"onError"
|
|
11624
11636
|
]);
|
|
11625
11637
|
var _a2, _b2;
|
|
11626
|
-
const ref =
|
|
11627
|
-
const [visible, setVisible] =
|
|
11628
|
-
const [loaded, setLoaded] =
|
|
11629
|
-
|
|
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(() => {
|
|
11630
11642
|
if (eager || visible) return;
|
|
11631
11643
|
const el = ref.current;
|
|
11632
11644
|
if (!el || typeof IntersectionObserver === "undefined") {
|
|
@@ -11645,7 +11657,7 @@ function Picture(_a) {
|
|
|
11645
11657
|
io.observe(el);
|
|
11646
11658
|
return () => io.disconnect();
|
|
11647
11659
|
}, [eager, visible, rootMargin]);
|
|
11648
|
-
|
|
11660
|
+
React20__namespace.useEffect(() => {
|
|
11649
11661
|
setLoaded(false);
|
|
11650
11662
|
}, [src]);
|
|
11651
11663
|
const webp = webpVariantUrl(src);
|
|
@@ -11776,11 +11788,11 @@ function ItineraryModal({
|
|
|
11776
11788
|
onNext
|
|
11777
11789
|
}) {
|
|
11778
11790
|
var _a, _b, _c;
|
|
11779
|
-
const [imgIndex, setImgIndex] =
|
|
11791
|
+
const [imgIndex, setImgIndex] = React20__namespace.useState(0);
|
|
11780
11792
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
11781
11793
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
11782
11794
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
11783
|
-
|
|
11795
|
+
React20__namespace.useEffect(() => {
|
|
11784
11796
|
setImgIndex(0);
|
|
11785
11797
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
11786
11798
|
if (!stop) return null;
|
|
@@ -11907,8 +11919,8 @@ function ItineraryModal({
|
|
|
11907
11919
|
) });
|
|
11908
11920
|
}
|
|
11909
11921
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
11910
|
-
const [activeIndex, setActiveIndex] =
|
|
11911
|
-
const scrollRef =
|
|
11922
|
+
const [activeIndex, setActiveIndex] = React20__namespace.useState(null);
|
|
11923
|
+
const scrollRef = React20__namespace.useRef(null);
|
|
11912
11924
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
11913
11925
|
const scrollBy = (dir) => {
|
|
11914
11926
|
if (!scrollRef.current) return;
|
|
@@ -12001,18 +12013,18 @@ function Lightbox({
|
|
|
12001
12013
|
labels
|
|
12002
12014
|
}) {
|
|
12003
12015
|
var _a, _b, _c, _d;
|
|
12004
|
-
const [index, setIndex] =
|
|
12016
|
+
const [index, setIndex] = React20__namespace.useState(initialIndex);
|
|
12005
12017
|
const total = photos.length;
|
|
12006
12018
|
const photo = photos[index];
|
|
12007
|
-
const prev =
|
|
12019
|
+
const prev = React20__namespace.useCallback(
|
|
12008
12020
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
12009
12021
|
[total]
|
|
12010
12022
|
);
|
|
12011
|
-
const next =
|
|
12023
|
+
const next = React20__namespace.useCallback(
|
|
12012
12024
|
() => setIndex((i) => (i + 1) % total),
|
|
12013
12025
|
[total]
|
|
12014
12026
|
);
|
|
12015
|
-
|
|
12027
|
+
React20__namespace.useEffect(() => {
|
|
12016
12028
|
const onKey = (e) => {
|
|
12017
12029
|
if (e.key === "Escape") onClose();
|
|
12018
12030
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -12114,6 +12126,260 @@ function Lightbox({
|
|
|
12114
12126
|
}
|
|
12115
12127
|
);
|
|
12116
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
|
+
}
|
|
12117
12383
|
function PhotoTile({
|
|
12118
12384
|
photo,
|
|
12119
12385
|
index,
|
|
@@ -12186,7 +12452,7 @@ function GridGallery({
|
|
|
12186
12452
|
onOpen,
|
|
12187
12453
|
labels
|
|
12188
12454
|
}) {
|
|
12189
|
-
const [expanded, setExpanded] =
|
|
12455
|
+
const [expanded, setExpanded] = React20__namespace.useState(false);
|
|
12190
12456
|
const cols = gridCols(photos.length);
|
|
12191
12457
|
const hasMore = photos.length > initialVisible;
|
|
12192
12458
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -12218,7 +12484,7 @@ function CompactGridGallery({
|
|
|
12218
12484
|
onOpen,
|
|
12219
12485
|
labels
|
|
12220
12486
|
}) {
|
|
12221
|
-
const [expanded, setExpanded] =
|
|
12487
|
+
const [expanded, setExpanded] = React20__namespace.useState(false);
|
|
12222
12488
|
const hasMore = photos.length > initialVisible;
|
|
12223
12489
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
12224
12490
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -12249,7 +12515,7 @@ function MasonryGallery({
|
|
|
12249
12515
|
onOpen,
|
|
12250
12516
|
labels
|
|
12251
12517
|
}) {
|
|
12252
|
-
const [expanded, setExpanded] =
|
|
12518
|
+
const [expanded, setExpanded] = React20__namespace.useState(false);
|
|
12253
12519
|
const hasMore = photos.length > initialVisible;
|
|
12254
12520
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
12255
12521
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -12326,7 +12592,7 @@ function FeaturedGallery({
|
|
|
12326
12592
|
onOpen,
|
|
12327
12593
|
labels
|
|
12328
12594
|
}) {
|
|
12329
|
-
const [expanded, setExpanded] =
|
|
12595
|
+
const [expanded, setExpanded] = React20__namespace.useState(false);
|
|
12330
12596
|
const featured = photos.slice(0, 3);
|
|
12331
12597
|
const extra = photos.slice(3);
|
|
12332
12598
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -12441,11 +12707,33 @@ function CarouselGallery({
|
|
|
12441
12707
|
const photo = photos[index];
|
|
12442
12708
|
const prev = () => onIndexChange((index - 1 + total) % total);
|
|
12443
12709
|
const next = () => onIndexChange((index + 1) % total);
|
|
12710
|
+
const touchStart = React20__namespace.useRef(null);
|
|
12711
|
+
const swiped = React20__namespace.useRef(false);
|
|
12712
|
+
const onTouchStart = (e) => {
|
|
12713
|
+
const t = e.touches[0];
|
|
12714
|
+
touchStart.current = { x: t.clientX, y: t.clientY };
|
|
12715
|
+
swiped.current = false;
|
|
12716
|
+
};
|
|
12717
|
+
const onTouchEnd = (e) => {
|
|
12718
|
+
const start = touchStart.current;
|
|
12719
|
+
touchStart.current = null;
|
|
12720
|
+
if (!start || total <= 1) return;
|
|
12721
|
+
const t = e.changedTouches[0];
|
|
12722
|
+
const dx = t.clientX - start.x;
|
|
12723
|
+
const dy = t.clientY - start.y;
|
|
12724
|
+
if (Math.abs(dx) > 40 && Math.abs(dx) > Math.abs(dy)) {
|
|
12725
|
+
swiped.current = true;
|
|
12726
|
+
if (dx < 0) next();
|
|
12727
|
+
else prev();
|
|
12728
|
+
}
|
|
12729
|
+
};
|
|
12444
12730
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12445
12731
|
"div",
|
|
12446
12732
|
{
|
|
12733
|
+
onTouchStart,
|
|
12734
|
+
onTouchEnd,
|
|
12447
12735
|
className: cn(
|
|
12448
|
-
"relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted group/photo",
|
|
12736
|
+
"relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted group/photo touch-pan-y select-none",
|
|
12449
12737
|
className
|
|
12450
12738
|
),
|
|
12451
12739
|
children: [
|
|
@@ -12453,7 +12741,13 @@ function CarouselGallery({
|
|
|
12453
12741
|
"button",
|
|
12454
12742
|
{
|
|
12455
12743
|
type: "button",
|
|
12456
|
-
onClick: () =>
|
|
12744
|
+
onClick: () => {
|
|
12745
|
+
if (swiped.current) {
|
|
12746
|
+
swiped.current = false;
|
|
12747
|
+
return;
|
|
12748
|
+
}
|
|
12749
|
+
onOpen(index);
|
|
12750
|
+
},
|
|
12457
12751
|
"aria-label": `Open photo ${index + 1} fullscreen`,
|
|
12458
12752
|
className: "absolute inset-0 w-full h-full cursor-zoom-in focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
12459
12753
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -12526,17 +12820,46 @@ function PhotoGallery({
|
|
|
12526
12820
|
initialVisible = 6,
|
|
12527
12821
|
onPhotoClick,
|
|
12528
12822
|
labels,
|
|
12823
|
+
lightbox: lightboxMode = "classic",
|
|
12824
|
+
tourSection,
|
|
12529
12825
|
className
|
|
12530
12826
|
}) {
|
|
12531
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
12532
|
-
const [carouselIndex, setCarouselIndex] =
|
|
12533
|
-
const normalised =
|
|
12827
|
+
const [lightboxIndex, setLightboxIndex] = React20__namespace.useState(null);
|
|
12828
|
+
const [carouselIndex, setCarouselIndex] = React20__namespace.useState(0);
|
|
12829
|
+
const normalised = React20__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
12830
|
+
const tour = React20__namespace.useContext(PhotoTourContext);
|
|
12831
|
+
const tourId = React20__namespace.useId();
|
|
12832
|
+
const markerRef = React20__namespace.useRef(null);
|
|
12833
|
+
const inTour = !!((tour == null ? void 0 : tour.enabled) && tourSection);
|
|
12834
|
+
React20__namespace.useEffect(() => {
|
|
12835
|
+
if (!inTour || !tour) return;
|
|
12836
|
+
tour.register({
|
|
12837
|
+
id: tourId,
|
|
12838
|
+
label: tourSection,
|
|
12839
|
+
getEl: () => markerRef.current,
|
|
12840
|
+
photos: normalised
|
|
12841
|
+
});
|
|
12842
|
+
return () => tour.unregister(tourId);
|
|
12843
|
+
}, [inTour, tour, tourId, tourSection, normalised]);
|
|
12534
12844
|
const handleOpen = (index) => {
|
|
12535
|
-
setLightboxIndex(index);
|
|
12536
12845
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
12846
|
+
if (inTour && tour) {
|
|
12847
|
+
tour.open(tourId, index);
|
|
12848
|
+
return;
|
|
12849
|
+
}
|
|
12850
|
+
setLightboxIndex(index);
|
|
12537
12851
|
};
|
|
12538
12852
|
if (normalised.length === 0) return null;
|
|
12539
|
-
const
|
|
12853
|
+
const tourMarker = inTour && /* @__PURE__ */ jsxRuntime.jsx("span", { ref: markerRef, "aria-hidden": true, className: "hidden" });
|
|
12854
|
+
const lightbox = lightboxIndex !== null && (lightboxMode === "feed" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12855
|
+
FeedLightbox,
|
|
12856
|
+
{
|
|
12857
|
+
sections: [{ photos: normalised }],
|
|
12858
|
+
initialIndex: lightboxIndex,
|
|
12859
|
+
onClose: () => setLightboxIndex(null),
|
|
12860
|
+
labels
|
|
12861
|
+
}
|
|
12862
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
12540
12863
|
Lightbox,
|
|
12541
12864
|
{
|
|
12542
12865
|
photos: normalised,
|
|
@@ -12544,9 +12867,10 @@ function PhotoGallery({
|
|
|
12544
12867
|
onClose: () => setLightboxIndex(null),
|
|
12545
12868
|
labels
|
|
12546
12869
|
}
|
|
12547
|
-
);
|
|
12870
|
+
));
|
|
12548
12871
|
if (variant === "carousel" || variant === "fullBleed") {
|
|
12549
12872
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
12873
|
+
tourMarker,
|
|
12550
12874
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12551
12875
|
CarouselGallery,
|
|
12552
12876
|
{
|
|
@@ -12565,6 +12889,7 @@ function PhotoGallery({
|
|
|
12565
12889
|
] });
|
|
12566
12890
|
}
|
|
12567
12891
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", className), children: [
|
|
12892
|
+
tourMarker,
|
|
12568
12893
|
variant === "grid" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12569
12894
|
GridGallery,
|
|
12570
12895
|
{
|
|
@@ -12620,14 +12945,15 @@ function ItineraryDay({
|
|
|
12620
12945
|
photoLayout = "rounded",
|
|
12621
12946
|
className
|
|
12622
12947
|
}) {
|
|
12623
|
-
const photoList =
|
|
12948
|
+
const photoList = React20__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
12624
12949
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
12625
12950
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
12626
12951
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12627
12952
|
PhotoGallery,
|
|
12628
12953
|
{
|
|
12629
12954
|
photos: photoList,
|
|
12630
|
-
variant: isFullBleed ? "fullBleed" : "carousel"
|
|
12955
|
+
variant: isFullBleed ? "fullBleed" : "carousel",
|
|
12956
|
+
tourSection: dayLabel != null ? dayLabel : `Day ${dayNumber}`
|
|
12631
12957
|
}
|
|
12632
12958
|
);
|
|
12633
12959
|
return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn("w-full flex flex-col gap-5", className), children: [
|
|
@@ -12675,8 +13001,8 @@ function MenuTrip({
|
|
|
12675
13001
|
bold = true,
|
|
12676
13002
|
className
|
|
12677
13003
|
}) {
|
|
12678
|
-
const scrollRef =
|
|
12679
|
-
|
|
13004
|
+
const scrollRef = React20__namespace.useRef(null);
|
|
13005
|
+
React20__namespace.useEffect(() => {
|
|
12680
13006
|
if (!scrollRef.current || !activeSection) return;
|
|
12681
13007
|
const container = scrollRef.current;
|
|
12682
13008
|
const btn = container.querySelector(
|
|
@@ -12874,8 +13200,8 @@ function PricingTrip({
|
|
|
12874
13200
|
className
|
|
12875
13201
|
}) {
|
|
12876
13202
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
12877
|
-
const [showEstimates, setShowEstimates] =
|
|
12878
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
13203
|
+
const [showEstimates, setShowEstimates] = React20__namespace.useState(false);
|
|
13204
|
+
const [showPriceInfo, setShowPriceInfo] = React20__namespace.useState(false);
|
|
12879
13205
|
if (variant === "compact") {
|
|
12880
13206
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
12881
13207
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -13311,6 +13637,7 @@ function SiteHeader({
|
|
|
13311
13637
|
logoSrcDark = "/logo-planetaexo-green.png",
|
|
13312
13638
|
logoSrc,
|
|
13313
13639
|
logoAlt = "Planeta Exo",
|
|
13640
|
+
logoHref = "#",
|
|
13314
13641
|
languages = DEFAULT_LANGUAGES,
|
|
13315
13642
|
currentLanguage = "EN",
|
|
13316
13643
|
onLanguageChange,
|
|
@@ -13323,14 +13650,14 @@ function SiteHeader({
|
|
|
13323
13650
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
13324
13651
|
const t = VARIANT[variant];
|
|
13325
13652
|
const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
|
|
13326
|
-
const [openMenu, setOpenMenu] =
|
|
13327
|
-
const [langOpen, setLangOpen] =
|
|
13328
|
-
const [mobileOpen, setMobileOpen] =
|
|
13329
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
13330
|
-
const [activeLang, setActiveLang] =
|
|
13653
|
+
const [openMenu, setOpenMenu] = React20__namespace.useState(null);
|
|
13654
|
+
const [langOpen, setLangOpen] = React20__namespace.useState(false);
|
|
13655
|
+
const [mobileOpen, setMobileOpen] = React20__namespace.useState(false);
|
|
13656
|
+
const [openMobileSection, setOpenMobileSection] = React20__namespace.useState(null);
|
|
13657
|
+
const [activeLang, setActiveLang] = React20__namespace.useState(currentLanguage);
|
|
13331
13658
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
13332
|
-
const menuCloseTimer =
|
|
13333
|
-
const langCloseTimer =
|
|
13659
|
+
const menuCloseTimer = React20__namespace.useRef(void 0);
|
|
13660
|
+
const langCloseTimer = React20__namespace.useRef(void 0);
|
|
13334
13661
|
const handleMenuEnter = (label) => {
|
|
13335
13662
|
clearTimeout(menuCloseTimer.current);
|
|
13336
13663
|
setOpenMenu(label);
|
|
@@ -13351,7 +13678,7 @@ function SiteHeader({
|
|
|
13351
13678
|
setOpenMenu(null);
|
|
13352
13679
|
setLangOpen(false);
|
|
13353
13680
|
};
|
|
13354
|
-
|
|
13681
|
+
React20__namespace.useEffect(() => () => {
|
|
13355
13682
|
clearTimeout(menuCloseTimer.current);
|
|
13356
13683
|
clearTimeout(langCloseTimer.current);
|
|
13357
13684
|
}, []);
|
|
@@ -13389,7 +13716,7 @@ function SiteHeader({
|
|
|
13389
13716
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
13390
13717
|
"a",
|
|
13391
13718
|
{
|
|
13392
|
-
href:
|
|
13719
|
+
href: logoHref,
|
|
13393
13720
|
className: cn(
|
|
13394
13721
|
"shrink-0 flex items-center",
|
|
13395
13722
|
"absolute left-1/2 -translate-x-1/2",
|
|
@@ -13541,7 +13868,7 @@ function SiteHeader({
|
|
|
13541
13868
|
),
|
|
13542
13869
|
children: [
|
|
13543
13870
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 h-[72px] shrink-0 border-b border-white/8", children: [
|
|
13544
|
-
/* @__PURE__ */ jsxRuntime.jsx("a", { href:
|
|
13871
|
+
/* @__PURE__ */ jsxRuntime.jsx("a", { href: logoHref, className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
13545
13872
|
"img",
|
|
13546
13873
|
{
|
|
13547
13874
|
src: resolvedLogo,
|
|
@@ -13627,7 +13954,7 @@ function SiteHeader({
|
|
|
13627
13954
|
), children: [
|
|
13628
13955
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
13629
13956
|
const isActive = lang.code === activeLang;
|
|
13630
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13957
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
13631
13958
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
13632
13959
|
"text-xs select-none",
|
|
13633
13960
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -13689,8 +14016,8 @@ function SiteHeader({
|
|
|
13689
14016
|
);
|
|
13690
14017
|
}
|
|
13691
14018
|
function ThemeToggle({ className }) {
|
|
13692
|
-
const [dark, setDark] =
|
|
13693
|
-
|
|
14019
|
+
const [dark, setDark] = React20__namespace.useState(false);
|
|
14020
|
+
React20__namespace.useEffect(() => {
|
|
13694
14021
|
const saved = localStorage.getItem("theme");
|
|
13695
14022
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
13696
14023
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -13740,7 +14067,7 @@ var chipVariants = classVarianceAuthority.cva(
|
|
|
13740
14067
|
}
|
|
13741
14068
|
}
|
|
13742
14069
|
);
|
|
13743
|
-
var Chip =
|
|
14070
|
+
var Chip = React20__namespace.forwardRef(function Chip2(_a, ref) {
|
|
13744
14071
|
var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
|
|
13745
14072
|
const classes = cn(chipVariants({ variant, size }), className);
|
|
13746
14073
|
if (href) {
|
|
@@ -13807,6 +14134,19 @@ var statusConfig = {
|
|
|
13807
14134
|
icon: /* @__PURE__ */ jsxRuntime.jsx(TrendingIcon, {})
|
|
13808
14135
|
}
|
|
13809
14136
|
};
|
|
14137
|
+
function StarIcon() {
|
|
14138
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
14139
|
+
"svg",
|
|
14140
|
+
{
|
|
14141
|
+
width: "15",
|
|
14142
|
+
height: "15",
|
|
14143
|
+
viewBox: "0 0 24 24",
|
|
14144
|
+
fill: "currentColor",
|
|
14145
|
+
"aria-hidden": "true",
|
|
14146
|
+
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" })
|
|
14147
|
+
}
|
|
14148
|
+
);
|
|
14149
|
+
}
|
|
13810
14150
|
function HeartIcon({ filled = false }) {
|
|
13811
14151
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
13812
14152
|
"svg",
|
|
@@ -13824,7 +14164,7 @@ function HeartIcon({ filled = false }) {
|
|
|
13824
14164
|
);
|
|
13825
14165
|
}
|
|
13826
14166
|
function TripCardEditorial(props) {
|
|
13827
|
-
var _a, _b, _c, _d;
|
|
14167
|
+
var _a, _b, _c, _d, _e, _f;
|
|
13828
14168
|
const {
|
|
13829
14169
|
image,
|
|
13830
14170
|
imageAlt = "",
|
|
@@ -13841,10 +14181,14 @@ function TripCardEditorial(props) {
|
|
|
13841
14181
|
location,
|
|
13842
14182
|
locationHref,
|
|
13843
14183
|
difficulty,
|
|
14184
|
+
rating,
|
|
14185
|
+
reviewCount,
|
|
13844
14186
|
tag,
|
|
13845
14187
|
tagHref
|
|
13846
14188
|
} = props;
|
|
13847
|
-
const
|
|
14189
|
+
const hasRating = typeof rating === "number" && rating > 0;
|
|
14190
|
+
const reviewsWord = reviewCount === 1 ? (_a = labels == null ? void 0 : labels.review) != null ? _a : "review" : (_b = labels == null ? void 0 : labels.reviews) != null ? _b : "reviews";
|
|
14191
|
+
const [internalFav, setInternalFav] = React20__namespace.useState(false);
|
|
13848
14192
|
const favorited = favoritedProp != null ? favoritedProp : internalFav;
|
|
13849
14193
|
const handleFav = (e) => {
|
|
13850
14194
|
e.preventDefault();
|
|
@@ -13886,7 +14230,7 @@ function TripCardEditorial(props) {
|
|
|
13886
14230
|
"button",
|
|
13887
14231
|
{
|
|
13888
14232
|
type: "button",
|
|
13889
|
-
"aria-label": favorited ? (
|
|
14233
|
+
"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",
|
|
13890
14234
|
"aria-pressed": favorited,
|
|
13891
14235
|
onClick: handleFav,
|
|
13892
14236
|
className: cn(
|
|
@@ -13900,7 +14244,24 @@ function TripCardEditorial(props) {
|
|
|
13900
14244
|
),
|
|
13901
14245
|
/* @__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 }) })
|
|
13902
14246
|
] }),
|
|
13903
|
-
(description || price || nights || location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
|
|
14247
|
+
(description || price || nights || location || difficulty || hasRating) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
|
|
14248
|
+
hasRating && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14249
|
+
"div",
|
|
14250
|
+
{
|
|
14251
|
+
className: "flex items-center gap-1.5 text-foreground/85",
|
|
14252
|
+
"aria-label": reviewCount ? `${rating.toFixed(1)} (${reviewCount} ${reviewsWord})` : `${rating.toFixed(1)}`,
|
|
14253
|
+
children: [
|
|
14254
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-amber-500", children: /* @__PURE__ */ jsxRuntime.jsx(StarIcon, {}) }),
|
|
14255
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: rating.toFixed(1) }),
|
|
14256
|
+
reviewCount ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-ui text-muted-foreground", children: [
|
|
14257
|
+
"\xB7 ",
|
|
14258
|
+
reviewCount,
|
|
14259
|
+
" ",
|
|
14260
|
+
reviewsWord
|
|
14261
|
+
] }) : null
|
|
14262
|
+
]
|
|
14263
|
+
}
|
|
14264
|
+
),
|
|
13904
14265
|
(location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
|
|
13905
14266
|
location ? locationHref ? (
|
|
13906
14267
|
// Above the card's stretched link (z-20) so the location is
|
|
@@ -13930,7 +14291,7 @@ function TripCardEditorial(props) {
|
|
|
13930
14291
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
|
|
13931
14292
|
nights,
|
|
13932
14293
|
" ",
|
|
13933
|
-
nights === 1 ? (
|
|
14294
|
+
nights === 1 ? (_e = labels == null ? void 0 : labels.night) != null ? _e : "night" : (_f = labels == null ? void 0 : labels.nights) != null ? _f : "nights"
|
|
13934
14295
|
] })
|
|
13935
14296
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
13936
14297
|
price && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
|
|
@@ -14359,7 +14720,7 @@ function BlogPost({
|
|
|
14359
14720
|
) }),
|
|
14360
14721
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
|
|
14361
14722
|
/* @__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: [
|
|
14362
|
-
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(
|
|
14723
|
+
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: [
|
|
14363
14724
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
14364
14725
|
crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
14365
14726
|
"a",
|
|
@@ -14413,7 +14774,7 @@ function BlogPost({
|
|
|
14413
14774
|
] });
|
|
14414
14775
|
}
|
|
14415
14776
|
function useHlsVideo(videoRef, src) {
|
|
14416
|
-
|
|
14777
|
+
React20__namespace.useEffect(() => {
|
|
14417
14778
|
if (!src || !videoRef.current) return;
|
|
14418
14779
|
const video = videoRef.current;
|
|
14419
14780
|
if (!src.includes(".m3u8")) return;
|
|
@@ -14459,11 +14820,11 @@ function TripHeader({
|
|
|
14459
14820
|
className
|
|
14460
14821
|
}) {
|
|
14461
14822
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
14462
|
-
const [heroIndex, setHeroIndex] =
|
|
14463
|
-
const [videoReady, setVideoReady] =
|
|
14464
|
-
const videoRef =
|
|
14823
|
+
const [heroIndex, setHeroIndex] = React20__namespace.useState(0);
|
|
14824
|
+
const [videoReady, setVideoReady] = React20__namespace.useState(false);
|
|
14825
|
+
const videoRef = React20__namespace.useRef(null);
|
|
14465
14826
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
14466
|
-
const validImages =
|
|
14827
|
+
const validImages = React20__namespace.useMemo(
|
|
14467
14828
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
14468
14829
|
[images]
|
|
14469
14830
|
);
|
|
@@ -14478,7 +14839,7 @@ function TripHeader({
|
|
|
14478
14839
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
14479
14840
|
const hasMeta = !!(destination || duration || groupSize);
|
|
14480
14841
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
14481
|
-
|
|
14842
|
+
React20__namespace.useEffect(() => {
|
|
14482
14843
|
if (!videoUrl) return;
|
|
14483
14844
|
const el = videoRef.current;
|
|
14484
14845
|
if (!el) return;
|
|
@@ -14621,7 +14982,7 @@ function TripHeader({
|
|
|
14621
14982
|
chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
|
|
14622
14983
|
),
|
|
14623
14984
|
children: [
|
|
14624
|
-
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(
|
|
14985
|
+
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: [
|
|
14625
14986
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
14626
14987
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
14627
14988
|
] }, i)) }),
|
|
@@ -14791,10 +15152,10 @@ function LanguagePicker({
|
|
|
14791
15152
|
}) {
|
|
14792
15153
|
var _a;
|
|
14793
15154
|
const t = VARIANT2[variant];
|
|
14794
|
-
const [open, setOpen] =
|
|
14795
|
-
const ref =
|
|
15155
|
+
const [open, setOpen] = React20__namespace.useState(false);
|
|
15156
|
+
const ref = React20__namespace.useRef(null);
|
|
14796
15157
|
const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
|
|
14797
|
-
|
|
15158
|
+
React20__namespace.useEffect(() => {
|
|
14798
15159
|
if (!open) return;
|
|
14799
15160
|
const onDocClick = (e) => {
|
|
14800
15161
|
if (ref.current && !ref.current.contains(e.target)) {
|
|
@@ -15002,7 +15363,7 @@ function SiteFooter({
|
|
|
15002
15363
|
children: wrapper
|
|
15003
15364
|
},
|
|
15004
15365
|
b.alt + i
|
|
15005
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
15366
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(React20__namespace.Fragment, { children: wrapper }, b.alt + i);
|
|
15006
15367
|
}) })
|
|
15007
15368
|
] }),
|
|
15008
15369
|
themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
|
|
@@ -15144,6 +15505,7 @@ function TripPage({
|
|
|
15144
15505
|
itinerary,
|
|
15145
15506
|
itineraryDays,
|
|
15146
15507
|
gallery,
|
|
15508
|
+
galleryLightbox = "classic",
|
|
15147
15509
|
included,
|
|
15148
15510
|
notIncluded,
|
|
15149
15511
|
whatToBring,
|
|
@@ -15183,15 +15545,16 @@ function TripPage({
|
|
|
15183
15545
|
fromLabel,
|
|
15184
15546
|
perPersonLabel,
|
|
15185
15547
|
siteHeader,
|
|
15548
|
+
footerBadges,
|
|
15186
15549
|
uiVariant = "v1",
|
|
15187
15550
|
features,
|
|
15188
15551
|
className
|
|
15189
15552
|
}) {
|
|
15190
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
|
|
15191
|
-
const [activeSection, setActiveSection] =
|
|
15192
|
-
const [accordionValue, setAccordionValue] =
|
|
15193
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
15194
|
-
const accordionSectionIds =
|
|
15553
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
15554
|
+
const [activeSection, setActiveSection] = React20__namespace.useState("");
|
|
15555
|
+
const [accordionValue, setAccordionValue] = React20__namespace.useState([]);
|
|
15556
|
+
const [faqsExpanded, setFaqsExpanded] = React20__namespace.useState(false);
|
|
15557
|
+
const accordionSectionIds = React20__namespace.useMemo(
|
|
15195
15558
|
() => /* @__PURE__ */ new Set([
|
|
15196
15559
|
"when-it-operates",
|
|
15197
15560
|
"how-to-get-there",
|
|
@@ -15205,18 +15568,18 @@ function TripPage({
|
|
|
15205
15568
|
]),
|
|
15206
15569
|
[]
|
|
15207
15570
|
);
|
|
15208
|
-
const [navFloating, setNavFloating] =
|
|
15209
|
-
const [navHidden, setNavHidden] =
|
|
15210
|
-
const [isFloating, setIsFloating] =
|
|
15211
|
-
const [sidebarPos, setSidebarPos] =
|
|
15212
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
15213
|
-
const navRef =
|
|
15214
|
-
const navSentinelRef =
|
|
15215
|
-
const sentinelRef =
|
|
15216
|
-
const sidebarPlaceholderRef =
|
|
15217
|
-
const pricingBarRef =
|
|
15218
|
-
const galleryRef =
|
|
15219
|
-
const sections =
|
|
15571
|
+
const [navFloating, setNavFloating] = React20__namespace.useState(false);
|
|
15572
|
+
const [navHidden, setNavHidden] = React20__namespace.useState(false);
|
|
15573
|
+
const [isFloating, setIsFloating] = React20__namespace.useState(false);
|
|
15574
|
+
const [sidebarPos, setSidebarPos] = React20__namespace.useState(null);
|
|
15575
|
+
const [pricingBarVisible, setPricingBarVisible] = React20__namespace.useState(false);
|
|
15576
|
+
const navRef = React20__namespace.useRef(null);
|
|
15577
|
+
const navSentinelRef = React20__namespace.useRef(null);
|
|
15578
|
+
const sentinelRef = React20__namespace.useRef(null);
|
|
15579
|
+
const sidebarPlaceholderRef = React20__namespace.useRef(null);
|
|
15580
|
+
const pricingBarRef = React20__namespace.useRef(null);
|
|
15581
|
+
const galleryRef = React20__namespace.useRef(null);
|
|
15582
|
+
const sections = React20__namespace.useMemo(
|
|
15220
15583
|
() => {
|
|
15221
15584
|
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
|
|
15222
15585
|
return [
|
|
@@ -15238,7 +15601,7 @@ function TripPage({
|
|
|
15238
15601
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
15239
15602
|
[]
|
|
15240
15603
|
);
|
|
15241
|
-
|
|
15604
|
+
React20__namespace.useEffect(() => {
|
|
15242
15605
|
const sentinel = navSentinelRef.current;
|
|
15243
15606
|
if (!sentinel) return;
|
|
15244
15607
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -15246,7 +15609,7 @@ function TripPage({
|
|
|
15246
15609
|
update();
|
|
15247
15610
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
15248
15611
|
}, []);
|
|
15249
|
-
|
|
15612
|
+
React20__namespace.useEffect(() => {
|
|
15250
15613
|
const sentinel = sentinelRef.current;
|
|
15251
15614
|
if (!sentinel) return;
|
|
15252
15615
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -15254,7 +15617,7 @@ function TripPage({
|
|
|
15254
15617
|
update();
|
|
15255
15618
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
15256
15619
|
}, []);
|
|
15257
|
-
|
|
15620
|
+
React20__namespace.useEffect(() => {
|
|
15258
15621
|
const measure = () => {
|
|
15259
15622
|
if (!sidebarPlaceholderRef.current) return;
|
|
15260
15623
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -15264,7 +15627,7 @@ function TripPage({
|
|
|
15264
15627
|
window.addEventListener("resize", measure);
|
|
15265
15628
|
return () => window.removeEventListener("resize", measure);
|
|
15266
15629
|
}, [isFloating]);
|
|
15267
|
-
|
|
15630
|
+
React20__namespace.useEffect(() => {
|
|
15268
15631
|
const check = () => {
|
|
15269
15632
|
var _a2;
|
|
15270
15633
|
const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
|
|
@@ -15275,7 +15638,7 @@ function TripPage({
|
|
|
15275
15638
|
check();
|
|
15276
15639
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
15277
15640
|
}, []);
|
|
15278
|
-
|
|
15641
|
+
React20__namespace.useEffect(() => {
|
|
15279
15642
|
const check = () => {
|
|
15280
15643
|
if (!pricingBarRef.current) return;
|
|
15281
15644
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -15284,7 +15647,7 @@ function TripPage({
|
|
|
15284
15647
|
check();
|
|
15285
15648
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
15286
15649
|
}, []);
|
|
15287
|
-
|
|
15650
|
+
React20__namespace.useEffect(() => {
|
|
15288
15651
|
if (sections.length === 0) return;
|
|
15289
15652
|
setActiveSection(sections[0].id);
|
|
15290
15653
|
const update = () => {
|
|
@@ -15342,468 +15705,483 @@ function TripPage({
|
|
|
15342
15705
|
}
|
|
15343
15706
|
performScroll();
|
|
15344
15707
|
};
|
|
15345
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
15346
|
-
|
|
15708
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
15709
|
+
PhotoTourProvider,
|
|
15347
15710
|
{
|
|
15348
|
-
|
|
15349
|
-
|
|
15350
|
-
|
|
15351
|
-
|
|
15352
|
-
|
|
15353
|
-
|
|
15354
|
-
|
|
15355
|
-
|
|
15356
|
-
|
|
15357
|
-
|
|
15358
|
-
|
|
15359
|
-
|
|
15360
|
-
|
|
15361
|
-
|
|
15362
|
-
|
|
15363
|
-
|
|
15364
|
-
|
|
15365
|
-
|
|
15366
|
-
|
|
15367
|
-
|
|
15368
|
-
|
|
15369
|
-
|
|
15370
|
-
|
|
15371
|
-
|
|
15372
|
-
|
|
15373
|
-
|
|
15374
|
-
|
|
15375
|
-
|
|
15376
|
-
|
|
15377
|
-
|
|
15378
|
-
|
|
15379
|
-
|
|
15380
|
-
|
|
15381
|
-
|
|
15382
|
-
|
|
15383
|
-
|
|
15384
|
-
|
|
15385
|
-
|
|
15386
|
-
|
|
15387
|
-
|
|
15388
|
-
|
|
15389
|
-
|
|
15390
|
-
|
|
15391
|
-
|
|
15711
|
+
enabled: galleryLightbox === "feed",
|
|
15712
|
+
labels: {
|
|
15713
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
15714
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15715
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
15716
|
+
},
|
|
15717
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15718
|
+
"div",
|
|
15719
|
+
{
|
|
15720
|
+
className: cn("w-full overflow-x-hidden", className),
|
|
15721
|
+
"data-ui-variant": uiVariant,
|
|
15722
|
+
"data-features": features ? JSON.stringify(features) : void 0,
|
|
15723
|
+
children: [
|
|
15724
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15725
|
+
TripHeader,
|
|
15726
|
+
{
|
|
15727
|
+
images,
|
|
15728
|
+
videoUrl,
|
|
15729
|
+
title,
|
|
15730
|
+
breadcrumb,
|
|
15731
|
+
destination,
|
|
15732
|
+
duration,
|
|
15733
|
+
groupSize,
|
|
15734
|
+
labels: {
|
|
15735
|
+
night: labels == null ? void 0 : labels.night,
|
|
15736
|
+
nights: labels == null ? void 0 : labels.nights,
|
|
15737
|
+
day: labels == null ? void 0 : labels.day,
|
|
15738
|
+
days: labels == null ? void 0 : labels.days,
|
|
15739
|
+
previousImage: labels == null ? void 0 : labels.previousImage,
|
|
15740
|
+
nextImage: labels == null ? void 0 : labels.nextImage
|
|
15741
|
+
},
|
|
15742
|
+
tagline,
|
|
15743
|
+
chips,
|
|
15744
|
+
siteHeader,
|
|
15745
|
+
uiVariant,
|
|
15746
|
+
belowMeta: trustpilotHero ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
|
|
15747
|
+
}
|
|
15748
|
+
),
|
|
15749
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
15750
|
+
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: [
|
|
15751
|
+
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 }),
|
|
15752
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
|
|
15753
|
+
] }, i)) }),
|
|
15754
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
|
|
15755
|
+
sections.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
15756
|
+
"div",
|
|
15392
15757
|
{
|
|
15393
|
-
|
|
15394
|
-
|
|
15395
|
-
|
|
15396
|
-
|
|
15758
|
+
className: cn(
|
|
15759
|
+
"pt-8 pb-2 flex justify-center transition-opacity duration-150",
|
|
15760
|
+
navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
|
|
15761
|
+
),
|
|
15762
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15763
|
+
MenuTrip,
|
|
15764
|
+
{
|
|
15765
|
+
sections,
|
|
15766
|
+
activeSection,
|
|
15767
|
+
onSelect: scrollToSection,
|
|
15768
|
+
variant: "floating"
|
|
15769
|
+
}
|
|
15770
|
+
)
|
|
15397
15771
|
}
|
|
15398
|
-
)
|
|
15399
|
-
|
|
15400
|
-
|
|
15401
|
-
|
|
15402
|
-
|
|
15403
|
-
|
|
15404
|
-
|
|
15405
|
-
|
|
15406
|
-
|
|
15407
|
-
|
|
15408
|
-
|
|
15409
|
-
|
|
15410
|
-
|
|
15411
|
-
|
|
15412
|
-
|
|
15413
|
-
|
|
15414
|
-
|
|
15415
|
-
|
|
15416
|
-
] })
|
|
15417
|
-
|
|
15418
|
-
|
|
15419
|
-
|
|
15420
|
-
|
|
15421
|
-
|
|
15422
|
-
|
|
15423
|
-
|
|
15424
|
-
|
|
15425
|
-
|
|
15426
|
-
|
|
15427
|
-
|
|
15428
|
-
|
|
15429
|
-
|
|
15430
|
-
|
|
15431
|
-
|
|
15432
|
-
|
|
15433
|
-
|
|
15434
|
-
|
|
15435
|
-
|
|
15436
|
-
|
|
15437
|
-
|
|
15438
|
-
|
|
15439
|
-
|
|
15440
|
-
|
|
15441
|
-
|
|
15442
|
-
|
|
15443
|
-
|
|
15444
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15445
|
-
Checklist,
|
|
15446
|
-
{
|
|
15447
|
-
items: notIncluded,
|
|
15448
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-4 w-4 text-muted-foreground" })
|
|
15449
|
-
}
|
|
15450
|
-
)
|
|
15451
|
-
] }),
|
|
15452
|
-
(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(
|
|
15453
|
-
Accordion,
|
|
15454
|
-
{
|
|
15455
|
-
multiple: false,
|
|
15456
|
-
value: accordionValue,
|
|
15457
|
-
onValueChange: setAccordionValue,
|
|
15458
|
-
className: "border-t border-border",
|
|
15459
|
-
children: [
|
|
15460
|
-
whenItOperates && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15461
|
-
AccordionItem,
|
|
15462
|
-
{
|
|
15463
|
-
value: "when-it-operates",
|
|
15464
|
-
id: "trip-section-when-it-operates",
|
|
15465
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15466
|
-
children: [
|
|
15467
|
-
/* @__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: [
|
|
15468
|
-
(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" }),
|
|
15469
|
-
(_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
|
|
15470
|
-
] }) }),
|
|
15471
|
-
/* @__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 }) })
|
|
15472
|
-
]
|
|
15473
|
-
}
|
|
15474
|
-
),
|
|
15475
|
-
(accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15476
|
-
AccordionItem,
|
|
15477
|
-
{
|
|
15478
|
-
value: "accommodation",
|
|
15479
|
-
id: "trip-section-accommodation",
|
|
15480
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15481
|
-
children: [
|
|
15482
|
-
/* @__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: [
|
|
15483
|
-
(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" }),
|
|
15484
|
-
(_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
|
|
15485
|
-
] }) }),
|
|
15486
|
-
/* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", children: [
|
|
15487
|
-
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 }),
|
|
15488
|
-
accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15489
|
-
PhotoGallery,
|
|
15490
|
-
{
|
|
15491
|
-
labels: {
|
|
15492
|
-
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15493
|
-
showLess: labels == null ? void 0 : labels.showLess,
|
|
15494
|
-
close: labels == null ? void 0 : labels.galleryClose,
|
|
15495
|
-
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15496
|
-
next: labels == null ? void 0 : labels.galleryNext
|
|
15497
|
-
},
|
|
15498
|
-
photos: accommodationGallery,
|
|
15499
|
-
variant: accommodationGalleryVariant,
|
|
15500
|
-
initialVisible: 6
|
|
15501
|
-
}
|
|
15502
|
-
) })
|
|
15503
|
-
] })
|
|
15504
|
-
]
|
|
15505
|
-
}
|
|
15506
|
-
),
|
|
15507
|
-
(food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15508
|
-
AccordionItem,
|
|
15509
|
-
{
|
|
15510
|
-
value: "food",
|
|
15511
|
-
id: "trip-section-food",
|
|
15512
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15513
|
-
children: [
|
|
15514
|
-
/* @__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: [
|
|
15515
|
-
(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" }),
|
|
15516
|
-
(_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
|
|
15517
|
-
] }) }),
|
|
15518
|
-
/* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", children: [
|
|
15519
|
-
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 }),
|
|
15520
|
-
foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15521
|
-
PhotoGallery,
|
|
15522
|
-
{
|
|
15523
|
-
labels: {
|
|
15524
|
-
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15525
|
-
showLess: labels == null ? void 0 : labels.showLess,
|
|
15526
|
-
close: labels == null ? void 0 : labels.galleryClose,
|
|
15527
|
-
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15528
|
-
next: labels == null ? void 0 : labels.galleryNext
|
|
15529
|
-
},
|
|
15530
|
-
photos: foodGallery,
|
|
15531
|
-
variant: foodGalleryVariant,
|
|
15532
|
-
initialVisible: 6
|
|
15533
|
-
}
|
|
15534
|
-
) })
|
|
15535
|
-
] })
|
|
15536
|
-
]
|
|
15537
|
-
}
|
|
15538
|
-
),
|
|
15539
|
-
(meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15540
|
-
AccordionItem,
|
|
15541
|
-
{
|
|
15542
|
-
value: "meeting",
|
|
15543
|
-
id: "trip-section-meeting",
|
|
15544
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15545
|
-
children: [
|
|
15546
|
-
/* @__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: [
|
|
15547
|
-
(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" }),
|
|
15548
|
-
(_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
|
|
15549
|
-
] }) }),
|
|
15550
|
-
/* @__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) => {
|
|
15551
|
-
var _a2, _b2, _c2;
|
|
15552
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
|
|
15553
|
-
/* @__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" }) }),
|
|
15554
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15555
|
-
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" }),
|
|
15556
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
|
|
15557
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
|
|
15558
|
-
] })
|
|
15559
|
-
] }, i);
|
|
15560
|
-
}) }) })
|
|
15561
|
-
]
|
|
15562
|
-
}
|
|
15563
|
-
),
|
|
15564
|
-
howToGetThere && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15565
|
-
AccordionItem,
|
|
15566
|
-
{
|
|
15567
|
-
value: "how-to-get-there",
|
|
15568
|
-
id: "trip-section-how-to-get-there",
|
|
15569
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15570
|
-
children: [
|
|
15571
|
-
/* @__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: [
|
|
15572
|
-
(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" }),
|
|
15573
|
-
(_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
|
|
15574
|
-
] }) }),
|
|
15575
|
-
/* @__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 }) })
|
|
15576
|
-
]
|
|
15577
|
-
}
|
|
15578
|
-
),
|
|
15579
|
-
weather && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15580
|
-
AccordionItem,
|
|
15581
|
-
{
|
|
15582
|
-
value: "weather",
|
|
15583
|
-
id: "trip-section-weather",
|
|
15584
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15585
|
-
children: [
|
|
15586
|
-
/* @__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: [
|
|
15587
|
-
(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" }),
|
|
15588
|
-
(_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
|
|
15589
|
-
] }) }),
|
|
15590
|
-
/* @__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 }) })
|
|
15591
|
-
]
|
|
15592
|
-
}
|
|
15593
|
-
),
|
|
15594
|
-
whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15595
|
-
AccordionItem,
|
|
15596
|
-
{
|
|
15597
|
-
value: "what-to-bring",
|
|
15598
|
-
id: "trip-section-what-to-bring",
|
|
15599
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15600
|
-
children: [
|
|
15601
|
-
/* @__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: [
|
|
15602
|
-
(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" }),
|
|
15603
|
-
(_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
|
|
15604
|
-
] }) }),
|
|
15605
|
-
/* @__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" }) }) })
|
|
15606
|
-
]
|
|
15607
|
-
}
|
|
15608
|
-
),
|
|
15609
|
-
optionalExtras && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15610
|
-
AccordionItem,
|
|
15611
|
-
{
|
|
15612
|
-
value: "optional-extras",
|
|
15613
|
-
id: "trip-section-optional-extras",
|
|
15614
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15615
|
-
children: [
|
|
15616
|
-
/* @__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: [
|
|
15617
|
-
(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" }),
|
|
15618
|
-
(_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
|
|
15619
|
-
] }) }),
|
|
15620
|
-
/* @__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 }) })
|
|
15621
|
-
]
|
|
15622
|
-
}
|
|
15623
|
-
),
|
|
15624
|
-
termsAndConditions && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15625
|
-
AccordionItem,
|
|
15772
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "my-6" }),
|
|
15773
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
|
|
15774
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
|
|
15775
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
|
|
15776
|
+
(overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
|
|
15777
|
+
/* @__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" }),
|
|
15778
|
+
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 }),
|
|
15779
|
+
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: [
|
|
15780
|
+
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 }),
|
|
15781
|
+
/* @__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 })
|
|
15782
|
+
] }, i)) }),
|
|
15783
|
+
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: [
|
|
15784
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
|
|
15785
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground font-ui", children: [
|
|
15786
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: "Recommended for: " }),
|
|
15787
|
+
recommendedFor
|
|
15788
|
+
] })
|
|
15789
|
+
] })
|
|
15790
|
+
] }),
|
|
15791
|
+
itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
|
|
15792
|
+
/* @__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" }),
|
|
15793
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
15794
|
+
ItineraryDay,
|
|
15795
|
+
__spreadProps(__spreadValues({}, day), {
|
|
15796
|
+
photoLayout: "fullBleedBottom"
|
|
15797
|
+
}),
|
|
15798
|
+
day.dayNumber
|
|
15799
|
+
)) })
|
|
15800
|
+
] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
|
|
15801
|
+
/* @__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" }),
|
|
15802
|
+
/* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
|
|
15803
|
+
] }),
|
|
15804
|
+
included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
|
|
15805
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
15806
|
+
(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" }),
|
|
15807
|
+
(_d = labels == null ? void 0 : labels.whatIsIncluded) != null ? _d : "Included"
|
|
15808
|
+
] }),
|
|
15809
|
+
/* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: included })
|
|
15810
|
+
] }),
|
|
15811
|
+
notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
|
|
15812
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
15813
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5 text-muted-foreground" }),
|
|
15814
|
+
(_e = labels == null ? void 0 : labels.notIncluded) != null ? _e : "Not included"
|
|
15815
|
+
] }),
|
|
15816
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15817
|
+
Checklist,
|
|
15626
15818
|
{
|
|
15627
|
-
|
|
15628
|
-
|
|
15629
|
-
className: "scroll-mt-20 border-b border-border",
|
|
15630
|
-
children: [
|
|
15631
|
-
/* @__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: [
|
|
15632
|
-
(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" }),
|
|
15633
|
-
(_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
|
|
15634
|
-
] }) }),
|
|
15635
|
-
/* @__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 }) })
|
|
15636
|
-
]
|
|
15819
|
+
items: notIncluded,
|
|
15820
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-4 w-4 text-muted-foreground" })
|
|
15637
15821
|
}
|
|
15638
15822
|
)
|
|
15639
|
-
]
|
|
15640
|
-
|
|
15641
|
-
|
|
15642
|
-
faqs && faqs.length > 0 && (() => {
|
|
15643
|
-
var _a2, _b2, _c2;
|
|
15644
|
-
const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
|
|
15645
|
-
const hiddenCount = faqs.length - visibleFaqs.length;
|
|
15646
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
|
|
15647
|
-
/* @__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" }),
|
|
15648
|
-
/* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
|
|
15649
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { children: faq.question }),
|
|
15650
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
|
|
15651
|
-
] }, i)) }),
|
|
15652
|
-
faqs.length > faqInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15653
|
-
"button",
|
|
15823
|
+
] }),
|
|
15824
|
+
(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(
|
|
15825
|
+
Accordion,
|
|
15654
15826
|
{
|
|
15655
|
-
|
|
15656
|
-
|
|
15657
|
-
|
|
15658
|
-
|
|
15659
|
-
|
|
15660
|
-
|
|
15661
|
-
|
|
15662
|
-
|
|
15663
|
-
|
|
15664
|
-
|
|
15665
|
-
|
|
15666
|
-
|
|
15667
|
-
|
|
15668
|
-
|
|
15669
|
-
|
|
15670
|
-
|
|
15671
|
-
|
|
15672
|
-
|
|
15827
|
+
multiple: false,
|
|
15828
|
+
value: accordionValue,
|
|
15829
|
+
onValueChange: setAccordionValue,
|
|
15830
|
+
className: "border-t border-border",
|
|
15831
|
+
children: [
|
|
15832
|
+
whenItOperates && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15833
|
+
AccordionItem,
|
|
15834
|
+
{
|
|
15835
|
+
value: "when-it-operates",
|
|
15836
|
+
id: "trip-section-when-it-operates",
|
|
15837
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15838
|
+
children: [
|
|
15839
|
+
/* @__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: [
|
|
15840
|
+
(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" }),
|
|
15841
|
+
(_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
|
|
15842
|
+
] }) }),
|
|
15843
|
+
/* @__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 }) })
|
|
15844
|
+
]
|
|
15845
|
+
}
|
|
15846
|
+
),
|
|
15847
|
+
(accommodation || accommodationGallery && accommodationGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15848
|
+
AccordionItem,
|
|
15849
|
+
{
|
|
15850
|
+
value: "accommodation",
|
|
15851
|
+
id: "trip-section-accommodation",
|
|
15852
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15853
|
+
children: [
|
|
15854
|
+
/* @__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: [
|
|
15855
|
+
(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" }),
|
|
15856
|
+
(_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
|
|
15857
|
+
] }) }),
|
|
15858
|
+
/* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
|
|
15859
|
+
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 }),
|
|
15860
|
+
accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15861
|
+
PhotoGallery,
|
|
15862
|
+
{
|
|
15863
|
+
labels: {
|
|
15864
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15865
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
15866
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
15867
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15868
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
15869
|
+
},
|
|
15870
|
+
photos: accommodationGallery,
|
|
15871
|
+
variant: accommodationGalleryVariant,
|
|
15872
|
+
initialVisible: 6,
|
|
15873
|
+
tourSection: (_h = labels == null ? void 0 : labels.accommodation) != null ? _h : "Accommodation"
|
|
15874
|
+
}
|
|
15875
|
+
) })
|
|
15876
|
+
] })
|
|
15877
|
+
]
|
|
15878
|
+
}
|
|
15879
|
+
),
|
|
15880
|
+
(food || foodGallery && foodGallery.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15881
|
+
AccordionItem,
|
|
15882
|
+
{
|
|
15883
|
+
value: "food",
|
|
15884
|
+
id: "trip-section-food",
|
|
15885
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15886
|
+
children: [
|
|
15887
|
+
/* @__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: [
|
|
15888
|
+
(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" }),
|
|
15889
|
+
(_i = labels == null ? void 0 : labels.food) != null ? _i : "Food"
|
|
15890
|
+
] }) }),
|
|
15891
|
+
/* @__PURE__ */ jsxRuntime.jsxs(AccordionContent, { className: "pb-6", keepMounted: true, children: [
|
|
15892
|
+
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 }),
|
|
15893
|
+
foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15894
|
+
PhotoGallery,
|
|
15895
|
+
{
|
|
15896
|
+
labels: {
|
|
15897
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15898
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
15899
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
15900
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15901
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
15902
|
+
},
|
|
15903
|
+
photos: foodGallery,
|
|
15904
|
+
variant: foodGalleryVariant,
|
|
15905
|
+
initialVisible: 6,
|
|
15906
|
+
tourSection: (_j = labels == null ? void 0 : labels.food) != null ? _j : "Food"
|
|
15907
|
+
}
|
|
15908
|
+
) })
|
|
15909
|
+
] })
|
|
15910
|
+
]
|
|
15911
|
+
}
|
|
15912
|
+
),
|
|
15913
|
+
(meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15914
|
+
AccordionItem,
|
|
15915
|
+
{
|
|
15916
|
+
value: "meeting",
|
|
15917
|
+
id: "trip-section-meeting",
|
|
15918
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15919
|
+
children: [
|
|
15920
|
+
/* @__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: [
|
|
15921
|
+
(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" }),
|
|
15922
|
+
(_k = labels == null ? void 0 : labels.meetingPoint) != null ? _k : "Meeting point"
|
|
15923
|
+
] }) }),
|
|
15924
|
+
/* @__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) => {
|
|
15925
|
+
var _a2, _b2, _c2;
|
|
15926
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
|
|
15927
|
+
/* @__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" }) }),
|
|
15928
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15929
|
+
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" }),
|
|
15930
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
|
|
15931
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
|
|
15932
|
+
] })
|
|
15933
|
+
] }, i);
|
|
15934
|
+
}) }) })
|
|
15935
|
+
]
|
|
15936
|
+
}
|
|
15937
|
+
),
|
|
15938
|
+
howToGetThere && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15939
|
+
AccordionItem,
|
|
15940
|
+
{
|
|
15941
|
+
value: "how-to-get-there",
|
|
15942
|
+
id: "trip-section-how-to-get-there",
|
|
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.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" }),
|
|
15947
|
+
(_l = labels == null ? void 0 : labels.howToGetThere) != null ? _l : "How to get there"
|
|
15948
|
+
] }) }),
|
|
15949
|
+
/* @__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 }) })
|
|
15950
|
+
]
|
|
15951
|
+
}
|
|
15952
|
+
),
|
|
15953
|
+
weather && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15954
|
+
AccordionItem,
|
|
15955
|
+
{
|
|
15956
|
+
value: "weather",
|
|
15957
|
+
id: "trip-section-weather",
|
|
15958
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15959
|
+
children: [
|
|
15960
|
+
/* @__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: [
|
|
15961
|
+
(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" }),
|
|
15962
|
+
(_m = labels == null ? void 0 : labels.weather) != null ? _m : "Weather"
|
|
15963
|
+
] }) }),
|
|
15964
|
+
/* @__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 }) })
|
|
15965
|
+
]
|
|
15966
|
+
}
|
|
15967
|
+
),
|
|
15968
|
+
whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15969
|
+
AccordionItem,
|
|
15970
|
+
{
|
|
15971
|
+
value: "what-to-bring",
|
|
15972
|
+
id: "trip-section-what-to-bring",
|
|
15973
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15974
|
+
children: [
|
|
15975
|
+
/* @__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: [
|
|
15976
|
+
(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" }),
|
|
15977
|
+
(_n = labels == null ? void 0 : labels.whatToBring) != null ? _n : "What to bring"
|
|
15978
|
+
] }) }),
|
|
15979
|
+
/* @__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" }) }) })
|
|
15980
|
+
]
|
|
15981
|
+
}
|
|
15982
|
+
),
|
|
15983
|
+
optionalExtras && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15984
|
+
AccordionItem,
|
|
15985
|
+
{
|
|
15986
|
+
value: "optional-extras",
|
|
15987
|
+
id: "trip-section-optional-extras",
|
|
15988
|
+
className: "scroll-mt-20 border-b border-border",
|
|
15989
|
+
children: [
|
|
15990
|
+
/* @__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: [
|
|
15991
|
+
(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" }),
|
|
15992
|
+
(_o = labels == null ? void 0 : labels.optionalExtras) != null ? _o : "Optional extras"
|
|
15993
|
+
] }) }),
|
|
15994
|
+
/* @__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 }) })
|
|
15995
|
+
]
|
|
15996
|
+
}
|
|
15997
|
+
),
|
|
15998
|
+
termsAndConditions && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15999
|
+
AccordionItem,
|
|
16000
|
+
{
|
|
16001
|
+
value: "terms",
|
|
16002
|
+
id: "trip-section-terms",
|
|
16003
|
+
className: "scroll-mt-20 border-b border-border",
|
|
16004
|
+
children: [
|
|
16005
|
+
/* @__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: [
|
|
16006
|
+
(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" }),
|
|
16007
|
+
(_p = labels == null ? void 0 : labels.terms) != null ? _p : "Terms & conditions"
|
|
16008
|
+
] }) }),
|
|
16009
|
+
/* @__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 }) })
|
|
16010
|
+
]
|
|
16011
|
+
}
|
|
16012
|
+
)
|
|
16013
|
+
]
|
|
15673
16014
|
}
|
|
15674
|
-
)
|
|
15675
|
-
|
|
15676
|
-
|
|
15677
|
-
|
|
15678
|
-
|
|
15679
|
-
|
|
15680
|
-
|
|
15681
|
-
|
|
15682
|
-
|
|
15683
|
-
|
|
15684
|
-
|
|
15685
|
-
|
|
15686
|
-
|
|
15687
|
-
|
|
15688
|
-
|
|
15689
|
-
|
|
15690
|
-
|
|
15691
|
-
|
|
15692
|
-
|
|
15693
|
-
|
|
15694
|
-
|
|
15695
|
-
|
|
15696
|
-
|
|
15697
|
-
|
|
15698
|
-
|
|
16015
|
+
),
|
|
16016
|
+
faqs && faqs.length > 0 && (() => {
|
|
16017
|
+
var _a2, _b2, _c2;
|
|
16018
|
+
const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
|
|
16019
|
+
const hiddenCount = faqs.length - visibleFaqs.length;
|
|
16020
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
|
|
16021
|
+
/* @__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" }),
|
|
16022
|
+
/* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: visibleFaqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
|
|
16023
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { children: faq.question }),
|
|
16024
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
|
|
16025
|
+
] }, i)) }),
|
|
16026
|
+
faqs.length > faqInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16027
|
+
"button",
|
|
16028
|
+
{
|
|
16029
|
+
type: "button",
|
|
16030
|
+
onClick: () => setFaqsExpanded((v) => !v),
|
|
16031
|
+
className: cn(
|
|
16032
|
+
"inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
|
|
16033
|
+
"text-sm font-semibold text-foreground shadow-sm",
|
|
16034
|
+
"hover:bg-muted transition-colors duration-150",
|
|
16035
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
16036
|
+
),
|
|
16037
|
+
children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
16038
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
16039
|
+
(_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
|
|
16040
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
16041
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
16042
|
+
(_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
|
|
16043
|
+
" (",
|
|
16044
|
+
hiddenCount,
|
|
16045
|
+
")"
|
|
16046
|
+
] })
|
|
16047
|
+
}
|
|
16048
|
+
) })
|
|
16049
|
+
] });
|
|
16050
|
+
})(),
|
|
16051
|
+
trustpilot ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
|
|
16052
|
+
/* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
|
|
16053
|
+
/* @__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" }),
|
|
16054
|
+
/* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilot })
|
|
16055
|
+
] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
|
|
16056
|
+
/* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
|
|
16057
|
+
/* @__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" }),
|
|
16058
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
|
|
16059
|
+
var _a2;
|
|
16060
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
|
|
16061
|
+
/* @__PURE__ */ jsxRuntime.jsx(Stars, { count: (_a2 = r.rating) != null ? _a2 : 5 }),
|
|
16062
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
|
|
16063
|
+
"\u201C",
|
|
16064
|
+
r.text,
|
|
16065
|
+
"\u201D"
|
|
16066
|
+
] }),
|
|
16067
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
|
|
16068
|
+
"\u2014 ",
|
|
16069
|
+
r.author
|
|
16070
|
+
] })
|
|
16071
|
+
] }, i);
|
|
16072
|
+
}) })
|
|
16073
|
+
] })
|
|
16074
|
+
] }),
|
|
16075
|
+
/* @__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(
|
|
16076
|
+
PricingTrip,
|
|
16077
|
+
{
|
|
16078
|
+
priceFrom,
|
|
16079
|
+
currency,
|
|
16080
|
+
season,
|
|
16081
|
+
departureTimes,
|
|
16082
|
+
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
16083
|
+
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
16084
|
+
fromLabel,
|
|
16085
|
+
perPersonLabel,
|
|
16086
|
+
variant: "card",
|
|
16087
|
+
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
16088
|
+
benefits,
|
|
16089
|
+
currencyEstimates,
|
|
16090
|
+
priceInfo
|
|
16091
|
+
}
|
|
16092
|
+
) }) })
|
|
15699
16093
|
] })
|
|
15700
16094
|
] }),
|
|
15701
|
-
|
|
15702
|
-
|
|
16095
|
+
sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
16096
|
+
"div",
|
|
15703
16097
|
{
|
|
15704
|
-
|
|
15705
|
-
|
|
15706
|
-
|
|
15707
|
-
|
|
15708
|
-
|
|
15709
|
-
|
|
15710
|
-
|
|
15711
|
-
|
|
15712
|
-
|
|
15713
|
-
|
|
15714
|
-
|
|
15715
|
-
|
|
15716
|
-
|
|
16098
|
+
ref: navRef,
|
|
16099
|
+
className: cn(
|
|
16100
|
+
"fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
|
|
16101
|
+
navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
|
|
16102
|
+
),
|
|
16103
|
+
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(
|
|
16104
|
+
MenuTrip,
|
|
16105
|
+
{
|
|
16106
|
+
sections,
|
|
16107
|
+
activeSection,
|
|
16108
|
+
onSelect: scrollToSection,
|
|
16109
|
+
variant: "floating"
|
|
16110
|
+
}
|
|
16111
|
+
) })
|
|
15717
16112
|
}
|
|
15718
|
-
) }) })
|
|
15719
|
-
] })
|
|
15720
|
-
] }),
|
|
15721
|
-
sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15722
|
-
"div",
|
|
15723
|
-
{
|
|
15724
|
-
ref: navRef,
|
|
15725
|
-
className: cn(
|
|
15726
|
-
"fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
|
|
15727
|
-
navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
|
|
15728
16113
|
),
|
|
15729
|
-
|
|
15730
|
-
|
|
16114
|
+
isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsxRuntime.jsx(
|
|
16115
|
+
"div",
|
|
15731
16116
|
{
|
|
15732
|
-
|
|
15733
|
-
|
|
15734
|
-
|
|
15735
|
-
|
|
16117
|
+
className: "hidden lg:block fixed z-20",
|
|
16118
|
+
style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
|
|
16119
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16120
|
+
PricingTrip,
|
|
16121
|
+
{
|
|
16122
|
+
priceFrom,
|
|
16123
|
+
currency,
|
|
16124
|
+
season,
|
|
16125
|
+
departureTimes,
|
|
16126
|
+
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
16127
|
+
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
16128
|
+
fromLabel,
|
|
16129
|
+
perPersonLabel,
|
|
16130
|
+
variant: "card",
|
|
16131
|
+
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
16132
|
+
benefits,
|
|
16133
|
+
currencyEstimates,
|
|
16134
|
+
priceInfo
|
|
16135
|
+
}
|
|
16136
|
+
) })
|
|
15736
16137
|
}
|
|
15737
|
-
)
|
|
15738
|
-
|
|
15739
|
-
|
|
15740
|
-
|
|
15741
|
-
|
|
15742
|
-
|
|
15743
|
-
|
|
15744
|
-
|
|
15745
|
-
|
|
16138
|
+
),
|
|
16139
|
+
gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16140
|
+
PhotoGallery,
|
|
16141
|
+
{
|
|
16142
|
+
labels: {
|
|
16143
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
16144
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
16145
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
16146
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
16147
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
16148
|
+
},
|
|
16149
|
+
photos: gallery,
|
|
16150
|
+
variant: "gridCompact",
|
|
16151
|
+
initialVisible: 8,
|
|
16152
|
+
lightbox: galleryLightbox,
|
|
16153
|
+
tourSection: (_s = labels == null ? void 0 : labels.gallery) != null ? _s : "Gallery"
|
|
16154
|
+
}
|
|
16155
|
+
) }),
|
|
16156
|
+
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(
|
|
16157
|
+
BookingForm,
|
|
16158
|
+
{
|
|
16159
|
+
labels: bookingLabels,
|
|
16160
|
+
defaultValues: bookingDefaults,
|
|
16161
|
+
onSubmit: onBookingSubmit,
|
|
16162
|
+
loading: bookingLoading
|
|
16163
|
+
}
|
|
16164
|
+
) }) }),
|
|
16165
|
+
/* @__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(
|
|
15746
16166
|
PricingTrip,
|
|
15747
16167
|
{
|
|
15748
16168
|
priceFrom,
|
|
15749
16169
|
currency,
|
|
15750
|
-
season,
|
|
15751
|
-
departureTimes,
|
|
15752
16170
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
15753
|
-
bookLabel: bookLabel != null ? bookLabel : "
|
|
16171
|
+
bookLabel: bookLabel != null ? bookLabel : "Book now",
|
|
15754
16172
|
fromLabel,
|
|
15755
16173
|
perPersonLabel,
|
|
15756
|
-
variant: "
|
|
15757
|
-
|
|
15758
|
-
|
|
15759
|
-
currencyEstimates
|
|
15760
|
-
priceInfo
|
|
16174
|
+
variant: "compact",
|
|
16175
|
+
sharp: true,
|
|
16176
|
+
priceInfo,
|
|
16177
|
+
currencyEstimates
|
|
15761
16178
|
}
|
|
15762
|
-
) })
|
|
15763
|
-
|
|
15764
|
-
|
|
15765
|
-
|
|
15766
|
-
|
|
15767
|
-
|
|
15768
|
-
labels: {
|
|
15769
|
-
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15770
|
-
showLess: labels == null ? void 0 : labels.showLess,
|
|
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
|
-
photos: gallery,
|
|
15776
|
-
variant: "gridCompact",
|
|
15777
|
-
initialVisible: 8
|
|
15778
|
-
}
|
|
15779
|
-
) }),
|
|
15780
|
-
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(
|
|
15781
|
-
BookingForm,
|
|
15782
|
-
{
|
|
15783
|
-
labels: bookingLabels,
|
|
15784
|
-
defaultValues: bookingDefaults,
|
|
15785
|
-
onSubmit: onBookingSubmit,
|
|
15786
|
-
loading: bookingLoading
|
|
15787
|
-
}
|
|
15788
|
-
) }) }),
|
|
15789
|
-
/* @__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(
|
|
15790
|
-
PricingTrip,
|
|
15791
|
-
{
|
|
15792
|
-
priceFrom,
|
|
15793
|
-
currency,
|
|
15794
|
-
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
15795
|
-
bookLabel: bookLabel != null ? bookLabel : "Book now",
|
|
15796
|
-
fromLabel,
|
|
15797
|
-
perPersonLabel,
|
|
15798
|
-
variant: "compact",
|
|
15799
|
-
sharp: true,
|
|
15800
|
-
priceInfo,
|
|
15801
|
-
currencyEstimates
|
|
15802
|
-
}
|
|
15803
|
-
) }),
|
|
15804
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" }),
|
|
15805
|
-
/* @__PURE__ */ jsxRuntime.jsx(SiteFooter, {})
|
|
15806
|
-
]
|
|
16179
|
+
) }),
|
|
16180
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" }),
|
|
16181
|
+
/* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { badges: footerBadges })
|
|
16182
|
+
]
|
|
16183
|
+
}
|
|
16184
|
+
)
|
|
15807
16185
|
}
|
|
15808
16186
|
);
|
|
15809
16187
|
}
|
|
@@ -15862,14 +16240,15 @@ function CategoryPage2({
|
|
|
15862
16240
|
viewAllPostsLabel,
|
|
15863
16241
|
cardLabels,
|
|
15864
16242
|
filterLabels,
|
|
16243
|
+
footerBadges,
|
|
15865
16244
|
className
|
|
15866
16245
|
}) {
|
|
15867
16246
|
var _a;
|
|
15868
|
-
const [videoReady, setVideoReady] =
|
|
15869
|
-
const videoRef =
|
|
16247
|
+
const [videoReady, setVideoReady] = React20__namespace.useState(false);
|
|
16248
|
+
const videoRef = React20__namespace.useRef(null);
|
|
15870
16249
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
15871
16250
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
15872
|
-
|
|
16251
|
+
React20__namespace.useEffect(() => {
|
|
15873
16252
|
if (!videoUrl) return;
|
|
15874
16253
|
const el = videoRef.current;
|
|
15875
16254
|
if (!el) return;
|
|
@@ -15884,13 +16263,13 @@ function CategoryPage2({
|
|
|
15884
16263
|
io.observe(el);
|
|
15885
16264
|
return () => io.disconnect();
|
|
15886
16265
|
}, [videoUrl]);
|
|
15887
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
15888
|
-
const [tripsExpanded, setTripsExpanded] =
|
|
15889
|
-
const [filterValue, setFilterValue] =
|
|
15890
|
-
const [sort, setSort] =
|
|
16266
|
+
const [faqsExpanded, setFaqsExpanded] = React20__namespace.useState(false);
|
|
16267
|
+
const [tripsExpanded, setTripsExpanded] = React20__namespace.useState(false);
|
|
16268
|
+
const [filterValue, setFilterValue] = React20__namespace.useState({});
|
|
16269
|
+
const [sort, setSort] = React20__namespace.useState(
|
|
15891
16270
|
defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
|
|
15892
16271
|
);
|
|
15893
|
-
const sortedTrips =
|
|
16272
|
+
const sortedTrips = React20__namespace.useMemo(() => {
|
|
15894
16273
|
const active = Object.entries(filterValue).filter(
|
|
15895
16274
|
([, vals]) => vals && vals.length > 0
|
|
15896
16275
|
);
|
|
@@ -15994,7 +16373,7 @@ function CategoryPage2({
|
|
|
15994
16373
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
15995
16374
|
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
|
|
15996
16375
|
const isLast = i === breadcrumb.length - 1;
|
|
15997
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16376
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React20__namespace.Fragment, { children: [
|
|
15998
16377
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
15999
16378
|
crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
16000
16379
|
"a",
|
|
@@ -16186,7 +16565,7 @@ function CategoryPage2({
|
|
|
16186
16565
|
) })
|
|
16187
16566
|
] });
|
|
16188
16567
|
})(),
|
|
16189
|
-
/* @__PURE__ */ jsxRuntime.jsx(SiteFooter, {})
|
|
16568
|
+
/* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { badges: footerBadges })
|
|
16190
16569
|
] });
|
|
16191
16570
|
}
|
|
16192
16571
|
var sizeConfig3 = {
|
|
@@ -16291,12 +16670,12 @@ function Toast({
|
|
|
16291
16670
|
duration = 6e3,
|
|
16292
16671
|
className
|
|
16293
16672
|
}) {
|
|
16294
|
-
const [mounted, setMounted] =
|
|
16295
|
-
const [visible, setVisible] =
|
|
16296
|
-
|
|
16673
|
+
const [mounted, setMounted] = React20__namespace.useState(false);
|
|
16674
|
+
const [visible, setVisible] = React20__namespace.useState(true);
|
|
16675
|
+
React20__namespace.useEffect(() => {
|
|
16297
16676
|
setMounted(true);
|
|
16298
16677
|
}, []);
|
|
16299
|
-
|
|
16678
|
+
React20__namespace.useEffect(() => {
|
|
16300
16679
|
if (duration === 0) return;
|
|
16301
16680
|
const t = setTimeout(() => {
|
|
16302
16681
|
setVisible(false);
|
|
@@ -16703,21 +17082,21 @@ function LeadCapturePopup({
|
|
|
16703
17082
|
}) {
|
|
16704
17083
|
var _a;
|
|
16705
17084
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
16706
|
-
const [open, setOpen] =
|
|
16707
|
-
const [closing, setClosing] =
|
|
16708
|
-
const [submitted, setSubmitted] =
|
|
16709
|
-
const [submitting, setSubmitting] =
|
|
16710
|
-
const [error, setError] =
|
|
16711
|
-
const [name, setName] =
|
|
16712
|
-
const [email, setEmail] =
|
|
16713
|
-
const [travelDate, setTravelDate] =
|
|
16714
|
-
const panelRef =
|
|
16715
|
-
const nameRef =
|
|
16716
|
-
const show =
|
|
17085
|
+
const [open, setOpen] = React20.useState(false);
|
|
17086
|
+
const [closing, setClosing] = React20.useState(false);
|
|
17087
|
+
const [submitted, setSubmitted] = React20.useState(false);
|
|
17088
|
+
const [submitting, setSubmitting] = React20.useState(false);
|
|
17089
|
+
const [error, setError] = React20.useState(null);
|
|
17090
|
+
const [name, setName] = React20.useState("");
|
|
17091
|
+
const [email, setEmail] = React20.useState("");
|
|
17092
|
+
const [travelDate, setTravelDate] = React20.useState("");
|
|
17093
|
+
const panelRef = React20.useRef(null);
|
|
17094
|
+
const nameRef = React20.useRef(null);
|
|
17095
|
+
const show = React20.useCallback(() => {
|
|
16717
17096
|
if (isDismissed()) return;
|
|
16718
17097
|
setOpen(true);
|
|
16719
17098
|
}, []);
|
|
16720
|
-
|
|
17099
|
+
React20.useEffect(() => {
|
|
16721
17100
|
var _a2;
|
|
16722
17101
|
if (isDismissed()) return;
|
|
16723
17102
|
if (config.trigger === "delay") {
|
|
@@ -16744,7 +17123,7 @@ function LeadCapturePopup({
|
|
|
16744
17123
|
return () => window.removeEventListener("scroll", handler);
|
|
16745
17124
|
}
|
|
16746
17125
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
16747
|
-
|
|
17126
|
+
React20.useEffect(() => {
|
|
16748
17127
|
if (open && !submitted) {
|
|
16749
17128
|
requestAnimationFrame(() => {
|
|
16750
17129
|
var _a2;
|
|
@@ -16752,7 +17131,7 @@ function LeadCapturePopup({
|
|
|
16752
17131
|
});
|
|
16753
17132
|
}
|
|
16754
17133
|
}, [open, submitted]);
|
|
16755
|
-
const close =
|
|
17134
|
+
const close = React20.useCallback(() => {
|
|
16756
17135
|
setClosing(true);
|
|
16757
17136
|
setDismissed(config.dismissDays);
|
|
16758
17137
|
setTimeout(() => {
|
|
@@ -16760,7 +17139,7 @@ function LeadCapturePopup({
|
|
|
16760
17139
|
setClosing(false);
|
|
16761
17140
|
}, 250);
|
|
16762
17141
|
}, [config.dismissDays]);
|
|
16763
|
-
|
|
17142
|
+
React20.useEffect(() => {
|
|
16764
17143
|
if (!open) return;
|
|
16765
17144
|
const handler = (e) => {
|
|
16766
17145
|
if (e.key === "Escape") close();
|
|
@@ -16768,7 +17147,7 @@ function LeadCapturePopup({
|
|
|
16768
17147
|
document.addEventListener("keydown", handler);
|
|
16769
17148
|
return () => document.removeEventListener("keydown", handler);
|
|
16770
17149
|
}, [open, close]);
|
|
16771
|
-
const onOverlayClick =
|
|
17150
|
+
const onOverlayClick = React20.useCallback(
|
|
16772
17151
|
(e) => {
|
|
16773
17152
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
16774
17153
|
close();
|
|
@@ -17006,11 +17385,11 @@ function ExoOrb({
|
|
|
17006
17385
|
trackCursor = true,
|
|
17007
17386
|
className
|
|
17008
17387
|
}) {
|
|
17009
|
-
const uid =
|
|
17388
|
+
const uid = React20.useId().replace(/:/g, "");
|
|
17010
17389
|
const id = (name) => `exo-orb-${uid}-${name}`;
|
|
17011
|
-
const rootRef =
|
|
17012
|
-
const pupilRef =
|
|
17013
|
-
|
|
17390
|
+
const rootRef = React20.useRef(null);
|
|
17391
|
+
const pupilRef = React20.useRef(null);
|
|
17392
|
+
React20.useEffect(() => {
|
|
17014
17393
|
if (!trackCursor) return;
|
|
17015
17394
|
if (typeof window === "undefined") return;
|
|
17016
17395
|
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
@@ -17206,13 +17585,13 @@ function AskExo({
|
|
|
17206
17585
|
teaserDelayMs = 2500,
|
|
17207
17586
|
teaserDurationMs = 6e3
|
|
17208
17587
|
}) {
|
|
17209
|
-
const [open, setOpen] =
|
|
17210
|
-
const [question, setQuestion] =
|
|
17211
|
-
const [teaserVisible, setTeaserVisible] =
|
|
17588
|
+
const [open, setOpen] = React20.useState(false);
|
|
17589
|
+
const [question, setQuestion] = React20.useState("");
|
|
17590
|
+
const [teaserVisible, setTeaserVisible] = React20.useState(false);
|
|
17212
17591
|
const teaserEnabled = !!teaser && teaser !== "";
|
|
17213
|
-
const inputRef =
|
|
17214
|
-
const textareaRef =
|
|
17215
|
-
|
|
17592
|
+
const inputRef = React20.useRef(null);
|
|
17593
|
+
const textareaRef = React20.useRef(null);
|
|
17594
|
+
React20.useEffect(() => {
|
|
17216
17595
|
if (!open) {
|
|
17217
17596
|
setQuestion("");
|
|
17218
17597
|
return;
|
|
@@ -17224,7 +17603,7 @@ function AskExo({
|
|
|
17224
17603
|
}, 200);
|
|
17225
17604
|
return () => clearTimeout(t);
|
|
17226
17605
|
}, [open, variant]);
|
|
17227
|
-
|
|
17606
|
+
React20.useEffect(() => {
|
|
17228
17607
|
if (!open) return;
|
|
17229
17608
|
const onKey = (e) => {
|
|
17230
17609
|
if (e.key === "Escape") setOpen(false);
|
|
@@ -17232,7 +17611,7 @@ function AskExo({
|
|
|
17232
17611
|
document.addEventListener("keydown", onKey);
|
|
17233
17612
|
return () => document.removeEventListener("keydown", onKey);
|
|
17234
17613
|
}, [open]);
|
|
17235
|
-
|
|
17614
|
+
React20.useEffect(() => {
|
|
17236
17615
|
if (!teaserEnabled || open) return;
|
|
17237
17616
|
if (typeof window === "undefined") return;
|
|
17238
17617
|
const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
|
|
@@ -17245,7 +17624,7 @@ function AskExo({
|
|
|
17245
17624
|
clearTimeout(hideTimer);
|
|
17246
17625
|
};
|
|
17247
17626
|
}, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
|
|
17248
|
-
|
|
17627
|
+
React20.useEffect(() => {
|
|
17249
17628
|
if (open) setTeaserVisible(false);
|
|
17250
17629
|
}, [open]);
|
|
17251
17630
|
const askExo = (q) => {
|
|
@@ -17798,8 +18177,8 @@ function ShareWidget({
|
|
|
17798
18177
|
title = "Invite friends & lower the price",
|
|
17799
18178
|
className
|
|
17800
18179
|
}) {
|
|
17801
|
-
const [copied, setCopied] =
|
|
17802
|
-
const [showToast, setShowToast] =
|
|
18180
|
+
const [copied, setCopied] = React20__namespace.useState(false);
|
|
18181
|
+
const [showToast, setShowToast] = React20__namespace.useState(false);
|
|
17803
18182
|
const encodedUrl = encodeURIComponent(url);
|
|
17804
18183
|
const encodedMsg = encodeURIComponent(`${message} ${url}`);
|
|
17805
18184
|
const channels = [
|
|
@@ -18016,11 +18395,11 @@ function HomeHeader({
|
|
|
18016
18395
|
className
|
|
18017
18396
|
}) {
|
|
18018
18397
|
var _a;
|
|
18019
|
-
const [heroIndex, setHeroIndex] =
|
|
18020
|
-
const [videoReady, setVideoReady] =
|
|
18021
|
-
const videoRef =
|
|
18398
|
+
const [heroIndex, setHeroIndex] = React20__namespace.useState(0);
|
|
18399
|
+
const [videoReady, setVideoReady] = React20__namespace.useState(false);
|
|
18400
|
+
const videoRef = React20__namespace.useRef(null);
|
|
18022
18401
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
18023
|
-
const validImages =
|
|
18402
|
+
const validImages = React20__namespace.useMemo(
|
|
18024
18403
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
18025
18404
|
[images]
|
|
18026
18405
|
);
|
|
@@ -18034,7 +18413,7 @@ function HomeHeader({
|
|
|
18034
18413
|
const showCarousel = !videoUrl && validImages.length > 1;
|
|
18035
18414
|
const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
|
|
18036
18415
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
18037
|
-
|
|
18416
|
+
React20__namespace.useEffect(() => {
|
|
18038
18417
|
if (!videoUrl) return;
|
|
18039
18418
|
const el = videoRef.current;
|
|
18040
18419
|
if (!el) return;
|
|
@@ -18392,7 +18771,7 @@ function AdventureExplorer({
|
|
|
18392
18771
|
className
|
|
18393
18772
|
}) {
|
|
18394
18773
|
var _a, _b, _c, _d, _e;
|
|
18395
|
-
const [activeId, setActiveId] =
|
|
18774
|
+
const [activeId, setActiveId] = React20__namespace.useState(
|
|
18396
18775
|
defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
|
|
18397
18776
|
);
|
|
18398
18777
|
const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
|
|
@@ -18732,8 +19111,8 @@ function RotatingSubtitle({
|
|
|
18732
19111
|
interval,
|
|
18733
19112
|
className
|
|
18734
19113
|
}) {
|
|
18735
|
-
const [index, setIndex] =
|
|
18736
|
-
|
|
19114
|
+
const [index, setIndex] = React20__namespace.useState(0);
|
|
19115
|
+
React20__namespace.useEffect(() => {
|
|
18737
19116
|
var _a;
|
|
18738
19117
|
if (phrases.length < 2) return;
|
|
18739
19118
|
const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
|
|
@@ -18772,7 +19151,7 @@ function CtaBanner({
|
|
|
18772
19151
|
overlayOpacity = 35,
|
|
18773
19152
|
className
|
|
18774
19153
|
}) {
|
|
18775
|
-
const phrases =
|
|
19154
|
+
const phrases = React20__namespace.useMemo(
|
|
18776
19155
|
() => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
|
|
18777
19156
|
[subtitle]
|
|
18778
19157
|
);
|
|
@@ -19053,7 +19432,7 @@ function SectionHead({
|
|
|
19053
19432
|
}
|
|
19054
19433
|
function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
|
|
19055
19434
|
var _a;
|
|
19056
|
-
const railRef =
|
|
19435
|
+
const railRef = React20__namespace.useRef(null);
|
|
19057
19436
|
const scrollByCard = (dir) => {
|
|
19058
19437
|
const rail = railRef.current;
|
|
19059
19438
|
if (!rail) return;
|
|
@@ -19261,7 +19640,7 @@ function SegmentedControl({
|
|
|
19261
19640
|
}) {
|
|
19262
19641
|
var _a;
|
|
19263
19642
|
const isControlled = value != null;
|
|
19264
|
-
const [internal, setInternal] =
|
|
19643
|
+
const [internal, setInternal] = React20__namespace.useState(
|
|
19265
19644
|
defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
|
|
19266
19645
|
);
|
|
19267
19646
|
const active = isControlled ? value : internal;
|
|
@@ -19420,6 +19799,7 @@ exports.PaymentReceiptEmail = PaymentReceiptEmail;
|
|
|
19420
19799
|
exports.PaymentReminderEmail = PaymentReminderEmail;
|
|
19421
19800
|
exports.PhoneCountrySelect = PhoneCountrySelect;
|
|
19422
19801
|
exports.PhotoGallery = PhotoGallery;
|
|
19802
|
+
exports.PhotoTourProvider = PhotoTourProvider;
|
|
19423
19803
|
exports.Picture = Picture;
|
|
19424
19804
|
exports.PriceProgress = PriceProgress;
|
|
19425
19805
|
exports.PricingMatrixCard = PricingMatrixCard;
|