@planetaexo/design-system 0.57.2 → 0.58.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 +720 -348
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +161 -3
- package/dist/index.d.ts +161 -3
- package/dist/index.js +689 -319
- 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 React31 = 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 React31__namespace = /*#__PURE__*/_interopNamespace(React31);
|
|
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 = React31__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 = React31__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 : React31__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 = React30__namespace.forwardRef(
|
|
|
374
374
|
}
|
|
375
375
|
);
|
|
376
376
|
FloatingInput.displayName = "FloatingInput";
|
|
377
|
-
var FloatingSelect =
|
|
377
|
+
var FloatingSelect = React31__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 : React31__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(
|
|
@@ -641,11 +641,11 @@ function PhoneCountrySelect({
|
|
|
641
641
|
disabled
|
|
642
642
|
}) {
|
|
643
643
|
var _a;
|
|
644
|
-
const [open, setOpen] =
|
|
645
|
-
const containerRef =
|
|
646
|
-
const listRef =
|
|
644
|
+
const [open, setOpen] = React31__namespace.useState(false);
|
|
645
|
+
const containerRef = React31__namespace.useRef(null);
|
|
646
|
+
const listRef = React31__namespace.useRef(null);
|
|
647
647
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
648
|
-
|
|
648
|
+
React31__namespace.useEffect(() => {
|
|
649
649
|
if (!open) return;
|
|
650
650
|
const handler = (e) => {
|
|
651
651
|
var _a2;
|
|
@@ -656,7 +656,7 @@ function PhoneCountrySelect({
|
|
|
656
656
|
document.addEventListener("mousedown", handler);
|
|
657
657
|
return () => document.removeEventListener("mousedown", handler);
|
|
658
658
|
}, [open]);
|
|
659
|
-
|
|
659
|
+
React31__namespace.useEffect(() => {
|
|
660
660
|
if (!open || !listRef.current) return;
|
|
661
661
|
const activeEl = listRef.current.querySelector("[data-selected=true]");
|
|
662
662
|
activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
|
|
@@ -926,8 +926,8 @@ function CalendarDayButton(_a) {
|
|
|
926
926
|
"locale"
|
|
927
927
|
]);
|
|
928
928
|
const defaultClassNames = reactDayPicker.getDefaultClassNames();
|
|
929
|
-
const ref =
|
|
930
|
-
|
|
929
|
+
const ref = React31__namespace.useRef(null);
|
|
930
|
+
React31__namespace.useEffect(() => {
|
|
931
931
|
var _a2;
|
|
932
932
|
if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
|
|
933
933
|
}, [modifiers.focused]);
|
|
@@ -958,16 +958,16 @@ function BirthDateField({
|
|
|
958
958
|
className,
|
|
959
959
|
disabled
|
|
960
960
|
}) {
|
|
961
|
-
const [open, setOpen] =
|
|
962
|
-
const [text, setText] =
|
|
961
|
+
const [open, setOpen] = React31__namespace.useState(false);
|
|
962
|
+
const [text, setText] = React31__namespace.useState(
|
|
963
963
|
value ? dateFns.format(value, "dd/MM/yyyy") : ""
|
|
964
964
|
);
|
|
965
|
-
const containerRef =
|
|
966
|
-
const inputId =
|
|
967
|
-
|
|
965
|
+
const containerRef = React31__namespace.useRef(null);
|
|
966
|
+
const inputId = React31__namespace.useId();
|
|
967
|
+
React31__namespace.useEffect(() => {
|
|
968
968
|
setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
|
|
969
969
|
}, [value]);
|
|
970
|
-
|
|
970
|
+
React31__namespace.useEffect(() => {
|
|
971
971
|
if (!open) return;
|
|
972
972
|
const handler = (e) => {
|
|
973
973
|
var _a;
|
|
@@ -1176,14 +1176,14 @@ function CountrySearchField({
|
|
|
1176
1176
|
}) {
|
|
1177
1177
|
var _a;
|
|
1178
1178
|
const list = countries != null ? countries : COUNTRIES;
|
|
1179
|
-
const [query, setQuery] =
|
|
1180
|
-
const [open, setOpen] =
|
|
1181
|
-
const containerRef =
|
|
1182
|
-
const searchRef =
|
|
1179
|
+
const [query, setQuery] = React31__namespace.useState("");
|
|
1180
|
+
const [open, setOpen] = React31__namespace.useState(false);
|
|
1181
|
+
const containerRef = React31__namespace.useRef(null);
|
|
1182
|
+
const searchRef = React31__namespace.useRef(null);
|
|
1183
1183
|
const selected = list.find((c) => c.code === value);
|
|
1184
1184
|
const isFloated = open || !!selected;
|
|
1185
1185
|
const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
|
|
1186
|
-
|
|
1186
|
+
React31__namespace.useEffect(() => {
|
|
1187
1187
|
if (!open) return;
|
|
1188
1188
|
const handler = (e) => {
|
|
1189
1189
|
var _a2;
|
|
@@ -1328,10 +1328,10 @@ function AdventureCard({
|
|
|
1328
1328
|
}) {
|
|
1329
1329
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
1330
1330
|
const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
|
|
1331
|
-
const [checkedInternal, setCheckedInternal] =
|
|
1331
|
+
const [checkedInternal, setCheckedInternal] = React31__namespace.useState(
|
|
1332
1332
|
new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
|
|
1333
1333
|
);
|
|
1334
|
-
const [openDescriptionId, setOpenDescriptionId] =
|
|
1334
|
+
const [openDescriptionId, setOpenDescriptionId] = React31__namespace.useState(null);
|
|
1335
1335
|
const openDescriptionOptional = openDescriptionId ? (_e = adventure.optionals) == null ? void 0 : _e.find((o) => o.id === openDescriptionId) : void 0;
|
|
1336
1336
|
const isChecked = (opt) => {
|
|
1337
1337
|
var _a2;
|
|
@@ -1761,7 +1761,7 @@ function BookingShell({
|
|
|
1761
1761
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1762
1762
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
|
|
1763
1763
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
|
|
1764
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1764
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
|
|
1765
1765
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1766
1766
|
"span",
|
|
1767
1767
|
{
|
|
@@ -1960,7 +1960,7 @@ function TermsSection({
|
|
|
1960
1960
|
termsContent
|
|
1961
1961
|
}) {
|
|
1962
1962
|
var _a;
|
|
1963
|
-
const [modalOpen, setModalOpen] =
|
|
1963
|
+
const [modalOpen, setModalOpen] = React31__namespace.useState(false);
|
|
1964
1964
|
const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
|
|
1965
1965
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
|
|
1966
1966
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
|
|
@@ -2098,9 +2098,9 @@ function BookingWizard({
|
|
|
2098
2098
|
}) {
|
|
2099
2099
|
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;
|
|
2100
2100
|
const wizardSteps = WIZARD_STEPS_FN(labels);
|
|
2101
|
-
const [step, setStep] =
|
|
2102
|
-
const [error, setError] =
|
|
2103
|
-
const [responsible, setResponsible] =
|
|
2101
|
+
const [step, setStep] = React31__namespace.useState("responsible");
|
|
2102
|
+
const [error, setError] = React31__namespace.useState(null);
|
|
2103
|
+
const [responsible, setResponsible] = React31__namespace.useState({
|
|
2104
2104
|
firstName: "",
|
|
2105
2105
|
lastName: "",
|
|
2106
2106
|
email: "",
|
|
@@ -2119,7 +2119,7 @@ function BookingWizard({
|
|
|
2119
2119
|
return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
|
|
2120
2120
|
}, 0);
|
|
2121
2121
|
const totalPax = totalAdults + totalChildren;
|
|
2122
|
-
const [travellers, setTravellers] =
|
|
2122
|
+
const [travellers, setTravellers] = React31__namespace.useState(
|
|
2123
2123
|
Array.from({ length: Math.max(totalPax, 1) }, () => ({
|
|
2124
2124
|
firstName: "",
|
|
2125
2125
|
lastName: "",
|
|
@@ -2127,9 +2127,9 @@ function BookingWizard({
|
|
|
2127
2127
|
email: ""
|
|
2128
2128
|
}))
|
|
2129
2129
|
);
|
|
2130
|
-
const [payAmount, setPayAmount] =
|
|
2131
|
-
const [payMethod, setPayMethod] =
|
|
2132
|
-
const [termsAccepted, setTermsAccepted] =
|
|
2130
|
+
const [payAmount, setPayAmount] = React31__namespace.useState("full");
|
|
2131
|
+
const [payMethod, setPayMethod] = React31__namespace.useState("stripe");
|
|
2132
|
+
const [termsAccepted, setTermsAccepted] = React31__namespace.useState(false);
|
|
2133
2133
|
const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
2134
2134
|
const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
|
|
2135
2135
|
const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
|
|
@@ -2357,7 +2357,7 @@ function Offer({
|
|
|
2357
2357
|
className
|
|
2358
2358
|
}) {
|
|
2359
2359
|
var _a, _b, _c;
|
|
2360
|
-
const [showBooking, setShowBooking] =
|
|
2360
|
+
const [showBooking, setShowBooking] = React31__namespace.useState(false);
|
|
2361
2361
|
const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
|
|
2362
2362
|
const handleBook = () => {
|
|
2363
2363
|
if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
|
|
@@ -2724,7 +2724,7 @@ function AdventureSection({
|
|
|
2724
2724
|
labels
|
|
2725
2725
|
}) {
|
|
2726
2726
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
2727
|
-
const [detailsOpen, setDetailsOpen] =
|
|
2727
|
+
const [detailsOpen, setDetailsOpen] = React31__namespace.useState(false);
|
|
2728
2728
|
const handleCopyUrl = (url) => {
|
|
2729
2729
|
if (onCopyFormLink) {
|
|
2730
2730
|
onCopyFormLink(url);
|
|
@@ -3237,8 +3237,8 @@ function AddTravellerDialog({
|
|
|
3237
3237
|
errorMessage
|
|
3238
3238
|
}) {
|
|
3239
3239
|
var _a, _b, _c, _d, _e;
|
|
3240
|
-
const [form, setForm] =
|
|
3241
|
-
|
|
3240
|
+
const [form, setForm] = React31__namespace.useState(() => createInitialAddFormData(config));
|
|
3241
|
+
React31__namespace.useEffect(() => {
|
|
3242
3242
|
if (open) {
|
|
3243
3243
|
setForm(createInitialAddFormData(config));
|
|
3244
3244
|
}
|
|
@@ -3298,7 +3298,7 @@ function EditTravellerDialog({
|
|
|
3298
3298
|
errorMessage
|
|
3299
3299
|
}) {
|
|
3300
3300
|
var _a, _b, _c, _d, _e;
|
|
3301
|
-
const [form, setForm] =
|
|
3301
|
+
const [form, setForm] = React31__namespace.useState(() => ({
|
|
3302
3302
|
firstName: "",
|
|
3303
3303
|
lastName: "",
|
|
3304
3304
|
email: "",
|
|
@@ -3307,7 +3307,7 @@ function EditTravellerDialog({
|
|
|
3307
3307
|
birthDate: "",
|
|
3308
3308
|
personType: "ADULT"
|
|
3309
3309
|
}));
|
|
3310
|
-
|
|
3310
|
+
React31__namespace.useEffect(() => {
|
|
3311
3311
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3312
3312
|
if (open && traveller) {
|
|
3313
3313
|
setForm({
|
|
@@ -3643,48 +3643,48 @@ function BookingDetails({
|
|
|
3643
3643
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3644
3644
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3645
3645
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3646
|
-
const [addModalState, setAddModalState] =
|
|
3646
|
+
const [addModalState, setAddModalState] = React31__namespace.useState({
|
|
3647
3647
|
open: false,
|
|
3648
3648
|
adventureId: null
|
|
3649
3649
|
});
|
|
3650
|
-
const [editModalState, setEditModalState] =
|
|
3651
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3652
|
-
const [resendInviteDialogState, setResendInviteDialogState] =
|
|
3653
|
-
const handleRequestOpenAddModal =
|
|
3650
|
+
const [editModalState, setEditModalState] = React31__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3651
|
+
const [deleteModalState, setDeleteModalState] = React31__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3652
|
+
const [resendInviteDialogState, setResendInviteDialogState] = React31__namespace.useState({ open: false, traveller: null });
|
|
3653
|
+
const handleRequestOpenAddModal = React31__namespace.useCallback((adventureId) => {
|
|
3654
3654
|
setAddModalState({ open: true, adventureId });
|
|
3655
3655
|
}, []);
|
|
3656
|
-
const handleRequestOpenEditModal =
|
|
3656
|
+
const handleRequestOpenEditModal = React31__namespace.useCallback(
|
|
3657
3657
|
(adventureId, traveller) => {
|
|
3658
3658
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3659
3659
|
},
|
|
3660
3660
|
[]
|
|
3661
3661
|
);
|
|
3662
|
-
const handleRequestOpenDeleteModal =
|
|
3662
|
+
const handleRequestOpenDeleteModal = React31__namespace.useCallback(
|
|
3663
3663
|
(adventureId, traveller) => {
|
|
3664
3664
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3665
3665
|
},
|
|
3666
3666
|
[]
|
|
3667
3667
|
);
|
|
3668
|
-
const handleRequestOpenResendInviteDialog =
|
|
3668
|
+
const handleRequestOpenResendInviteDialog = React31__namespace.useCallback(
|
|
3669
3669
|
(traveller) => {
|
|
3670
3670
|
setResendInviteDialogState({ open: true, traveller });
|
|
3671
3671
|
},
|
|
3672
3672
|
[]
|
|
3673
3673
|
);
|
|
3674
|
-
const closeAddModal =
|
|
3674
|
+
const closeAddModal = React31__namespace.useCallback(() => {
|
|
3675
3675
|
setAddModalState({ open: false, adventureId: null });
|
|
3676
3676
|
}, []);
|
|
3677
|
-
const closeEditModal =
|
|
3677
|
+
const closeEditModal = React31__namespace.useCallback(() => {
|
|
3678
3678
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3679
3679
|
}, []);
|
|
3680
|
-
const closeDeleteModal =
|
|
3680
|
+
const closeDeleteModal = React31__namespace.useCallback(() => {
|
|
3681
3681
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3682
3682
|
}, []);
|
|
3683
|
-
const closeResendInviteDialog =
|
|
3683
|
+
const closeResendInviteDialog = React31__namespace.useCallback(() => {
|
|
3684
3684
|
setResendInviteDialogState({ open: false, traveller: null });
|
|
3685
3685
|
}, []);
|
|
3686
|
-
const submitInFlightRef =
|
|
3687
|
-
const handleAddSubmit =
|
|
3686
|
+
const submitInFlightRef = React31__namespace.useRef(false);
|
|
3687
|
+
const handleAddSubmit = React31__namespace.useCallback(
|
|
3688
3688
|
async (adventureId, data) => {
|
|
3689
3689
|
if (!onSubmitAddTraveller) return;
|
|
3690
3690
|
if (submitInFlightRef.current) return;
|
|
@@ -3699,7 +3699,7 @@ function BookingDetails({
|
|
|
3699
3699
|
},
|
|
3700
3700
|
[onSubmitAddTraveller, closeAddModal]
|
|
3701
3701
|
);
|
|
3702
|
-
const handleEditSubmit =
|
|
3702
|
+
const handleEditSubmit = React31__namespace.useCallback(
|
|
3703
3703
|
async (adventureId, travellerId, data) => {
|
|
3704
3704
|
if (!onSubmitEditTraveller) return;
|
|
3705
3705
|
if (submitInFlightRef.current) return;
|
|
@@ -3714,7 +3714,7 @@ function BookingDetails({
|
|
|
3714
3714
|
},
|
|
3715
3715
|
[onSubmitEditTraveller, closeEditModal]
|
|
3716
3716
|
);
|
|
3717
|
-
const handleDeleteConfirm =
|
|
3717
|
+
const handleDeleteConfirm = React31__namespace.useCallback(
|
|
3718
3718
|
async (adventureId, travellerId) => {
|
|
3719
3719
|
if (!onConfirmRemoveTraveller) return;
|
|
3720
3720
|
if (submitInFlightRef.current) return;
|
|
@@ -5290,7 +5290,7 @@ function BookingCreatedEmail({
|
|
|
5290
5290
|
}, children: i + 1 }) }),
|
|
5291
5291
|
/* @__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 }) })
|
|
5292
5292
|
] }) }) }, i)) }),
|
|
5293
|
-
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(
|
|
5293
|
+
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(React31__namespace.Fragment, { children: [
|
|
5294
5294
|
idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
|
|
5295
5295
|
idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
|
|
5296
5296
|
] }, idx)) })
|
|
@@ -7310,11 +7310,11 @@ function DatePickerField({
|
|
|
7310
7310
|
fromDate,
|
|
7311
7311
|
className
|
|
7312
7312
|
}) {
|
|
7313
|
-
const [open, setOpen] =
|
|
7314
|
-
const containerRef =
|
|
7315
|
-
const [calendarWidth, setCalendarWidth] =
|
|
7313
|
+
const [open, setOpen] = React31__namespace.useState(false);
|
|
7314
|
+
const containerRef = React31__namespace.useRef(null);
|
|
7315
|
+
const [calendarWidth, setCalendarWidth] = React31__namespace.useState();
|
|
7316
7316
|
const hasValue = !!value;
|
|
7317
|
-
|
|
7317
|
+
React31__namespace.useEffect(() => {
|
|
7318
7318
|
if (!containerRef.current) return;
|
|
7319
7319
|
const observer = new ResizeObserver(([entry]) => {
|
|
7320
7320
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -7423,7 +7423,7 @@ function BookingForm({
|
|
|
7423
7423
|
subtitle = "Free enquiry \u2013 no commitment",
|
|
7424
7424
|
className
|
|
7425
7425
|
}) {
|
|
7426
|
-
const [values, setValues] =
|
|
7426
|
+
const [values, setValues] = React31__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
7427
7427
|
const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
7428
7428
|
const handleSubmit = (e) => {
|
|
7429
7429
|
e.preventDefault();
|
|
@@ -7991,11 +7991,11 @@ function FloatingTextarea({
|
|
|
7991
7991
|
}
|
|
7992
7992
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
7993
7993
|
var _a, _b, _c;
|
|
7994
|
-
const [open, setOpen] =
|
|
7995
|
-
const containerRef =
|
|
7994
|
+
const [open, setOpen] = React31__namespace.useState(false);
|
|
7995
|
+
const containerRef = React31__namespace.useRef(null);
|
|
7996
7996
|
const options = (_a = field.options) != null ? _a : [];
|
|
7997
7997
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
7998
|
-
|
|
7998
|
+
React31__namespace.useEffect(() => {
|
|
7999
7999
|
if (!open) return;
|
|
8000
8000
|
const handleOutside = (e) => {
|
|
8001
8001
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -8460,11 +8460,11 @@ function RegistrationForm({
|
|
|
8460
8460
|
readOnly = false
|
|
8461
8461
|
}) {
|
|
8462
8462
|
var _a;
|
|
8463
|
-
const L =
|
|
8463
|
+
const L = React31__namespace.useMemo(
|
|
8464
8464
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
|
|
8465
8465
|
[labels]
|
|
8466
8466
|
);
|
|
8467
|
-
const sortedFields =
|
|
8467
|
+
const sortedFields = React31__namespace.useMemo(
|
|
8468
8468
|
() => [...fields].sort((a, b) => {
|
|
8469
8469
|
var _a2, _b;
|
|
8470
8470
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -8472,7 +8472,7 @@ function RegistrationForm({
|
|
|
8472
8472
|
[fields]
|
|
8473
8473
|
);
|
|
8474
8474
|
const isControlled = values !== void 0;
|
|
8475
|
-
const [internal, setInternal] =
|
|
8475
|
+
const [internal, setInternal] = React31__namespace.useState(
|
|
8476
8476
|
() => initializeValues(
|
|
8477
8477
|
sortedFields,
|
|
8478
8478
|
defaultValues != null ? defaultValues : {},
|
|
@@ -8480,9 +8480,9 @@ function RegistrationForm({
|
|
|
8480
8480
|
includeTerms
|
|
8481
8481
|
)
|
|
8482
8482
|
);
|
|
8483
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
8484
|
-
const [validationErrors, setValidationErrors] =
|
|
8485
|
-
|
|
8483
|
+
const [submitAttempted, setSubmitAttempted] = React31__namespace.useState(false);
|
|
8484
|
+
const [validationErrors, setValidationErrors] = React31__namespace.useState({});
|
|
8485
|
+
React31__namespace.useEffect(() => {
|
|
8486
8486
|
if (isControlled) return;
|
|
8487
8487
|
setInternal((prev) => {
|
|
8488
8488
|
const next = initializeValues(
|
|
@@ -8539,7 +8539,7 @@ function RegistrationForm({
|
|
|
8539
8539
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
8540
8540
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
8541
8541
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
8542
|
-
|
|
8542
|
+
React31__namespace.useEffect(() => {
|
|
8543
8543
|
if (!submitAttempted || !scrollTargetId) return;
|
|
8544
8544
|
const timer = setTimeout(() => {
|
|
8545
8545
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -9001,10 +9001,10 @@ var OTPCodeInput = ({
|
|
|
9001
9001
|
id,
|
|
9002
9002
|
required
|
|
9003
9003
|
}) => {
|
|
9004
|
-
const baseId = id != null ? id :
|
|
9005
|
-
const inputRef =
|
|
9006
|
-
const [focused, setFocused] =
|
|
9007
|
-
const digits =
|
|
9004
|
+
const baseId = id != null ? id : React31__namespace.useId();
|
|
9005
|
+
const inputRef = React31__namespace.useRef(null);
|
|
9006
|
+
const [focused, setFocused] = React31__namespace.useState(false);
|
|
9007
|
+
const digits = React31__namespace.useMemo(() => {
|
|
9008
9008
|
const arr = value.split("").slice(0, length);
|
|
9009
9009
|
while (arr.length < length) arr.push("");
|
|
9010
9010
|
return arr;
|
|
@@ -9117,7 +9117,7 @@ function Checkbox(_a) {
|
|
|
9117
9117
|
})
|
|
9118
9118
|
);
|
|
9119
9119
|
}
|
|
9120
|
-
var AccordionVariantContext =
|
|
9120
|
+
var AccordionVariantContext = React31__namespace.createContext("default");
|
|
9121
9121
|
function Accordion(_a) {
|
|
9122
9122
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
9123
9123
|
return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -9135,7 +9135,7 @@ function Accordion(_a) {
|
|
|
9135
9135
|
}
|
|
9136
9136
|
function AccordionItem(_a) {
|
|
9137
9137
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
9138
|
-
const variant =
|
|
9138
|
+
const variant = React31__namespace.useContext(AccordionVariantContext);
|
|
9139
9139
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9140
9140
|
accordion.Accordion.Item,
|
|
9141
9141
|
__spreadValues({
|
|
@@ -9156,7 +9156,7 @@ function AccordionTrigger(_a) {
|
|
|
9156
9156
|
"className",
|
|
9157
9157
|
"children"
|
|
9158
9158
|
]);
|
|
9159
|
-
const variant =
|
|
9159
|
+
const variant = React31__namespace.useContext(AccordionVariantContext);
|
|
9160
9160
|
return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9161
9161
|
accordion.Accordion.Trigger,
|
|
9162
9162
|
__spreadProps(__spreadValues({
|
|
@@ -9210,7 +9210,7 @@ function AccordionContent(_a) {
|
|
|
9210
9210
|
"className",
|
|
9211
9211
|
"children"
|
|
9212
9212
|
]);
|
|
9213
|
-
const variant =
|
|
9213
|
+
const variant = React31__namespace.useContext(AccordionVariantContext);
|
|
9214
9214
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9215
9215
|
accordion.Accordion.Panel,
|
|
9216
9216
|
__spreadProps(__spreadValues({
|
|
@@ -9428,15 +9428,15 @@ function FilterPanel({
|
|
|
9428
9428
|
onSortChange
|
|
9429
9429
|
}) {
|
|
9430
9430
|
var _a, _b;
|
|
9431
|
-
const resolvedGroups =
|
|
9432
|
-
const [internalValue, setInternalValue] =
|
|
9431
|
+
const resolvedGroups = React31__namespace.useMemo(() => resolveGroups(groups), [groups]);
|
|
9432
|
+
const [internalValue, setInternalValue] = React31__namespace.useState(
|
|
9433
9433
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
9434
9434
|
);
|
|
9435
9435
|
const selected = value != null ? value : internalValue;
|
|
9436
|
-
const [expandedItems, setExpandedItems] =
|
|
9436
|
+
const [expandedItems, setExpandedItems] = React31__namespace.useState(
|
|
9437
9437
|
() => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
|
|
9438
9438
|
);
|
|
9439
|
-
const toggleExpanded =
|
|
9439
|
+
const toggleExpanded = React31__namespace.useCallback((id) => {
|
|
9440
9440
|
setExpandedItems((prev) => {
|
|
9441
9441
|
const next = new Set(prev);
|
|
9442
9442
|
if (next.has(id)) next.delete(id);
|
|
@@ -9820,11 +9820,11 @@ function FilterPanel({
|
|
|
9820
9820
|
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
9821
9821
|
function TrustpilotEmbed({ config }) {
|
|
9822
9822
|
var _a, _b, _c, _d, _e, _f;
|
|
9823
|
-
const ref =
|
|
9824
|
-
const [widgetReady, setWidgetReady] =
|
|
9825
|
-
const [delayPassed, setDelayPassed] =
|
|
9823
|
+
const ref = React31__namespace.useRef(null);
|
|
9824
|
+
const [widgetReady, setWidgetReady] = React31__namespace.useState(false);
|
|
9825
|
+
const [delayPassed, setDelayPassed] = React31__namespace.useState(false);
|
|
9826
9826
|
const showFallback = delayPassed && !widgetReady;
|
|
9827
|
-
|
|
9827
|
+
React31__namespace.useEffect(() => {
|
|
9828
9828
|
var _a2;
|
|
9829
9829
|
if (typeof document === "undefined" || !ref.current) return;
|
|
9830
9830
|
const node = ref.current;
|
|
@@ -10011,6 +10011,55 @@ function webpVariantUrl(src) {
|
|
|
10011
10011
|
const withoutQuery = query ? src.slice(0, -query.length) : src;
|
|
10012
10012
|
return `${withoutQuery}.webp${query}`;
|
|
10013
10013
|
}
|
|
10014
|
+
function PictureLoader() {
|
|
10015
|
+
const gradientId = React31__namespace.useId();
|
|
10016
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10017
|
+
"span",
|
|
10018
|
+
{
|
|
10019
|
+
"aria-hidden": true,
|
|
10020
|
+
className: "pointer-events-none absolute inset-0 flex items-center justify-center",
|
|
10021
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10022
|
+
"svg",
|
|
10023
|
+
{
|
|
10024
|
+
viewBox: "0 0 200 200",
|
|
10025
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
10026
|
+
className: "h-10 w-10 text-primary",
|
|
10027
|
+
fill: "none",
|
|
10028
|
+
children: [
|
|
10029
|
+
/* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: gradientId, children: [
|
|
10030
|
+
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0", stopColor: "currentColor", stopOpacity: "0" }),
|
|
10031
|
+
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "1", stopColor: "currentColor" })
|
|
10032
|
+
] }),
|
|
10033
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10034
|
+
"circle",
|
|
10035
|
+
{
|
|
10036
|
+
stroke: `url(#${gradientId})`,
|
|
10037
|
+
strokeWidth: "15",
|
|
10038
|
+
strokeLinecap: "round",
|
|
10039
|
+
strokeDasharray: "0 44 0 44 0 44 0 44 0 360",
|
|
10040
|
+
cx: "100",
|
|
10041
|
+
cy: "100",
|
|
10042
|
+
r: "70",
|
|
10043
|
+
style: { transformOrigin: "center" },
|
|
10044
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10045
|
+
"animateTransform",
|
|
10046
|
+
{
|
|
10047
|
+
type: "rotate",
|
|
10048
|
+
attributeName: "transform",
|
|
10049
|
+
calcMode: "discrete",
|
|
10050
|
+
dur: "2s",
|
|
10051
|
+
values: "360;324;288;252;216;180;144;108;72;36",
|
|
10052
|
+
repeatCount: "indefinite"
|
|
10053
|
+
}
|
|
10054
|
+
)
|
|
10055
|
+
}
|
|
10056
|
+
)
|
|
10057
|
+
]
|
|
10058
|
+
}
|
|
10059
|
+
)
|
|
10060
|
+
}
|
|
10061
|
+
);
|
|
10062
|
+
}
|
|
10014
10063
|
var PLACEHOLDER_SRC = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
|
|
10015
10064
|
function Picture(_a) {
|
|
10016
10065
|
var _b = _a, {
|
|
@@ -10019,18 +10068,23 @@ function Picture(_a) {
|
|
|
10019
10068
|
eager = false,
|
|
10020
10069
|
rootMargin = "200px",
|
|
10021
10070
|
decoding,
|
|
10022
|
-
loading
|
|
10071
|
+
loading,
|
|
10072
|
+
onLoad,
|
|
10073
|
+
onError
|
|
10023
10074
|
} = _b, imgProps = __objRest(_b, [
|
|
10024
10075
|
"src",
|
|
10025
10076
|
"extraSources",
|
|
10026
10077
|
"eager",
|
|
10027
10078
|
"rootMargin",
|
|
10028
10079
|
"decoding",
|
|
10029
|
-
"loading"
|
|
10080
|
+
"loading",
|
|
10081
|
+
"onLoad",
|
|
10082
|
+
"onError"
|
|
10030
10083
|
]);
|
|
10031
|
-
const ref =
|
|
10032
|
-
const [visible, setVisible] =
|
|
10033
|
-
|
|
10084
|
+
const ref = React31__namespace.useRef(null);
|
|
10085
|
+
const [visible, setVisible] = React31__namespace.useState(eager);
|
|
10086
|
+
const [loaded, setLoaded] = React31__namespace.useState(false);
|
|
10087
|
+
React31__namespace.useEffect(() => {
|
|
10034
10088
|
if (eager || visible) return;
|
|
10035
10089
|
const el = ref.current;
|
|
10036
10090
|
if (!el || typeof IntersectionObserver === "undefined") {
|
|
@@ -10052,32 +10106,51 @@ function Picture(_a) {
|
|
|
10052
10106
|
const webp = webpVariantUrl(src);
|
|
10053
10107
|
const realSrc = visible ? src : PLACEHOLDER_SRC;
|
|
10054
10108
|
const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
|
|
10109
|
+
const handleLoad = (e) => {
|
|
10110
|
+
if (visible) setLoaded(true);
|
|
10111
|
+
onLoad == null ? void 0 : onLoad(e);
|
|
10112
|
+
};
|
|
10113
|
+
const handleError = (e) => {
|
|
10114
|
+
if (visible) setLoaded(true);
|
|
10115
|
+
onError == null ? void 0 : onError(e);
|
|
10116
|
+
};
|
|
10117
|
+
const showLoader = visible && !loaded;
|
|
10055
10118
|
if (!webp) {
|
|
10056
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
10057
|
-
|
|
10058
|
-
|
|
10059
|
-
|
|
10060
|
-
|
|
10061
|
-
|
|
10062
|
-
|
|
10063
|
-
|
|
10064
|
-
|
|
10065
|
-
|
|
10119
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10120
|
+
showLoader && /* @__PURE__ */ jsxRuntime.jsx(PictureLoader, {}),
|
|
10121
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10122
|
+
"img",
|
|
10123
|
+
__spreadValues({
|
|
10124
|
+
ref,
|
|
10125
|
+
src: realSrc,
|
|
10126
|
+
"data-src": visible ? void 0 : src,
|
|
10127
|
+
decoding: decodingResolved,
|
|
10128
|
+
loading: loading != null ? loading : eager ? void 0 : "lazy",
|
|
10129
|
+
onLoad: handleLoad,
|
|
10130
|
+
onError: handleError
|
|
10131
|
+
}, imgProps)
|
|
10132
|
+
)
|
|
10133
|
+
] });
|
|
10066
10134
|
}
|
|
10067
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10068
|
-
|
|
10069
|
-
|
|
10070
|
-
|
|
10071
|
-
|
|
10072
|
-
|
|
10073
|
-
|
|
10074
|
-
|
|
10075
|
-
|
|
10076
|
-
|
|
10077
|
-
|
|
10078
|
-
|
|
10079
|
-
|
|
10080
|
-
|
|
10135
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10136
|
+
showLoader && /* @__PURE__ */ jsxRuntime.jsx(PictureLoader, {}),
|
|
10137
|
+
/* @__PURE__ */ jsxRuntime.jsxs("picture", { style: { display: "contents" }, children: [
|
|
10138
|
+
visible && /* @__PURE__ */ jsxRuntime.jsx("source", { srcSet: webp, type: "image/webp" }),
|
|
10139
|
+
extraSources,
|
|
10140
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10141
|
+
"img",
|
|
10142
|
+
__spreadValues({
|
|
10143
|
+
ref,
|
|
10144
|
+
src: realSrc,
|
|
10145
|
+
"data-src": visible ? void 0 : src,
|
|
10146
|
+
"data-srcset-webp": visible ? void 0 : webp,
|
|
10147
|
+
decoding: decodingResolved,
|
|
10148
|
+
loading: loading != null ? loading : eager ? void 0 : "lazy",
|
|
10149
|
+
onLoad: handleLoad,
|
|
10150
|
+
onError: handleError
|
|
10151
|
+
}, imgProps)
|
|
10152
|
+
)
|
|
10153
|
+
] })
|
|
10081
10154
|
] });
|
|
10082
10155
|
}
|
|
10083
10156
|
function ItineraryDayCard({
|
|
@@ -10146,11 +10219,11 @@ function ItineraryModal({
|
|
|
10146
10219
|
onNext
|
|
10147
10220
|
}) {
|
|
10148
10221
|
var _a, _b, _c;
|
|
10149
|
-
const [imgIndex, setImgIndex] =
|
|
10222
|
+
const [imgIndex, setImgIndex] = React31__namespace.useState(0);
|
|
10150
10223
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
10151
10224
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
10152
10225
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
10153
|
-
|
|
10226
|
+
React31__namespace.useEffect(() => {
|
|
10154
10227
|
setImgIndex(0);
|
|
10155
10228
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
10156
10229
|
if (!stop) return null;
|
|
@@ -10277,8 +10350,8 @@ function ItineraryModal({
|
|
|
10277
10350
|
) });
|
|
10278
10351
|
}
|
|
10279
10352
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
10280
|
-
const [activeIndex, setActiveIndex] =
|
|
10281
|
-
const scrollRef =
|
|
10353
|
+
const [activeIndex, setActiveIndex] = React31__namespace.useState(null);
|
|
10354
|
+
const scrollRef = React31__namespace.useRef(null);
|
|
10282
10355
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
10283
10356
|
const scrollBy = (dir) => {
|
|
10284
10357
|
if (!scrollRef.current) return;
|
|
@@ -10370,18 +10443,18 @@ function Lightbox({
|
|
|
10370
10443
|
onClose
|
|
10371
10444
|
}) {
|
|
10372
10445
|
var _a;
|
|
10373
|
-
const [index, setIndex] =
|
|
10446
|
+
const [index, setIndex] = React31__namespace.useState(initialIndex);
|
|
10374
10447
|
const total = photos.length;
|
|
10375
10448
|
const photo = photos[index];
|
|
10376
|
-
const prev =
|
|
10449
|
+
const prev = React31__namespace.useCallback(
|
|
10377
10450
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
10378
10451
|
[total]
|
|
10379
10452
|
);
|
|
10380
|
-
const next =
|
|
10453
|
+
const next = React31__namespace.useCallback(
|
|
10381
10454
|
() => setIndex((i) => (i + 1) % total),
|
|
10382
10455
|
[total]
|
|
10383
10456
|
);
|
|
10384
|
-
|
|
10457
|
+
React31__namespace.useEffect(() => {
|
|
10385
10458
|
const onKey = (e) => {
|
|
10386
10459
|
if (e.key === "Escape") onClose();
|
|
10387
10460
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -10486,7 +10559,8 @@ function PhotoTile({
|
|
|
10486
10559
|
photo,
|
|
10487
10560
|
index,
|
|
10488
10561
|
className,
|
|
10489
|
-
onClick
|
|
10562
|
+
onClick,
|
|
10563
|
+
showCredit = false
|
|
10490
10564
|
}) {
|
|
10491
10565
|
var _a, _b;
|
|
10492
10566
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -10509,7 +10583,8 @@ function PhotoTile({
|
|
|
10509
10583
|
loading: "lazy"
|
|
10510
10584
|
}
|
|
10511
10585
|
),
|
|
10512
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ZoomInIcon, { className: "h-8 w-8 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300 drop-shadow-lg" }) })
|
|
10586
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ZoomInIcon, { className: "h-8 w-8 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300 drop-shadow-lg" }) }),
|
|
10587
|
+
showCredit && photo.credit && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pointer-events-none absolute bottom-2 right-2.5 text-[11px] font-ui text-white/90 [text-shadow:0_1px_3px_rgba(0,0,0,0.7)]", children: photo.credit })
|
|
10513
10588
|
]
|
|
10514
10589
|
}
|
|
10515
10590
|
);
|
|
@@ -10547,7 +10622,7 @@ function GridGallery({
|
|
|
10547
10622
|
initialVisible,
|
|
10548
10623
|
onOpen
|
|
10549
10624
|
}) {
|
|
10550
|
-
const [expanded, setExpanded] =
|
|
10625
|
+
const [expanded, setExpanded] = React31__namespace.useState(false);
|
|
10551
10626
|
const cols = gridCols(photos.length);
|
|
10552
10627
|
const hasMore = photos.length > initialVisible;
|
|
10553
10628
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -10577,7 +10652,7 @@ function CompactGridGallery({
|
|
|
10577
10652
|
initialVisible,
|
|
10578
10653
|
onOpen
|
|
10579
10654
|
}) {
|
|
10580
|
-
const [expanded, setExpanded] =
|
|
10655
|
+
const [expanded, setExpanded] = React31__namespace.useState(false);
|
|
10581
10656
|
const hasMore = photos.length > initialVisible;
|
|
10582
10657
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
10583
10658
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10606,7 +10681,7 @@ function MasonryGallery({
|
|
|
10606
10681
|
initialVisible,
|
|
10607
10682
|
onOpen
|
|
10608
10683
|
}) {
|
|
10609
|
-
const [expanded, setExpanded] =
|
|
10684
|
+
const [expanded, setExpanded] = React31__namespace.useState(false);
|
|
10610
10685
|
const hasMore = photos.length > initialVisible;
|
|
10611
10686
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
10612
10687
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10679,7 +10754,7 @@ function FeaturedGallery({
|
|
|
10679
10754
|
photos,
|
|
10680
10755
|
onOpen
|
|
10681
10756
|
}) {
|
|
10682
|
-
const [expanded, setExpanded] =
|
|
10757
|
+
const [expanded, setExpanded] = React31__namespace.useState(false);
|
|
10683
10758
|
const featured = photos.slice(0, 3);
|
|
10684
10759
|
const extra = photos.slice(3);
|
|
10685
10760
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10749,6 +10824,37 @@ function FeaturedGallery({
|
|
|
10749
10824
|
)
|
|
10750
10825
|
] });
|
|
10751
10826
|
}
|
|
10827
|
+
function CollageGallery({
|
|
10828
|
+
photos,
|
|
10829
|
+
onOpen,
|
|
10830
|
+
seamless = false
|
|
10831
|
+
}) {
|
|
10832
|
+
const [hero, ...rest] = photos;
|
|
10833
|
+
const gap = seamless ? "gap-0" : "gap-1.5";
|
|
10834
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col", gap), children: [
|
|
10835
|
+
hero && /* @__PURE__ */ jsxRuntime.jsx(
|
|
10836
|
+
PhotoTile,
|
|
10837
|
+
{
|
|
10838
|
+
photo: hero,
|
|
10839
|
+
index: 0,
|
|
10840
|
+
className: "aspect-[16/10] sm:aspect-[2/1]",
|
|
10841
|
+
onClick: () => onOpen(0),
|
|
10842
|
+
showCredit: true
|
|
10843
|
+
}
|
|
10844
|
+
),
|
|
10845
|
+
rest.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid grid-cols-2", gap), children: rest.map((p, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
10846
|
+
PhotoTile,
|
|
10847
|
+
{
|
|
10848
|
+
photo: p,
|
|
10849
|
+
index: i + 1,
|
|
10850
|
+
className: "aspect-[4/3]",
|
|
10851
|
+
onClick: () => onOpen(i + 1),
|
|
10852
|
+
showCredit: true
|
|
10853
|
+
},
|
|
10854
|
+
i + 1
|
|
10855
|
+
)) })
|
|
10856
|
+
] });
|
|
10857
|
+
}
|
|
10752
10858
|
function CarouselGallery({
|
|
10753
10859
|
photos,
|
|
10754
10860
|
index,
|
|
@@ -10846,9 +10952,9 @@ function PhotoGallery({
|
|
|
10846
10952
|
onPhotoClick,
|
|
10847
10953
|
className
|
|
10848
10954
|
}) {
|
|
10849
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
10850
|
-
const [carouselIndex, setCarouselIndex] =
|
|
10851
|
-
const normalised =
|
|
10955
|
+
const [lightboxIndex, setLightboxIndex] = React31__namespace.useState(null);
|
|
10956
|
+
const [carouselIndex, setCarouselIndex] = React31__namespace.useState(0);
|
|
10957
|
+
const normalised = React31__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
10852
10958
|
const handleOpen = (index) => {
|
|
10853
10959
|
setLightboxIndex(index);
|
|
10854
10960
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
@@ -10908,6 +11014,8 @@ function PhotoGallery({
|
|
|
10908
11014
|
),
|
|
10909
11015
|
variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
|
|
10910
11016
|
variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
|
|
11017
|
+
variant === "collage" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
|
|
11018
|
+
variant === "collageTight" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
|
|
10911
11019
|
lightbox
|
|
10912
11020
|
] });
|
|
10913
11021
|
}
|
|
@@ -10932,7 +11040,7 @@ function ItineraryDay({
|
|
|
10932
11040
|
photoLayout = "rounded",
|
|
10933
11041
|
className
|
|
10934
11042
|
}) {
|
|
10935
|
-
const photoList =
|
|
11043
|
+
const photoList = React31__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
10936
11044
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
10937
11045
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
10938
11046
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10987,8 +11095,8 @@ function MenuTrip({
|
|
|
10987
11095
|
bold = true,
|
|
10988
11096
|
className
|
|
10989
11097
|
}) {
|
|
10990
|
-
const scrollRef =
|
|
10991
|
-
|
|
11098
|
+
const scrollRef = React31__namespace.useRef(null);
|
|
11099
|
+
React31__namespace.useEffect(() => {
|
|
10992
11100
|
if (!scrollRef.current || !activeSection) return;
|
|
10993
11101
|
const container = scrollRef.current;
|
|
10994
11102
|
const btn = container.querySelector(
|
|
@@ -11184,8 +11292,8 @@ function PricingTrip({
|
|
|
11184
11292
|
className
|
|
11185
11293
|
}) {
|
|
11186
11294
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
11187
|
-
const [showEstimates, setShowEstimates] =
|
|
11188
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
11295
|
+
const [showEstimates, setShowEstimates] = React31__namespace.useState(false);
|
|
11296
|
+
const [showPriceInfo, setShowPriceInfo] = React31__namespace.useState(false);
|
|
11189
11297
|
if (variant === "compact") {
|
|
11190
11298
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
11191
11299
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -11625,14 +11733,14 @@ function SiteHeader({
|
|
|
11625
11733
|
}) {
|
|
11626
11734
|
const t = VARIANT[variant];
|
|
11627
11735
|
const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
|
|
11628
|
-
const [openMenu, setOpenMenu] =
|
|
11629
|
-
const [langOpen, setLangOpen] =
|
|
11630
|
-
const [mobileOpen, setMobileOpen] =
|
|
11631
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
11632
|
-
const [activeLang, setActiveLang] =
|
|
11736
|
+
const [openMenu, setOpenMenu] = React31__namespace.useState(null);
|
|
11737
|
+
const [langOpen, setLangOpen] = React31__namespace.useState(false);
|
|
11738
|
+
const [mobileOpen, setMobileOpen] = React31__namespace.useState(false);
|
|
11739
|
+
const [openMobileSection, setOpenMobileSection] = React31__namespace.useState(null);
|
|
11740
|
+
const [activeLang, setActiveLang] = React31__namespace.useState(currentLanguage);
|
|
11633
11741
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
11634
|
-
const menuCloseTimer =
|
|
11635
|
-
const langCloseTimer =
|
|
11742
|
+
const menuCloseTimer = React31__namespace.useRef(void 0);
|
|
11743
|
+
const langCloseTimer = React31__namespace.useRef(void 0);
|
|
11636
11744
|
const handleMenuEnter = (label) => {
|
|
11637
11745
|
clearTimeout(menuCloseTimer.current);
|
|
11638
11746
|
setOpenMenu(label);
|
|
@@ -11653,7 +11761,7 @@ function SiteHeader({
|
|
|
11653
11761
|
setOpenMenu(null);
|
|
11654
11762
|
setLangOpen(false);
|
|
11655
11763
|
};
|
|
11656
|
-
|
|
11764
|
+
React31__namespace.useEffect(() => () => {
|
|
11657
11765
|
clearTimeout(menuCloseTimer.current);
|
|
11658
11766
|
clearTimeout(langCloseTimer.current);
|
|
11659
11767
|
}, []);
|
|
@@ -11929,7 +12037,7 @@ function SiteHeader({
|
|
|
11929
12037
|
), children: [
|
|
11930
12038
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
11931
12039
|
const isActive = lang.code === activeLang;
|
|
11932
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12040
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
|
|
11933
12041
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
11934
12042
|
"text-xs select-none",
|
|
11935
12043
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -11991,8 +12099,8 @@ function SiteHeader({
|
|
|
11991
12099
|
);
|
|
11992
12100
|
}
|
|
11993
12101
|
function ThemeToggle({ className }) {
|
|
11994
|
-
const [dark, setDark] =
|
|
11995
|
-
|
|
12102
|
+
const [dark, setDark] = React31__namespace.useState(false);
|
|
12103
|
+
React31__namespace.useEffect(() => {
|
|
11996
12104
|
const saved = localStorage.getItem("theme");
|
|
11997
12105
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
11998
12106
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -12042,7 +12150,7 @@ var chipVariants = classVarianceAuthority.cva(
|
|
|
12042
12150
|
}
|
|
12043
12151
|
}
|
|
12044
12152
|
);
|
|
12045
|
-
var Chip =
|
|
12153
|
+
var Chip = React31__namespace.forwardRef(function Chip2(_a, ref) {
|
|
12046
12154
|
var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
|
|
12047
12155
|
const classes = cn(chipVariants({ variant, size }), className);
|
|
12048
12156
|
if (href) {
|
|
@@ -12144,7 +12252,7 @@ function TripCardEditorial(props) {
|
|
|
12144
12252
|
tag,
|
|
12145
12253
|
tagHref
|
|
12146
12254
|
} = props;
|
|
12147
|
-
const [internalFav, setInternalFav] =
|
|
12255
|
+
const [internalFav, setInternalFav] = React31__namespace.useState(false);
|
|
12148
12256
|
const favorited = favoritedProp != null ? favoritedProp : internalFav;
|
|
12149
12257
|
const handleFav = (e) => {
|
|
12150
12258
|
e.preventDefault();
|
|
@@ -12329,8 +12437,387 @@ function TripCard(props) {
|
|
|
12329
12437
|
}
|
|
12330
12438
|
);
|
|
12331
12439
|
}
|
|
12440
|
+
function ArrowIcon2() {
|
|
12441
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12442
|
+
"svg",
|
|
12443
|
+
{
|
|
12444
|
+
width: "13",
|
|
12445
|
+
height: "13",
|
|
12446
|
+
viewBox: "0 0 24 24",
|
|
12447
|
+
fill: "none",
|
|
12448
|
+
stroke: "currentColor",
|
|
12449
|
+
strokeWidth: "2.2",
|
|
12450
|
+
strokeLinecap: "round",
|
|
12451
|
+
strokeLinejoin: "round",
|
|
12452
|
+
children: [
|
|
12453
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
|
|
12454
|
+
/* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "12 5 19 12 12 19" })
|
|
12455
|
+
]
|
|
12456
|
+
}
|
|
12457
|
+
);
|
|
12458
|
+
}
|
|
12459
|
+
var sizeConfig2 = {
|
|
12460
|
+
sm: {
|
|
12461
|
+
card: "h-72 w-56",
|
|
12462
|
+
title: "text-lg font-bold",
|
|
12463
|
+
meta: "text-xs",
|
|
12464
|
+
excerpt: "text-xs"
|
|
12465
|
+
},
|
|
12466
|
+
md: {
|
|
12467
|
+
card: "h-96 w-72",
|
|
12468
|
+
title: "text-xl font-bold",
|
|
12469
|
+
meta: "text-xs",
|
|
12470
|
+
excerpt: "text-sm"
|
|
12471
|
+
},
|
|
12472
|
+
lg: {
|
|
12473
|
+
card: "h-[28rem] w-96",
|
|
12474
|
+
title: "text-2xl font-bold",
|
|
12475
|
+
meta: "text-sm",
|
|
12476
|
+
excerpt: "text-sm"
|
|
12477
|
+
}
|
|
12478
|
+
};
|
|
12479
|
+
function BlogCard({
|
|
12480
|
+
image,
|
|
12481
|
+
imageAlt = "",
|
|
12482
|
+
category,
|
|
12483
|
+
readingTime,
|
|
12484
|
+
date,
|
|
12485
|
+
title,
|
|
12486
|
+
excerpt,
|
|
12487
|
+
href,
|
|
12488
|
+
external,
|
|
12489
|
+
cta,
|
|
12490
|
+
size = "md",
|
|
12491
|
+
className
|
|
12492
|
+
}) {
|
|
12493
|
+
var _a;
|
|
12494
|
+
const s = sizeConfig2[size];
|
|
12495
|
+
const meta = [date != null ? date : null, readingTime != null ? readingTime : null].filter(Boolean).join(" | ");
|
|
12496
|
+
const ctaLabel = (_a = cta == null ? void 0 : cta.label) != null ? _a : "Read more";
|
|
12497
|
+
const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
12498
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12499
|
+
"img",
|
|
12500
|
+
{
|
|
12501
|
+
src: image,
|
|
12502
|
+
alt: imageAlt,
|
|
12503
|
+
loading: "lazy",
|
|
12504
|
+
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
|
|
12505
|
+
}
|
|
12506
|
+
),
|
|
12507
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/40 to-black/10" }),
|
|
12508
|
+
category ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", children: category }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10" }),
|
|
12509
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
|
|
12510
|
+
meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/70 font-medium font-ui", s.meta), children: meta }),
|
|
12511
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-white leading-snug", s.title), children: title }),
|
|
12512
|
+
excerpt && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12513
|
+
"p",
|
|
12514
|
+
{
|
|
12515
|
+
className: cn(
|
|
12516
|
+
"text-white/80 leading-relaxed -mt-1 line-clamp-2",
|
|
12517
|
+
s.excerpt
|
|
12518
|
+
),
|
|
12519
|
+
children: excerpt
|
|
12520
|
+
}
|
|
12521
|
+
),
|
|
12522
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex items-center justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12523
|
+
"span",
|
|
12524
|
+
{
|
|
12525
|
+
className: cn(
|
|
12526
|
+
"group/cta inline-flex items-center gap-1.5 border-b border-white/70 pb-0.5",
|
|
12527
|
+
"text-sm font-semibold text-white transition-colors hover:border-white hover:text-white",
|
|
12528
|
+
"font-ui"
|
|
12529
|
+
),
|
|
12530
|
+
children: [
|
|
12531
|
+
ctaLabel,
|
|
12532
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "transition-transform duration-150 group-hover/cta:translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon2, {}) })
|
|
12533
|
+
]
|
|
12534
|
+
}
|
|
12535
|
+
) })
|
|
12536
|
+
] })
|
|
12537
|
+
] });
|
|
12538
|
+
const baseClasses = cn(
|
|
12539
|
+
"group relative flex flex-col justify-between overflow-hidden rounded-2xl",
|
|
12540
|
+
"shadow-md transition-shadow duration-300 hover:shadow-xl",
|
|
12541
|
+
s.card,
|
|
12542
|
+
className
|
|
12543
|
+
);
|
|
12544
|
+
return href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12545
|
+
"a",
|
|
12546
|
+
{
|
|
12547
|
+
href,
|
|
12548
|
+
onClick: cta == null ? void 0 : cta.onClick,
|
|
12549
|
+
className: baseClasses,
|
|
12550
|
+
"aria-label": title,
|
|
12551
|
+
target: external ? "_blank" : void 0,
|
|
12552
|
+
rel: external ? "noopener noreferrer" : void 0,
|
|
12553
|
+
children: inner
|
|
12554
|
+
}
|
|
12555
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: inner });
|
|
12556
|
+
}
|
|
12557
|
+
var alignClass = {
|
|
12558
|
+
left: "text-left",
|
|
12559
|
+
center: "text-center",
|
|
12560
|
+
right: "text-right"
|
|
12561
|
+
};
|
|
12562
|
+
function Figure({
|
|
12563
|
+
caption,
|
|
12564
|
+
wide,
|
|
12565
|
+
children
|
|
12566
|
+
}) {
|
|
12567
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: cn(wide && "lg:-mx-24"), children: [
|
|
12568
|
+
children,
|
|
12569
|
+
caption && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: "mt-2.5 text-center text-xs text-muted-foreground font-sans italic", children: caption })
|
|
12570
|
+
] });
|
|
12571
|
+
}
|
|
12572
|
+
function renderBlock(block, i) {
|
|
12573
|
+
var _a, _b, _c, _d, _e;
|
|
12574
|
+
switch (block.type) {
|
|
12575
|
+
case "paragraph":
|
|
12576
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12577
|
+
"p",
|
|
12578
|
+
{
|
|
12579
|
+
className: cn(
|
|
12580
|
+
"font-sans text-foreground/90",
|
|
12581
|
+
block.lead ? "text-lg sm:text-xl leading-relaxed text-foreground" : "text-base sm:text-lg leading-relaxed"
|
|
12582
|
+
),
|
|
12583
|
+
children: block.text
|
|
12584
|
+
},
|
|
12585
|
+
i
|
|
12586
|
+
);
|
|
12587
|
+
case "heading": {
|
|
12588
|
+
const level = (_a = block.level) != null ? _a : 2;
|
|
12589
|
+
const Tag = level === 2 ? "h2" : "h3";
|
|
12590
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12591
|
+
Tag,
|
|
12592
|
+
{
|
|
12593
|
+
id: block.id,
|
|
12594
|
+
className: cn(
|
|
12595
|
+
"font-heading font-bold text-foreground scroll-mt-24",
|
|
12596
|
+
level === 2 ? "text-2xl sm:text-3xl leading-tight pt-2" : "text-xl sm:text-2xl leading-snug"
|
|
12597
|
+
),
|
|
12598
|
+
children: block.text
|
|
12599
|
+
},
|
|
12600
|
+
i
|
|
12601
|
+
);
|
|
12602
|
+
}
|
|
12603
|
+
case "image":
|
|
12604
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(Figure, { caption: block.caption, wide: block.wide, children: [
|
|
12605
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-2xl bg-muted shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12606
|
+
Picture,
|
|
12607
|
+
{
|
|
12608
|
+
src: block.src,
|
|
12609
|
+
alt: (_b = block.alt) != null ? _b : "",
|
|
12610
|
+
loading: "lazy",
|
|
12611
|
+
className: "w-full h-auto object-cover"
|
|
12612
|
+
}
|
|
12613
|
+
) }),
|
|
12614
|
+
block.credit && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sr-only", children: [
|
|
12615
|
+
"Photo: ",
|
|
12616
|
+
block.credit
|
|
12617
|
+
] })
|
|
12618
|
+
] }, i);
|
|
12619
|
+
case "collage":
|
|
12620
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Figure, { caption: block.caption, wide: block.wide, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12621
|
+
PhotoGallery,
|
|
12622
|
+
{
|
|
12623
|
+
photos: block.photos,
|
|
12624
|
+
variant: (_c = block.variant) != null ? _c : "collage",
|
|
12625
|
+
initialVisible: Infinity
|
|
12626
|
+
}
|
|
12627
|
+
) }, i);
|
|
12628
|
+
case "table":
|
|
12629
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Figure, { caption: block.caption, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto rounded-xl border border-border", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full text-sm", children: [
|
|
12630
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-muted/60", children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: block.columns.map((col) => {
|
|
12631
|
+
var _a2;
|
|
12632
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12633
|
+
"th",
|
|
12634
|
+
{
|
|
12635
|
+
className: cn(
|
|
12636
|
+
"px-4 py-3 font-ui font-semibold text-foreground whitespace-nowrap",
|
|
12637
|
+
alignClass[(_a2 = col.align) != null ? _a2 : "left"]
|
|
12638
|
+
),
|
|
12639
|
+
children: col.label
|
|
12640
|
+
},
|
|
12641
|
+
col.key
|
|
12642
|
+
);
|
|
12643
|
+
}) }) }),
|
|
12644
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "divide-y divide-border", children: block.rows.map((row, ri) => /* @__PURE__ */ jsxRuntime.jsx("tr", { className: "hover:bg-muted/30 transition-colors", children: block.columns.map((col) => {
|
|
12645
|
+
var _a2;
|
|
12646
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12647
|
+
"td",
|
|
12648
|
+
{
|
|
12649
|
+
className: cn(
|
|
12650
|
+
"px-4 py-3 font-sans text-foreground/90 align-top",
|
|
12651
|
+
alignClass[(_a2 = col.align) != null ? _a2 : "left"]
|
|
12652
|
+
),
|
|
12653
|
+
children: row[col.key]
|
|
12654
|
+
},
|
|
12655
|
+
col.key
|
|
12656
|
+
);
|
|
12657
|
+
}) }, ri)) })
|
|
12658
|
+
] }) }) }, i);
|
|
12659
|
+
case "callout": {
|
|
12660
|
+
const icon = (_d = block.icon) != null ? _d : "\u{1F449}";
|
|
12661
|
+
const cta = (_e = block.cta) != null ? _e : "Read more";
|
|
12662
|
+
const body = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12663
|
+
"div",
|
|
12664
|
+
{
|
|
12665
|
+
className: cn(
|
|
12666
|
+
"rounded-r-xl border-l-4 border-primary bg-muted/40 px-5 py-4",
|
|
12667
|
+
block.href && "transition-colors hover:bg-muted/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
12668
|
+
),
|
|
12669
|
+
children: [
|
|
12670
|
+
block.title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-ui font-semibold text-foreground", children: block.title }),
|
|
12671
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
12672
|
+
"p",
|
|
12673
|
+
{
|
|
12674
|
+
className: cn(
|
|
12675
|
+
"font-sans text-foreground/90 leading-relaxed",
|
|
12676
|
+
block.title && "mt-1"
|
|
12677
|
+
),
|
|
12678
|
+
children: [
|
|
12679
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mr-1.5", children: icon }),
|
|
12680
|
+
block.text
|
|
12681
|
+
]
|
|
12682
|
+
}
|
|
12683
|
+
),
|
|
12684
|
+
block.href && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-2 inline-flex items-center gap-1.5 font-ui text-sm font-semibold text-primary", children: [
|
|
12685
|
+
cta,
|
|
12686
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-3.5 w-3.5" })
|
|
12687
|
+
] })
|
|
12688
|
+
]
|
|
12689
|
+
}
|
|
12690
|
+
);
|
|
12691
|
+
return block.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12692
|
+
"a",
|
|
12693
|
+
{
|
|
12694
|
+
href: block.href,
|
|
12695
|
+
target: block.external ? "_blank" : void 0,
|
|
12696
|
+
rel: block.external ? "noopener noreferrer" : void 0,
|
|
12697
|
+
className: "block no-underline",
|
|
12698
|
+
children: body
|
|
12699
|
+
},
|
|
12700
|
+
i
|
|
12701
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { children: body }, i);
|
|
12702
|
+
}
|
|
12703
|
+
case "quote":
|
|
12704
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12705
|
+
"blockquote",
|
|
12706
|
+
{
|
|
12707
|
+
className: "border-l-4 border-border pl-5 py-1 font-sans text-xl sm:text-2xl italic leading-snug text-foreground",
|
|
12708
|
+
children: [
|
|
12709
|
+
block.text,
|
|
12710
|
+
block.cite && /* @__PURE__ */ jsxRuntime.jsxs("cite", { className: "mt-2 block font-ui text-sm not-italic font-semibold text-muted-foreground", children: [
|
|
12711
|
+
"\u2014 ",
|
|
12712
|
+
block.cite
|
|
12713
|
+
] })
|
|
12714
|
+
]
|
|
12715
|
+
},
|
|
12716
|
+
i
|
|
12717
|
+
);
|
|
12718
|
+
case "list": {
|
|
12719
|
+
const Tag = block.ordered ? "ol" : "ul";
|
|
12720
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12721
|
+
Tag,
|
|
12722
|
+
{
|
|
12723
|
+
className: cn(
|
|
12724
|
+
"font-sans text-base sm:text-lg leading-relaxed text-foreground/90 pl-5 space-y-2",
|
|
12725
|
+
block.ordered ? "list-decimal" : "list-disc"
|
|
12726
|
+
),
|
|
12727
|
+
children: block.items.map((item, li) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "pl-1", children: item }, li))
|
|
12728
|
+
},
|
|
12729
|
+
i
|
|
12730
|
+
);
|
|
12731
|
+
}
|
|
12732
|
+
default:
|
|
12733
|
+
return null;
|
|
12734
|
+
}
|
|
12735
|
+
}
|
|
12736
|
+
function BlogPost({
|
|
12737
|
+
image,
|
|
12738
|
+
imageAlt = "",
|
|
12739
|
+
title,
|
|
12740
|
+
category,
|
|
12741
|
+
breadcrumb,
|
|
12742
|
+
author,
|
|
12743
|
+
date,
|
|
12744
|
+
readingTime,
|
|
12745
|
+
blocks,
|
|
12746
|
+
children,
|
|
12747
|
+
related,
|
|
12748
|
+
relatedTitle = "Keep reading",
|
|
12749
|
+
className
|
|
12750
|
+
}) {
|
|
12751
|
+
const hasMeta = !!(author || date || readingTime);
|
|
12752
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn("w-full", className), children: [
|
|
12753
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full overflow-hidden bg-muted", children: [
|
|
12754
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-[62vh] min-h-[460px] w-full", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12755
|
+
Picture,
|
|
12756
|
+
{
|
|
12757
|
+
src: image,
|
|
12758
|
+
alt: imageAlt || title,
|
|
12759
|
+
fetchPriority: "high",
|
|
12760
|
+
eager: true,
|
|
12761
|
+
className: "absolute inset-0 h-full w-full object-cover"
|
|
12762
|
+
}
|
|
12763
|
+
) }),
|
|
12764
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
|
|
12765
|
+
/* @__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: [
|
|
12766
|
+
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(React31__namespace.Fragment, { children: [
|
|
12767
|
+
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
12768
|
+
crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12769
|
+
"a",
|
|
12770
|
+
{
|
|
12771
|
+
href: crumb.href,
|
|
12772
|
+
className: "text-xs text-white/70 font-ui hover:text-white transition-colors",
|
|
12773
|
+
children: crumb.label
|
|
12774
|
+
}
|
|
12775
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui", children: crumb.label })
|
|
12776
|
+
] }, i)) }),
|
|
12777
|
+
category && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", children: category }) }),
|
|
12778
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight", children: title }),
|
|
12779
|
+
hasMeta && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 flex items-center gap-4 flex-wrap", children: [
|
|
12780
|
+
author && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
|
|
12781
|
+
author.avatar && // eslint-disable-next-line @next/next/no-img-element
|
|
12782
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12783
|
+
"img",
|
|
12784
|
+
{
|
|
12785
|
+
src: author.avatar,
|
|
12786
|
+
alt: author.name,
|
|
12787
|
+
loading: "lazy",
|
|
12788
|
+
className: "h-10 w-10 rounded-full object-cover ring-2 ring-white/30"
|
|
12789
|
+
}
|
|
12790
|
+
),
|
|
12791
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "leading-tight", children: [
|
|
12792
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-white font-ui", children: author.name }),
|
|
12793
|
+
author.role && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-white/70 font-ui", children: author.role })
|
|
12794
|
+
] })
|
|
12795
|
+
] }),
|
|
12796
|
+
(date || readingTime) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4 text-white/80", children: [
|
|
12797
|
+
date && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5 text-sm font-ui", children: [
|
|
12798
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
|
|
12799
|
+
date
|
|
12800
|
+
] }),
|
|
12801
|
+
readingTime && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5 text-sm font-ui", children: [
|
|
12802
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
|
|
12803
|
+
readingTime
|
|
12804
|
+
] })
|
|
12805
|
+
] })
|
|
12806
|
+
] })
|
|
12807
|
+
] }) })
|
|
12808
|
+
] }),
|
|
12809
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-3xl px-6 sm:px-8 pt-10 sm:pt-12 pb-16", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [
|
|
12810
|
+
blocks.map((block, i) => renderBlock(block, i)),
|
|
12811
|
+
children
|
|
12812
|
+
] }) }),
|
|
12813
|
+
related && related.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-border bg-muted/30", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-5xl px-6 sm:px-8 py-12", children: [
|
|
12814
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold font-heading text-foreground mb-6", children: relatedTitle }),
|
|
12815
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-5", children: related.map((post, i) => /* @__PURE__ */ jsxRuntime.jsx(BlogCard, __spreadProps(__spreadValues({}, post), { className: "w-full" }), i)) })
|
|
12816
|
+
] }) })
|
|
12817
|
+
] });
|
|
12818
|
+
}
|
|
12332
12819
|
function useHlsVideo(videoRef, src) {
|
|
12333
|
-
|
|
12820
|
+
React31__namespace.useEffect(() => {
|
|
12334
12821
|
if (!src || !videoRef.current) return;
|
|
12335
12822
|
const video = videoRef.current;
|
|
12336
12823
|
if (!src.includes(".m3u8")) return;
|
|
@@ -12374,11 +12861,11 @@ function TripHeader({
|
|
|
12374
12861
|
className
|
|
12375
12862
|
}) {
|
|
12376
12863
|
var _a;
|
|
12377
|
-
const [heroIndex, setHeroIndex] =
|
|
12378
|
-
const [videoReady, setVideoReady] =
|
|
12379
|
-
const videoRef =
|
|
12864
|
+
const [heroIndex, setHeroIndex] = React31__namespace.useState(0);
|
|
12865
|
+
const [videoReady, setVideoReady] = React31__namespace.useState(false);
|
|
12866
|
+
const videoRef = React31__namespace.useRef(null);
|
|
12380
12867
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
12381
|
-
const validImages =
|
|
12868
|
+
const validImages = React31__namespace.useMemo(
|
|
12382
12869
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
12383
12870
|
[images]
|
|
12384
12871
|
);
|
|
@@ -12393,7 +12880,7 @@ function TripHeader({
|
|
|
12393
12880
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
12394
12881
|
const hasMeta = !!(destination || duration);
|
|
12395
12882
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
12396
|
-
|
|
12883
|
+
React31__namespace.useEffect(() => {
|
|
12397
12884
|
if (!videoUrl) return;
|
|
12398
12885
|
const el = videoRef.current;
|
|
12399
12886
|
if (!el) return;
|
|
@@ -12536,7 +13023,7 @@ function TripHeader({
|
|
|
12536
13023
|
chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
|
|
12537
13024
|
),
|
|
12538
13025
|
children: [
|
|
12539
|
-
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(
|
|
13026
|
+
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(React31__namespace.Fragment, { children: [
|
|
12540
13027
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
12541
13028
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
12542
13029
|
] }, i)) }),
|
|
@@ -12702,10 +13189,10 @@ function LanguagePicker({
|
|
|
12702
13189
|
}) {
|
|
12703
13190
|
var _a;
|
|
12704
13191
|
const t = VARIANT2[variant];
|
|
12705
|
-
const [open, setOpen] =
|
|
12706
|
-
const ref =
|
|
13192
|
+
const [open, setOpen] = React31__namespace.useState(false);
|
|
13193
|
+
const ref = React31__namespace.useRef(null);
|
|
12707
13194
|
const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
|
|
12708
|
-
|
|
13195
|
+
React31__namespace.useEffect(() => {
|
|
12709
13196
|
if (!open) return;
|
|
12710
13197
|
const onDocClick = (e) => {
|
|
12711
13198
|
if (ref.current && !ref.current.contains(e.target)) {
|
|
@@ -12906,7 +13393,7 @@ function SiteFooter({
|
|
|
12906
13393
|
children: wrapper
|
|
12907
13394
|
},
|
|
12908
13395
|
b.alt + i
|
|
12909
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
13396
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(React31__namespace.Fragment, { children: wrapper }, b.alt + i);
|
|
12910
13397
|
}) })
|
|
12911
13398
|
] }),
|
|
12912
13399
|
themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
|
|
@@ -13081,10 +13568,10 @@ function TripPage({
|
|
|
13081
13568
|
className
|
|
13082
13569
|
}) {
|
|
13083
13570
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
|
|
13084
|
-
const [activeSection, setActiveSection] =
|
|
13085
|
-
const [accordionValue, setAccordionValue] =
|
|
13086
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
13087
|
-
const accordionSectionIds =
|
|
13571
|
+
const [activeSection, setActiveSection] = React31__namespace.useState("");
|
|
13572
|
+
const [accordionValue, setAccordionValue] = React31__namespace.useState([]);
|
|
13573
|
+
const [faqsExpanded, setFaqsExpanded] = React31__namespace.useState(false);
|
|
13574
|
+
const accordionSectionIds = React31__namespace.useMemo(
|
|
13088
13575
|
() => /* @__PURE__ */ new Set([
|
|
13089
13576
|
"when-it-operates",
|
|
13090
13577
|
"how-to-get-there",
|
|
@@ -13098,18 +13585,18 @@ function TripPage({
|
|
|
13098
13585
|
]),
|
|
13099
13586
|
[]
|
|
13100
13587
|
);
|
|
13101
|
-
const [navFloating, setNavFloating] =
|
|
13102
|
-
const [navHidden, setNavHidden] =
|
|
13103
|
-
const [isFloating, setIsFloating] =
|
|
13104
|
-
const [sidebarPos, setSidebarPos] =
|
|
13105
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
13106
|
-
const navRef =
|
|
13107
|
-
const navSentinelRef =
|
|
13108
|
-
const sentinelRef =
|
|
13109
|
-
const sidebarPlaceholderRef =
|
|
13110
|
-
const pricingBarRef =
|
|
13111
|
-
const galleryRef =
|
|
13112
|
-
const sections =
|
|
13588
|
+
const [navFloating, setNavFloating] = React31__namespace.useState(false);
|
|
13589
|
+
const [navHidden, setNavHidden] = React31__namespace.useState(false);
|
|
13590
|
+
const [isFloating, setIsFloating] = React31__namespace.useState(false);
|
|
13591
|
+
const [sidebarPos, setSidebarPos] = React31__namespace.useState(null);
|
|
13592
|
+
const [pricingBarVisible, setPricingBarVisible] = React31__namespace.useState(false);
|
|
13593
|
+
const navRef = React31__namespace.useRef(null);
|
|
13594
|
+
const navSentinelRef = React31__namespace.useRef(null);
|
|
13595
|
+
const sentinelRef = React31__namespace.useRef(null);
|
|
13596
|
+
const sidebarPlaceholderRef = React31__namespace.useRef(null);
|
|
13597
|
+
const pricingBarRef = React31__namespace.useRef(null);
|
|
13598
|
+
const galleryRef = React31__namespace.useRef(null);
|
|
13599
|
+
const sections = React31__namespace.useMemo(
|
|
13113
13600
|
() => {
|
|
13114
13601
|
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
|
|
13115
13602
|
return [
|
|
@@ -13131,7 +13618,7 @@ function TripPage({
|
|
|
13131
13618
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
13132
13619
|
[]
|
|
13133
13620
|
);
|
|
13134
|
-
|
|
13621
|
+
React31__namespace.useEffect(() => {
|
|
13135
13622
|
const sentinel = navSentinelRef.current;
|
|
13136
13623
|
if (!sentinel) return;
|
|
13137
13624
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -13139,7 +13626,7 @@ function TripPage({
|
|
|
13139
13626
|
update();
|
|
13140
13627
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
13141
13628
|
}, []);
|
|
13142
|
-
|
|
13629
|
+
React31__namespace.useEffect(() => {
|
|
13143
13630
|
const sentinel = sentinelRef.current;
|
|
13144
13631
|
if (!sentinel) return;
|
|
13145
13632
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -13147,7 +13634,7 @@ function TripPage({
|
|
|
13147
13634
|
update();
|
|
13148
13635
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
13149
13636
|
}, []);
|
|
13150
|
-
|
|
13637
|
+
React31__namespace.useEffect(() => {
|
|
13151
13638
|
const measure = () => {
|
|
13152
13639
|
if (!sidebarPlaceholderRef.current) return;
|
|
13153
13640
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -13157,7 +13644,7 @@ function TripPage({
|
|
|
13157
13644
|
window.addEventListener("resize", measure);
|
|
13158
13645
|
return () => window.removeEventListener("resize", measure);
|
|
13159
13646
|
}, [isFloating]);
|
|
13160
|
-
|
|
13647
|
+
React31__namespace.useEffect(() => {
|
|
13161
13648
|
const check = () => {
|
|
13162
13649
|
var _a2;
|
|
13163
13650
|
const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
|
|
@@ -13168,7 +13655,7 @@ function TripPage({
|
|
|
13168
13655
|
check();
|
|
13169
13656
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
13170
13657
|
}, []);
|
|
13171
|
-
|
|
13658
|
+
React31__namespace.useEffect(() => {
|
|
13172
13659
|
const check = () => {
|
|
13173
13660
|
if (!pricingBarRef.current) return;
|
|
13174
13661
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -13177,7 +13664,7 @@ function TripPage({
|
|
|
13177
13664
|
check();
|
|
13178
13665
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
13179
13666
|
}, []);
|
|
13180
|
-
|
|
13667
|
+
React31__namespace.useEffect(() => {
|
|
13181
13668
|
if (sections.length === 0) return;
|
|
13182
13669
|
setActiveSection(sections[0].id);
|
|
13183
13670
|
const update = () => {
|
|
@@ -13652,123 +14139,6 @@ function TripPage({
|
|
|
13652
14139
|
}
|
|
13653
14140
|
);
|
|
13654
14141
|
}
|
|
13655
|
-
function ArrowIcon2() {
|
|
13656
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13657
|
-
"svg",
|
|
13658
|
-
{
|
|
13659
|
-
width: "13",
|
|
13660
|
-
height: "13",
|
|
13661
|
-
viewBox: "0 0 24 24",
|
|
13662
|
-
fill: "none",
|
|
13663
|
-
stroke: "currentColor",
|
|
13664
|
-
strokeWidth: "2.2",
|
|
13665
|
-
strokeLinecap: "round",
|
|
13666
|
-
strokeLinejoin: "round",
|
|
13667
|
-
children: [
|
|
13668
|
-
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
|
|
13669
|
-
/* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "12 5 19 12 12 19" })
|
|
13670
|
-
]
|
|
13671
|
-
}
|
|
13672
|
-
);
|
|
13673
|
-
}
|
|
13674
|
-
var sizeConfig2 = {
|
|
13675
|
-
sm: {
|
|
13676
|
-
card: "h-72 w-56",
|
|
13677
|
-
title: "text-lg font-bold",
|
|
13678
|
-
meta: "text-xs",
|
|
13679
|
-
excerpt: "text-xs"
|
|
13680
|
-
},
|
|
13681
|
-
md: {
|
|
13682
|
-
card: "h-96 w-72",
|
|
13683
|
-
title: "text-xl font-bold",
|
|
13684
|
-
meta: "text-xs",
|
|
13685
|
-
excerpt: "text-sm"
|
|
13686
|
-
},
|
|
13687
|
-
lg: {
|
|
13688
|
-
card: "h-[28rem] w-96",
|
|
13689
|
-
title: "text-2xl font-bold",
|
|
13690
|
-
meta: "text-sm",
|
|
13691
|
-
excerpt: "text-sm"
|
|
13692
|
-
}
|
|
13693
|
-
};
|
|
13694
|
-
function BlogCard({
|
|
13695
|
-
image,
|
|
13696
|
-
imageAlt = "",
|
|
13697
|
-
category,
|
|
13698
|
-
readingTime,
|
|
13699
|
-
date,
|
|
13700
|
-
title,
|
|
13701
|
-
excerpt,
|
|
13702
|
-
href,
|
|
13703
|
-
external,
|
|
13704
|
-
cta,
|
|
13705
|
-
size = "md",
|
|
13706
|
-
className
|
|
13707
|
-
}) {
|
|
13708
|
-
var _a;
|
|
13709
|
-
const s = sizeConfig2[size];
|
|
13710
|
-
const meta = [date != null ? date : null, readingTime != null ? readingTime : null].filter(Boolean).join(" | ");
|
|
13711
|
-
const ctaLabel = (_a = cta == null ? void 0 : cta.label) != null ? _a : "Read more";
|
|
13712
|
-
const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
13713
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
13714
|
-
"img",
|
|
13715
|
-
{
|
|
13716
|
-
src: image,
|
|
13717
|
-
alt: imageAlt,
|
|
13718
|
-
loading: "lazy",
|
|
13719
|
-
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
|
|
13720
|
-
}
|
|
13721
|
-
),
|
|
13722
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/40 to-black/10" }),
|
|
13723
|
-
category ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", children: category }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10" }),
|
|
13724
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
|
|
13725
|
-
meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/70 font-medium font-ui", s.meta), children: meta }),
|
|
13726
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-white leading-snug", s.title), children: title }),
|
|
13727
|
-
excerpt && /* @__PURE__ */ jsxRuntime.jsx(
|
|
13728
|
-
"p",
|
|
13729
|
-
{
|
|
13730
|
-
className: cn(
|
|
13731
|
-
"text-white/80 leading-relaxed -mt-1 line-clamp-2",
|
|
13732
|
-
s.excerpt
|
|
13733
|
-
),
|
|
13734
|
-
children: excerpt
|
|
13735
|
-
}
|
|
13736
|
-
),
|
|
13737
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex items-center justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13738
|
-
"span",
|
|
13739
|
-
{
|
|
13740
|
-
className: cn(
|
|
13741
|
-
"group/cta inline-flex items-center gap-1.5 border-b border-white/70 pb-0.5",
|
|
13742
|
-
"text-sm font-semibold text-white transition-colors hover:border-white hover:text-white",
|
|
13743
|
-
"font-ui"
|
|
13744
|
-
),
|
|
13745
|
-
children: [
|
|
13746
|
-
ctaLabel,
|
|
13747
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "transition-transform duration-150 group-hover/cta:translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon2, {}) })
|
|
13748
|
-
]
|
|
13749
|
-
}
|
|
13750
|
-
) })
|
|
13751
|
-
] })
|
|
13752
|
-
] });
|
|
13753
|
-
const baseClasses = cn(
|
|
13754
|
-
"group relative flex flex-col justify-between overflow-hidden rounded-2xl",
|
|
13755
|
-
"shadow-md transition-shadow duration-300 hover:shadow-xl",
|
|
13756
|
-
s.card,
|
|
13757
|
-
className
|
|
13758
|
-
);
|
|
13759
|
-
return href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
13760
|
-
"a",
|
|
13761
|
-
{
|
|
13762
|
-
href,
|
|
13763
|
-
onClick: cta == null ? void 0 : cta.onClick,
|
|
13764
|
-
className: baseClasses,
|
|
13765
|
-
"aria-label": title,
|
|
13766
|
-
target: external ? "_blank" : void 0,
|
|
13767
|
-
rel: external ? "noopener noreferrer" : void 0,
|
|
13768
|
-
children: inner
|
|
13769
|
-
}
|
|
13770
|
-
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: inner });
|
|
13771
|
-
}
|
|
13772
14142
|
function SectionHeading({
|
|
13773
14143
|
eyebrow,
|
|
13774
14144
|
title,
|
|
@@ -13819,11 +14189,11 @@ function CategoryPage2({
|
|
|
13819
14189
|
className
|
|
13820
14190
|
}) {
|
|
13821
14191
|
var _a;
|
|
13822
|
-
const [videoReady, setVideoReady] =
|
|
13823
|
-
const videoRef =
|
|
14192
|
+
const [videoReady, setVideoReady] = React31__namespace.useState(false);
|
|
14193
|
+
const videoRef = React31__namespace.useRef(null);
|
|
13824
14194
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
13825
14195
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
13826
|
-
|
|
14196
|
+
React31__namespace.useEffect(() => {
|
|
13827
14197
|
if (!videoUrl) return;
|
|
13828
14198
|
const el = videoRef.current;
|
|
13829
14199
|
if (!el) return;
|
|
@@ -13838,13 +14208,13 @@ function CategoryPage2({
|
|
|
13838
14208
|
io.observe(el);
|
|
13839
14209
|
return () => io.disconnect();
|
|
13840
14210
|
}, [videoUrl]);
|
|
13841
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
13842
|
-
const [tripsExpanded, setTripsExpanded] =
|
|
13843
|
-
const [filterValue, setFilterValue] =
|
|
13844
|
-
const [sort, setSort] =
|
|
14211
|
+
const [faqsExpanded, setFaqsExpanded] = React31__namespace.useState(false);
|
|
14212
|
+
const [tripsExpanded, setTripsExpanded] = React31__namespace.useState(false);
|
|
14213
|
+
const [filterValue, setFilterValue] = React31__namespace.useState({});
|
|
14214
|
+
const [sort, setSort] = React31__namespace.useState(
|
|
13845
14215
|
defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
|
|
13846
14216
|
);
|
|
13847
|
-
const sortedTrips =
|
|
14217
|
+
const sortedTrips = React31__namespace.useMemo(() => {
|
|
13848
14218
|
const active = Object.entries(filterValue).filter(
|
|
13849
14219
|
([, vals]) => vals && vals.length > 0
|
|
13850
14220
|
);
|
|
@@ -13948,7 +14318,7 @@ function CategoryPage2({
|
|
|
13948
14318
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
13949
14319
|
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
|
|
13950
14320
|
const isLast = i === breadcrumb.length - 1;
|
|
13951
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14321
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
|
|
13952
14322
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13953
14323
|
crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
13954
14324
|
"a",
|
|
@@ -14236,12 +14606,12 @@ function Toast({
|
|
|
14236
14606
|
duration = 6e3,
|
|
14237
14607
|
className
|
|
14238
14608
|
}) {
|
|
14239
|
-
const [mounted, setMounted] =
|
|
14240
|
-
const [visible, setVisible] =
|
|
14241
|
-
|
|
14609
|
+
const [mounted, setMounted] = React31__namespace.useState(false);
|
|
14610
|
+
const [visible, setVisible] = React31__namespace.useState(true);
|
|
14611
|
+
React31__namespace.useEffect(() => {
|
|
14242
14612
|
setMounted(true);
|
|
14243
14613
|
}, []);
|
|
14244
|
-
|
|
14614
|
+
React31__namespace.useEffect(() => {
|
|
14245
14615
|
if (duration === 0) return;
|
|
14246
14616
|
const t = setTimeout(() => {
|
|
14247
14617
|
setVisible(false);
|
|
@@ -14648,21 +15018,21 @@ function LeadCapturePopup({
|
|
|
14648
15018
|
}) {
|
|
14649
15019
|
var _a;
|
|
14650
15020
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
14651
|
-
const [open, setOpen] =
|
|
14652
|
-
const [closing, setClosing] =
|
|
14653
|
-
const [submitted, setSubmitted] =
|
|
14654
|
-
const [submitting, setSubmitting] =
|
|
14655
|
-
const [error, setError] =
|
|
14656
|
-
const [name, setName] =
|
|
14657
|
-
const [email, setEmail] =
|
|
14658
|
-
const [travelDate, setTravelDate] =
|
|
14659
|
-
const panelRef =
|
|
14660
|
-
const nameRef =
|
|
14661
|
-
const show =
|
|
15021
|
+
const [open, setOpen] = React31.useState(false);
|
|
15022
|
+
const [closing, setClosing] = React31.useState(false);
|
|
15023
|
+
const [submitted, setSubmitted] = React31.useState(false);
|
|
15024
|
+
const [submitting, setSubmitting] = React31.useState(false);
|
|
15025
|
+
const [error, setError] = React31.useState(null);
|
|
15026
|
+
const [name, setName] = React31.useState("");
|
|
15027
|
+
const [email, setEmail] = React31.useState("");
|
|
15028
|
+
const [travelDate, setTravelDate] = React31.useState("");
|
|
15029
|
+
const panelRef = React31.useRef(null);
|
|
15030
|
+
const nameRef = React31.useRef(null);
|
|
15031
|
+
const show = React31.useCallback(() => {
|
|
14662
15032
|
if (isDismissed()) return;
|
|
14663
15033
|
setOpen(true);
|
|
14664
15034
|
}, []);
|
|
14665
|
-
|
|
15035
|
+
React31.useEffect(() => {
|
|
14666
15036
|
var _a2;
|
|
14667
15037
|
if (isDismissed()) return;
|
|
14668
15038
|
if (config.trigger === "delay") {
|
|
@@ -14689,7 +15059,7 @@ function LeadCapturePopup({
|
|
|
14689
15059
|
return () => window.removeEventListener("scroll", handler);
|
|
14690
15060
|
}
|
|
14691
15061
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
14692
|
-
|
|
15062
|
+
React31.useEffect(() => {
|
|
14693
15063
|
if (open && !submitted) {
|
|
14694
15064
|
requestAnimationFrame(() => {
|
|
14695
15065
|
var _a2;
|
|
@@ -14697,7 +15067,7 @@ function LeadCapturePopup({
|
|
|
14697
15067
|
});
|
|
14698
15068
|
}
|
|
14699
15069
|
}, [open, submitted]);
|
|
14700
|
-
const close =
|
|
15070
|
+
const close = React31.useCallback(() => {
|
|
14701
15071
|
setClosing(true);
|
|
14702
15072
|
setDismissed(config.dismissDays);
|
|
14703
15073
|
setTimeout(() => {
|
|
@@ -14705,7 +15075,7 @@ function LeadCapturePopup({
|
|
|
14705
15075
|
setClosing(false);
|
|
14706
15076
|
}, 250);
|
|
14707
15077
|
}, [config.dismissDays]);
|
|
14708
|
-
|
|
15078
|
+
React31.useEffect(() => {
|
|
14709
15079
|
if (!open) return;
|
|
14710
15080
|
const handler = (e) => {
|
|
14711
15081
|
if (e.key === "Escape") close();
|
|
@@ -14713,7 +15083,7 @@ function LeadCapturePopup({
|
|
|
14713
15083
|
document.addEventListener("keydown", handler);
|
|
14714
15084
|
return () => document.removeEventListener("keydown", handler);
|
|
14715
15085
|
}, [open, close]);
|
|
14716
|
-
const onOverlayClick =
|
|
15086
|
+
const onOverlayClick = React31.useCallback(
|
|
14717
15087
|
(e) => {
|
|
14718
15088
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
14719
15089
|
close();
|
|
@@ -14951,11 +15321,11 @@ function ExoOrb({
|
|
|
14951
15321
|
trackCursor = true,
|
|
14952
15322
|
className
|
|
14953
15323
|
}) {
|
|
14954
|
-
const uid =
|
|
15324
|
+
const uid = React31.useId().replace(/:/g, "");
|
|
14955
15325
|
const id = (name) => `exo-orb-${uid}-${name}`;
|
|
14956
|
-
const rootRef =
|
|
14957
|
-
const pupilRef =
|
|
14958
|
-
|
|
15326
|
+
const rootRef = React31.useRef(null);
|
|
15327
|
+
const pupilRef = React31.useRef(null);
|
|
15328
|
+
React31.useEffect(() => {
|
|
14959
15329
|
if (!trackCursor) return;
|
|
14960
15330
|
if (typeof window === "undefined") return;
|
|
14961
15331
|
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
@@ -15151,13 +15521,13 @@ function AskExo({
|
|
|
15151
15521
|
teaserDelayMs = 2500,
|
|
15152
15522
|
teaserDurationMs = 6e3
|
|
15153
15523
|
}) {
|
|
15154
|
-
const [open, setOpen] =
|
|
15155
|
-
const [question, setQuestion] =
|
|
15156
|
-
const [teaserVisible, setTeaserVisible] =
|
|
15524
|
+
const [open, setOpen] = React31.useState(false);
|
|
15525
|
+
const [question, setQuestion] = React31.useState("");
|
|
15526
|
+
const [teaserVisible, setTeaserVisible] = React31.useState(false);
|
|
15157
15527
|
const teaserEnabled = !!teaser && teaser !== "";
|
|
15158
|
-
const inputRef =
|
|
15159
|
-
const textareaRef =
|
|
15160
|
-
|
|
15528
|
+
const inputRef = React31.useRef(null);
|
|
15529
|
+
const textareaRef = React31.useRef(null);
|
|
15530
|
+
React31.useEffect(() => {
|
|
15161
15531
|
if (!open) {
|
|
15162
15532
|
setQuestion("");
|
|
15163
15533
|
return;
|
|
@@ -15169,7 +15539,7 @@ function AskExo({
|
|
|
15169
15539
|
}, 200);
|
|
15170
15540
|
return () => clearTimeout(t);
|
|
15171
15541
|
}, [open, variant]);
|
|
15172
|
-
|
|
15542
|
+
React31.useEffect(() => {
|
|
15173
15543
|
if (!open) return;
|
|
15174
15544
|
const onKey = (e) => {
|
|
15175
15545
|
if (e.key === "Escape") setOpen(false);
|
|
@@ -15177,7 +15547,7 @@ function AskExo({
|
|
|
15177
15547
|
document.addEventListener("keydown", onKey);
|
|
15178
15548
|
return () => document.removeEventListener("keydown", onKey);
|
|
15179
15549
|
}, [open]);
|
|
15180
|
-
|
|
15550
|
+
React31.useEffect(() => {
|
|
15181
15551
|
if (!teaserEnabled || open) return;
|
|
15182
15552
|
if (typeof window === "undefined") return;
|
|
15183
15553
|
const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
|
|
@@ -15190,7 +15560,7 @@ function AskExo({
|
|
|
15190
15560
|
clearTimeout(hideTimer);
|
|
15191
15561
|
};
|
|
15192
15562
|
}, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
|
|
15193
|
-
|
|
15563
|
+
React31.useEffect(() => {
|
|
15194
15564
|
if (open) setTeaserVisible(false);
|
|
15195
15565
|
}, [open]);
|
|
15196
15566
|
const askExo = (q) => {
|
|
@@ -15743,8 +16113,8 @@ function ShareWidget({
|
|
|
15743
16113
|
title = "Invite friends & lower the price",
|
|
15744
16114
|
className
|
|
15745
16115
|
}) {
|
|
15746
|
-
const [copied, setCopied] =
|
|
15747
|
-
const [showToast, setShowToast] =
|
|
16116
|
+
const [copied, setCopied] = React31__namespace.useState(false);
|
|
16117
|
+
const [showToast, setShowToast] = React31__namespace.useState(false);
|
|
15748
16118
|
const encodedUrl = encodeURIComponent(url);
|
|
15749
16119
|
const encodedMsg = encodeURIComponent(`${message} ${url}`);
|
|
15750
16120
|
const channels = [
|
|
@@ -15899,6 +16269,8 @@ exports.AgentContactCard = AgentContactCard;
|
|
|
15899
16269
|
exports.Alert = Alert;
|
|
15900
16270
|
exports.AskExo = AskExo;
|
|
15901
16271
|
exports.BirthDateField = BirthDateField;
|
|
16272
|
+
exports.BlogCard = BlogCard;
|
|
16273
|
+
exports.BlogPost = BlogPost;
|
|
15902
16274
|
exports.BookingAdventureCard = BookingAdventureCard;
|
|
15903
16275
|
exports.BookingCancellationEmail = BookingCancellationEmail;
|
|
15904
16276
|
exports.BookingConfirmedCard = BookingConfirmedCard;
|