@planetaexo/design-system 0.56.0 → 0.57.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 +297 -213
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.js +267 -183
- 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 React30 = 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 React30__namespace = /*#__PURE__*/_interopNamespace(React30);
|
|
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 = React30__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 = React30__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 : React30__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 = React29__namespace.forwardRef(
|
|
|
374
374
|
}
|
|
375
375
|
);
|
|
376
376
|
FloatingInput.displayName = "FloatingInput";
|
|
377
|
-
var FloatingSelect =
|
|
377
|
+
var FloatingSelect = React30__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 : React30__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] = React30__namespace.useState(false);
|
|
645
|
+
const containerRef = React30__namespace.useRef(null);
|
|
646
|
+
const listRef = React30__namespace.useRef(null);
|
|
647
647
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
648
|
-
|
|
648
|
+
React30__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
|
+
React30__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 = React30__namespace.useRef(null);
|
|
930
|
+
React30__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] = React30__namespace.useState(false);
|
|
962
|
+
const [text, setText] = React30__namespace.useState(
|
|
963
963
|
value ? dateFns.format(value, "dd/MM/yyyy") : ""
|
|
964
964
|
);
|
|
965
|
-
const containerRef =
|
|
966
|
-
const inputId =
|
|
967
|
-
|
|
965
|
+
const containerRef = React30__namespace.useRef(null);
|
|
966
|
+
const inputId = React30__namespace.useId();
|
|
967
|
+
React30__namespace.useEffect(() => {
|
|
968
968
|
setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
|
|
969
969
|
}, [value]);
|
|
970
|
-
|
|
970
|
+
React30__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] = React30__namespace.useState("");
|
|
1180
|
+
const [open, setOpen] = React30__namespace.useState(false);
|
|
1181
|
+
const containerRef = React30__namespace.useRef(null);
|
|
1182
|
+
const searchRef = React30__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
|
+
React30__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] = React30__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] = React30__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(React30__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] = React30__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] = React30__namespace.useState("responsible");
|
|
2102
|
+
const [error, setError] = React30__namespace.useState(null);
|
|
2103
|
+
const [responsible, setResponsible] = React30__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] = React30__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] = React30__namespace.useState("full");
|
|
2131
|
+
const [payMethod, setPayMethod] = React30__namespace.useState("stripe");
|
|
2132
|
+
const [termsAccepted, setTermsAccepted] = React30__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] = React30__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] = React30__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] = React30__namespace.useState(() => createInitialAddFormData(config));
|
|
3241
|
+
React30__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] = React30__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
|
+
React30__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] = React30__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] = React30__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3651
|
+
const [deleteModalState, setDeleteModalState] = React30__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3652
|
+
const [resendInviteDialogState, setResendInviteDialogState] = React30__namespace.useState({ open: false, traveller: null });
|
|
3653
|
+
const handleRequestOpenAddModal = React30__namespace.useCallback((adventureId) => {
|
|
3654
3654
|
setAddModalState({ open: true, adventureId });
|
|
3655
3655
|
}, []);
|
|
3656
|
-
const handleRequestOpenEditModal =
|
|
3656
|
+
const handleRequestOpenEditModal = React30__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 = React30__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 = React30__namespace.useCallback(
|
|
3669
3669
|
(traveller) => {
|
|
3670
3670
|
setResendInviteDialogState({ open: true, traveller });
|
|
3671
3671
|
},
|
|
3672
3672
|
[]
|
|
3673
3673
|
);
|
|
3674
|
-
const closeAddModal =
|
|
3674
|
+
const closeAddModal = React30__namespace.useCallback(() => {
|
|
3675
3675
|
setAddModalState({ open: false, adventureId: null });
|
|
3676
3676
|
}, []);
|
|
3677
|
-
const closeEditModal =
|
|
3677
|
+
const closeEditModal = React30__namespace.useCallback(() => {
|
|
3678
3678
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3679
3679
|
}, []);
|
|
3680
|
-
const closeDeleteModal =
|
|
3680
|
+
const closeDeleteModal = React30__namespace.useCallback(() => {
|
|
3681
3681
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3682
3682
|
}, []);
|
|
3683
|
-
const closeResendInviteDialog =
|
|
3683
|
+
const closeResendInviteDialog = React30__namespace.useCallback(() => {
|
|
3684
3684
|
setResendInviteDialogState({ open: false, traveller: null });
|
|
3685
3685
|
}, []);
|
|
3686
|
-
const submitInFlightRef =
|
|
3687
|
-
const handleAddSubmit =
|
|
3686
|
+
const submitInFlightRef = React30__namespace.useRef(false);
|
|
3687
|
+
const handleAddSubmit = React30__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 = React30__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 = React30__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(React30__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] = React30__namespace.useState(false);
|
|
7314
|
+
const containerRef = React30__namespace.useRef(null);
|
|
7315
|
+
const [calendarWidth, setCalendarWidth] = React30__namespace.useState();
|
|
7316
7316
|
const hasValue = !!value;
|
|
7317
|
-
|
|
7317
|
+
React30__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] = React30__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] = React30__namespace.useState(false);
|
|
7995
|
+
const containerRef = React30__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
|
+
React30__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 = React30__namespace.useMemo(
|
|
8464
8464
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
|
|
8465
8465
|
[labels]
|
|
8466
8466
|
);
|
|
8467
|
-
const sortedFields =
|
|
8467
|
+
const sortedFields = React30__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] = React30__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] = React30__namespace.useState(false);
|
|
8484
|
+
const [validationErrors, setValidationErrors] = React30__namespace.useState({});
|
|
8485
|
+
React30__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
|
+
React30__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 : React30__namespace.useId();
|
|
9005
|
+
const inputRef = React30__namespace.useRef(null);
|
|
9006
|
+
const [focused, setFocused] = React30__namespace.useState(false);
|
|
9007
|
+
const digits = React30__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 = React30__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 = React30__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 = React30__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 = React30__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 = React30__namespace.useMemo(() => resolveGroups(groups), [groups]);
|
|
9432
|
+
const [internalValue, setInternalValue] = React30__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] = React30__namespace.useState(
|
|
9437
9437
|
() => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
|
|
9438
9438
|
);
|
|
9439
|
-
const toggleExpanded =
|
|
9439
|
+
const toggleExpanded = React30__namespace.useCallback((id) => {
|
|
9440
9440
|
setExpandedItems((prev) => {
|
|
9441
9441
|
const next = new Set(prev);
|
|
9442
9442
|
if (next.has(id)) next.delete(id);
|
|
@@ -9502,7 +9502,7 @@ function FilterPanel({
|
|
|
9502
9502
|
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "px-0 py-3.5 hover:no-underline transition-colors", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2.5", children: [
|
|
9503
9503
|
group.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary shrink-0", children: group.icon }),
|
|
9504
9504
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold text-foreground font-ui", children: group.label }),
|
|
9505
|
-
groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold text-primary-foreground", children: groupSelected.length })
|
|
9505
|
+
groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold leading-none text-primary-foreground", children: groupSelected.length })
|
|
9506
9506
|
] }) }),
|
|
9507
9507
|
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "px-4 pb-3 pt-1", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9508
9508
|
FilterItemsList,
|
|
@@ -9542,7 +9542,7 @@ function FilterPanel({
|
|
|
9542
9542
|
children: [
|
|
9543
9543
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
9544
9544
|
title,
|
|
9545
|
-
totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-primary px-1.5 text-[10px] font-bold text-primary-foreground", children: totalSelected })
|
|
9545
|
+
totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-primary px-1.5 text-[10px] font-bold leading-none text-primary-foreground", children: totalSelected })
|
|
9546
9546
|
] }),
|
|
9547
9547
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.SlidersHorizontalIcon, { className: "h-4 w-4 text-foreground" })
|
|
9548
9548
|
]
|
|
@@ -9663,7 +9663,7 @@ function FilterPanel({
|
|
|
9663
9663
|
"span",
|
|
9664
9664
|
{
|
|
9665
9665
|
className: cn(
|
|
9666
|
-
"inline-flex items-center justify-center rounded-full text-[10px] font-bold px-1.5 min-w-[18px] h-[18px]",
|
|
9666
|
+
"inline-flex items-center justify-center rounded-full text-[10px] font-bold leading-none px-1.5 min-w-[18px] h-[18px]",
|
|
9667
9667
|
isActive ? "bg-background text-foreground" : "bg-foreground text-background"
|
|
9668
9668
|
),
|
|
9669
9669
|
children: selectedCount
|
|
@@ -9766,7 +9766,7 @@ function FilterPanel({
|
|
|
9766
9766
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
|
|
9767
9767
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
9768
9768
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-ui", children: title }),
|
|
9769
|
-
totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 w-5 items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-foreground", children: totalSelected })
|
|
9769
|
+
totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 w-5 items-center justify-center rounded-full bg-primary text-[10px] font-bold leading-none text-primary-foreground", children: totalSelected })
|
|
9770
9770
|
] }),
|
|
9771
9771
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9772
9772
|
Accordion,
|
|
@@ -9785,7 +9785,7 @@ function FilterPanel({
|
|
|
9785
9785
|
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "px-0 py-3.5 hover:no-underline transition-colors", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2.5", children: [
|
|
9786
9786
|
group.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary shrink-0", children: group.icon }),
|
|
9787
9787
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold text-foreground font-ui", children: group.label }),
|
|
9788
|
-
groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold text-primary-foreground", children: groupSelected.length })
|
|
9788
|
+
groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold leading-none text-primary-foreground", children: groupSelected.length })
|
|
9789
9789
|
] }) }),
|
|
9790
9790
|
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "px-4 pb-3 pt-1", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9791
9791
|
FilterItemsList,
|
|
@@ -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 = React30__namespace.useRef(null);
|
|
9824
|
+
const [widgetReady, setWidgetReady] = React30__namespace.useState(false);
|
|
9825
|
+
const [delayPassed, setDelayPassed] = React30__namespace.useState(false);
|
|
9826
9826
|
const showFallback = delayPassed && !widgetReady;
|
|
9827
|
-
|
|
9827
|
+
React30__namespace.useEffect(() => {
|
|
9828
9828
|
var _a2;
|
|
9829
9829
|
if (typeof document === "undefined" || !ref.current) return;
|
|
9830
9830
|
const node = ref.current;
|
|
@@ -10028,9 +10028,9 @@ function Picture(_a) {
|
|
|
10028
10028
|
"decoding",
|
|
10029
10029
|
"loading"
|
|
10030
10030
|
]);
|
|
10031
|
-
const ref =
|
|
10032
|
-
const [visible, setVisible] =
|
|
10033
|
-
|
|
10031
|
+
const ref = React30__namespace.useRef(null);
|
|
10032
|
+
const [visible, setVisible] = React30__namespace.useState(eager);
|
|
10033
|
+
React30__namespace.useEffect(() => {
|
|
10034
10034
|
if (eager || visible) return;
|
|
10035
10035
|
const el = ref.current;
|
|
10036
10036
|
if (!el || typeof IntersectionObserver === "undefined") {
|
|
@@ -10146,11 +10146,11 @@ function ItineraryModal({
|
|
|
10146
10146
|
onNext
|
|
10147
10147
|
}) {
|
|
10148
10148
|
var _a, _b, _c;
|
|
10149
|
-
const [imgIndex, setImgIndex] =
|
|
10149
|
+
const [imgIndex, setImgIndex] = React30__namespace.useState(0);
|
|
10150
10150
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
10151
10151
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
10152
10152
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
10153
|
-
|
|
10153
|
+
React30__namespace.useEffect(() => {
|
|
10154
10154
|
setImgIndex(0);
|
|
10155
10155
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
10156
10156
|
if (!stop) return null;
|
|
@@ -10277,8 +10277,8 @@ function ItineraryModal({
|
|
|
10277
10277
|
) });
|
|
10278
10278
|
}
|
|
10279
10279
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
10280
|
-
const [activeIndex, setActiveIndex] =
|
|
10281
|
-
const scrollRef =
|
|
10280
|
+
const [activeIndex, setActiveIndex] = React30__namespace.useState(null);
|
|
10281
|
+
const scrollRef = React30__namespace.useRef(null);
|
|
10282
10282
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
10283
10283
|
const scrollBy = (dir) => {
|
|
10284
10284
|
if (!scrollRef.current) return;
|
|
@@ -10370,18 +10370,18 @@ function Lightbox({
|
|
|
10370
10370
|
onClose
|
|
10371
10371
|
}) {
|
|
10372
10372
|
var _a;
|
|
10373
|
-
const [index, setIndex] =
|
|
10373
|
+
const [index, setIndex] = React30__namespace.useState(initialIndex);
|
|
10374
10374
|
const total = photos.length;
|
|
10375
10375
|
const photo = photos[index];
|
|
10376
|
-
const prev =
|
|
10376
|
+
const prev = React30__namespace.useCallback(
|
|
10377
10377
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
10378
10378
|
[total]
|
|
10379
10379
|
);
|
|
10380
|
-
const next =
|
|
10380
|
+
const next = React30__namespace.useCallback(
|
|
10381
10381
|
() => setIndex((i) => (i + 1) % total),
|
|
10382
10382
|
[total]
|
|
10383
10383
|
);
|
|
10384
|
-
|
|
10384
|
+
React30__namespace.useEffect(() => {
|
|
10385
10385
|
const onKey = (e) => {
|
|
10386
10386
|
if (e.key === "Escape") onClose();
|
|
10387
10387
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -10547,7 +10547,7 @@ function GridGallery({
|
|
|
10547
10547
|
initialVisible,
|
|
10548
10548
|
onOpen
|
|
10549
10549
|
}) {
|
|
10550
|
-
const [expanded, setExpanded] =
|
|
10550
|
+
const [expanded, setExpanded] = React30__namespace.useState(false);
|
|
10551
10551
|
const cols = gridCols(photos.length);
|
|
10552
10552
|
const hasMore = photos.length > initialVisible;
|
|
10553
10553
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -10577,7 +10577,7 @@ function CompactGridGallery({
|
|
|
10577
10577
|
initialVisible,
|
|
10578
10578
|
onOpen
|
|
10579
10579
|
}) {
|
|
10580
|
-
const [expanded, setExpanded] =
|
|
10580
|
+
const [expanded, setExpanded] = React30__namespace.useState(false);
|
|
10581
10581
|
const hasMore = photos.length > initialVisible;
|
|
10582
10582
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
10583
10583
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10606,7 +10606,7 @@ function MasonryGallery({
|
|
|
10606
10606
|
initialVisible,
|
|
10607
10607
|
onOpen
|
|
10608
10608
|
}) {
|
|
10609
|
-
const [expanded, setExpanded] =
|
|
10609
|
+
const [expanded, setExpanded] = React30__namespace.useState(false);
|
|
10610
10610
|
const hasMore = photos.length > initialVisible;
|
|
10611
10611
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
10612
10612
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10679,7 +10679,7 @@ function FeaturedGallery({
|
|
|
10679
10679
|
photos,
|
|
10680
10680
|
onOpen
|
|
10681
10681
|
}) {
|
|
10682
|
-
const [expanded, setExpanded] =
|
|
10682
|
+
const [expanded, setExpanded] = React30__namespace.useState(false);
|
|
10683
10683
|
const featured = photos.slice(0, 3);
|
|
10684
10684
|
const extra = photos.slice(3);
|
|
10685
10685
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -10846,9 +10846,9 @@ function PhotoGallery({
|
|
|
10846
10846
|
onPhotoClick,
|
|
10847
10847
|
className
|
|
10848
10848
|
}) {
|
|
10849
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
10850
|
-
const [carouselIndex, setCarouselIndex] =
|
|
10851
|
-
const normalised =
|
|
10849
|
+
const [lightboxIndex, setLightboxIndex] = React30__namespace.useState(null);
|
|
10850
|
+
const [carouselIndex, setCarouselIndex] = React30__namespace.useState(0);
|
|
10851
|
+
const normalised = React30__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
10852
10852
|
const handleOpen = (index) => {
|
|
10853
10853
|
setLightboxIndex(index);
|
|
10854
10854
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
@@ -10932,7 +10932,7 @@ function ItineraryDay({
|
|
|
10932
10932
|
photoLayout = "rounded",
|
|
10933
10933
|
className
|
|
10934
10934
|
}) {
|
|
10935
|
-
const photoList =
|
|
10935
|
+
const photoList = React30__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
10936
10936
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
10937
10937
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
10938
10938
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10987,8 +10987,8 @@ function MenuTrip({
|
|
|
10987
10987
|
bold = true,
|
|
10988
10988
|
className
|
|
10989
10989
|
}) {
|
|
10990
|
-
const scrollRef =
|
|
10991
|
-
|
|
10990
|
+
const scrollRef = React30__namespace.useRef(null);
|
|
10991
|
+
React30__namespace.useEffect(() => {
|
|
10992
10992
|
if (!scrollRef.current || !activeSection) return;
|
|
10993
10993
|
const container = scrollRef.current;
|
|
10994
10994
|
const btn = container.querySelector(
|
|
@@ -11184,8 +11184,8 @@ function PricingTrip({
|
|
|
11184
11184
|
className
|
|
11185
11185
|
}) {
|
|
11186
11186
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
11187
|
-
const [showEstimates, setShowEstimates] =
|
|
11188
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
11187
|
+
const [showEstimates, setShowEstimates] = React30__namespace.useState(false);
|
|
11188
|
+
const [showPriceInfo, setShowPriceInfo] = React30__namespace.useState(false);
|
|
11189
11189
|
if (variant === "compact") {
|
|
11190
11190
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
11191
11191
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -11625,14 +11625,14 @@ function SiteHeader({
|
|
|
11625
11625
|
}) {
|
|
11626
11626
|
const t = VARIANT[variant];
|
|
11627
11627
|
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] =
|
|
11628
|
+
const [openMenu, setOpenMenu] = React30__namespace.useState(null);
|
|
11629
|
+
const [langOpen, setLangOpen] = React30__namespace.useState(false);
|
|
11630
|
+
const [mobileOpen, setMobileOpen] = React30__namespace.useState(false);
|
|
11631
|
+
const [openMobileSection, setOpenMobileSection] = React30__namespace.useState(null);
|
|
11632
|
+
const [activeLang, setActiveLang] = React30__namespace.useState(currentLanguage);
|
|
11633
11633
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
11634
|
-
const menuCloseTimer =
|
|
11635
|
-
const langCloseTimer =
|
|
11634
|
+
const menuCloseTimer = React30__namespace.useRef(void 0);
|
|
11635
|
+
const langCloseTimer = React30__namespace.useRef(void 0);
|
|
11636
11636
|
const handleMenuEnter = (label) => {
|
|
11637
11637
|
clearTimeout(menuCloseTimer.current);
|
|
11638
11638
|
setOpenMenu(label);
|
|
@@ -11653,7 +11653,7 @@ function SiteHeader({
|
|
|
11653
11653
|
setOpenMenu(null);
|
|
11654
11654
|
setLangOpen(false);
|
|
11655
11655
|
};
|
|
11656
|
-
|
|
11656
|
+
React30__namespace.useEffect(() => () => {
|
|
11657
11657
|
clearTimeout(menuCloseTimer.current);
|
|
11658
11658
|
clearTimeout(langCloseTimer.current);
|
|
11659
11659
|
}, []);
|
|
@@ -11929,7 +11929,7 @@ function SiteHeader({
|
|
|
11929
11929
|
), children: [
|
|
11930
11930
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
11931
11931
|
const isActive = lang.code === activeLang;
|
|
11932
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11932
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
|
|
11933
11933
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
11934
11934
|
"text-xs select-none",
|
|
11935
11935
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -11991,8 +11991,8 @@ function SiteHeader({
|
|
|
11991
11991
|
);
|
|
11992
11992
|
}
|
|
11993
11993
|
function ThemeToggle({ className }) {
|
|
11994
|
-
const [dark, setDark] =
|
|
11995
|
-
|
|
11994
|
+
const [dark, setDark] = React30__namespace.useState(false);
|
|
11995
|
+
React30__namespace.useEffect(() => {
|
|
11996
11996
|
const saved = localStorage.getItem("theme");
|
|
11997
11997
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
11998
11998
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -12042,7 +12042,7 @@ var chipVariants = classVarianceAuthority.cva(
|
|
|
12042
12042
|
}
|
|
12043
12043
|
}
|
|
12044
12044
|
);
|
|
12045
|
-
var Chip =
|
|
12045
|
+
var Chip = React30__namespace.forwardRef(function Chip2(_a, ref) {
|
|
12046
12046
|
var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
|
|
12047
12047
|
const classes = cn(chipVariants({ variant, size }), className);
|
|
12048
12048
|
if (href) {
|
|
@@ -12139,10 +12139,12 @@ function TripCardEditorial(props) {
|
|
|
12139
12139
|
favorited: favoritedProp,
|
|
12140
12140
|
onFavoriteToggle,
|
|
12141
12141
|
location,
|
|
12142
|
+
locationHref,
|
|
12142
12143
|
difficulty,
|
|
12143
|
-
tag
|
|
12144
|
+
tag,
|
|
12145
|
+
tagHref
|
|
12144
12146
|
} = props;
|
|
12145
|
-
const [internalFav, setInternalFav] =
|
|
12147
|
+
const [internalFav, setInternalFav] = React30__namespace.useState(false);
|
|
12146
12148
|
const favorited = favoritedProp != null ? favoritedProp : internalFav;
|
|
12147
12149
|
const handleFav = (e) => {
|
|
12148
12150
|
e.preventDefault();
|
|
@@ -12163,7 +12165,23 @@ function TripCardEditorial(props) {
|
|
|
12163
12165
|
}
|
|
12164
12166
|
),
|
|
12165
12167
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/85 via-black/20 to-transparent" }),
|
|
12166
|
-
tag && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-3 left-3 z-
|
|
12168
|
+
tag && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-3 left-3 z-20 max-w-[calc(100%-4.5rem)]", children: tagHref ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
12169
|
+
"a",
|
|
12170
|
+
{
|
|
12171
|
+
href: tagHref,
|
|
12172
|
+
onClick: (e) => e.stopPropagation(),
|
|
12173
|
+
className: "inline-block rounded-full focus:outline-none focus-visible:ring-2 focus-visible:ring-white/70",
|
|
12174
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12175
|
+
Chip,
|
|
12176
|
+
{
|
|
12177
|
+
variant: "glass",
|
|
12178
|
+
size: "sm",
|
|
12179
|
+
className: "cursor-pointer transition-colors hover:bg-white/25",
|
|
12180
|
+
children: tag
|
|
12181
|
+
}
|
|
12182
|
+
)
|
|
12183
|
+
}
|
|
12184
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(Chip, { variant: "glass", size: "sm", children: tag }) }),
|
|
12167
12185
|
favoritable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12168
12186
|
"button",
|
|
12169
12187
|
{
|
|
@@ -12172,7 +12190,7 @@ function TripCardEditorial(props) {
|
|
|
12172
12190
|
"aria-pressed": favorited,
|
|
12173
12191
|
onClick: handleFav,
|
|
12174
12192
|
className: cn(
|
|
12175
|
-
"absolute top-3 right-3 flex h-9 w-9 items-center justify-center rounded-full",
|
|
12193
|
+
"absolute top-3 right-3 z-20 flex h-9 w-9 items-center justify-center rounded-full",
|
|
12176
12194
|
"border border-white/15 bg-black/30 backdrop-blur-sm",
|
|
12177
12195
|
"transition-colors hover:bg-white/10 hover:border-white/50",
|
|
12178
12196
|
favorited ? "text-white" : "text-white/85 hover:text-white"
|
|
@@ -12184,7 +12202,22 @@ function TripCardEditorial(props) {
|
|
|
12184
12202
|
] }),
|
|
12185
12203
|
(description || price || nights || location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 bg-card p-6", children: [
|
|
12186
12204
|
(location || difficulty) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
|
|
12187
|
-
location ?
|
|
12205
|
+
location ? locationHref ? (
|
|
12206
|
+
// Above the card's stretched link (z-20) so the location is
|
|
12207
|
+
// independently clickable through to its destination page.
|
|
12208
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
12209
|
+
"a",
|
|
12210
|
+
{
|
|
12211
|
+
href: locationHref,
|
|
12212
|
+
onClick: (e) => e.stopPropagation(),
|
|
12213
|
+
className: "relative z-20 flex items-center gap-1.5 text-foreground/85 transition-colors hover:text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded",
|
|
12214
|
+
children: [
|
|
12215
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
12216
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold underline-offset-2 hover:underline", children: location })
|
|
12217
|
+
]
|
|
12218
|
+
}
|
|
12219
|
+
)
|
|
12220
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-foreground/85", children: [
|
|
12188
12221
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
12189
12222
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: location })
|
|
12190
12223
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
@@ -12209,7 +12242,17 @@ function TripCardEditorial(props) {
|
|
|
12209
12242
|
"shadow-md transition-shadow duration-300 hover:shadow-xl",
|
|
12210
12243
|
className
|
|
12211
12244
|
);
|
|
12212
|
-
return
|
|
12245
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: baseClasses, children: [
|
|
12246
|
+
body,
|
|
12247
|
+
href && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12248
|
+
"a",
|
|
12249
|
+
{
|
|
12250
|
+
href,
|
|
12251
|
+
"aria-label": title,
|
|
12252
|
+
className: "absolute inset-0 z-[1] rounded-2xl focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
12253
|
+
}
|
|
12254
|
+
)
|
|
12255
|
+
] });
|
|
12213
12256
|
}
|
|
12214
12257
|
function TripCard(props) {
|
|
12215
12258
|
if (props.variant === "editorial") {
|
|
@@ -12287,7 +12330,7 @@ function TripCard(props) {
|
|
|
12287
12330
|
);
|
|
12288
12331
|
}
|
|
12289
12332
|
function useHlsVideo(videoRef, src) {
|
|
12290
|
-
|
|
12333
|
+
React30__namespace.useEffect(() => {
|
|
12291
12334
|
if (!src || !videoRef.current) return;
|
|
12292
12335
|
const video = videoRef.current;
|
|
12293
12336
|
if (!src.includes(".m3u8")) return;
|
|
@@ -12331,11 +12374,11 @@ function TripHeader({
|
|
|
12331
12374
|
className
|
|
12332
12375
|
}) {
|
|
12333
12376
|
var _a;
|
|
12334
|
-
const [heroIndex, setHeroIndex] =
|
|
12335
|
-
const [videoReady, setVideoReady] =
|
|
12336
|
-
const videoRef =
|
|
12377
|
+
const [heroIndex, setHeroIndex] = React30__namespace.useState(0);
|
|
12378
|
+
const [videoReady, setVideoReady] = React30__namespace.useState(false);
|
|
12379
|
+
const videoRef = React30__namespace.useRef(null);
|
|
12337
12380
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
12338
|
-
const validImages =
|
|
12381
|
+
const validImages = React30__namespace.useMemo(
|
|
12339
12382
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
12340
12383
|
[images]
|
|
12341
12384
|
);
|
|
@@ -12350,7 +12393,7 @@ function TripHeader({
|
|
|
12350
12393
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
12351
12394
|
const hasMeta = !!(destination || duration);
|
|
12352
12395
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
12353
|
-
|
|
12396
|
+
React30__namespace.useEffect(() => {
|
|
12354
12397
|
if (!videoUrl) return;
|
|
12355
12398
|
const el = videoRef.current;
|
|
12356
12399
|
if (!el) return;
|
|
@@ -12493,7 +12536,7 @@ function TripHeader({
|
|
|
12493
12536
|
chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
|
|
12494
12537
|
),
|
|
12495
12538
|
children: [
|
|
12496
|
-
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(
|
|
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(React30__namespace.Fragment, { children: [
|
|
12497
12540
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
12498
12541
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
12499
12542
|
] }, i)) }),
|
|
@@ -12659,10 +12702,10 @@ function LanguagePicker({
|
|
|
12659
12702
|
}) {
|
|
12660
12703
|
var _a;
|
|
12661
12704
|
const t = VARIANT2[variant];
|
|
12662
|
-
const [open, setOpen] =
|
|
12663
|
-
const ref =
|
|
12705
|
+
const [open, setOpen] = React30__namespace.useState(false);
|
|
12706
|
+
const ref = React30__namespace.useRef(null);
|
|
12664
12707
|
const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
|
|
12665
|
-
|
|
12708
|
+
React30__namespace.useEffect(() => {
|
|
12666
12709
|
if (!open) return;
|
|
12667
12710
|
const onDocClick = (e) => {
|
|
12668
12711
|
if (ref.current && !ref.current.contains(e.target)) {
|
|
@@ -12863,7 +12906,7 @@ function SiteFooter({
|
|
|
12863
12906
|
children: wrapper
|
|
12864
12907
|
},
|
|
12865
12908
|
b.alt + i
|
|
12866
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
12909
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(React30__namespace.Fragment, { children: wrapper }, b.alt + i);
|
|
12867
12910
|
}) })
|
|
12868
12911
|
] }),
|
|
12869
12912
|
themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
|
|
@@ -13038,10 +13081,10 @@ function TripPage({
|
|
|
13038
13081
|
className
|
|
13039
13082
|
}) {
|
|
13040
13083
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
|
|
13041
|
-
const [activeSection, setActiveSection] =
|
|
13042
|
-
const [accordionValue, setAccordionValue] =
|
|
13043
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
13044
|
-
const accordionSectionIds =
|
|
13084
|
+
const [activeSection, setActiveSection] = React30__namespace.useState("");
|
|
13085
|
+
const [accordionValue, setAccordionValue] = React30__namespace.useState([]);
|
|
13086
|
+
const [faqsExpanded, setFaqsExpanded] = React30__namespace.useState(false);
|
|
13087
|
+
const accordionSectionIds = React30__namespace.useMemo(
|
|
13045
13088
|
() => /* @__PURE__ */ new Set([
|
|
13046
13089
|
"when-it-operates",
|
|
13047
13090
|
"how-to-get-there",
|
|
@@ -13055,18 +13098,18 @@ function TripPage({
|
|
|
13055
13098
|
]),
|
|
13056
13099
|
[]
|
|
13057
13100
|
);
|
|
13058
|
-
const [navFloating, setNavFloating] =
|
|
13059
|
-
const [navHidden, setNavHidden] =
|
|
13060
|
-
const [isFloating, setIsFloating] =
|
|
13061
|
-
const [sidebarPos, setSidebarPos] =
|
|
13062
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
13063
|
-
const navRef =
|
|
13064
|
-
const navSentinelRef =
|
|
13065
|
-
const sentinelRef =
|
|
13066
|
-
const sidebarPlaceholderRef =
|
|
13067
|
-
const pricingBarRef =
|
|
13068
|
-
const galleryRef =
|
|
13069
|
-
const sections =
|
|
13101
|
+
const [navFloating, setNavFloating] = React30__namespace.useState(false);
|
|
13102
|
+
const [navHidden, setNavHidden] = React30__namespace.useState(false);
|
|
13103
|
+
const [isFloating, setIsFloating] = React30__namespace.useState(false);
|
|
13104
|
+
const [sidebarPos, setSidebarPos] = React30__namespace.useState(null);
|
|
13105
|
+
const [pricingBarVisible, setPricingBarVisible] = React30__namespace.useState(false);
|
|
13106
|
+
const navRef = React30__namespace.useRef(null);
|
|
13107
|
+
const navSentinelRef = React30__namespace.useRef(null);
|
|
13108
|
+
const sentinelRef = React30__namespace.useRef(null);
|
|
13109
|
+
const sidebarPlaceholderRef = React30__namespace.useRef(null);
|
|
13110
|
+
const pricingBarRef = React30__namespace.useRef(null);
|
|
13111
|
+
const galleryRef = React30__namespace.useRef(null);
|
|
13112
|
+
const sections = React30__namespace.useMemo(
|
|
13070
13113
|
() => {
|
|
13071
13114
|
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
|
|
13072
13115
|
return [
|
|
@@ -13088,7 +13131,7 @@ function TripPage({
|
|
|
13088
13131
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
13089
13132
|
[]
|
|
13090
13133
|
);
|
|
13091
|
-
|
|
13134
|
+
React30__namespace.useEffect(() => {
|
|
13092
13135
|
const sentinel = navSentinelRef.current;
|
|
13093
13136
|
if (!sentinel) return;
|
|
13094
13137
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -13096,7 +13139,7 @@ function TripPage({
|
|
|
13096
13139
|
update();
|
|
13097
13140
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
13098
13141
|
}, []);
|
|
13099
|
-
|
|
13142
|
+
React30__namespace.useEffect(() => {
|
|
13100
13143
|
const sentinel = sentinelRef.current;
|
|
13101
13144
|
if (!sentinel) return;
|
|
13102
13145
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -13104,7 +13147,7 @@ function TripPage({
|
|
|
13104
13147
|
update();
|
|
13105
13148
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
13106
13149
|
}, []);
|
|
13107
|
-
|
|
13150
|
+
React30__namespace.useEffect(() => {
|
|
13108
13151
|
const measure = () => {
|
|
13109
13152
|
if (!sidebarPlaceholderRef.current) return;
|
|
13110
13153
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -13114,7 +13157,7 @@ function TripPage({
|
|
|
13114
13157
|
window.addEventListener("resize", measure);
|
|
13115
13158
|
return () => window.removeEventListener("resize", measure);
|
|
13116
13159
|
}, [isFloating]);
|
|
13117
|
-
|
|
13160
|
+
React30__namespace.useEffect(() => {
|
|
13118
13161
|
const check = () => {
|
|
13119
13162
|
var _a2;
|
|
13120
13163
|
const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
|
|
@@ -13125,7 +13168,7 @@ function TripPage({
|
|
|
13125
13168
|
check();
|
|
13126
13169
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
13127
13170
|
}, []);
|
|
13128
|
-
|
|
13171
|
+
React30__namespace.useEffect(() => {
|
|
13129
13172
|
const check = () => {
|
|
13130
13173
|
if (!pricingBarRef.current) return;
|
|
13131
13174
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -13134,7 +13177,7 @@ function TripPage({
|
|
|
13134
13177
|
check();
|
|
13135
13178
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
13136
13179
|
}, []);
|
|
13137
|
-
|
|
13180
|
+
React30__namespace.useEffect(() => {
|
|
13138
13181
|
if (sections.length === 0) return;
|
|
13139
13182
|
setActiveSection(sections[0].id);
|
|
13140
13183
|
const update = () => {
|
|
@@ -13740,6 +13783,7 @@ function CategoryPage2({
|
|
|
13740
13783
|
title,
|
|
13741
13784
|
intro,
|
|
13742
13785
|
heroImage,
|
|
13786
|
+
videoUrl,
|
|
13743
13787
|
trustpilotMini,
|
|
13744
13788
|
breadcrumb,
|
|
13745
13789
|
siteHeader,
|
|
@@ -13772,13 +13816,32 @@ function CategoryPage2({
|
|
|
13772
13816
|
className
|
|
13773
13817
|
}) {
|
|
13774
13818
|
var _a;
|
|
13775
|
-
const [
|
|
13776
|
-
const
|
|
13777
|
-
const
|
|
13778
|
-
|
|
13819
|
+
const [videoReady, setVideoReady] = React30__namespace.useState(false);
|
|
13820
|
+
const videoRef = React30__namespace.useRef(null);
|
|
13821
|
+
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
13822
|
+
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
13823
|
+
React30__namespace.useEffect(() => {
|
|
13824
|
+
if (!videoUrl) return;
|
|
13825
|
+
const el = videoRef.current;
|
|
13826
|
+
if (!el) return;
|
|
13827
|
+
const io = new IntersectionObserver(
|
|
13828
|
+
([entry]) => {
|
|
13829
|
+
if (entry.isIntersecting) el.play().catch(() => {
|
|
13830
|
+
});
|
|
13831
|
+
else el.pause();
|
|
13832
|
+
},
|
|
13833
|
+
{ threshold: 0.1 }
|
|
13834
|
+
);
|
|
13835
|
+
io.observe(el);
|
|
13836
|
+
return () => io.disconnect();
|
|
13837
|
+
}, [videoUrl]);
|
|
13838
|
+
const [faqsExpanded, setFaqsExpanded] = React30__namespace.useState(false);
|
|
13839
|
+
const [tripsExpanded, setTripsExpanded] = React30__namespace.useState(false);
|
|
13840
|
+
const [filterValue, setFilterValue] = React30__namespace.useState({});
|
|
13841
|
+
const [sort, setSort] = React30__namespace.useState(
|
|
13779
13842
|
defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
|
|
13780
13843
|
);
|
|
13781
|
-
const sortedTrips =
|
|
13844
|
+
const sortedTrips = React30__namespace.useMemo(() => {
|
|
13782
13845
|
const active = Object.entries(filterValue).filter(
|
|
13783
13846
|
([, vals]) => vals && vals.length > 0
|
|
13784
13847
|
);
|
|
@@ -13839,15 +13902,36 @@ function CategoryPage2({
|
|
|
13839
13902
|
!heroImage && "bg-gradient-to-br from-primary-900 via-primary-800 to-primary-950"
|
|
13840
13903
|
),
|
|
13841
13904
|
children: [
|
|
13842
|
-
heroImage && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 overflow-hidden", children: [
|
|
13843
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
13905
|
+
(heroImage || videoUrl) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 overflow-hidden", children: [
|
|
13906
|
+
heroImage && /* @__PURE__ */ jsxRuntime.jsx(
|
|
13844
13907
|
"img",
|
|
13845
13908
|
{
|
|
13846
13909
|
src: heroImage,
|
|
13847
13910
|
alt: "",
|
|
13848
13911
|
"aria-hidden": true,
|
|
13849
13912
|
fetchPriority: "high",
|
|
13850
|
-
className:
|
|
13913
|
+
className: cn(
|
|
13914
|
+
"absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
|
|
13915
|
+
videoUrl && videoReady ? "opacity-0" : "opacity-100"
|
|
13916
|
+
)
|
|
13917
|
+
}
|
|
13918
|
+
),
|
|
13919
|
+
videoUrl && /* @__PURE__ */ jsxRuntime.jsx(
|
|
13920
|
+
"video",
|
|
13921
|
+
{
|
|
13922
|
+
ref: videoRef,
|
|
13923
|
+
src: isHls ? void 0 : videoUrl,
|
|
13924
|
+
autoPlay: true,
|
|
13925
|
+
muted: true,
|
|
13926
|
+
loop: true,
|
|
13927
|
+
playsInline: true,
|
|
13928
|
+
preload: "auto",
|
|
13929
|
+
poster: heroImage,
|
|
13930
|
+
onCanPlay: () => setVideoReady(true),
|
|
13931
|
+
className: cn(
|
|
13932
|
+
"absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
|
|
13933
|
+
videoReady ? "opacity-100" : "opacity-0"
|
|
13934
|
+
)
|
|
13851
13935
|
}
|
|
13852
13936
|
),
|
|
13853
13937
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-b from-black/55 via-black/40 to-black/65" })
|
|
@@ -13861,7 +13945,7 @@ function CategoryPage2({
|
|
|
13861
13945
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
13862
13946
|
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
|
|
13863
13947
|
const isLast = i === breadcrumb.length - 1;
|
|
13864
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13948
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React30__namespace.Fragment, { children: [
|
|
13865
13949
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13866
13950
|
crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
13867
13951
|
"a",
|
|
@@ -14148,12 +14232,12 @@ function Toast({
|
|
|
14148
14232
|
duration = 6e3,
|
|
14149
14233
|
className
|
|
14150
14234
|
}) {
|
|
14151
|
-
const [mounted, setMounted] =
|
|
14152
|
-
const [visible, setVisible] =
|
|
14153
|
-
|
|
14235
|
+
const [mounted, setMounted] = React30__namespace.useState(false);
|
|
14236
|
+
const [visible, setVisible] = React30__namespace.useState(true);
|
|
14237
|
+
React30__namespace.useEffect(() => {
|
|
14154
14238
|
setMounted(true);
|
|
14155
14239
|
}, []);
|
|
14156
|
-
|
|
14240
|
+
React30__namespace.useEffect(() => {
|
|
14157
14241
|
if (duration === 0) return;
|
|
14158
14242
|
const t = setTimeout(() => {
|
|
14159
14243
|
setVisible(false);
|
|
@@ -14560,21 +14644,21 @@ function LeadCapturePopup({
|
|
|
14560
14644
|
}) {
|
|
14561
14645
|
var _a;
|
|
14562
14646
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
14563
|
-
const [open, setOpen] =
|
|
14564
|
-
const [closing, setClosing] =
|
|
14565
|
-
const [submitted, setSubmitted] =
|
|
14566
|
-
const [submitting, setSubmitting] =
|
|
14567
|
-
const [error, setError] =
|
|
14568
|
-
const [name, setName] =
|
|
14569
|
-
const [email, setEmail] =
|
|
14570
|
-
const [travelDate, setTravelDate] =
|
|
14571
|
-
const panelRef =
|
|
14572
|
-
const nameRef =
|
|
14573
|
-
const show =
|
|
14647
|
+
const [open, setOpen] = React30.useState(false);
|
|
14648
|
+
const [closing, setClosing] = React30.useState(false);
|
|
14649
|
+
const [submitted, setSubmitted] = React30.useState(false);
|
|
14650
|
+
const [submitting, setSubmitting] = React30.useState(false);
|
|
14651
|
+
const [error, setError] = React30.useState(null);
|
|
14652
|
+
const [name, setName] = React30.useState("");
|
|
14653
|
+
const [email, setEmail] = React30.useState("");
|
|
14654
|
+
const [travelDate, setTravelDate] = React30.useState("");
|
|
14655
|
+
const panelRef = React30.useRef(null);
|
|
14656
|
+
const nameRef = React30.useRef(null);
|
|
14657
|
+
const show = React30.useCallback(() => {
|
|
14574
14658
|
if (isDismissed()) return;
|
|
14575
14659
|
setOpen(true);
|
|
14576
14660
|
}, []);
|
|
14577
|
-
|
|
14661
|
+
React30.useEffect(() => {
|
|
14578
14662
|
var _a2;
|
|
14579
14663
|
if (isDismissed()) return;
|
|
14580
14664
|
if (config.trigger === "delay") {
|
|
@@ -14601,7 +14685,7 @@ function LeadCapturePopup({
|
|
|
14601
14685
|
return () => window.removeEventListener("scroll", handler);
|
|
14602
14686
|
}
|
|
14603
14687
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
14604
|
-
|
|
14688
|
+
React30.useEffect(() => {
|
|
14605
14689
|
if (open && !submitted) {
|
|
14606
14690
|
requestAnimationFrame(() => {
|
|
14607
14691
|
var _a2;
|
|
@@ -14609,7 +14693,7 @@ function LeadCapturePopup({
|
|
|
14609
14693
|
});
|
|
14610
14694
|
}
|
|
14611
14695
|
}, [open, submitted]);
|
|
14612
|
-
const close =
|
|
14696
|
+
const close = React30.useCallback(() => {
|
|
14613
14697
|
setClosing(true);
|
|
14614
14698
|
setDismissed(config.dismissDays);
|
|
14615
14699
|
setTimeout(() => {
|
|
@@ -14617,7 +14701,7 @@ function LeadCapturePopup({
|
|
|
14617
14701
|
setClosing(false);
|
|
14618
14702
|
}, 250);
|
|
14619
14703
|
}, [config.dismissDays]);
|
|
14620
|
-
|
|
14704
|
+
React30.useEffect(() => {
|
|
14621
14705
|
if (!open) return;
|
|
14622
14706
|
const handler = (e) => {
|
|
14623
14707
|
if (e.key === "Escape") close();
|
|
@@ -14625,7 +14709,7 @@ function LeadCapturePopup({
|
|
|
14625
14709
|
document.addEventListener("keydown", handler);
|
|
14626
14710
|
return () => document.removeEventListener("keydown", handler);
|
|
14627
14711
|
}, [open, close]);
|
|
14628
|
-
const onOverlayClick =
|
|
14712
|
+
const onOverlayClick = React30.useCallback(
|
|
14629
14713
|
(e) => {
|
|
14630
14714
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
14631
14715
|
close();
|
|
@@ -14863,11 +14947,11 @@ function ExoOrb({
|
|
|
14863
14947
|
trackCursor = true,
|
|
14864
14948
|
className
|
|
14865
14949
|
}) {
|
|
14866
|
-
const uid =
|
|
14950
|
+
const uid = React30.useId().replace(/:/g, "");
|
|
14867
14951
|
const id = (name) => `exo-orb-${uid}-${name}`;
|
|
14868
|
-
const rootRef =
|
|
14869
|
-
const pupilRef =
|
|
14870
|
-
|
|
14952
|
+
const rootRef = React30.useRef(null);
|
|
14953
|
+
const pupilRef = React30.useRef(null);
|
|
14954
|
+
React30.useEffect(() => {
|
|
14871
14955
|
if (!trackCursor) return;
|
|
14872
14956
|
if (typeof window === "undefined") return;
|
|
14873
14957
|
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
@@ -15063,13 +15147,13 @@ function AskExo({
|
|
|
15063
15147
|
teaserDelayMs = 2500,
|
|
15064
15148
|
teaserDurationMs = 6e3
|
|
15065
15149
|
}) {
|
|
15066
|
-
const [open, setOpen] =
|
|
15067
|
-
const [question, setQuestion] =
|
|
15068
|
-
const [teaserVisible, setTeaserVisible] =
|
|
15150
|
+
const [open, setOpen] = React30.useState(false);
|
|
15151
|
+
const [question, setQuestion] = React30.useState("");
|
|
15152
|
+
const [teaserVisible, setTeaserVisible] = React30.useState(false);
|
|
15069
15153
|
const teaserEnabled = !!teaser && teaser !== "";
|
|
15070
|
-
const inputRef =
|
|
15071
|
-
const textareaRef =
|
|
15072
|
-
|
|
15154
|
+
const inputRef = React30.useRef(null);
|
|
15155
|
+
const textareaRef = React30.useRef(null);
|
|
15156
|
+
React30.useEffect(() => {
|
|
15073
15157
|
if (!open) {
|
|
15074
15158
|
setQuestion("");
|
|
15075
15159
|
return;
|
|
@@ -15081,7 +15165,7 @@ function AskExo({
|
|
|
15081
15165
|
}, 200);
|
|
15082
15166
|
return () => clearTimeout(t);
|
|
15083
15167
|
}, [open, variant]);
|
|
15084
|
-
|
|
15168
|
+
React30.useEffect(() => {
|
|
15085
15169
|
if (!open) return;
|
|
15086
15170
|
const onKey = (e) => {
|
|
15087
15171
|
if (e.key === "Escape") setOpen(false);
|
|
@@ -15089,7 +15173,7 @@ function AskExo({
|
|
|
15089
15173
|
document.addEventListener("keydown", onKey);
|
|
15090
15174
|
return () => document.removeEventListener("keydown", onKey);
|
|
15091
15175
|
}, [open]);
|
|
15092
|
-
|
|
15176
|
+
React30.useEffect(() => {
|
|
15093
15177
|
if (!teaserEnabled || open) return;
|
|
15094
15178
|
if (typeof window === "undefined") return;
|
|
15095
15179
|
const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
|
|
@@ -15102,7 +15186,7 @@ function AskExo({
|
|
|
15102
15186
|
clearTimeout(hideTimer);
|
|
15103
15187
|
};
|
|
15104
15188
|
}, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
|
|
15105
|
-
|
|
15189
|
+
React30.useEffect(() => {
|
|
15106
15190
|
if (open) setTeaserVisible(false);
|
|
15107
15191
|
}, [open]);
|
|
15108
15192
|
const askExo = (q) => {
|
|
@@ -15655,8 +15739,8 @@ function ShareWidget({
|
|
|
15655
15739
|
title = "Invite friends & lower the price",
|
|
15656
15740
|
className
|
|
15657
15741
|
}) {
|
|
15658
|
-
const [copied, setCopied] =
|
|
15659
|
-
const [showToast, setShowToast] =
|
|
15742
|
+
const [copied, setCopied] = React30__namespace.useState(false);
|
|
15743
|
+
const [showToast, setShowToast] = React30__namespace.useState(false);
|
|
15660
15744
|
const encodedUrl = encodeURIComponent(url);
|
|
15661
15745
|
const encodedMsg = encodeURIComponent(`${message} ${url}`);
|
|
15662
15746
|
const channels = [
|