@planetaexo/design-system 0.57.2 → 0.58.1
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 +723 -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 +692 -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") {
|
|
@@ -10049,35 +10103,57 @@ function Picture(_a) {
|
|
|
10049
10103
|
io.observe(el);
|
|
10050
10104
|
return () => io.disconnect();
|
|
10051
10105
|
}, [eager, visible, rootMargin]);
|
|
10106
|
+
React31__namespace.useEffect(() => {
|
|
10107
|
+
setLoaded(false);
|
|
10108
|
+
}, [src]);
|
|
10052
10109
|
const webp = webpVariantUrl(src);
|
|
10053
10110
|
const realSrc = visible ? src : PLACEHOLDER_SRC;
|
|
10054
10111
|
const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
|
|
10112
|
+
const handleLoad = (e) => {
|
|
10113
|
+
if (visible) setLoaded(true);
|
|
10114
|
+
onLoad == null ? void 0 : onLoad(e);
|
|
10115
|
+
};
|
|
10116
|
+
const handleError = (e) => {
|
|
10117
|
+
if (visible) setLoaded(true);
|
|
10118
|
+
onError == null ? void 0 : onError(e);
|
|
10119
|
+
};
|
|
10120
|
+
const showLoader = visible && !loaded;
|
|
10055
10121
|
if (!webp) {
|
|
10056
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
10057
|
-
|
|
10058
|
-
|
|
10059
|
-
|
|
10060
|
-
|
|
10061
|
-
|
|
10062
|
-
|
|
10063
|
-
|
|
10064
|
-
|
|
10065
|
-
|
|
10122
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10123
|
+
showLoader && /* @__PURE__ */ jsxRuntime.jsx(PictureLoader, {}),
|
|
10124
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10125
|
+
"img",
|
|
10126
|
+
__spreadValues({
|
|
10127
|
+
ref,
|
|
10128
|
+
src: realSrc,
|
|
10129
|
+
"data-src": visible ? void 0 : src,
|
|
10130
|
+
decoding: decodingResolved,
|
|
10131
|
+
loading: loading != null ? loading : eager ? void 0 : "lazy",
|
|
10132
|
+
onLoad: handleLoad,
|
|
10133
|
+
onError: handleError
|
|
10134
|
+
}, imgProps)
|
|
10135
|
+
)
|
|
10136
|
+
] });
|
|
10066
10137
|
}
|
|
10067
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10068
|
-
|
|
10069
|
-
|
|
10070
|
-
|
|
10071
|
-
|
|
10072
|
-
|
|
10073
|
-
|
|
10074
|
-
|
|
10075
|
-
|
|
10076
|
-
|
|
10077
|
-
|
|
10078
|
-
|
|
10079
|
-
|
|
10080
|
-
|
|
10138
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10139
|
+
showLoader && /* @__PURE__ */ jsxRuntime.jsx(PictureLoader, {}),
|
|
10140
|
+
/* @__PURE__ */ jsxRuntime.jsxs("picture", { style: { display: "contents" }, children: [
|
|
10141
|
+
visible && /* @__PURE__ */ jsxRuntime.jsx("source", { srcSet: webp, type: "image/webp" }),
|
|
10142
|
+
extraSources,
|
|
10143
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10144
|
+
"img",
|
|
10145
|
+
__spreadValues({
|
|
10146
|
+
ref,
|
|
10147
|
+
src: realSrc,
|
|
10148
|
+
"data-src": visible ? void 0 : src,
|
|
10149
|
+
"data-srcset-webp": visible ? void 0 : webp,
|
|
10150
|
+
decoding: decodingResolved,
|
|
10151
|
+
loading: loading != null ? loading : eager ? void 0 : "lazy",
|
|
10152
|
+
onLoad: handleLoad,
|
|
10153
|
+
onError: handleError
|
|
10154
|
+
}, imgProps)
|
|
10155
|
+
)
|
|
10156
|
+
] })
|
|
10081
10157
|
] });
|
|
10082
10158
|
}
|
|
10083
10159
|
function ItineraryDayCard({
|
|
@@ -10146,11 +10222,11 @@ function ItineraryModal({
|
|
|
10146
10222
|
onNext
|
|
10147
10223
|
}) {
|
|
10148
10224
|
var _a, _b, _c;
|
|
10149
|
-
const [imgIndex, setImgIndex] =
|
|
10225
|
+
const [imgIndex, setImgIndex] = React31__namespace.useState(0);
|
|
10150
10226
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
10151
10227
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
10152
10228
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
10153
|
-
|
|
10229
|
+
React31__namespace.useEffect(() => {
|
|
10154
10230
|
setImgIndex(0);
|
|
10155
10231
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
10156
10232
|
if (!stop) return null;
|
|
@@ -10277,8 +10353,8 @@ function ItineraryModal({
|
|
|
10277
10353
|
) });
|
|
10278
10354
|
}
|
|
10279
10355
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
10280
|
-
const [activeIndex, setActiveIndex] =
|
|
10281
|
-
const scrollRef =
|
|
10356
|
+
const [activeIndex, setActiveIndex] = React31__namespace.useState(null);
|
|
10357
|
+
const scrollRef = React31__namespace.useRef(null);
|
|
10282
10358
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
10283
10359
|
const scrollBy = (dir) => {
|
|
10284
10360
|
if (!scrollRef.current) return;
|
|
@@ -10370,18 +10446,18 @@ function Lightbox({
|
|
|
10370
10446
|
onClose
|
|
10371
10447
|
}) {
|
|
10372
10448
|
var _a;
|
|
10373
|
-
const [index, setIndex] =
|
|
10449
|
+
const [index, setIndex] = React31__namespace.useState(initialIndex);
|
|
10374
10450
|
const total = photos.length;
|
|
10375
10451
|
const photo = photos[index];
|
|
10376
|
-
const prev =
|
|
10452
|
+
const prev = React31__namespace.useCallback(
|
|
10377
10453
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
10378
10454
|
[total]
|
|
10379
10455
|
);
|
|
10380
|
-
const next =
|
|
10456
|
+
const next = React31__namespace.useCallback(
|
|
10381
10457
|
() => setIndex((i) => (i + 1) % total),
|
|
10382
10458
|
[total]
|
|
10383
10459
|
);
|
|
10384
|
-
|
|
10460
|
+
React31__namespace.useEffect(() => {
|
|
10385
10461
|
const onKey = (e) => {
|
|
10386
10462
|
if (e.key === "Escape") onClose();
|
|
10387
10463
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -10486,7 +10562,8 @@ function PhotoTile({
|
|
|
10486
10562
|
photo,
|
|
10487
10563
|
index,
|
|
10488
10564
|
className,
|
|
10489
|
-
onClick
|
|
10565
|
+
onClick,
|
|
10566
|
+
showCredit = false
|
|
10490
10567
|
}) {
|
|
10491
10568
|
var _a, _b;
|
|
10492
10569
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -10509,7 +10586,8 @@ function PhotoTile({
|
|
|
10509
10586
|
loading: "lazy"
|
|
10510
10587
|
}
|
|
10511
10588
|
),
|
|
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" }) })
|
|
10589
|
+
/* @__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" }) }),
|
|
10590
|
+
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
10591
|
]
|
|
10514
10592
|
}
|
|
10515
10593
|
);
|
|
@@ -10547,7 +10625,7 @@ function GridGallery({
|
|
|
10547
10625
|
initialVisible,
|
|
10548
10626
|
onOpen
|
|
10549
10627
|
}) {
|
|
10550
|
-
const [expanded, setExpanded] =
|
|
10628
|
+
const [expanded, setExpanded] = React31__namespace.useState(false);
|
|
10551
10629
|
const cols = gridCols(photos.length);
|
|
10552
10630
|
const hasMore = photos.length > initialVisible;
|
|
10553
10631
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -10577,7 +10655,7 @@ function CompactGridGallery({
|
|
|
10577
10655
|
initialVisible,
|
|
10578
10656
|
onOpen
|
|
10579
10657
|
}) {
|
|
10580
|
-
const [expanded, setExpanded] =
|
|
10658
|
+
const [expanded, setExpanded] = React31__namespace.useState(false);
|
|
10581
10659
|
const hasMore = photos.length > initialVisible;
|
|
10582
10660
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
10583
10661
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10606,7 +10684,7 @@ function MasonryGallery({
|
|
|
10606
10684
|
initialVisible,
|
|
10607
10685
|
onOpen
|
|
10608
10686
|
}) {
|
|
10609
|
-
const [expanded, setExpanded] =
|
|
10687
|
+
const [expanded, setExpanded] = React31__namespace.useState(false);
|
|
10610
10688
|
const hasMore = photos.length > initialVisible;
|
|
10611
10689
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
10612
10690
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10679,7 +10757,7 @@ function FeaturedGallery({
|
|
|
10679
10757
|
photos,
|
|
10680
10758
|
onOpen
|
|
10681
10759
|
}) {
|
|
10682
|
-
const [expanded, setExpanded] =
|
|
10760
|
+
const [expanded, setExpanded] = React31__namespace.useState(false);
|
|
10683
10761
|
const featured = photos.slice(0, 3);
|
|
10684
10762
|
const extra = photos.slice(3);
|
|
10685
10763
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10749,6 +10827,37 @@ function FeaturedGallery({
|
|
|
10749
10827
|
)
|
|
10750
10828
|
] });
|
|
10751
10829
|
}
|
|
10830
|
+
function CollageGallery({
|
|
10831
|
+
photos,
|
|
10832
|
+
onOpen,
|
|
10833
|
+
seamless = false
|
|
10834
|
+
}) {
|
|
10835
|
+
const [hero, ...rest] = photos;
|
|
10836
|
+
const gap = seamless ? "gap-0" : "gap-1.5";
|
|
10837
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col", gap), children: [
|
|
10838
|
+
hero && /* @__PURE__ */ jsxRuntime.jsx(
|
|
10839
|
+
PhotoTile,
|
|
10840
|
+
{
|
|
10841
|
+
photo: hero,
|
|
10842
|
+
index: 0,
|
|
10843
|
+
className: "aspect-[16/10] sm:aspect-[2/1]",
|
|
10844
|
+
onClick: () => onOpen(0),
|
|
10845
|
+
showCredit: true
|
|
10846
|
+
}
|
|
10847
|
+
),
|
|
10848
|
+
rest.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid grid-cols-2", gap), children: rest.map((p, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
10849
|
+
PhotoTile,
|
|
10850
|
+
{
|
|
10851
|
+
photo: p,
|
|
10852
|
+
index: i + 1,
|
|
10853
|
+
className: "aspect-[4/3]",
|
|
10854
|
+
onClick: () => onOpen(i + 1),
|
|
10855
|
+
showCredit: true
|
|
10856
|
+
},
|
|
10857
|
+
i + 1
|
|
10858
|
+
)) })
|
|
10859
|
+
] });
|
|
10860
|
+
}
|
|
10752
10861
|
function CarouselGallery({
|
|
10753
10862
|
photos,
|
|
10754
10863
|
index,
|
|
@@ -10846,9 +10955,9 @@ function PhotoGallery({
|
|
|
10846
10955
|
onPhotoClick,
|
|
10847
10956
|
className
|
|
10848
10957
|
}) {
|
|
10849
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
10850
|
-
const [carouselIndex, setCarouselIndex] =
|
|
10851
|
-
const normalised =
|
|
10958
|
+
const [lightboxIndex, setLightboxIndex] = React31__namespace.useState(null);
|
|
10959
|
+
const [carouselIndex, setCarouselIndex] = React31__namespace.useState(0);
|
|
10960
|
+
const normalised = React31__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
10852
10961
|
const handleOpen = (index) => {
|
|
10853
10962
|
setLightboxIndex(index);
|
|
10854
10963
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
@@ -10908,6 +11017,8 @@ function PhotoGallery({
|
|
|
10908
11017
|
),
|
|
10909
11018
|
variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
|
|
10910
11019
|
variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
|
|
11020
|
+
variant === "collage" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
|
|
11021
|
+
variant === "collageTight" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
|
|
10911
11022
|
lightbox
|
|
10912
11023
|
] });
|
|
10913
11024
|
}
|
|
@@ -10932,7 +11043,7 @@ function ItineraryDay({
|
|
|
10932
11043
|
photoLayout = "rounded",
|
|
10933
11044
|
className
|
|
10934
11045
|
}) {
|
|
10935
|
-
const photoList =
|
|
11046
|
+
const photoList = React31__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
10936
11047
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
10937
11048
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
10938
11049
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10987,8 +11098,8 @@ function MenuTrip({
|
|
|
10987
11098
|
bold = true,
|
|
10988
11099
|
className
|
|
10989
11100
|
}) {
|
|
10990
|
-
const scrollRef =
|
|
10991
|
-
|
|
11101
|
+
const scrollRef = React31__namespace.useRef(null);
|
|
11102
|
+
React31__namespace.useEffect(() => {
|
|
10992
11103
|
if (!scrollRef.current || !activeSection) return;
|
|
10993
11104
|
const container = scrollRef.current;
|
|
10994
11105
|
const btn = container.querySelector(
|
|
@@ -11184,8 +11295,8 @@ function PricingTrip({
|
|
|
11184
11295
|
className
|
|
11185
11296
|
}) {
|
|
11186
11297
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
11187
|
-
const [showEstimates, setShowEstimates] =
|
|
11188
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
11298
|
+
const [showEstimates, setShowEstimates] = React31__namespace.useState(false);
|
|
11299
|
+
const [showPriceInfo, setShowPriceInfo] = React31__namespace.useState(false);
|
|
11189
11300
|
if (variant === "compact") {
|
|
11190
11301
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
11191
11302
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -11625,14 +11736,14 @@ function SiteHeader({
|
|
|
11625
11736
|
}) {
|
|
11626
11737
|
const t = VARIANT[variant];
|
|
11627
11738
|
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] =
|
|
11739
|
+
const [openMenu, setOpenMenu] = React31__namespace.useState(null);
|
|
11740
|
+
const [langOpen, setLangOpen] = React31__namespace.useState(false);
|
|
11741
|
+
const [mobileOpen, setMobileOpen] = React31__namespace.useState(false);
|
|
11742
|
+
const [openMobileSection, setOpenMobileSection] = React31__namespace.useState(null);
|
|
11743
|
+
const [activeLang, setActiveLang] = React31__namespace.useState(currentLanguage);
|
|
11633
11744
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
11634
|
-
const menuCloseTimer =
|
|
11635
|
-
const langCloseTimer =
|
|
11745
|
+
const menuCloseTimer = React31__namespace.useRef(void 0);
|
|
11746
|
+
const langCloseTimer = React31__namespace.useRef(void 0);
|
|
11636
11747
|
const handleMenuEnter = (label) => {
|
|
11637
11748
|
clearTimeout(menuCloseTimer.current);
|
|
11638
11749
|
setOpenMenu(label);
|
|
@@ -11653,7 +11764,7 @@ function SiteHeader({
|
|
|
11653
11764
|
setOpenMenu(null);
|
|
11654
11765
|
setLangOpen(false);
|
|
11655
11766
|
};
|
|
11656
|
-
|
|
11767
|
+
React31__namespace.useEffect(() => () => {
|
|
11657
11768
|
clearTimeout(menuCloseTimer.current);
|
|
11658
11769
|
clearTimeout(langCloseTimer.current);
|
|
11659
11770
|
}, []);
|
|
@@ -11929,7 +12040,7 @@ function SiteHeader({
|
|
|
11929
12040
|
), children: [
|
|
11930
12041
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
11931
12042
|
const isActive = lang.code === activeLang;
|
|
11932
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12043
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
|
|
11933
12044
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
11934
12045
|
"text-xs select-none",
|
|
11935
12046
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -11991,8 +12102,8 @@ function SiteHeader({
|
|
|
11991
12102
|
);
|
|
11992
12103
|
}
|
|
11993
12104
|
function ThemeToggle({ className }) {
|
|
11994
|
-
const [dark, setDark] =
|
|
11995
|
-
|
|
12105
|
+
const [dark, setDark] = React31__namespace.useState(false);
|
|
12106
|
+
React31__namespace.useEffect(() => {
|
|
11996
12107
|
const saved = localStorage.getItem("theme");
|
|
11997
12108
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
11998
12109
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -12042,7 +12153,7 @@ var chipVariants = classVarianceAuthority.cva(
|
|
|
12042
12153
|
}
|
|
12043
12154
|
}
|
|
12044
12155
|
);
|
|
12045
|
-
var Chip =
|
|
12156
|
+
var Chip = React31__namespace.forwardRef(function Chip2(_a, ref) {
|
|
12046
12157
|
var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
|
|
12047
12158
|
const classes = cn(chipVariants({ variant, size }), className);
|
|
12048
12159
|
if (href) {
|
|
@@ -12144,7 +12255,7 @@ function TripCardEditorial(props) {
|
|
|
12144
12255
|
tag,
|
|
12145
12256
|
tagHref
|
|
12146
12257
|
} = props;
|
|
12147
|
-
const [internalFav, setInternalFav] =
|
|
12258
|
+
const [internalFav, setInternalFav] = React31__namespace.useState(false);
|
|
12148
12259
|
const favorited = favoritedProp != null ? favoritedProp : internalFav;
|
|
12149
12260
|
const handleFav = (e) => {
|
|
12150
12261
|
e.preventDefault();
|
|
@@ -12329,8 +12440,387 @@ function TripCard(props) {
|
|
|
12329
12440
|
}
|
|
12330
12441
|
);
|
|
12331
12442
|
}
|
|
12443
|
+
function ArrowIcon2() {
|
|
12444
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12445
|
+
"svg",
|
|
12446
|
+
{
|
|
12447
|
+
width: "13",
|
|
12448
|
+
height: "13",
|
|
12449
|
+
viewBox: "0 0 24 24",
|
|
12450
|
+
fill: "none",
|
|
12451
|
+
stroke: "currentColor",
|
|
12452
|
+
strokeWidth: "2.2",
|
|
12453
|
+
strokeLinecap: "round",
|
|
12454
|
+
strokeLinejoin: "round",
|
|
12455
|
+
children: [
|
|
12456
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
|
|
12457
|
+
/* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "12 5 19 12 12 19" })
|
|
12458
|
+
]
|
|
12459
|
+
}
|
|
12460
|
+
);
|
|
12461
|
+
}
|
|
12462
|
+
var sizeConfig2 = {
|
|
12463
|
+
sm: {
|
|
12464
|
+
card: "h-72 w-56",
|
|
12465
|
+
title: "text-lg font-bold",
|
|
12466
|
+
meta: "text-xs",
|
|
12467
|
+
excerpt: "text-xs"
|
|
12468
|
+
},
|
|
12469
|
+
md: {
|
|
12470
|
+
card: "h-96 w-72",
|
|
12471
|
+
title: "text-xl font-bold",
|
|
12472
|
+
meta: "text-xs",
|
|
12473
|
+
excerpt: "text-sm"
|
|
12474
|
+
},
|
|
12475
|
+
lg: {
|
|
12476
|
+
card: "h-[28rem] w-96",
|
|
12477
|
+
title: "text-2xl font-bold",
|
|
12478
|
+
meta: "text-sm",
|
|
12479
|
+
excerpt: "text-sm"
|
|
12480
|
+
}
|
|
12481
|
+
};
|
|
12482
|
+
function BlogCard({
|
|
12483
|
+
image,
|
|
12484
|
+
imageAlt = "",
|
|
12485
|
+
category,
|
|
12486
|
+
readingTime,
|
|
12487
|
+
date,
|
|
12488
|
+
title,
|
|
12489
|
+
excerpt,
|
|
12490
|
+
href,
|
|
12491
|
+
external,
|
|
12492
|
+
cta,
|
|
12493
|
+
size = "md",
|
|
12494
|
+
className
|
|
12495
|
+
}) {
|
|
12496
|
+
var _a;
|
|
12497
|
+
const s = sizeConfig2[size];
|
|
12498
|
+
const meta = [date != null ? date : null, readingTime != null ? readingTime : null].filter(Boolean).join(" | ");
|
|
12499
|
+
const ctaLabel = (_a = cta == null ? void 0 : cta.label) != null ? _a : "Read more";
|
|
12500
|
+
const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
12501
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12502
|
+
"img",
|
|
12503
|
+
{
|
|
12504
|
+
src: image,
|
|
12505
|
+
alt: imageAlt,
|
|
12506
|
+
loading: "lazy",
|
|
12507
|
+
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
|
|
12508
|
+
}
|
|
12509
|
+
),
|
|
12510
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/40 to-black/10" }),
|
|
12511
|
+
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" }),
|
|
12512
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
|
|
12513
|
+
meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/70 font-medium font-ui", s.meta), children: meta }),
|
|
12514
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-white leading-snug", s.title), children: title }),
|
|
12515
|
+
excerpt && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12516
|
+
"p",
|
|
12517
|
+
{
|
|
12518
|
+
className: cn(
|
|
12519
|
+
"text-white/80 leading-relaxed -mt-1 line-clamp-2",
|
|
12520
|
+
s.excerpt
|
|
12521
|
+
),
|
|
12522
|
+
children: excerpt
|
|
12523
|
+
}
|
|
12524
|
+
),
|
|
12525
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex items-center justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12526
|
+
"span",
|
|
12527
|
+
{
|
|
12528
|
+
className: cn(
|
|
12529
|
+
"group/cta inline-flex items-center gap-1.5 border-b border-white/70 pb-0.5",
|
|
12530
|
+
"text-sm font-semibold text-white transition-colors hover:border-white hover:text-white",
|
|
12531
|
+
"font-ui"
|
|
12532
|
+
),
|
|
12533
|
+
children: [
|
|
12534
|
+
ctaLabel,
|
|
12535
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "transition-transform duration-150 group-hover/cta:translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon2, {}) })
|
|
12536
|
+
]
|
|
12537
|
+
}
|
|
12538
|
+
) })
|
|
12539
|
+
] })
|
|
12540
|
+
] });
|
|
12541
|
+
const baseClasses = cn(
|
|
12542
|
+
"group relative flex flex-col justify-between overflow-hidden rounded-2xl",
|
|
12543
|
+
"shadow-md transition-shadow duration-300 hover:shadow-xl",
|
|
12544
|
+
s.card,
|
|
12545
|
+
className
|
|
12546
|
+
);
|
|
12547
|
+
return href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12548
|
+
"a",
|
|
12549
|
+
{
|
|
12550
|
+
href,
|
|
12551
|
+
onClick: cta == null ? void 0 : cta.onClick,
|
|
12552
|
+
className: baseClasses,
|
|
12553
|
+
"aria-label": title,
|
|
12554
|
+
target: external ? "_blank" : void 0,
|
|
12555
|
+
rel: external ? "noopener noreferrer" : void 0,
|
|
12556
|
+
children: inner
|
|
12557
|
+
}
|
|
12558
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: baseClasses, children: inner });
|
|
12559
|
+
}
|
|
12560
|
+
var alignClass = {
|
|
12561
|
+
left: "text-left",
|
|
12562
|
+
center: "text-center",
|
|
12563
|
+
right: "text-right"
|
|
12564
|
+
};
|
|
12565
|
+
function Figure({
|
|
12566
|
+
caption,
|
|
12567
|
+
wide,
|
|
12568
|
+
children
|
|
12569
|
+
}) {
|
|
12570
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: cn(wide && "lg:-mx-24"), children: [
|
|
12571
|
+
children,
|
|
12572
|
+
caption && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: "mt-2.5 text-center text-xs text-muted-foreground font-sans italic", children: caption })
|
|
12573
|
+
] });
|
|
12574
|
+
}
|
|
12575
|
+
function renderBlock(block, i) {
|
|
12576
|
+
var _a, _b, _c, _d, _e;
|
|
12577
|
+
switch (block.type) {
|
|
12578
|
+
case "paragraph":
|
|
12579
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12580
|
+
"p",
|
|
12581
|
+
{
|
|
12582
|
+
className: cn(
|
|
12583
|
+
"font-sans text-foreground/90",
|
|
12584
|
+
block.lead ? "text-lg sm:text-xl leading-relaxed text-foreground" : "text-base sm:text-lg leading-relaxed"
|
|
12585
|
+
),
|
|
12586
|
+
children: block.text
|
|
12587
|
+
},
|
|
12588
|
+
i
|
|
12589
|
+
);
|
|
12590
|
+
case "heading": {
|
|
12591
|
+
const level = (_a = block.level) != null ? _a : 2;
|
|
12592
|
+
const Tag = level === 2 ? "h2" : "h3";
|
|
12593
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12594
|
+
Tag,
|
|
12595
|
+
{
|
|
12596
|
+
id: block.id,
|
|
12597
|
+
className: cn(
|
|
12598
|
+
"font-heading font-bold text-foreground scroll-mt-24",
|
|
12599
|
+
level === 2 ? "text-2xl sm:text-3xl leading-tight pt-2" : "text-xl sm:text-2xl leading-snug"
|
|
12600
|
+
),
|
|
12601
|
+
children: block.text
|
|
12602
|
+
},
|
|
12603
|
+
i
|
|
12604
|
+
);
|
|
12605
|
+
}
|
|
12606
|
+
case "image":
|
|
12607
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(Figure, { caption: block.caption, wide: block.wide, children: [
|
|
12608
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-2xl bg-muted shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12609
|
+
Picture,
|
|
12610
|
+
{
|
|
12611
|
+
src: block.src,
|
|
12612
|
+
alt: (_b = block.alt) != null ? _b : "",
|
|
12613
|
+
loading: "lazy",
|
|
12614
|
+
className: "w-full h-auto object-cover"
|
|
12615
|
+
}
|
|
12616
|
+
) }),
|
|
12617
|
+
block.credit && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sr-only", children: [
|
|
12618
|
+
"Photo: ",
|
|
12619
|
+
block.credit
|
|
12620
|
+
] })
|
|
12621
|
+
] }, i);
|
|
12622
|
+
case "collage":
|
|
12623
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Figure, { caption: block.caption, wide: block.wide, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12624
|
+
PhotoGallery,
|
|
12625
|
+
{
|
|
12626
|
+
photos: block.photos,
|
|
12627
|
+
variant: (_c = block.variant) != null ? _c : "collage",
|
|
12628
|
+
initialVisible: Infinity
|
|
12629
|
+
}
|
|
12630
|
+
) }, i);
|
|
12631
|
+
case "table":
|
|
12632
|
+
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: [
|
|
12633
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-muted/60", children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: block.columns.map((col) => {
|
|
12634
|
+
var _a2;
|
|
12635
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12636
|
+
"th",
|
|
12637
|
+
{
|
|
12638
|
+
className: cn(
|
|
12639
|
+
"px-4 py-3 font-ui font-semibold text-foreground whitespace-nowrap",
|
|
12640
|
+
alignClass[(_a2 = col.align) != null ? _a2 : "left"]
|
|
12641
|
+
),
|
|
12642
|
+
children: col.label
|
|
12643
|
+
},
|
|
12644
|
+
col.key
|
|
12645
|
+
);
|
|
12646
|
+
}) }) }),
|
|
12647
|
+
/* @__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) => {
|
|
12648
|
+
var _a2;
|
|
12649
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12650
|
+
"td",
|
|
12651
|
+
{
|
|
12652
|
+
className: cn(
|
|
12653
|
+
"px-4 py-3 font-sans text-foreground/90 align-top",
|
|
12654
|
+
alignClass[(_a2 = col.align) != null ? _a2 : "left"]
|
|
12655
|
+
),
|
|
12656
|
+
children: row[col.key]
|
|
12657
|
+
},
|
|
12658
|
+
col.key
|
|
12659
|
+
);
|
|
12660
|
+
}) }, ri)) })
|
|
12661
|
+
] }) }) }, i);
|
|
12662
|
+
case "callout": {
|
|
12663
|
+
const icon = (_d = block.icon) != null ? _d : "\u{1F449}";
|
|
12664
|
+
const cta = (_e = block.cta) != null ? _e : "Read more";
|
|
12665
|
+
const body = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12666
|
+
"div",
|
|
12667
|
+
{
|
|
12668
|
+
className: cn(
|
|
12669
|
+
"rounded-r-xl border-l-4 border-primary bg-muted/40 px-5 py-4",
|
|
12670
|
+
block.href && "transition-colors hover:bg-muted/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
12671
|
+
),
|
|
12672
|
+
children: [
|
|
12673
|
+
block.title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-ui font-semibold text-foreground", children: block.title }),
|
|
12674
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
12675
|
+
"p",
|
|
12676
|
+
{
|
|
12677
|
+
className: cn(
|
|
12678
|
+
"font-sans text-foreground/90 leading-relaxed",
|
|
12679
|
+
block.title && "mt-1"
|
|
12680
|
+
),
|
|
12681
|
+
children: [
|
|
12682
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mr-1.5", children: icon }),
|
|
12683
|
+
block.text
|
|
12684
|
+
]
|
|
12685
|
+
}
|
|
12686
|
+
),
|
|
12687
|
+
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: [
|
|
12688
|
+
cta,
|
|
12689
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-3.5 w-3.5" })
|
|
12690
|
+
] })
|
|
12691
|
+
]
|
|
12692
|
+
}
|
|
12693
|
+
);
|
|
12694
|
+
return block.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12695
|
+
"a",
|
|
12696
|
+
{
|
|
12697
|
+
href: block.href,
|
|
12698
|
+
target: block.external ? "_blank" : void 0,
|
|
12699
|
+
rel: block.external ? "noopener noreferrer" : void 0,
|
|
12700
|
+
className: "block no-underline",
|
|
12701
|
+
children: body
|
|
12702
|
+
},
|
|
12703
|
+
i
|
|
12704
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { children: body }, i);
|
|
12705
|
+
}
|
|
12706
|
+
case "quote":
|
|
12707
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12708
|
+
"blockquote",
|
|
12709
|
+
{
|
|
12710
|
+
className: "border-l-4 border-border pl-5 py-1 font-sans text-xl sm:text-2xl italic leading-snug text-foreground",
|
|
12711
|
+
children: [
|
|
12712
|
+
block.text,
|
|
12713
|
+
block.cite && /* @__PURE__ */ jsxRuntime.jsxs("cite", { className: "mt-2 block font-ui text-sm not-italic font-semibold text-muted-foreground", children: [
|
|
12714
|
+
"\u2014 ",
|
|
12715
|
+
block.cite
|
|
12716
|
+
] })
|
|
12717
|
+
]
|
|
12718
|
+
},
|
|
12719
|
+
i
|
|
12720
|
+
);
|
|
12721
|
+
case "list": {
|
|
12722
|
+
const Tag = block.ordered ? "ol" : "ul";
|
|
12723
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12724
|
+
Tag,
|
|
12725
|
+
{
|
|
12726
|
+
className: cn(
|
|
12727
|
+
"font-sans text-base sm:text-lg leading-relaxed text-foreground/90 pl-5 space-y-2",
|
|
12728
|
+
block.ordered ? "list-decimal" : "list-disc"
|
|
12729
|
+
),
|
|
12730
|
+
children: block.items.map((item, li) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "pl-1", children: item }, li))
|
|
12731
|
+
},
|
|
12732
|
+
i
|
|
12733
|
+
);
|
|
12734
|
+
}
|
|
12735
|
+
default:
|
|
12736
|
+
return null;
|
|
12737
|
+
}
|
|
12738
|
+
}
|
|
12739
|
+
function BlogPost({
|
|
12740
|
+
image,
|
|
12741
|
+
imageAlt = "",
|
|
12742
|
+
title,
|
|
12743
|
+
category,
|
|
12744
|
+
breadcrumb,
|
|
12745
|
+
author,
|
|
12746
|
+
date,
|
|
12747
|
+
readingTime,
|
|
12748
|
+
blocks,
|
|
12749
|
+
children,
|
|
12750
|
+
related,
|
|
12751
|
+
relatedTitle = "Keep reading",
|
|
12752
|
+
className
|
|
12753
|
+
}) {
|
|
12754
|
+
const hasMeta = !!(author || date || readingTime);
|
|
12755
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn("w-full", className), children: [
|
|
12756
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full overflow-hidden bg-muted", children: [
|
|
12757
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-[62vh] min-h-[460px] w-full", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12758
|
+
Picture,
|
|
12759
|
+
{
|
|
12760
|
+
src: image,
|
|
12761
|
+
alt: imageAlt || title,
|
|
12762
|
+
fetchPriority: "high",
|
|
12763
|
+
eager: true,
|
|
12764
|
+
className: "absolute inset-0 h-full w-full object-cover"
|
|
12765
|
+
}
|
|
12766
|
+
) }),
|
|
12767
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
|
|
12768
|
+
/* @__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: [
|
|
12769
|
+
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: [
|
|
12770
|
+
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
12771
|
+
crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12772
|
+
"a",
|
|
12773
|
+
{
|
|
12774
|
+
href: crumb.href,
|
|
12775
|
+
className: "text-xs text-white/70 font-ui hover:text-white transition-colors",
|
|
12776
|
+
children: crumb.label
|
|
12777
|
+
}
|
|
12778
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui", children: crumb.label })
|
|
12779
|
+
] }, i)) }),
|
|
12780
|
+
category && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3", children: /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", children: category }) }),
|
|
12781
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight", children: title }),
|
|
12782
|
+
hasMeta && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 flex items-center gap-4 flex-wrap", children: [
|
|
12783
|
+
author && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
|
|
12784
|
+
author.avatar && // eslint-disable-next-line @next/next/no-img-element
|
|
12785
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12786
|
+
"img",
|
|
12787
|
+
{
|
|
12788
|
+
src: author.avatar,
|
|
12789
|
+
alt: author.name,
|
|
12790
|
+
loading: "lazy",
|
|
12791
|
+
className: "h-10 w-10 rounded-full object-cover ring-2 ring-white/30"
|
|
12792
|
+
}
|
|
12793
|
+
),
|
|
12794
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "leading-tight", children: [
|
|
12795
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-white font-ui", children: author.name }),
|
|
12796
|
+
author.role && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-white/70 font-ui", children: author.role })
|
|
12797
|
+
] })
|
|
12798
|
+
] }),
|
|
12799
|
+
(date || readingTime) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4 text-white/80", children: [
|
|
12800
|
+
date && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5 text-sm font-ui", children: [
|
|
12801
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
|
|
12802
|
+
date
|
|
12803
|
+
] }),
|
|
12804
|
+
readingTime && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5 text-sm font-ui", children: [
|
|
12805
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
|
|
12806
|
+
readingTime
|
|
12807
|
+
] })
|
|
12808
|
+
] })
|
|
12809
|
+
] })
|
|
12810
|
+
] }) })
|
|
12811
|
+
] }),
|
|
12812
|
+
/* @__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: [
|
|
12813
|
+
blocks.map((block, i) => renderBlock(block, i)),
|
|
12814
|
+
children
|
|
12815
|
+
] }) }),
|
|
12816
|
+
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: [
|
|
12817
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold font-heading text-foreground mb-6", children: relatedTitle }),
|
|
12818
|
+
/* @__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)) })
|
|
12819
|
+
] }) })
|
|
12820
|
+
] });
|
|
12821
|
+
}
|
|
12332
12822
|
function useHlsVideo(videoRef, src) {
|
|
12333
|
-
|
|
12823
|
+
React31__namespace.useEffect(() => {
|
|
12334
12824
|
if (!src || !videoRef.current) return;
|
|
12335
12825
|
const video = videoRef.current;
|
|
12336
12826
|
if (!src.includes(".m3u8")) return;
|
|
@@ -12374,11 +12864,11 @@ function TripHeader({
|
|
|
12374
12864
|
className
|
|
12375
12865
|
}) {
|
|
12376
12866
|
var _a;
|
|
12377
|
-
const [heroIndex, setHeroIndex] =
|
|
12378
|
-
const [videoReady, setVideoReady] =
|
|
12379
|
-
const videoRef =
|
|
12867
|
+
const [heroIndex, setHeroIndex] = React31__namespace.useState(0);
|
|
12868
|
+
const [videoReady, setVideoReady] = React31__namespace.useState(false);
|
|
12869
|
+
const videoRef = React31__namespace.useRef(null);
|
|
12380
12870
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
12381
|
-
const validImages =
|
|
12871
|
+
const validImages = React31__namespace.useMemo(
|
|
12382
12872
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
12383
12873
|
[images]
|
|
12384
12874
|
);
|
|
@@ -12393,7 +12883,7 @@ function TripHeader({
|
|
|
12393
12883
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
12394
12884
|
const hasMeta = !!(destination || duration);
|
|
12395
12885
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
12396
|
-
|
|
12886
|
+
React31__namespace.useEffect(() => {
|
|
12397
12887
|
if (!videoUrl) return;
|
|
12398
12888
|
const el = videoRef.current;
|
|
12399
12889
|
if (!el) return;
|
|
@@ -12536,7 +13026,7 @@ function TripHeader({
|
|
|
12536
13026
|
chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
|
|
12537
13027
|
),
|
|
12538
13028
|
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(
|
|
13029
|
+
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
13030
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
12541
13031
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
12542
13032
|
] }, i)) }),
|
|
@@ -12702,10 +13192,10 @@ function LanguagePicker({
|
|
|
12702
13192
|
}) {
|
|
12703
13193
|
var _a;
|
|
12704
13194
|
const t = VARIANT2[variant];
|
|
12705
|
-
const [open, setOpen] =
|
|
12706
|
-
const ref =
|
|
13195
|
+
const [open, setOpen] = React31__namespace.useState(false);
|
|
13196
|
+
const ref = React31__namespace.useRef(null);
|
|
12707
13197
|
const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
|
|
12708
|
-
|
|
13198
|
+
React31__namespace.useEffect(() => {
|
|
12709
13199
|
if (!open) return;
|
|
12710
13200
|
const onDocClick = (e) => {
|
|
12711
13201
|
if (ref.current && !ref.current.contains(e.target)) {
|
|
@@ -12906,7 +13396,7 @@ function SiteFooter({
|
|
|
12906
13396
|
children: wrapper
|
|
12907
13397
|
},
|
|
12908
13398
|
b.alt + i
|
|
12909
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
13399
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(React31__namespace.Fragment, { children: wrapper }, b.alt + i);
|
|
12910
13400
|
}) })
|
|
12911
13401
|
] }),
|
|
12912
13402
|
themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
|
|
@@ -13081,10 +13571,10 @@ function TripPage({
|
|
|
13081
13571
|
className
|
|
13082
13572
|
}) {
|
|
13083
13573
|
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 =
|
|
13574
|
+
const [activeSection, setActiveSection] = React31__namespace.useState("");
|
|
13575
|
+
const [accordionValue, setAccordionValue] = React31__namespace.useState([]);
|
|
13576
|
+
const [faqsExpanded, setFaqsExpanded] = React31__namespace.useState(false);
|
|
13577
|
+
const accordionSectionIds = React31__namespace.useMemo(
|
|
13088
13578
|
() => /* @__PURE__ */ new Set([
|
|
13089
13579
|
"when-it-operates",
|
|
13090
13580
|
"how-to-get-there",
|
|
@@ -13098,18 +13588,18 @@ function TripPage({
|
|
|
13098
13588
|
]),
|
|
13099
13589
|
[]
|
|
13100
13590
|
);
|
|
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 =
|
|
13591
|
+
const [navFloating, setNavFloating] = React31__namespace.useState(false);
|
|
13592
|
+
const [navHidden, setNavHidden] = React31__namespace.useState(false);
|
|
13593
|
+
const [isFloating, setIsFloating] = React31__namespace.useState(false);
|
|
13594
|
+
const [sidebarPos, setSidebarPos] = React31__namespace.useState(null);
|
|
13595
|
+
const [pricingBarVisible, setPricingBarVisible] = React31__namespace.useState(false);
|
|
13596
|
+
const navRef = React31__namespace.useRef(null);
|
|
13597
|
+
const navSentinelRef = React31__namespace.useRef(null);
|
|
13598
|
+
const sentinelRef = React31__namespace.useRef(null);
|
|
13599
|
+
const sidebarPlaceholderRef = React31__namespace.useRef(null);
|
|
13600
|
+
const pricingBarRef = React31__namespace.useRef(null);
|
|
13601
|
+
const galleryRef = React31__namespace.useRef(null);
|
|
13602
|
+
const sections = React31__namespace.useMemo(
|
|
13113
13603
|
() => {
|
|
13114
13604
|
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
|
|
13115
13605
|
return [
|
|
@@ -13131,7 +13621,7 @@ function TripPage({
|
|
|
13131
13621
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
13132
13622
|
[]
|
|
13133
13623
|
);
|
|
13134
|
-
|
|
13624
|
+
React31__namespace.useEffect(() => {
|
|
13135
13625
|
const sentinel = navSentinelRef.current;
|
|
13136
13626
|
if (!sentinel) return;
|
|
13137
13627
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -13139,7 +13629,7 @@ function TripPage({
|
|
|
13139
13629
|
update();
|
|
13140
13630
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
13141
13631
|
}, []);
|
|
13142
|
-
|
|
13632
|
+
React31__namespace.useEffect(() => {
|
|
13143
13633
|
const sentinel = sentinelRef.current;
|
|
13144
13634
|
if (!sentinel) return;
|
|
13145
13635
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -13147,7 +13637,7 @@ function TripPage({
|
|
|
13147
13637
|
update();
|
|
13148
13638
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
13149
13639
|
}, []);
|
|
13150
|
-
|
|
13640
|
+
React31__namespace.useEffect(() => {
|
|
13151
13641
|
const measure = () => {
|
|
13152
13642
|
if (!sidebarPlaceholderRef.current) return;
|
|
13153
13643
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -13157,7 +13647,7 @@ function TripPage({
|
|
|
13157
13647
|
window.addEventListener("resize", measure);
|
|
13158
13648
|
return () => window.removeEventListener("resize", measure);
|
|
13159
13649
|
}, [isFloating]);
|
|
13160
|
-
|
|
13650
|
+
React31__namespace.useEffect(() => {
|
|
13161
13651
|
const check = () => {
|
|
13162
13652
|
var _a2;
|
|
13163
13653
|
const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
|
|
@@ -13168,7 +13658,7 @@ function TripPage({
|
|
|
13168
13658
|
check();
|
|
13169
13659
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
13170
13660
|
}, []);
|
|
13171
|
-
|
|
13661
|
+
React31__namespace.useEffect(() => {
|
|
13172
13662
|
const check = () => {
|
|
13173
13663
|
if (!pricingBarRef.current) return;
|
|
13174
13664
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -13177,7 +13667,7 @@ function TripPage({
|
|
|
13177
13667
|
check();
|
|
13178
13668
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
13179
13669
|
}, []);
|
|
13180
|
-
|
|
13670
|
+
React31__namespace.useEffect(() => {
|
|
13181
13671
|
if (sections.length === 0) return;
|
|
13182
13672
|
setActiveSection(sections[0].id);
|
|
13183
13673
|
const update = () => {
|
|
@@ -13652,123 +14142,6 @@ function TripPage({
|
|
|
13652
14142
|
}
|
|
13653
14143
|
);
|
|
13654
14144
|
}
|
|
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
14145
|
function SectionHeading({
|
|
13773
14146
|
eyebrow,
|
|
13774
14147
|
title,
|
|
@@ -13819,11 +14192,11 @@ function CategoryPage2({
|
|
|
13819
14192
|
className
|
|
13820
14193
|
}) {
|
|
13821
14194
|
var _a;
|
|
13822
|
-
const [videoReady, setVideoReady] =
|
|
13823
|
-
const videoRef =
|
|
14195
|
+
const [videoReady, setVideoReady] = React31__namespace.useState(false);
|
|
14196
|
+
const videoRef = React31__namespace.useRef(null);
|
|
13824
14197
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
13825
14198
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
13826
|
-
|
|
14199
|
+
React31__namespace.useEffect(() => {
|
|
13827
14200
|
if (!videoUrl) return;
|
|
13828
14201
|
const el = videoRef.current;
|
|
13829
14202
|
if (!el) return;
|
|
@@ -13838,13 +14211,13 @@ function CategoryPage2({
|
|
|
13838
14211
|
io.observe(el);
|
|
13839
14212
|
return () => io.disconnect();
|
|
13840
14213
|
}, [videoUrl]);
|
|
13841
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
13842
|
-
const [tripsExpanded, setTripsExpanded] =
|
|
13843
|
-
const [filterValue, setFilterValue] =
|
|
13844
|
-
const [sort, setSort] =
|
|
14214
|
+
const [faqsExpanded, setFaqsExpanded] = React31__namespace.useState(false);
|
|
14215
|
+
const [tripsExpanded, setTripsExpanded] = React31__namespace.useState(false);
|
|
14216
|
+
const [filterValue, setFilterValue] = React31__namespace.useState({});
|
|
14217
|
+
const [sort, setSort] = React31__namespace.useState(
|
|
13845
14218
|
defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
|
|
13846
14219
|
);
|
|
13847
|
-
const sortedTrips =
|
|
14220
|
+
const sortedTrips = React31__namespace.useMemo(() => {
|
|
13848
14221
|
const active = Object.entries(filterValue).filter(
|
|
13849
14222
|
([, vals]) => vals && vals.length > 0
|
|
13850
14223
|
);
|
|
@@ -13948,7 +14321,7 @@ function CategoryPage2({
|
|
|
13948
14321
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
13949
14322
|
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
14323
|
const isLast = i === breadcrumb.length - 1;
|
|
13951
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14324
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React31__namespace.Fragment, { children: [
|
|
13952
14325
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13953
14326
|
crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
13954
14327
|
"a",
|
|
@@ -14236,12 +14609,12 @@ function Toast({
|
|
|
14236
14609
|
duration = 6e3,
|
|
14237
14610
|
className
|
|
14238
14611
|
}) {
|
|
14239
|
-
const [mounted, setMounted] =
|
|
14240
|
-
const [visible, setVisible] =
|
|
14241
|
-
|
|
14612
|
+
const [mounted, setMounted] = React31__namespace.useState(false);
|
|
14613
|
+
const [visible, setVisible] = React31__namespace.useState(true);
|
|
14614
|
+
React31__namespace.useEffect(() => {
|
|
14242
14615
|
setMounted(true);
|
|
14243
14616
|
}, []);
|
|
14244
|
-
|
|
14617
|
+
React31__namespace.useEffect(() => {
|
|
14245
14618
|
if (duration === 0) return;
|
|
14246
14619
|
const t = setTimeout(() => {
|
|
14247
14620
|
setVisible(false);
|
|
@@ -14648,21 +15021,21 @@ function LeadCapturePopup({
|
|
|
14648
15021
|
}) {
|
|
14649
15022
|
var _a;
|
|
14650
15023
|
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 =
|
|
15024
|
+
const [open, setOpen] = React31.useState(false);
|
|
15025
|
+
const [closing, setClosing] = React31.useState(false);
|
|
15026
|
+
const [submitted, setSubmitted] = React31.useState(false);
|
|
15027
|
+
const [submitting, setSubmitting] = React31.useState(false);
|
|
15028
|
+
const [error, setError] = React31.useState(null);
|
|
15029
|
+
const [name, setName] = React31.useState("");
|
|
15030
|
+
const [email, setEmail] = React31.useState("");
|
|
15031
|
+
const [travelDate, setTravelDate] = React31.useState("");
|
|
15032
|
+
const panelRef = React31.useRef(null);
|
|
15033
|
+
const nameRef = React31.useRef(null);
|
|
15034
|
+
const show = React31.useCallback(() => {
|
|
14662
15035
|
if (isDismissed()) return;
|
|
14663
15036
|
setOpen(true);
|
|
14664
15037
|
}, []);
|
|
14665
|
-
|
|
15038
|
+
React31.useEffect(() => {
|
|
14666
15039
|
var _a2;
|
|
14667
15040
|
if (isDismissed()) return;
|
|
14668
15041
|
if (config.trigger === "delay") {
|
|
@@ -14689,7 +15062,7 @@ function LeadCapturePopup({
|
|
|
14689
15062
|
return () => window.removeEventListener("scroll", handler);
|
|
14690
15063
|
}
|
|
14691
15064
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
14692
|
-
|
|
15065
|
+
React31.useEffect(() => {
|
|
14693
15066
|
if (open && !submitted) {
|
|
14694
15067
|
requestAnimationFrame(() => {
|
|
14695
15068
|
var _a2;
|
|
@@ -14697,7 +15070,7 @@ function LeadCapturePopup({
|
|
|
14697
15070
|
});
|
|
14698
15071
|
}
|
|
14699
15072
|
}, [open, submitted]);
|
|
14700
|
-
const close =
|
|
15073
|
+
const close = React31.useCallback(() => {
|
|
14701
15074
|
setClosing(true);
|
|
14702
15075
|
setDismissed(config.dismissDays);
|
|
14703
15076
|
setTimeout(() => {
|
|
@@ -14705,7 +15078,7 @@ function LeadCapturePopup({
|
|
|
14705
15078
|
setClosing(false);
|
|
14706
15079
|
}, 250);
|
|
14707
15080
|
}, [config.dismissDays]);
|
|
14708
|
-
|
|
15081
|
+
React31.useEffect(() => {
|
|
14709
15082
|
if (!open) return;
|
|
14710
15083
|
const handler = (e) => {
|
|
14711
15084
|
if (e.key === "Escape") close();
|
|
@@ -14713,7 +15086,7 @@ function LeadCapturePopup({
|
|
|
14713
15086
|
document.addEventListener("keydown", handler);
|
|
14714
15087
|
return () => document.removeEventListener("keydown", handler);
|
|
14715
15088
|
}, [open, close]);
|
|
14716
|
-
const onOverlayClick =
|
|
15089
|
+
const onOverlayClick = React31.useCallback(
|
|
14717
15090
|
(e) => {
|
|
14718
15091
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
14719
15092
|
close();
|
|
@@ -14951,11 +15324,11 @@ function ExoOrb({
|
|
|
14951
15324
|
trackCursor = true,
|
|
14952
15325
|
className
|
|
14953
15326
|
}) {
|
|
14954
|
-
const uid =
|
|
15327
|
+
const uid = React31.useId().replace(/:/g, "");
|
|
14955
15328
|
const id = (name) => `exo-orb-${uid}-${name}`;
|
|
14956
|
-
const rootRef =
|
|
14957
|
-
const pupilRef =
|
|
14958
|
-
|
|
15329
|
+
const rootRef = React31.useRef(null);
|
|
15330
|
+
const pupilRef = React31.useRef(null);
|
|
15331
|
+
React31.useEffect(() => {
|
|
14959
15332
|
if (!trackCursor) return;
|
|
14960
15333
|
if (typeof window === "undefined") return;
|
|
14961
15334
|
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
@@ -15151,13 +15524,13 @@ function AskExo({
|
|
|
15151
15524
|
teaserDelayMs = 2500,
|
|
15152
15525
|
teaserDurationMs = 6e3
|
|
15153
15526
|
}) {
|
|
15154
|
-
const [open, setOpen] =
|
|
15155
|
-
const [question, setQuestion] =
|
|
15156
|
-
const [teaserVisible, setTeaserVisible] =
|
|
15527
|
+
const [open, setOpen] = React31.useState(false);
|
|
15528
|
+
const [question, setQuestion] = React31.useState("");
|
|
15529
|
+
const [teaserVisible, setTeaserVisible] = React31.useState(false);
|
|
15157
15530
|
const teaserEnabled = !!teaser && teaser !== "";
|
|
15158
|
-
const inputRef =
|
|
15159
|
-
const textareaRef =
|
|
15160
|
-
|
|
15531
|
+
const inputRef = React31.useRef(null);
|
|
15532
|
+
const textareaRef = React31.useRef(null);
|
|
15533
|
+
React31.useEffect(() => {
|
|
15161
15534
|
if (!open) {
|
|
15162
15535
|
setQuestion("");
|
|
15163
15536
|
return;
|
|
@@ -15169,7 +15542,7 @@ function AskExo({
|
|
|
15169
15542
|
}, 200);
|
|
15170
15543
|
return () => clearTimeout(t);
|
|
15171
15544
|
}, [open, variant]);
|
|
15172
|
-
|
|
15545
|
+
React31.useEffect(() => {
|
|
15173
15546
|
if (!open) return;
|
|
15174
15547
|
const onKey = (e) => {
|
|
15175
15548
|
if (e.key === "Escape") setOpen(false);
|
|
@@ -15177,7 +15550,7 @@ function AskExo({
|
|
|
15177
15550
|
document.addEventListener("keydown", onKey);
|
|
15178
15551
|
return () => document.removeEventListener("keydown", onKey);
|
|
15179
15552
|
}, [open]);
|
|
15180
|
-
|
|
15553
|
+
React31.useEffect(() => {
|
|
15181
15554
|
if (!teaserEnabled || open) return;
|
|
15182
15555
|
if (typeof window === "undefined") return;
|
|
15183
15556
|
const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
|
|
@@ -15190,7 +15563,7 @@ function AskExo({
|
|
|
15190
15563
|
clearTimeout(hideTimer);
|
|
15191
15564
|
};
|
|
15192
15565
|
}, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
|
|
15193
|
-
|
|
15566
|
+
React31.useEffect(() => {
|
|
15194
15567
|
if (open) setTeaserVisible(false);
|
|
15195
15568
|
}, [open]);
|
|
15196
15569
|
const askExo = (q) => {
|
|
@@ -15743,8 +16116,8 @@ function ShareWidget({
|
|
|
15743
16116
|
title = "Invite friends & lower the price",
|
|
15744
16117
|
className
|
|
15745
16118
|
}) {
|
|
15746
|
-
const [copied, setCopied] =
|
|
15747
|
-
const [showToast, setShowToast] =
|
|
16119
|
+
const [copied, setCopied] = React31__namespace.useState(false);
|
|
16120
|
+
const [showToast, setShowToast] = React31__namespace.useState(false);
|
|
15748
16121
|
const encodedUrl = encodeURIComponent(url);
|
|
15749
16122
|
const encodedMsg = encodeURIComponent(`${message} ${url}`);
|
|
15750
16123
|
const channels = [
|
|
@@ -15899,6 +16272,8 @@ exports.AgentContactCard = AgentContactCard;
|
|
|
15899
16272
|
exports.Alert = Alert;
|
|
15900
16273
|
exports.AskExo = AskExo;
|
|
15901
16274
|
exports.BirthDateField = BirthDateField;
|
|
16275
|
+
exports.BlogCard = BlogCard;
|
|
16276
|
+
exports.BlogPost = BlogPost;
|
|
15902
16277
|
exports.BookingAdventureCard = BookingAdventureCard;
|
|
15903
16278
|
exports.BookingCancellationEmail = BookingCancellationEmail;
|
|
15904
16279
|
exports.BookingConfirmedCard = BookingConfirmedCard;
|