@planetaexo/design-system 0.63.0 → 0.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +486 -210
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +86 -1
- package/dist/index.d.ts +86 -1
- package/dist/index.js +456 -181
- 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 React32 = 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 React32__namespace = /*#__PURE__*/_interopNamespace(React32);
|
|
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 = React32__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 = React32__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 : React32__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 = React31__namespace.forwardRef(
|
|
|
374
374
|
}
|
|
375
375
|
);
|
|
376
376
|
FloatingInput.displayName = "FloatingInput";
|
|
377
|
-
var FloatingSelect =
|
|
377
|
+
var FloatingSelect = React32__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 : React32__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] = React32__namespace.useState(false);
|
|
645
|
+
const containerRef = React32__namespace.useRef(null);
|
|
646
|
+
const listRef = React32__namespace.useRef(null);
|
|
647
647
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
648
|
-
|
|
648
|
+
React32__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
|
+
React32__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 = React32__namespace.useRef(null);
|
|
930
|
+
React32__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] = React32__namespace.useState(false);
|
|
962
|
+
const [text, setText] = React32__namespace.useState(
|
|
963
963
|
value ? dateFns.format(value, "dd/MM/yyyy") : ""
|
|
964
964
|
);
|
|
965
|
-
const containerRef =
|
|
966
|
-
const inputId =
|
|
967
|
-
|
|
965
|
+
const containerRef = React32__namespace.useRef(null);
|
|
966
|
+
const inputId = React32__namespace.useId();
|
|
967
|
+
React32__namespace.useEffect(() => {
|
|
968
968
|
setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
|
|
969
969
|
}, [value]);
|
|
970
|
-
|
|
970
|
+
React32__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] = React32__namespace.useState("");
|
|
1180
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
1181
|
+
const containerRef = React32__namespace.useRef(null);
|
|
1182
|
+
const searchRef = React32__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
|
+
React32__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, _s;
|
|
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] = React32__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] = React32__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;
|
|
@@ -1787,7 +1787,7 @@ function BookingShell({
|
|
|
1787
1787
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1788
1788
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
|
|
1789
1789
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
|
|
1790
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1790
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
1791
1791
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1792
1792
|
"span",
|
|
1793
1793
|
{
|
|
@@ -1986,7 +1986,7 @@ function TermsSection({
|
|
|
1986
1986
|
termsContent
|
|
1987
1987
|
}) {
|
|
1988
1988
|
var _a;
|
|
1989
|
-
const [modalOpen, setModalOpen] =
|
|
1989
|
+
const [modalOpen, setModalOpen] = React32__namespace.useState(false);
|
|
1990
1990
|
const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
|
|
1991
1991
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
|
|
1992
1992
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
|
|
@@ -2124,9 +2124,9 @@ function BookingWizard({
|
|
|
2124
2124
|
}) {
|
|
2125
2125
|
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;
|
|
2126
2126
|
const wizardSteps = WIZARD_STEPS_FN(labels);
|
|
2127
|
-
const [step, setStep] =
|
|
2128
|
-
const [error, setError] =
|
|
2129
|
-
const [responsible, setResponsible] =
|
|
2127
|
+
const [step, setStep] = React32__namespace.useState("responsible");
|
|
2128
|
+
const [error, setError] = React32__namespace.useState(null);
|
|
2129
|
+
const [responsible, setResponsible] = React32__namespace.useState({
|
|
2130
2130
|
firstName: "",
|
|
2131
2131
|
lastName: "",
|
|
2132
2132
|
email: "",
|
|
@@ -2145,7 +2145,7 @@ function BookingWizard({
|
|
|
2145
2145
|
return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
|
|
2146
2146
|
}, 0);
|
|
2147
2147
|
const totalPax = totalAdults + totalChildren;
|
|
2148
|
-
const [travellers, setTravellers] =
|
|
2148
|
+
const [travellers, setTravellers] = React32__namespace.useState(
|
|
2149
2149
|
Array.from({ length: Math.max(totalPax, 1) }, () => ({
|
|
2150
2150
|
firstName: "",
|
|
2151
2151
|
lastName: "",
|
|
@@ -2153,9 +2153,9 @@ function BookingWizard({
|
|
|
2153
2153
|
email: ""
|
|
2154
2154
|
}))
|
|
2155
2155
|
);
|
|
2156
|
-
const [payAmount, setPayAmount] =
|
|
2157
|
-
const [payMethod, setPayMethod] =
|
|
2158
|
-
const [termsAccepted, setTermsAccepted] =
|
|
2156
|
+
const [payAmount, setPayAmount] = React32__namespace.useState("full");
|
|
2157
|
+
const [payMethod, setPayMethod] = React32__namespace.useState("stripe");
|
|
2158
|
+
const [termsAccepted, setTermsAccepted] = React32__namespace.useState(false);
|
|
2159
2159
|
const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
2160
2160
|
const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
|
|
2161
2161
|
const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
|
|
@@ -2383,7 +2383,7 @@ function Offer({
|
|
|
2383
2383
|
className
|
|
2384
2384
|
}) {
|
|
2385
2385
|
var _a, _b, _c;
|
|
2386
|
-
const [showBooking, setShowBooking] =
|
|
2386
|
+
const [showBooking, setShowBooking] = React32__namespace.useState(false);
|
|
2387
2387
|
const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
|
|
2388
2388
|
const handleBook = () => {
|
|
2389
2389
|
if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
|
|
@@ -2750,7 +2750,7 @@ function AdventureSection({
|
|
|
2750
2750
|
labels
|
|
2751
2751
|
}) {
|
|
2752
2752
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
2753
|
-
const [detailsOpen, setDetailsOpen] =
|
|
2753
|
+
const [detailsOpen, setDetailsOpen] = React32__namespace.useState(false);
|
|
2754
2754
|
const handleCopyUrl = (url) => {
|
|
2755
2755
|
if (onCopyFormLink) {
|
|
2756
2756
|
onCopyFormLink(url);
|
|
@@ -3289,8 +3289,8 @@ function AddTravellerDialog({
|
|
|
3289
3289
|
errorMessage
|
|
3290
3290
|
}) {
|
|
3291
3291
|
var _a, _b, _c, _d, _e;
|
|
3292
|
-
const [form, setForm] =
|
|
3293
|
-
|
|
3292
|
+
const [form, setForm] = React32__namespace.useState(() => createInitialAddFormData(config));
|
|
3293
|
+
React32__namespace.useEffect(() => {
|
|
3294
3294
|
if (open) {
|
|
3295
3295
|
setForm(createInitialAddFormData(config));
|
|
3296
3296
|
}
|
|
@@ -3350,7 +3350,7 @@ function EditTravellerDialog({
|
|
|
3350
3350
|
errorMessage
|
|
3351
3351
|
}) {
|
|
3352
3352
|
var _a, _b, _c, _d, _e;
|
|
3353
|
-
const [form, setForm] =
|
|
3353
|
+
const [form, setForm] = React32__namespace.useState(() => ({
|
|
3354
3354
|
firstName: "",
|
|
3355
3355
|
lastName: "",
|
|
3356
3356
|
email: "",
|
|
@@ -3359,7 +3359,7 @@ function EditTravellerDialog({
|
|
|
3359
3359
|
birthDate: "",
|
|
3360
3360
|
personType: "ADULT"
|
|
3361
3361
|
}));
|
|
3362
|
-
|
|
3362
|
+
React32__namespace.useEffect(() => {
|
|
3363
3363
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3364
3364
|
if (open && traveller) {
|
|
3365
3365
|
setForm({
|
|
@@ -3695,48 +3695,48 @@ function BookingDetails({
|
|
|
3695
3695
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3696
3696
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3697
3697
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3698
|
-
const [addModalState, setAddModalState] =
|
|
3698
|
+
const [addModalState, setAddModalState] = React32__namespace.useState({
|
|
3699
3699
|
open: false,
|
|
3700
3700
|
adventureId: null
|
|
3701
3701
|
});
|
|
3702
|
-
const [editModalState, setEditModalState] =
|
|
3703
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3704
|
-
const [resendInviteDialogState, setResendInviteDialogState] =
|
|
3705
|
-
const handleRequestOpenAddModal =
|
|
3702
|
+
const [editModalState, setEditModalState] = React32__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3703
|
+
const [deleteModalState, setDeleteModalState] = React32__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3704
|
+
const [resendInviteDialogState, setResendInviteDialogState] = React32__namespace.useState({ open: false, traveller: null });
|
|
3705
|
+
const handleRequestOpenAddModal = React32__namespace.useCallback((adventureId) => {
|
|
3706
3706
|
setAddModalState({ open: true, adventureId });
|
|
3707
3707
|
}, []);
|
|
3708
|
-
const handleRequestOpenEditModal =
|
|
3708
|
+
const handleRequestOpenEditModal = React32__namespace.useCallback(
|
|
3709
3709
|
(adventureId, traveller) => {
|
|
3710
3710
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3711
3711
|
},
|
|
3712
3712
|
[]
|
|
3713
3713
|
);
|
|
3714
|
-
const handleRequestOpenDeleteModal =
|
|
3714
|
+
const handleRequestOpenDeleteModal = React32__namespace.useCallback(
|
|
3715
3715
|
(adventureId, traveller) => {
|
|
3716
3716
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3717
3717
|
},
|
|
3718
3718
|
[]
|
|
3719
3719
|
);
|
|
3720
|
-
const handleRequestOpenResendInviteDialog =
|
|
3720
|
+
const handleRequestOpenResendInviteDialog = React32__namespace.useCallback(
|
|
3721
3721
|
(traveller) => {
|
|
3722
3722
|
setResendInviteDialogState({ open: true, traveller });
|
|
3723
3723
|
},
|
|
3724
3724
|
[]
|
|
3725
3725
|
);
|
|
3726
|
-
const closeAddModal =
|
|
3726
|
+
const closeAddModal = React32__namespace.useCallback(() => {
|
|
3727
3727
|
setAddModalState({ open: false, adventureId: null });
|
|
3728
3728
|
}, []);
|
|
3729
|
-
const closeEditModal =
|
|
3729
|
+
const closeEditModal = React32__namespace.useCallback(() => {
|
|
3730
3730
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3731
3731
|
}, []);
|
|
3732
|
-
const closeDeleteModal =
|
|
3732
|
+
const closeDeleteModal = React32__namespace.useCallback(() => {
|
|
3733
3733
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3734
3734
|
}, []);
|
|
3735
|
-
const closeResendInviteDialog =
|
|
3735
|
+
const closeResendInviteDialog = React32__namespace.useCallback(() => {
|
|
3736
3736
|
setResendInviteDialogState({ open: false, traveller: null });
|
|
3737
3737
|
}, []);
|
|
3738
|
-
const submitInFlightRef =
|
|
3739
|
-
const handleAddSubmit =
|
|
3738
|
+
const submitInFlightRef = React32__namespace.useRef(false);
|
|
3739
|
+
const handleAddSubmit = React32__namespace.useCallback(
|
|
3740
3740
|
async (adventureId, data) => {
|
|
3741
3741
|
if (!onSubmitAddTraveller) return;
|
|
3742
3742
|
if (submitInFlightRef.current) return;
|
|
@@ -3751,7 +3751,7 @@ function BookingDetails({
|
|
|
3751
3751
|
},
|
|
3752
3752
|
[onSubmitAddTraveller, closeAddModal]
|
|
3753
3753
|
);
|
|
3754
|
-
const handleEditSubmit =
|
|
3754
|
+
const handleEditSubmit = React32__namespace.useCallback(
|
|
3755
3755
|
async (adventureId, travellerId, data) => {
|
|
3756
3756
|
if (!onSubmitEditTraveller) return;
|
|
3757
3757
|
if (submitInFlightRef.current) return;
|
|
@@ -3766,7 +3766,7 @@ function BookingDetails({
|
|
|
3766
3766
|
},
|
|
3767
3767
|
[onSubmitEditTraveller, closeEditModal]
|
|
3768
3768
|
);
|
|
3769
|
-
const handleDeleteConfirm =
|
|
3769
|
+
const handleDeleteConfirm = React32__namespace.useCallback(
|
|
3770
3770
|
async (adventureId, travellerId) => {
|
|
3771
3771
|
if (!onConfirmRemoveTraveller) return;
|
|
3772
3772
|
if (submitInFlightRef.current) return;
|
|
@@ -5563,7 +5563,7 @@ function BookingCreatedEmail({
|
|
|
5563
5563
|
}, children: i + 1 }) }),
|
|
5564
5564
|
/* @__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 }) })
|
|
5565
5565
|
] }) }) }, i)) }),
|
|
5566
|
-
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(
|
|
5566
|
+
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(React32__namespace.Fragment, { children: [
|
|
5567
5567
|
idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
|
|
5568
5568
|
idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
|
|
5569
5569
|
] }, idx)) })
|
|
@@ -7932,11 +7932,11 @@ function DatePickerField({
|
|
|
7932
7932
|
fromDate,
|
|
7933
7933
|
className
|
|
7934
7934
|
}) {
|
|
7935
|
-
const [open, setOpen] =
|
|
7936
|
-
const containerRef =
|
|
7937
|
-
const [calendarWidth, setCalendarWidth] =
|
|
7935
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
7936
|
+
const containerRef = React32__namespace.useRef(null);
|
|
7937
|
+
const [calendarWidth, setCalendarWidth] = React32__namespace.useState();
|
|
7938
7938
|
const hasValue = !!value;
|
|
7939
|
-
|
|
7939
|
+
React32__namespace.useEffect(() => {
|
|
7940
7940
|
if (!containerRef.current) return;
|
|
7941
7941
|
const observer = new ResizeObserver(([entry]) => {
|
|
7942
7942
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -8045,7 +8045,7 @@ function BookingForm({
|
|
|
8045
8045
|
subtitle = "Free enquiry \u2013 no commitment",
|
|
8046
8046
|
className
|
|
8047
8047
|
}) {
|
|
8048
|
-
const [values, setValues] =
|
|
8048
|
+
const [values, setValues] = React32__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
8049
8049
|
const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
8050
8050
|
const handleSubmit = (e) => {
|
|
8051
8051
|
e.preventDefault();
|
|
@@ -8613,11 +8613,11 @@ function FloatingTextarea({
|
|
|
8613
8613
|
}
|
|
8614
8614
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
8615
8615
|
var _a, _b, _c;
|
|
8616
|
-
const [open, setOpen] =
|
|
8617
|
-
const containerRef =
|
|
8616
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
8617
|
+
const containerRef = React32__namespace.useRef(null);
|
|
8618
8618
|
const options = (_a = field.options) != null ? _a : [];
|
|
8619
8619
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
8620
|
-
|
|
8620
|
+
React32__namespace.useEffect(() => {
|
|
8621
8621
|
if (!open) return;
|
|
8622
8622
|
const handleOutside = (e) => {
|
|
8623
8623
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -9085,11 +9085,11 @@ function RegistrationForm({
|
|
|
9085
9085
|
readOnly = false
|
|
9086
9086
|
}) {
|
|
9087
9087
|
var _a;
|
|
9088
|
-
const L =
|
|
9088
|
+
const L = React32__namespace.useMemo(
|
|
9089
9089
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
|
|
9090
9090
|
[labels]
|
|
9091
9091
|
);
|
|
9092
|
-
const sortedFields =
|
|
9092
|
+
const sortedFields = React32__namespace.useMemo(
|
|
9093
9093
|
() => [...fields].sort((a, b) => {
|
|
9094
9094
|
var _a2, _b;
|
|
9095
9095
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -9097,7 +9097,7 @@ function RegistrationForm({
|
|
|
9097
9097
|
[fields]
|
|
9098
9098
|
);
|
|
9099
9099
|
const isControlled = values !== void 0;
|
|
9100
|
-
const [internal, setInternal] =
|
|
9100
|
+
const [internal, setInternal] = React32__namespace.useState(
|
|
9101
9101
|
() => initializeValues(
|
|
9102
9102
|
sortedFields,
|
|
9103
9103
|
defaultValues != null ? defaultValues : {},
|
|
@@ -9105,9 +9105,9 @@ function RegistrationForm({
|
|
|
9105
9105
|
includeTerms
|
|
9106
9106
|
)
|
|
9107
9107
|
);
|
|
9108
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
9109
|
-
const [validationErrors, setValidationErrors] =
|
|
9110
|
-
|
|
9108
|
+
const [submitAttempted, setSubmitAttempted] = React32__namespace.useState(false);
|
|
9109
|
+
const [validationErrors, setValidationErrors] = React32__namespace.useState({});
|
|
9110
|
+
React32__namespace.useEffect(() => {
|
|
9111
9111
|
if (isControlled) return;
|
|
9112
9112
|
setInternal((prev) => {
|
|
9113
9113
|
const next = initializeValues(
|
|
@@ -9164,7 +9164,7 @@ function RegistrationForm({
|
|
|
9164
9164
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
9165
9165
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
9166
9166
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
9167
|
-
|
|
9167
|
+
React32__namespace.useEffect(() => {
|
|
9168
9168
|
if (!submitAttempted || !scrollTargetId) return;
|
|
9169
9169
|
const timer = setTimeout(() => {
|
|
9170
9170
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -9617,6 +9617,281 @@ function RegistrationSuccessCard({
|
|
|
9617
9617
|
}
|
|
9618
9618
|
);
|
|
9619
9619
|
}
|
|
9620
|
+
var OTHER = "OTHER";
|
|
9621
|
+
function SectionHeading({ children }) {
|
|
9622
|
+
return /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-lg font-heading font-bold text-foreground mb-3", children });
|
|
9623
|
+
}
|
|
9624
|
+
function FieldError({ children }) {
|
|
9625
|
+
if (!children) return null;
|
|
9626
|
+
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children });
|
|
9627
|
+
}
|
|
9628
|
+
function CancellationForm({
|
|
9629
|
+
adventures,
|
|
9630
|
+
identity,
|
|
9631
|
+
labels,
|
|
9632
|
+
onSubmit,
|
|
9633
|
+
submitting = false,
|
|
9634
|
+
error,
|
|
9635
|
+
className
|
|
9636
|
+
}) {
|
|
9637
|
+
var _a, _b, _c;
|
|
9638
|
+
const [selectedAdventureIds, setSelectedAdventureIds] = React32__namespace.useState(/* @__PURE__ */ new Set());
|
|
9639
|
+
const [participantsByAdventure, setParticipantsByAdventure] = React32__namespace.useState({});
|
|
9640
|
+
const [reasonCode, setReasonCode] = React32__namespace.useState("");
|
|
9641
|
+
const [reasonOther, setReasonOther] = React32__namespace.useState("");
|
|
9642
|
+
const [refundPreference, setRefundPreference] = React32__namespace.useState("");
|
|
9643
|
+
const [refundOther, setRefundOther] = React32__namespace.useState("");
|
|
9644
|
+
const [agreedToPolicy, setAgreedToPolicy] = React32__namespace.useState(false);
|
|
9645
|
+
const [contactName, setContactName] = React32__namespace.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
|
|
9646
|
+
const [contactEmail, setContactEmail] = React32__namespace.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
|
|
9647
|
+
const [contactPhone, setContactPhone] = React32__namespace.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
|
|
9648
|
+
const [errors, setErrors] = React32__namespace.useState({});
|
|
9649
|
+
const allParticipantsOf = React32__namespace.useCallback(
|
|
9650
|
+
(advId) => {
|
|
9651
|
+
var _a2, _b2;
|
|
9652
|
+
return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
|
|
9653
|
+
},
|
|
9654
|
+
[adventures]
|
|
9655
|
+
);
|
|
9656
|
+
function toggleAdventure(advId, on) {
|
|
9657
|
+
setSelectedAdventureIds((prev) => {
|
|
9658
|
+
const next = new Set(prev);
|
|
9659
|
+
if (on) next.add(advId);
|
|
9660
|
+
else next.delete(advId);
|
|
9661
|
+
return next;
|
|
9662
|
+
});
|
|
9663
|
+
setParticipantsByAdventure((prev) => {
|
|
9664
|
+
const next = __spreadValues({}, prev);
|
|
9665
|
+
if (on) next[advId] = allParticipantsOf(advId);
|
|
9666
|
+
else delete next[advId];
|
|
9667
|
+
return next;
|
|
9668
|
+
});
|
|
9669
|
+
}
|
|
9670
|
+
function toggleParticipant(advId, travellerId, on) {
|
|
9671
|
+
setParticipantsByAdventure((prev) => {
|
|
9672
|
+
var _a2;
|
|
9673
|
+
const set = new Set((_a2 = prev[advId]) != null ? _a2 : []);
|
|
9674
|
+
if (on) set.add(travellerId);
|
|
9675
|
+
else set.delete(travellerId);
|
|
9676
|
+
return __spreadProps(__spreadValues({}, prev), { [advId]: set });
|
|
9677
|
+
});
|
|
9678
|
+
}
|
|
9679
|
+
function selectAll() {
|
|
9680
|
+
const allAdv = new Set(adventures.map((a) => a.id));
|
|
9681
|
+
const byAdv = {};
|
|
9682
|
+
for (const a of adventures) byAdv[a.id] = new Set(a.participants.map((p) => p.id));
|
|
9683
|
+
setSelectedAdventureIds(allAdv);
|
|
9684
|
+
setParticipantsByAdventure(byAdv);
|
|
9685
|
+
}
|
|
9686
|
+
const allSelected = adventures.length > 0 && adventures.every((a) => selectedAdventureIds.has(a.id));
|
|
9687
|
+
function validate() {
|
|
9688
|
+
var _a2;
|
|
9689
|
+
const next = {};
|
|
9690
|
+
const selAdvIds = adventures.filter((a) => selectedAdventureIds.has(a.id)).map((a) => a.id);
|
|
9691
|
+
if (selAdvIds.length === 0) next.adventures = labels.errorSelectAdventure;
|
|
9692
|
+
for (const advId of selAdvIds) {
|
|
9693
|
+
const set = participantsByAdventure[advId];
|
|
9694
|
+
if (!set || set.size === 0) next.participants = labels.errorSelectParticipants;
|
|
9695
|
+
}
|
|
9696
|
+
if (!reasonCode) next.reason = labels.errorReasonRequired;
|
|
9697
|
+
else if (reasonCode === OTHER && !reasonOther.trim()) next.reason = labels.errorReasonOtherRequired;
|
|
9698
|
+
if (!refundPreference) next.refund = labels.errorRefundRequired;
|
|
9699
|
+
else if (refundPreference === OTHER && !refundOther.trim())
|
|
9700
|
+
next.refund = labels.errorRefundOtherRequired;
|
|
9701
|
+
if (!agreedToPolicy) next.agreement = labels.errorAgreementRequired;
|
|
9702
|
+
setErrors(next);
|
|
9703
|
+
if (Object.keys(next).length > 0) return { ok: false };
|
|
9704
|
+
const travellerIds = /* @__PURE__ */ new Set();
|
|
9705
|
+
for (const advId of selAdvIds) {
|
|
9706
|
+
for (const tid of (_a2 = participantsByAdventure[advId]) != null ? _a2 : []) travellerIds.add(tid);
|
|
9707
|
+
}
|
|
9708
|
+
return {
|
|
9709
|
+
ok: true,
|
|
9710
|
+
values: {
|
|
9711
|
+
selectedBookingAdventureIds: selAdvIds,
|
|
9712
|
+
selectedTravellerIds: [...travellerIds],
|
|
9713
|
+
reasonCode,
|
|
9714
|
+
reasonOther: reasonCode === OTHER ? reasonOther.trim() : "",
|
|
9715
|
+
refundPreference,
|
|
9716
|
+
refundOther: refundPreference === OTHER ? refundOther.trim() : "",
|
|
9717
|
+
agreedToPolicy,
|
|
9718
|
+
contact: { name: contactName.trim(), email: contactEmail.trim(), phone: contactPhone.trim() }
|
|
9719
|
+
}
|
|
9720
|
+
};
|
|
9721
|
+
}
|
|
9722
|
+
function handleSubmit(e) {
|
|
9723
|
+
e.preventDefault();
|
|
9724
|
+
const r = validate();
|
|
9725
|
+
if (r.ok && r.values) void onSubmit(r.values);
|
|
9726
|
+
}
|
|
9727
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: cn("space-y-8", className), noValidate: true, children: [
|
|
9728
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9729
|
+
/* @__PURE__ */ jsxRuntime.jsx(SectionHeading, { children: labels.identityHeading }),
|
|
9730
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-3", children: [
|
|
9731
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9732
|
+
FloatingInput,
|
|
9733
|
+
{
|
|
9734
|
+
label: labels.contactNameLabel,
|
|
9735
|
+
value: contactName,
|
|
9736
|
+
onChange: (e) => setContactName(e.target.value)
|
|
9737
|
+
}
|
|
9738
|
+
),
|
|
9739
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9740
|
+
FloatingInput,
|
|
9741
|
+
{
|
|
9742
|
+
label: labels.contactEmailLabel,
|
|
9743
|
+
type: "email",
|
|
9744
|
+
value: contactEmail,
|
|
9745
|
+
onChange: (e) => setContactEmail(e.target.value)
|
|
9746
|
+
}
|
|
9747
|
+
),
|
|
9748
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9749
|
+
FloatingInput,
|
|
9750
|
+
{
|
|
9751
|
+
label: labels.contactPhoneLabel,
|
|
9752
|
+
value: contactPhone,
|
|
9753
|
+
onChange: (e) => setContactPhone(e.target.value)
|
|
9754
|
+
}
|
|
9755
|
+
)
|
|
9756
|
+
] })
|
|
9757
|
+
] }),
|
|
9758
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9759
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3 mb-3", children: [
|
|
9760
|
+
/* @__PURE__ */ jsxRuntime.jsx(SectionHeading, { children: labels.adventuresHeading }),
|
|
9761
|
+
adventures.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "link", size: "sm", onClick: selectAll, disabled: allSelected, children: labels.selectAllLabel })
|
|
9762
|
+
] }),
|
|
9763
|
+
labels.adventuresHint && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-3", children: labels.adventuresHint }),
|
|
9764
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: adventures.map((adv) => {
|
|
9765
|
+
var _a2;
|
|
9766
|
+
const selected = selectedAdventureIds.has(adv.id);
|
|
9767
|
+
const partSet = (_a2 = participantsByAdventure[adv.id]) != null ? _a2 : /* @__PURE__ */ new Set();
|
|
9768
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9769
|
+
"div",
|
|
9770
|
+
{
|
|
9771
|
+
className: cn(
|
|
9772
|
+
"rounded-lg border p-4 transition-colors",
|
|
9773
|
+
selected ? "border-primary bg-primary/5" : "border-border bg-card"
|
|
9774
|
+
),
|
|
9775
|
+
children: [
|
|
9776
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-start gap-3 cursor-pointer", children: [
|
|
9777
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9778
|
+
"input",
|
|
9779
|
+
{
|
|
9780
|
+
type: "checkbox",
|
|
9781
|
+
className: "mt-1 h-4 w-4 accent-primary",
|
|
9782
|
+
checked: selected,
|
|
9783
|
+
onChange: (e) => toggleAdventure(adv.id, e.target.checked)
|
|
9784
|
+
}
|
|
9785
|
+
),
|
|
9786
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex-1", children: [
|
|
9787
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block font-ui font-medium text-foreground", children: adv.name }),
|
|
9788
|
+
adv.dateRange && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-sm text-muted-foreground", children: adv.dateRange })
|
|
9789
|
+
] })
|
|
9790
|
+
] }),
|
|
9791
|
+
selected && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 pl-7 space-y-4", children: [
|
|
9792
|
+
adv.cancellationPolicy && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md bg-muted/50 border border-border p-3", children: [
|
|
9793
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-ui font-semibold uppercase tracking-wide text-muted-foreground mb-1", children: labels.policyHeading }),
|
|
9794
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground whitespace-pre-line", children: adv.cancellationPolicy })
|
|
9795
|
+
] }),
|
|
9796
|
+
adv.participants.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
9797
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-ui font-semibold uppercase tracking-wide text-muted-foreground mb-2", children: labels.participantsHeading }),
|
|
9798
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1.5", children: adv.participants.map((p) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9799
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9800
|
+
"input",
|
|
9801
|
+
{
|
|
9802
|
+
type: "checkbox",
|
|
9803
|
+
className: "h-4 w-4 accent-primary",
|
|
9804
|
+
checked: partSet.has(p.id),
|
|
9805
|
+
onChange: (e) => toggleParticipant(adv.id, p.id, e.target.checked)
|
|
9806
|
+
}
|
|
9807
|
+
),
|
|
9808
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: p.name })
|
|
9809
|
+
] }, p.id)) })
|
|
9810
|
+
] })
|
|
9811
|
+
] })
|
|
9812
|
+
]
|
|
9813
|
+
},
|
|
9814
|
+
adv.id
|
|
9815
|
+
);
|
|
9816
|
+
}) }),
|
|
9817
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.adventures }),
|
|
9818
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.participants })
|
|
9819
|
+
] }),
|
|
9820
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9821
|
+
/* @__PURE__ */ jsxRuntime.jsx(SectionHeading, { children: labels.reasonHeading }),
|
|
9822
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: labels.reasonOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9823
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9824
|
+
"input",
|
|
9825
|
+
{
|
|
9826
|
+
type: "radio",
|
|
9827
|
+
name: "cancellation-reason",
|
|
9828
|
+
className: "h-4 w-4 accent-primary",
|
|
9829
|
+
checked: reasonCode === opt.value,
|
|
9830
|
+
onChange: () => setReasonCode(opt.value)
|
|
9831
|
+
}
|
|
9832
|
+
),
|
|
9833
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: opt.label })
|
|
9834
|
+
] }, opt.value)) }),
|
|
9835
|
+
reasonCode === OTHER && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9836
|
+
"textarea",
|
|
9837
|
+
{
|
|
9838
|
+
className: "mt-3 w-full rounded-lg border border-border bg-background px-3 py-2 text-base text-foreground font-ui focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
|
|
9839
|
+
rows: 3,
|
|
9840
|
+
placeholder: labels.reasonOtherLabel,
|
|
9841
|
+
value: reasonOther,
|
|
9842
|
+
onChange: (e) => setReasonOther(e.target.value),
|
|
9843
|
+
maxLength: 1e3
|
|
9844
|
+
}
|
|
9845
|
+
),
|
|
9846
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.reason })
|
|
9847
|
+
] }),
|
|
9848
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9849
|
+
/* @__PURE__ */ jsxRuntime.jsx(SectionHeading, { children: labels.refundHeading }),
|
|
9850
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: labels.refundOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9851
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9852
|
+
"input",
|
|
9853
|
+
{
|
|
9854
|
+
type: "radio",
|
|
9855
|
+
name: "cancellation-refund",
|
|
9856
|
+
className: "h-4 w-4 accent-primary",
|
|
9857
|
+
checked: refundPreference === opt.value,
|
|
9858
|
+
onChange: () => setRefundPreference(opt.value)
|
|
9859
|
+
}
|
|
9860
|
+
),
|
|
9861
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: opt.label })
|
|
9862
|
+
] }, opt.value)) }),
|
|
9863
|
+
refundPreference === OTHER && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9864
|
+
"textarea",
|
|
9865
|
+
{
|
|
9866
|
+
className: "mt-3 w-full rounded-lg border border-border bg-background px-3 py-2 text-base text-foreground font-ui focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
|
|
9867
|
+
rows: 3,
|
|
9868
|
+
placeholder: labels.refundOtherLabel,
|
|
9869
|
+
value: refundOther,
|
|
9870
|
+
onChange: (e) => setRefundOther(e.target.value),
|
|
9871
|
+
maxLength: 1e3
|
|
9872
|
+
}
|
|
9873
|
+
),
|
|
9874
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.refund })
|
|
9875
|
+
] }),
|
|
9876
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9877
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-start gap-3 cursor-pointer", children: [
|
|
9878
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9879
|
+
"input",
|
|
9880
|
+
{
|
|
9881
|
+
type: "checkbox",
|
|
9882
|
+
className: "mt-1 h-4 w-4 accent-primary",
|
|
9883
|
+
checked: agreedToPolicy,
|
|
9884
|
+
onChange: (e) => setAgreedToPolicy(e.target.checked)
|
|
9885
|
+
}
|
|
9886
|
+
),
|
|
9887
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: labels.agreementLabel })
|
|
9888
|
+
] }),
|
|
9889
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.agreement })
|
|
9890
|
+
] }),
|
|
9891
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive font-ui", role: "alert", children: error }),
|
|
9892
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", variant: "destructive", size: "lg", disabled: submitting, className: "w-full", children: submitting ? labels.submittingLabel : labels.submitLabel })
|
|
9893
|
+
] });
|
|
9894
|
+
}
|
|
9620
9895
|
var OTPCodeInput = ({
|
|
9621
9896
|
value,
|
|
9622
9897
|
onChange,
|
|
@@ -9628,10 +9903,10 @@ var OTPCodeInput = ({
|
|
|
9628
9903
|
id,
|
|
9629
9904
|
required
|
|
9630
9905
|
}) => {
|
|
9631
|
-
const baseId = id != null ? id :
|
|
9632
|
-
const inputRef =
|
|
9633
|
-
const [focused, setFocused] =
|
|
9634
|
-
const digits =
|
|
9906
|
+
const baseId = id != null ? id : React32__namespace.useId();
|
|
9907
|
+
const inputRef = React32__namespace.useRef(null);
|
|
9908
|
+
const [focused, setFocused] = React32__namespace.useState(false);
|
|
9909
|
+
const digits = React32__namespace.useMemo(() => {
|
|
9635
9910
|
const arr = value.split("").slice(0, length);
|
|
9636
9911
|
while (arr.length < length) arr.push("");
|
|
9637
9912
|
return arr;
|
|
@@ -9744,7 +10019,7 @@ function Checkbox(_a) {
|
|
|
9744
10019
|
})
|
|
9745
10020
|
);
|
|
9746
10021
|
}
|
|
9747
|
-
var AccordionVariantContext =
|
|
10022
|
+
var AccordionVariantContext = React32__namespace.createContext("default");
|
|
9748
10023
|
function Accordion(_a) {
|
|
9749
10024
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
9750
10025
|
return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -9762,7 +10037,7 @@ function Accordion(_a) {
|
|
|
9762
10037
|
}
|
|
9763
10038
|
function AccordionItem(_a) {
|
|
9764
10039
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
9765
|
-
const variant =
|
|
10040
|
+
const variant = React32__namespace.useContext(AccordionVariantContext);
|
|
9766
10041
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9767
10042
|
accordion.Accordion.Item,
|
|
9768
10043
|
__spreadValues({
|
|
@@ -9783,7 +10058,7 @@ function AccordionTrigger(_a) {
|
|
|
9783
10058
|
"className",
|
|
9784
10059
|
"children"
|
|
9785
10060
|
]);
|
|
9786
|
-
const variant =
|
|
10061
|
+
const variant = React32__namespace.useContext(AccordionVariantContext);
|
|
9787
10062
|
return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9788
10063
|
accordion.Accordion.Trigger,
|
|
9789
10064
|
__spreadProps(__spreadValues({
|
|
@@ -9837,7 +10112,7 @@ function AccordionContent(_a) {
|
|
|
9837
10112
|
"className",
|
|
9838
10113
|
"children"
|
|
9839
10114
|
]);
|
|
9840
|
-
const variant =
|
|
10115
|
+
const variant = React32__namespace.useContext(AccordionVariantContext);
|
|
9841
10116
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9842
10117
|
accordion.Accordion.Panel,
|
|
9843
10118
|
__spreadProps(__spreadValues({
|
|
@@ -10055,15 +10330,15 @@ function FilterPanel({
|
|
|
10055
10330
|
onSortChange
|
|
10056
10331
|
}) {
|
|
10057
10332
|
var _a, _b;
|
|
10058
|
-
const resolvedGroups =
|
|
10059
|
-
const [internalValue, setInternalValue] =
|
|
10333
|
+
const resolvedGroups = React32__namespace.useMemo(() => resolveGroups(groups), [groups]);
|
|
10334
|
+
const [internalValue, setInternalValue] = React32__namespace.useState(
|
|
10060
10335
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
10061
10336
|
);
|
|
10062
10337
|
const selected = value != null ? value : internalValue;
|
|
10063
|
-
const [expandedItems, setExpandedItems] =
|
|
10338
|
+
const [expandedItems, setExpandedItems] = React32__namespace.useState(
|
|
10064
10339
|
() => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
|
|
10065
10340
|
);
|
|
10066
|
-
const toggleExpanded =
|
|
10341
|
+
const toggleExpanded = React32__namespace.useCallback((id) => {
|
|
10067
10342
|
setExpandedItems((prev) => {
|
|
10068
10343
|
const next = new Set(prev);
|
|
10069
10344
|
if (next.has(id)) next.delete(id);
|
|
@@ -10447,11 +10722,11 @@ function FilterPanel({
|
|
|
10447
10722
|
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
10448
10723
|
function TrustpilotEmbed({ config }) {
|
|
10449
10724
|
var _a, _b, _c, _d, _e, _f;
|
|
10450
|
-
const ref =
|
|
10451
|
-
const [widgetReady, setWidgetReady] =
|
|
10452
|
-
const [delayPassed, setDelayPassed] =
|
|
10725
|
+
const ref = React32__namespace.useRef(null);
|
|
10726
|
+
const [widgetReady, setWidgetReady] = React32__namespace.useState(false);
|
|
10727
|
+
const [delayPassed, setDelayPassed] = React32__namespace.useState(false);
|
|
10453
10728
|
const showFallback = delayPassed && !widgetReady;
|
|
10454
|
-
|
|
10729
|
+
React32__namespace.useEffect(() => {
|
|
10455
10730
|
var _a2;
|
|
10456
10731
|
if (typeof document === "undefined" || !ref.current) return;
|
|
10457
10732
|
const node = ref.current;
|
|
@@ -10639,7 +10914,7 @@ function webpVariantUrl(src) {
|
|
|
10639
10914
|
return `${withoutQuery}.webp${query}`;
|
|
10640
10915
|
}
|
|
10641
10916
|
function PictureLoader() {
|
|
10642
|
-
const gradientId =
|
|
10917
|
+
const gradientId = React32__namespace.useId();
|
|
10643
10918
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10644
10919
|
"span",
|
|
10645
10920
|
{
|
|
@@ -10709,10 +10984,10 @@ function Picture(_a) {
|
|
|
10709
10984
|
"onError"
|
|
10710
10985
|
]);
|
|
10711
10986
|
var _a2;
|
|
10712
|
-
const ref =
|
|
10713
|
-
const [visible, setVisible] =
|
|
10714
|
-
const [loaded, setLoaded] =
|
|
10715
|
-
|
|
10987
|
+
const ref = React32__namespace.useRef(null);
|
|
10988
|
+
const [visible, setVisible] = React32__namespace.useState(eager);
|
|
10989
|
+
const [loaded, setLoaded] = React32__namespace.useState(false);
|
|
10990
|
+
React32__namespace.useEffect(() => {
|
|
10716
10991
|
if (eager || visible) return;
|
|
10717
10992
|
const el = ref.current;
|
|
10718
10993
|
if (!el || typeof IntersectionObserver === "undefined") {
|
|
@@ -10731,7 +11006,7 @@ function Picture(_a) {
|
|
|
10731
11006
|
io.observe(el);
|
|
10732
11007
|
return () => io.disconnect();
|
|
10733
11008
|
}, [eager, visible, rootMargin]);
|
|
10734
|
-
|
|
11009
|
+
React32__namespace.useEffect(() => {
|
|
10735
11010
|
setLoaded(false);
|
|
10736
11011
|
}, [src]);
|
|
10737
11012
|
const webp = webpVariantUrl(src);
|
|
@@ -10859,11 +11134,11 @@ function ItineraryModal({
|
|
|
10859
11134
|
onNext
|
|
10860
11135
|
}) {
|
|
10861
11136
|
var _a, _b, _c;
|
|
10862
|
-
const [imgIndex, setImgIndex] =
|
|
11137
|
+
const [imgIndex, setImgIndex] = React32__namespace.useState(0);
|
|
10863
11138
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
10864
11139
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
10865
11140
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
10866
|
-
|
|
11141
|
+
React32__namespace.useEffect(() => {
|
|
10867
11142
|
setImgIndex(0);
|
|
10868
11143
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
10869
11144
|
if (!stop) return null;
|
|
@@ -10990,8 +11265,8 @@ function ItineraryModal({
|
|
|
10990
11265
|
) });
|
|
10991
11266
|
}
|
|
10992
11267
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
10993
|
-
const [activeIndex, setActiveIndex] =
|
|
10994
|
-
const scrollRef =
|
|
11268
|
+
const [activeIndex, setActiveIndex] = React32__namespace.useState(null);
|
|
11269
|
+
const scrollRef = React32__namespace.useRef(null);
|
|
10995
11270
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
10996
11271
|
const scrollBy = (dir) => {
|
|
10997
11272
|
if (!scrollRef.current) return;
|
|
@@ -11083,18 +11358,18 @@ function Lightbox({
|
|
|
11083
11358
|
onClose
|
|
11084
11359
|
}) {
|
|
11085
11360
|
var _a;
|
|
11086
|
-
const [index, setIndex] =
|
|
11361
|
+
const [index, setIndex] = React32__namespace.useState(initialIndex);
|
|
11087
11362
|
const total = photos.length;
|
|
11088
11363
|
const photo = photos[index];
|
|
11089
|
-
const prev =
|
|
11364
|
+
const prev = React32__namespace.useCallback(
|
|
11090
11365
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
11091
11366
|
[total]
|
|
11092
11367
|
);
|
|
11093
|
-
const next =
|
|
11368
|
+
const next = React32__namespace.useCallback(
|
|
11094
11369
|
() => setIndex((i) => (i + 1) % total),
|
|
11095
11370
|
[total]
|
|
11096
11371
|
);
|
|
11097
|
-
|
|
11372
|
+
React32__namespace.useEffect(() => {
|
|
11098
11373
|
const onKey = (e) => {
|
|
11099
11374
|
if (e.key === "Escape") onClose();
|
|
11100
11375
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -11262,7 +11537,7 @@ function GridGallery({
|
|
|
11262
11537
|
initialVisible,
|
|
11263
11538
|
onOpen
|
|
11264
11539
|
}) {
|
|
11265
|
-
const [expanded, setExpanded] =
|
|
11540
|
+
const [expanded, setExpanded] = React32__namespace.useState(false);
|
|
11266
11541
|
const cols = gridCols(photos.length);
|
|
11267
11542
|
const hasMore = photos.length > initialVisible;
|
|
11268
11543
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -11292,7 +11567,7 @@ function CompactGridGallery({
|
|
|
11292
11567
|
initialVisible,
|
|
11293
11568
|
onOpen
|
|
11294
11569
|
}) {
|
|
11295
|
-
const [expanded, setExpanded] =
|
|
11570
|
+
const [expanded, setExpanded] = React32__namespace.useState(false);
|
|
11296
11571
|
const hasMore = photos.length > initialVisible;
|
|
11297
11572
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
11298
11573
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -11321,7 +11596,7 @@ function MasonryGallery({
|
|
|
11321
11596
|
initialVisible,
|
|
11322
11597
|
onOpen
|
|
11323
11598
|
}) {
|
|
11324
|
-
const [expanded, setExpanded] =
|
|
11599
|
+
const [expanded, setExpanded] = React32__namespace.useState(false);
|
|
11325
11600
|
const hasMore = photos.length > initialVisible;
|
|
11326
11601
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
11327
11602
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -11394,7 +11669,7 @@ function FeaturedGallery({
|
|
|
11394
11669
|
photos,
|
|
11395
11670
|
onOpen
|
|
11396
11671
|
}) {
|
|
11397
|
-
const [expanded, setExpanded] =
|
|
11672
|
+
const [expanded, setExpanded] = React32__namespace.useState(false);
|
|
11398
11673
|
const featured = photos.slice(0, 3);
|
|
11399
11674
|
const extra = photos.slice(3);
|
|
11400
11675
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -11592,9 +11867,9 @@ function PhotoGallery({
|
|
|
11592
11867
|
onPhotoClick,
|
|
11593
11868
|
className
|
|
11594
11869
|
}) {
|
|
11595
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
11596
|
-
const [carouselIndex, setCarouselIndex] =
|
|
11597
|
-
const normalised =
|
|
11870
|
+
const [lightboxIndex, setLightboxIndex] = React32__namespace.useState(null);
|
|
11871
|
+
const [carouselIndex, setCarouselIndex] = React32__namespace.useState(0);
|
|
11872
|
+
const normalised = React32__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
11598
11873
|
const handleOpen = (index) => {
|
|
11599
11874
|
setLightboxIndex(index);
|
|
11600
11875
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
@@ -11680,7 +11955,7 @@ function ItineraryDay({
|
|
|
11680
11955
|
photoLayout = "rounded",
|
|
11681
11956
|
className
|
|
11682
11957
|
}) {
|
|
11683
|
-
const photoList =
|
|
11958
|
+
const photoList = React32__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
11684
11959
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
11685
11960
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
11686
11961
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -11735,8 +12010,8 @@ function MenuTrip({
|
|
|
11735
12010
|
bold = true,
|
|
11736
12011
|
className
|
|
11737
12012
|
}) {
|
|
11738
|
-
const scrollRef =
|
|
11739
|
-
|
|
12013
|
+
const scrollRef = React32__namespace.useRef(null);
|
|
12014
|
+
React32__namespace.useEffect(() => {
|
|
11740
12015
|
if (!scrollRef.current || !activeSection) return;
|
|
11741
12016
|
const container = scrollRef.current;
|
|
11742
12017
|
const btn = container.querySelector(
|
|
@@ -11932,8 +12207,8 @@ function PricingTrip({
|
|
|
11932
12207
|
className
|
|
11933
12208
|
}) {
|
|
11934
12209
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
11935
|
-
const [showEstimates, setShowEstimates] =
|
|
11936
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
12210
|
+
const [showEstimates, setShowEstimates] = React32__namespace.useState(false);
|
|
12211
|
+
const [showPriceInfo, setShowPriceInfo] = React32__namespace.useState(false);
|
|
11937
12212
|
if (variant === "compact") {
|
|
11938
12213
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
11939
12214
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -12373,14 +12648,14 @@ function SiteHeader({
|
|
|
12373
12648
|
}) {
|
|
12374
12649
|
const t = VARIANT[variant];
|
|
12375
12650
|
const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
|
|
12376
|
-
const [openMenu, setOpenMenu] =
|
|
12377
|
-
const [langOpen, setLangOpen] =
|
|
12378
|
-
const [mobileOpen, setMobileOpen] =
|
|
12379
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
12380
|
-
const [activeLang, setActiveLang] =
|
|
12651
|
+
const [openMenu, setOpenMenu] = React32__namespace.useState(null);
|
|
12652
|
+
const [langOpen, setLangOpen] = React32__namespace.useState(false);
|
|
12653
|
+
const [mobileOpen, setMobileOpen] = React32__namespace.useState(false);
|
|
12654
|
+
const [openMobileSection, setOpenMobileSection] = React32__namespace.useState(null);
|
|
12655
|
+
const [activeLang, setActiveLang] = React32__namespace.useState(currentLanguage);
|
|
12381
12656
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
12382
|
-
const menuCloseTimer =
|
|
12383
|
-
const langCloseTimer =
|
|
12657
|
+
const menuCloseTimer = React32__namespace.useRef(void 0);
|
|
12658
|
+
const langCloseTimer = React32__namespace.useRef(void 0);
|
|
12384
12659
|
const handleMenuEnter = (label) => {
|
|
12385
12660
|
clearTimeout(menuCloseTimer.current);
|
|
12386
12661
|
setOpenMenu(label);
|
|
@@ -12401,7 +12676,7 @@ function SiteHeader({
|
|
|
12401
12676
|
setOpenMenu(null);
|
|
12402
12677
|
setLangOpen(false);
|
|
12403
12678
|
};
|
|
12404
|
-
|
|
12679
|
+
React32__namespace.useEffect(() => () => {
|
|
12405
12680
|
clearTimeout(menuCloseTimer.current);
|
|
12406
12681
|
clearTimeout(langCloseTimer.current);
|
|
12407
12682
|
}, []);
|
|
@@ -12677,7 +12952,7 @@ function SiteHeader({
|
|
|
12677
12952
|
), children: [
|
|
12678
12953
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
12679
12954
|
const isActive = lang.code === activeLang;
|
|
12680
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12955
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
12681
12956
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
12682
12957
|
"text-xs select-none",
|
|
12683
12958
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -12739,8 +13014,8 @@ function SiteHeader({
|
|
|
12739
13014
|
);
|
|
12740
13015
|
}
|
|
12741
13016
|
function ThemeToggle({ className }) {
|
|
12742
|
-
const [dark, setDark] =
|
|
12743
|
-
|
|
13017
|
+
const [dark, setDark] = React32__namespace.useState(false);
|
|
13018
|
+
React32__namespace.useEffect(() => {
|
|
12744
13019
|
const saved = localStorage.getItem("theme");
|
|
12745
13020
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
12746
13021
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -12790,7 +13065,7 @@ var chipVariants = classVarianceAuthority.cva(
|
|
|
12790
13065
|
}
|
|
12791
13066
|
}
|
|
12792
13067
|
);
|
|
12793
|
-
var Chip =
|
|
13068
|
+
var Chip = React32__namespace.forwardRef(function Chip2(_a, ref) {
|
|
12794
13069
|
var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
|
|
12795
13070
|
const classes = cn(chipVariants({ variant, size }), className);
|
|
12796
13071
|
if (href) {
|
|
@@ -12892,7 +13167,7 @@ function TripCardEditorial(props) {
|
|
|
12892
13167
|
tag,
|
|
12893
13168
|
tagHref
|
|
12894
13169
|
} = props;
|
|
12895
|
-
const [internalFav, setInternalFav] =
|
|
13170
|
+
const [internalFav, setInternalFav] = React32__namespace.useState(false);
|
|
12896
13171
|
const favorited = favoritedProp != null ? favoritedProp : internalFav;
|
|
12897
13172
|
const handleFav = (e) => {
|
|
12898
13173
|
e.preventDefault();
|
|
@@ -13403,7 +13678,7 @@ function BlogPost({
|
|
|
13403
13678
|
) }),
|
|
13404
13679
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
|
|
13405
13680
|
/* @__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: [
|
|
13406
|
-
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(
|
|
13681
|
+
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(React32__namespace.Fragment, { children: [
|
|
13407
13682
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13408
13683
|
crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
13409
13684
|
"a",
|
|
@@ -13457,7 +13732,7 @@ function BlogPost({
|
|
|
13457
13732
|
] });
|
|
13458
13733
|
}
|
|
13459
13734
|
function useHlsVideo(videoRef, src) {
|
|
13460
|
-
|
|
13735
|
+
React32__namespace.useEffect(() => {
|
|
13461
13736
|
if (!src || !videoRef.current) return;
|
|
13462
13737
|
const video = videoRef.current;
|
|
13463
13738
|
if (!src.includes(".m3u8")) return;
|
|
@@ -13501,11 +13776,11 @@ function TripHeader({
|
|
|
13501
13776
|
className
|
|
13502
13777
|
}) {
|
|
13503
13778
|
var _a;
|
|
13504
|
-
const [heroIndex, setHeroIndex] =
|
|
13505
|
-
const [videoReady, setVideoReady] =
|
|
13506
|
-
const videoRef =
|
|
13779
|
+
const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
|
|
13780
|
+
const [videoReady, setVideoReady] = React32__namespace.useState(false);
|
|
13781
|
+
const videoRef = React32__namespace.useRef(null);
|
|
13507
13782
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
13508
|
-
const validImages =
|
|
13783
|
+
const validImages = React32__namespace.useMemo(
|
|
13509
13784
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
13510
13785
|
[images]
|
|
13511
13786
|
);
|
|
@@ -13520,7 +13795,7 @@ function TripHeader({
|
|
|
13520
13795
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
13521
13796
|
const hasMeta = !!(destination || duration);
|
|
13522
13797
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
13523
|
-
|
|
13798
|
+
React32__namespace.useEffect(() => {
|
|
13524
13799
|
if (!videoUrl) return;
|
|
13525
13800
|
const el = videoRef.current;
|
|
13526
13801
|
if (!el) return;
|
|
@@ -13663,7 +13938,7 @@ function TripHeader({
|
|
|
13663
13938
|
chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
|
|
13664
13939
|
),
|
|
13665
13940
|
children: [
|
|
13666
|
-
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(
|
|
13941
|
+
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(React32__namespace.Fragment, { children: [
|
|
13667
13942
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13668
13943
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
13669
13944
|
] }, i)) }),
|
|
@@ -13829,10 +14104,10 @@ function LanguagePicker({
|
|
|
13829
14104
|
}) {
|
|
13830
14105
|
var _a;
|
|
13831
14106
|
const t = VARIANT2[variant];
|
|
13832
|
-
const [open, setOpen] =
|
|
13833
|
-
const ref =
|
|
14107
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
14108
|
+
const ref = React32__namespace.useRef(null);
|
|
13834
14109
|
const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
|
|
13835
|
-
|
|
14110
|
+
React32__namespace.useEffect(() => {
|
|
13836
14111
|
if (!open) return;
|
|
13837
14112
|
const onDocClick = (e) => {
|
|
13838
14113
|
if (ref.current && !ref.current.contains(e.target)) {
|
|
@@ -14033,7 +14308,7 @@ function SiteFooter({
|
|
|
14033
14308
|
children: wrapper
|
|
14034
14309
|
},
|
|
14035
14310
|
b.alt + i
|
|
14036
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
14311
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(React32__namespace.Fragment, { children: wrapper }, b.alt + i);
|
|
14037
14312
|
}) })
|
|
14038
14313
|
] }),
|
|
14039
14314
|
themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
|
|
@@ -14208,10 +14483,10 @@ function TripPage({
|
|
|
14208
14483
|
className
|
|
14209
14484
|
}) {
|
|
14210
14485
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
|
|
14211
|
-
const [activeSection, setActiveSection] =
|
|
14212
|
-
const [accordionValue, setAccordionValue] =
|
|
14213
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
14214
|
-
const accordionSectionIds =
|
|
14486
|
+
const [activeSection, setActiveSection] = React32__namespace.useState("");
|
|
14487
|
+
const [accordionValue, setAccordionValue] = React32__namespace.useState([]);
|
|
14488
|
+
const [faqsExpanded, setFaqsExpanded] = React32__namespace.useState(false);
|
|
14489
|
+
const accordionSectionIds = React32__namespace.useMemo(
|
|
14215
14490
|
() => /* @__PURE__ */ new Set([
|
|
14216
14491
|
"when-it-operates",
|
|
14217
14492
|
"how-to-get-there",
|
|
@@ -14225,18 +14500,18 @@ function TripPage({
|
|
|
14225
14500
|
]),
|
|
14226
14501
|
[]
|
|
14227
14502
|
);
|
|
14228
|
-
const [navFloating, setNavFloating] =
|
|
14229
|
-
const [navHidden, setNavHidden] =
|
|
14230
|
-
const [isFloating, setIsFloating] =
|
|
14231
|
-
const [sidebarPos, setSidebarPos] =
|
|
14232
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
14233
|
-
const navRef =
|
|
14234
|
-
const navSentinelRef =
|
|
14235
|
-
const sentinelRef =
|
|
14236
|
-
const sidebarPlaceholderRef =
|
|
14237
|
-
const pricingBarRef =
|
|
14238
|
-
const galleryRef =
|
|
14239
|
-
const sections =
|
|
14503
|
+
const [navFloating, setNavFloating] = React32__namespace.useState(false);
|
|
14504
|
+
const [navHidden, setNavHidden] = React32__namespace.useState(false);
|
|
14505
|
+
const [isFloating, setIsFloating] = React32__namespace.useState(false);
|
|
14506
|
+
const [sidebarPos, setSidebarPos] = React32__namespace.useState(null);
|
|
14507
|
+
const [pricingBarVisible, setPricingBarVisible] = React32__namespace.useState(false);
|
|
14508
|
+
const navRef = React32__namespace.useRef(null);
|
|
14509
|
+
const navSentinelRef = React32__namespace.useRef(null);
|
|
14510
|
+
const sentinelRef = React32__namespace.useRef(null);
|
|
14511
|
+
const sidebarPlaceholderRef = React32__namespace.useRef(null);
|
|
14512
|
+
const pricingBarRef = React32__namespace.useRef(null);
|
|
14513
|
+
const galleryRef = React32__namespace.useRef(null);
|
|
14514
|
+
const sections = React32__namespace.useMemo(
|
|
14240
14515
|
() => {
|
|
14241
14516
|
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
|
|
14242
14517
|
return [
|
|
@@ -14258,7 +14533,7 @@ function TripPage({
|
|
|
14258
14533
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
14259
14534
|
[]
|
|
14260
14535
|
);
|
|
14261
|
-
|
|
14536
|
+
React32__namespace.useEffect(() => {
|
|
14262
14537
|
const sentinel = navSentinelRef.current;
|
|
14263
14538
|
if (!sentinel) return;
|
|
14264
14539
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -14266,7 +14541,7 @@ function TripPage({
|
|
|
14266
14541
|
update();
|
|
14267
14542
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
14268
14543
|
}, []);
|
|
14269
|
-
|
|
14544
|
+
React32__namespace.useEffect(() => {
|
|
14270
14545
|
const sentinel = sentinelRef.current;
|
|
14271
14546
|
if (!sentinel) return;
|
|
14272
14547
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -14274,7 +14549,7 @@ function TripPage({
|
|
|
14274
14549
|
update();
|
|
14275
14550
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
14276
14551
|
}, []);
|
|
14277
|
-
|
|
14552
|
+
React32__namespace.useEffect(() => {
|
|
14278
14553
|
const measure = () => {
|
|
14279
14554
|
if (!sidebarPlaceholderRef.current) return;
|
|
14280
14555
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -14284,7 +14559,7 @@ function TripPage({
|
|
|
14284
14559
|
window.addEventListener("resize", measure);
|
|
14285
14560
|
return () => window.removeEventListener("resize", measure);
|
|
14286
14561
|
}, [isFloating]);
|
|
14287
|
-
|
|
14562
|
+
React32__namespace.useEffect(() => {
|
|
14288
14563
|
const check = () => {
|
|
14289
14564
|
var _a2;
|
|
14290
14565
|
const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
|
|
@@ -14295,7 +14570,7 @@ function TripPage({
|
|
|
14295
14570
|
check();
|
|
14296
14571
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
14297
14572
|
}, []);
|
|
14298
|
-
|
|
14573
|
+
React32__namespace.useEffect(() => {
|
|
14299
14574
|
const check = () => {
|
|
14300
14575
|
if (!pricingBarRef.current) return;
|
|
14301
14576
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -14304,7 +14579,7 @@ function TripPage({
|
|
|
14304
14579
|
check();
|
|
14305
14580
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
14306
14581
|
}, []);
|
|
14307
|
-
|
|
14582
|
+
React32__namespace.useEffect(() => {
|
|
14308
14583
|
if (sections.length === 0) return;
|
|
14309
14584
|
setActiveSection(sections[0].id);
|
|
14310
14585
|
const update = () => {
|
|
@@ -14779,7 +15054,7 @@ function TripPage({
|
|
|
14779
15054
|
}
|
|
14780
15055
|
);
|
|
14781
15056
|
}
|
|
14782
|
-
function
|
|
15057
|
+
function SectionHeading2({
|
|
14783
15058
|
eyebrow,
|
|
14784
15059
|
title,
|
|
14785
15060
|
rightSlot
|
|
@@ -14829,11 +15104,11 @@ function CategoryPage2({
|
|
|
14829
15104
|
className
|
|
14830
15105
|
}) {
|
|
14831
15106
|
var _a;
|
|
14832
|
-
const [videoReady, setVideoReady] =
|
|
14833
|
-
const videoRef =
|
|
15107
|
+
const [videoReady, setVideoReady] = React32__namespace.useState(false);
|
|
15108
|
+
const videoRef = React32__namespace.useRef(null);
|
|
14834
15109
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
14835
15110
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
14836
|
-
|
|
15111
|
+
React32__namespace.useEffect(() => {
|
|
14837
15112
|
if (!videoUrl) return;
|
|
14838
15113
|
const el = videoRef.current;
|
|
14839
15114
|
if (!el) return;
|
|
@@ -14848,13 +15123,13 @@ function CategoryPage2({
|
|
|
14848
15123
|
io.observe(el);
|
|
14849
15124
|
return () => io.disconnect();
|
|
14850
15125
|
}, [videoUrl]);
|
|
14851
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
14852
|
-
const [tripsExpanded, setTripsExpanded] =
|
|
14853
|
-
const [filterValue, setFilterValue] =
|
|
14854
|
-
const [sort, setSort] =
|
|
15126
|
+
const [faqsExpanded, setFaqsExpanded] = React32__namespace.useState(false);
|
|
15127
|
+
const [tripsExpanded, setTripsExpanded] = React32__namespace.useState(false);
|
|
15128
|
+
const [filterValue, setFilterValue] = React32__namespace.useState({});
|
|
15129
|
+
const [sort, setSort] = React32__namespace.useState(
|
|
14855
15130
|
defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
|
|
14856
15131
|
);
|
|
14857
|
-
const sortedTrips =
|
|
15132
|
+
const sortedTrips = React32__namespace.useMemo(() => {
|
|
14858
15133
|
const active = Object.entries(filterValue).filter(
|
|
14859
15134
|
([, vals]) => vals && vals.length > 0
|
|
14860
15135
|
);
|
|
@@ -14958,7 +15233,7 @@ function CategoryPage2({
|
|
|
14958
15233
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
14959
15234
|
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
|
|
14960
15235
|
const isLast = i === breadcrumb.length - 1;
|
|
14961
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15236
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
14962
15237
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
14963
15238
|
crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
14964
15239
|
"a",
|
|
@@ -14988,7 +15263,7 @@ function CategoryPage2({
|
|
|
14988
15263
|
),
|
|
14989
15264
|
popularTours && popularTours.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: [
|
|
14990
15265
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14991
|
-
|
|
15266
|
+
SectionHeading2,
|
|
14992
15267
|
{
|
|
14993
15268
|
eyebrow: popularToursEyebrow,
|
|
14994
15269
|
title: popularToursTitle
|
|
@@ -15008,7 +15283,7 @@ function CategoryPage2({
|
|
|
15008
15283
|
}) }) })
|
|
15009
15284
|
] }),
|
|
15010
15285
|
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 pt-6 sm:pt-8 pb-12", children: [
|
|
15011
|
-
(tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15286
|
+
(tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsxRuntime.jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
|
|
15012
15287
|
filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15013
15288
|
FilterPanel,
|
|
15014
15289
|
{
|
|
@@ -15246,12 +15521,12 @@ function Toast({
|
|
|
15246
15521
|
duration = 6e3,
|
|
15247
15522
|
className
|
|
15248
15523
|
}) {
|
|
15249
|
-
const [mounted, setMounted] =
|
|
15250
|
-
const [visible, setVisible] =
|
|
15251
|
-
|
|
15524
|
+
const [mounted, setMounted] = React32__namespace.useState(false);
|
|
15525
|
+
const [visible, setVisible] = React32__namespace.useState(true);
|
|
15526
|
+
React32__namespace.useEffect(() => {
|
|
15252
15527
|
setMounted(true);
|
|
15253
15528
|
}, []);
|
|
15254
|
-
|
|
15529
|
+
React32__namespace.useEffect(() => {
|
|
15255
15530
|
if (duration === 0) return;
|
|
15256
15531
|
const t = setTimeout(() => {
|
|
15257
15532
|
setVisible(false);
|
|
@@ -15658,21 +15933,21 @@ function LeadCapturePopup({
|
|
|
15658
15933
|
}) {
|
|
15659
15934
|
var _a;
|
|
15660
15935
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
15661
|
-
const [open, setOpen] =
|
|
15662
|
-
const [closing, setClosing] =
|
|
15663
|
-
const [submitted, setSubmitted] =
|
|
15664
|
-
const [submitting, setSubmitting] =
|
|
15665
|
-
const [error, setError] =
|
|
15666
|
-
const [name, setName] =
|
|
15667
|
-
const [email, setEmail] =
|
|
15668
|
-
const [travelDate, setTravelDate] =
|
|
15669
|
-
const panelRef =
|
|
15670
|
-
const nameRef =
|
|
15671
|
-
const show =
|
|
15936
|
+
const [open, setOpen] = React32.useState(false);
|
|
15937
|
+
const [closing, setClosing] = React32.useState(false);
|
|
15938
|
+
const [submitted, setSubmitted] = React32.useState(false);
|
|
15939
|
+
const [submitting, setSubmitting] = React32.useState(false);
|
|
15940
|
+
const [error, setError] = React32.useState(null);
|
|
15941
|
+
const [name, setName] = React32.useState("");
|
|
15942
|
+
const [email, setEmail] = React32.useState("");
|
|
15943
|
+
const [travelDate, setTravelDate] = React32.useState("");
|
|
15944
|
+
const panelRef = React32.useRef(null);
|
|
15945
|
+
const nameRef = React32.useRef(null);
|
|
15946
|
+
const show = React32.useCallback(() => {
|
|
15672
15947
|
if (isDismissed()) return;
|
|
15673
15948
|
setOpen(true);
|
|
15674
15949
|
}, []);
|
|
15675
|
-
|
|
15950
|
+
React32.useEffect(() => {
|
|
15676
15951
|
var _a2;
|
|
15677
15952
|
if (isDismissed()) return;
|
|
15678
15953
|
if (config.trigger === "delay") {
|
|
@@ -15699,7 +15974,7 @@ function LeadCapturePopup({
|
|
|
15699
15974
|
return () => window.removeEventListener("scroll", handler);
|
|
15700
15975
|
}
|
|
15701
15976
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
15702
|
-
|
|
15977
|
+
React32.useEffect(() => {
|
|
15703
15978
|
if (open && !submitted) {
|
|
15704
15979
|
requestAnimationFrame(() => {
|
|
15705
15980
|
var _a2;
|
|
@@ -15707,7 +15982,7 @@ function LeadCapturePopup({
|
|
|
15707
15982
|
});
|
|
15708
15983
|
}
|
|
15709
15984
|
}, [open, submitted]);
|
|
15710
|
-
const close =
|
|
15985
|
+
const close = React32.useCallback(() => {
|
|
15711
15986
|
setClosing(true);
|
|
15712
15987
|
setDismissed(config.dismissDays);
|
|
15713
15988
|
setTimeout(() => {
|
|
@@ -15715,7 +15990,7 @@ function LeadCapturePopup({
|
|
|
15715
15990
|
setClosing(false);
|
|
15716
15991
|
}, 250);
|
|
15717
15992
|
}, [config.dismissDays]);
|
|
15718
|
-
|
|
15993
|
+
React32.useEffect(() => {
|
|
15719
15994
|
if (!open) return;
|
|
15720
15995
|
const handler = (e) => {
|
|
15721
15996
|
if (e.key === "Escape") close();
|
|
@@ -15723,7 +15998,7 @@ function LeadCapturePopup({
|
|
|
15723
15998
|
document.addEventListener("keydown", handler);
|
|
15724
15999
|
return () => document.removeEventListener("keydown", handler);
|
|
15725
16000
|
}, [open, close]);
|
|
15726
|
-
const onOverlayClick =
|
|
16001
|
+
const onOverlayClick = React32.useCallback(
|
|
15727
16002
|
(e) => {
|
|
15728
16003
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
15729
16004
|
close();
|
|
@@ -15961,11 +16236,11 @@ function ExoOrb({
|
|
|
15961
16236
|
trackCursor = true,
|
|
15962
16237
|
className
|
|
15963
16238
|
}) {
|
|
15964
|
-
const uid =
|
|
16239
|
+
const uid = React32.useId().replace(/:/g, "");
|
|
15965
16240
|
const id = (name) => `exo-orb-${uid}-${name}`;
|
|
15966
|
-
const rootRef =
|
|
15967
|
-
const pupilRef =
|
|
15968
|
-
|
|
16241
|
+
const rootRef = React32.useRef(null);
|
|
16242
|
+
const pupilRef = React32.useRef(null);
|
|
16243
|
+
React32.useEffect(() => {
|
|
15969
16244
|
if (!trackCursor) return;
|
|
15970
16245
|
if (typeof window === "undefined") return;
|
|
15971
16246
|
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
@@ -16161,13 +16436,13 @@ function AskExo({
|
|
|
16161
16436
|
teaserDelayMs = 2500,
|
|
16162
16437
|
teaserDurationMs = 6e3
|
|
16163
16438
|
}) {
|
|
16164
|
-
const [open, setOpen] =
|
|
16165
|
-
const [question, setQuestion] =
|
|
16166
|
-
const [teaserVisible, setTeaserVisible] =
|
|
16439
|
+
const [open, setOpen] = React32.useState(false);
|
|
16440
|
+
const [question, setQuestion] = React32.useState("");
|
|
16441
|
+
const [teaserVisible, setTeaserVisible] = React32.useState(false);
|
|
16167
16442
|
const teaserEnabled = !!teaser && teaser !== "";
|
|
16168
|
-
const inputRef =
|
|
16169
|
-
const textareaRef =
|
|
16170
|
-
|
|
16443
|
+
const inputRef = React32.useRef(null);
|
|
16444
|
+
const textareaRef = React32.useRef(null);
|
|
16445
|
+
React32.useEffect(() => {
|
|
16171
16446
|
if (!open) {
|
|
16172
16447
|
setQuestion("");
|
|
16173
16448
|
return;
|
|
@@ -16179,7 +16454,7 @@ function AskExo({
|
|
|
16179
16454
|
}, 200);
|
|
16180
16455
|
return () => clearTimeout(t);
|
|
16181
16456
|
}, [open, variant]);
|
|
16182
|
-
|
|
16457
|
+
React32.useEffect(() => {
|
|
16183
16458
|
if (!open) return;
|
|
16184
16459
|
const onKey = (e) => {
|
|
16185
16460
|
if (e.key === "Escape") setOpen(false);
|
|
@@ -16187,7 +16462,7 @@ function AskExo({
|
|
|
16187
16462
|
document.addEventListener("keydown", onKey);
|
|
16188
16463
|
return () => document.removeEventListener("keydown", onKey);
|
|
16189
16464
|
}, [open]);
|
|
16190
|
-
|
|
16465
|
+
React32.useEffect(() => {
|
|
16191
16466
|
if (!teaserEnabled || open) return;
|
|
16192
16467
|
if (typeof window === "undefined") return;
|
|
16193
16468
|
const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
|
|
@@ -16200,7 +16475,7 @@ function AskExo({
|
|
|
16200
16475
|
clearTimeout(hideTimer);
|
|
16201
16476
|
};
|
|
16202
16477
|
}, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
|
|
16203
|
-
|
|
16478
|
+
React32.useEffect(() => {
|
|
16204
16479
|
if (open) setTeaserVisible(false);
|
|
16205
16480
|
}, [open]);
|
|
16206
16481
|
const askExo = (q) => {
|
|
@@ -16753,8 +17028,8 @@ function ShareWidget({
|
|
|
16753
17028
|
title = "Invite friends & lower the price",
|
|
16754
17029
|
className
|
|
16755
17030
|
}) {
|
|
16756
|
-
const [copied, setCopied] =
|
|
16757
|
-
const [showToast, setShowToast] =
|
|
17031
|
+
const [copied, setCopied] = React32__namespace.useState(false);
|
|
17032
|
+
const [showToast, setShowToast] = React32__namespace.useState(false);
|
|
16758
17033
|
const encodedUrl = encodeURIComponent(url);
|
|
16759
17034
|
const encodedMsg = encodeURIComponent(`${message} ${url}`);
|
|
16760
17035
|
const channels = [
|
|
@@ -16923,6 +17198,7 @@ exports.BookingShell = BookingShell;
|
|
|
16923
17198
|
exports.BookingSummary = BookingSummary;
|
|
16924
17199
|
exports.Button = Button;
|
|
16925
17200
|
exports.COUNTRIES = COUNTRIES;
|
|
17201
|
+
exports.CancellationForm = CancellationForm;
|
|
16926
17202
|
exports.CategoryPage2 = CategoryPage2;
|
|
16927
17203
|
exports.CounterField = CounterField;
|
|
16928
17204
|
exports.CountrySearchField = CountrySearchField;
|