@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.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React32 from 'react';
|
|
2
2
|
import { useState, useRef, useCallback, useEffect, useId } from 'react';
|
|
3
3
|
import { cva } from 'class-variance-authority';
|
|
4
4
|
import { clsx } from 'clsx';
|
|
@@ -81,7 +81,7 @@ var buttonVariants = cva(
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
);
|
|
84
|
-
var Button =
|
|
84
|
+
var Button = React32.forwardRef(
|
|
85
85
|
(_a, ref) => {
|
|
86
86
|
var _b = _a, { className, variant, size } = _b, props = __objRest(_b, ["className", "variant", "size"]);
|
|
87
87
|
return /* @__PURE__ */ jsx(
|
|
@@ -310,10 +310,10 @@ function DialogDescription(_a) {
|
|
|
310
310
|
}, props)
|
|
311
311
|
);
|
|
312
312
|
}
|
|
313
|
-
var FloatingInput =
|
|
313
|
+
var FloatingInput = React32.forwardRef(
|
|
314
314
|
(_a, ref) => {
|
|
315
315
|
var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
|
|
316
|
-
const inputId = id != null ? id :
|
|
316
|
+
const inputId = id != null ? id : React32.useId();
|
|
317
317
|
return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
|
|
318
318
|
/* @__PURE__ */ jsx(
|
|
319
319
|
"input",
|
|
@@ -353,10 +353,10 @@ var FloatingInput = React31.forwardRef(
|
|
|
353
353
|
}
|
|
354
354
|
);
|
|
355
355
|
FloatingInput.displayName = "FloatingInput";
|
|
356
|
-
var FloatingSelect =
|
|
356
|
+
var FloatingSelect = React32.forwardRef(
|
|
357
357
|
(_a, ref) => {
|
|
358
358
|
var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
|
|
359
|
-
const inputId = id != null ? id :
|
|
359
|
+
const inputId = id != null ? id : React32.useId();
|
|
360
360
|
const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
|
|
361
361
|
return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
|
|
362
362
|
/* @__PURE__ */ jsx(
|
|
@@ -620,11 +620,11 @@ function PhoneCountrySelect({
|
|
|
620
620
|
disabled
|
|
621
621
|
}) {
|
|
622
622
|
var _a;
|
|
623
|
-
const [open, setOpen] =
|
|
624
|
-
const containerRef =
|
|
625
|
-
const listRef =
|
|
623
|
+
const [open, setOpen] = React32.useState(false);
|
|
624
|
+
const containerRef = React32.useRef(null);
|
|
625
|
+
const listRef = React32.useRef(null);
|
|
626
626
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
627
|
-
|
|
627
|
+
React32.useEffect(() => {
|
|
628
628
|
if (!open) return;
|
|
629
629
|
const handler = (e) => {
|
|
630
630
|
var _a2;
|
|
@@ -635,7 +635,7 @@ function PhoneCountrySelect({
|
|
|
635
635
|
document.addEventListener("mousedown", handler);
|
|
636
636
|
return () => document.removeEventListener("mousedown", handler);
|
|
637
637
|
}, [open]);
|
|
638
|
-
|
|
638
|
+
React32.useEffect(() => {
|
|
639
639
|
if (!open || !listRef.current) return;
|
|
640
640
|
const activeEl = listRef.current.querySelector("[data-selected=true]");
|
|
641
641
|
activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
|
|
@@ -905,8 +905,8 @@ function CalendarDayButton(_a) {
|
|
|
905
905
|
"locale"
|
|
906
906
|
]);
|
|
907
907
|
const defaultClassNames = getDefaultClassNames();
|
|
908
|
-
const ref =
|
|
909
|
-
|
|
908
|
+
const ref = React32.useRef(null);
|
|
909
|
+
React32.useEffect(() => {
|
|
910
910
|
var _a2;
|
|
911
911
|
if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
|
|
912
912
|
}, [modifiers.focused]);
|
|
@@ -937,16 +937,16 @@ function BirthDateField({
|
|
|
937
937
|
className,
|
|
938
938
|
disabled
|
|
939
939
|
}) {
|
|
940
|
-
const [open, setOpen] =
|
|
941
|
-
const [text, setText] =
|
|
940
|
+
const [open, setOpen] = React32.useState(false);
|
|
941
|
+
const [text, setText] = React32.useState(
|
|
942
942
|
value ? format(value, "dd/MM/yyyy") : ""
|
|
943
943
|
);
|
|
944
|
-
const containerRef =
|
|
945
|
-
const inputId =
|
|
946
|
-
|
|
944
|
+
const containerRef = React32.useRef(null);
|
|
945
|
+
const inputId = React32.useId();
|
|
946
|
+
React32.useEffect(() => {
|
|
947
947
|
setText(value ? format(value, "dd/MM/yyyy") : "");
|
|
948
948
|
}, [value]);
|
|
949
|
-
|
|
949
|
+
React32.useEffect(() => {
|
|
950
950
|
if (!open) return;
|
|
951
951
|
const handler = (e) => {
|
|
952
952
|
var _a;
|
|
@@ -1155,14 +1155,14 @@ function CountrySearchField({
|
|
|
1155
1155
|
}) {
|
|
1156
1156
|
var _a;
|
|
1157
1157
|
const list = countries != null ? countries : COUNTRIES;
|
|
1158
|
-
const [query, setQuery] =
|
|
1159
|
-
const [open, setOpen] =
|
|
1160
|
-
const containerRef =
|
|
1161
|
-
const searchRef =
|
|
1158
|
+
const [query, setQuery] = React32.useState("");
|
|
1159
|
+
const [open, setOpen] = React32.useState(false);
|
|
1160
|
+
const containerRef = React32.useRef(null);
|
|
1161
|
+
const searchRef = React32.useRef(null);
|
|
1162
1162
|
const selected = list.find((c) => c.code === value);
|
|
1163
1163
|
const isFloated = open || !!selected;
|
|
1164
1164
|
const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
|
|
1165
|
-
|
|
1165
|
+
React32.useEffect(() => {
|
|
1166
1166
|
if (!open) return;
|
|
1167
1167
|
const handler = (e) => {
|
|
1168
1168
|
var _a2;
|
|
@@ -1307,10 +1307,10 @@ function AdventureCard({
|
|
|
1307
1307
|
}) {
|
|
1308
1308
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
1309
1309
|
const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
|
|
1310
|
-
const [checkedInternal, setCheckedInternal] =
|
|
1310
|
+
const [checkedInternal, setCheckedInternal] = React32.useState(
|
|
1311
1311
|
new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
|
|
1312
1312
|
);
|
|
1313
|
-
const [openDescriptionId, setOpenDescriptionId] =
|
|
1313
|
+
const [openDescriptionId, setOpenDescriptionId] = React32.useState(null);
|
|
1314
1314
|
const openDescriptionOptional = openDescriptionId ? (_e = adventure.optionals) == null ? void 0 : _e.find((o) => o.id === openDescriptionId) : void 0;
|
|
1315
1315
|
const isChecked = (opt) => {
|
|
1316
1316
|
var _a2;
|
|
@@ -1766,7 +1766,7 @@ function BookingShell({
|
|
|
1766
1766
|
return /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1767
1767
|
/* @__PURE__ */ jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
|
|
1768
1768
|
/* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
|
|
1769
|
-
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(
|
|
1769
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
|
|
1770
1770
|
/* @__PURE__ */ jsx(
|
|
1771
1771
|
"span",
|
|
1772
1772
|
{
|
|
@@ -1965,7 +1965,7 @@ function TermsSection({
|
|
|
1965
1965
|
termsContent
|
|
1966
1966
|
}) {
|
|
1967
1967
|
var _a;
|
|
1968
|
-
const [modalOpen, setModalOpen] =
|
|
1968
|
+
const [modalOpen, setModalOpen] = React32.useState(false);
|
|
1969
1969
|
const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
|
|
1970
1970
|
return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
|
|
1971
1971
|
/* @__PURE__ */ jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
|
|
@@ -2103,9 +2103,9 @@ function BookingWizard({
|
|
|
2103
2103
|
}) {
|
|
2104
2104
|
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;
|
|
2105
2105
|
const wizardSteps = WIZARD_STEPS_FN(labels);
|
|
2106
|
-
const [step, setStep] =
|
|
2107
|
-
const [error, setError] =
|
|
2108
|
-
const [responsible, setResponsible] =
|
|
2106
|
+
const [step, setStep] = React32.useState("responsible");
|
|
2107
|
+
const [error, setError] = React32.useState(null);
|
|
2108
|
+
const [responsible, setResponsible] = React32.useState({
|
|
2109
2109
|
firstName: "",
|
|
2110
2110
|
lastName: "",
|
|
2111
2111
|
email: "",
|
|
@@ -2124,7 +2124,7 @@ function BookingWizard({
|
|
|
2124
2124
|
return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
|
|
2125
2125
|
}, 0);
|
|
2126
2126
|
const totalPax = totalAdults + totalChildren;
|
|
2127
|
-
const [travellers, setTravellers] =
|
|
2127
|
+
const [travellers, setTravellers] = React32.useState(
|
|
2128
2128
|
Array.from({ length: Math.max(totalPax, 1) }, () => ({
|
|
2129
2129
|
firstName: "",
|
|
2130
2130
|
lastName: "",
|
|
@@ -2132,9 +2132,9 @@ function BookingWizard({
|
|
|
2132
2132
|
email: ""
|
|
2133
2133
|
}))
|
|
2134
2134
|
);
|
|
2135
|
-
const [payAmount, setPayAmount] =
|
|
2136
|
-
const [payMethod, setPayMethod] =
|
|
2137
|
-
const [termsAccepted, setTermsAccepted] =
|
|
2135
|
+
const [payAmount, setPayAmount] = React32.useState("full");
|
|
2136
|
+
const [payMethod, setPayMethod] = React32.useState("stripe");
|
|
2137
|
+
const [termsAccepted, setTermsAccepted] = React32.useState(false);
|
|
2138
2138
|
const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
2139
2139
|
const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
|
|
2140
2140
|
const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
|
|
@@ -2362,7 +2362,7 @@ function Offer({
|
|
|
2362
2362
|
className
|
|
2363
2363
|
}) {
|
|
2364
2364
|
var _a, _b, _c;
|
|
2365
|
-
const [showBooking, setShowBooking] =
|
|
2365
|
+
const [showBooking, setShowBooking] = React32.useState(false);
|
|
2366
2366
|
const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
|
|
2367
2367
|
const handleBook = () => {
|
|
2368
2368
|
if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
|
|
@@ -2729,7 +2729,7 @@ function AdventureSection({
|
|
|
2729
2729
|
labels
|
|
2730
2730
|
}) {
|
|
2731
2731
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
2732
|
-
const [detailsOpen, setDetailsOpen] =
|
|
2732
|
+
const [detailsOpen, setDetailsOpen] = React32.useState(false);
|
|
2733
2733
|
const handleCopyUrl = (url) => {
|
|
2734
2734
|
if (onCopyFormLink) {
|
|
2735
2735
|
onCopyFormLink(url);
|
|
@@ -3268,8 +3268,8 @@ function AddTravellerDialog({
|
|
|
3268
3268
|
errorMessage
|
|
3269
3269
|
}) {
|
|
3270
3270
|
var _a, _b, _c, _d, _e;
|
|
3271
|
-
const [form, setForm] =
|
|
3272
|
-
|
|
3271
|
+
const [form, setForm] = React32.useState(() => createInitialAddFormData(config));
|
|
3272
|
+
React32.useEffect(() => {
|
|
3273
3273
|
if (open) {
|
|
3274
3274
|
setForm(createInitialAddFormData(config));
|
|
3275
3275
|
}
|
|
@@ -3329,7 +3329,7 @@ function EditTravellerDialog({
|
|
|
3329
3329
|
errorMessage
|
|
3330
3330
|
}) {
|
|
3331
3331
|
var _a, _b, _c, _d, _e;
|
|
3332
|
-
const [form, setForm] =
|
|
3332
|
+
const [form, setForm] = React32.useState(() => ({
|
|
3333
3333
|
firstName: "",
|
|
3334
3334
|
lastName: "",
|
|
3335
3335
|
email: "",
|
|
@@ -3338,7 +3338,7 @@ function EditTravellerDialog({
|
|
|
3338
3338
|
birthDate: "",
|
|
3339
3339
|
personType: "ADULT"
|
|
3340
3340
|
}));
|
|
3341
|
-
|
|
3341
|
+
React32.useEffect(() => {
|
|
3342
3342
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3343
3343
|
if (open && traveller) {
|
|
3344
3344
|
setForm({
|
|
@@ -3674,48 +3674,48 @@ function BookingDetails({
|
|
|
3674
3674
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3675
3675
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3676
3676
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3677
|
-
const [addModalState, setAddModalState] =
|
|
3677
|
+
const [addModalState, setAddModalState] = React32.useState({
|
|
3678
3678
|
open: false,
|
|
3679
3679
|
adventureId: null
|
|
3680
3680
|
});
|
|
3681
|
-
const [editModalState, setEditModalState] =
|
|
3682
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3683
|
-
const [resendInviteDialogState, setResendInviteDialogState] =
|
|
3684
|
-
const handleRequestOpenAddModal =
|
|
3681
|
+
const [editModalState, setEditModalState] = React32.useState({ open: false, adventureId: null, traveller: null });
|
|
3682
|
+
const [deleteModalState, setDeleteModalState] = React32.useState({ open: false, adventureId: null, traveller: null });
|
|
3683
|
+
const [resendInviteDialogState, setResendInviteDialogState] = React32.useState({ open: false, traveller: null });
|
|
3684
|
+
const handleRequestOpenAddModal = React32.useCallback((adventureId) => {
|
|
3685
3685
|
setAddModalState({ open: true, adventureId });
|
|
3686
3686
|
}, []);
|
|
3687
|
-
const handleRequestOpenEditModal =
|
|
3687
|
+
const handleRequestOpenEditModal = React32.useCallback(
|
|
3688
3688
|
(adventureId, traveller) => {
|
|
3689
3689
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3690
3690
|
},
|
|
3691
3691
|
[]
|
|
3692
3692
|
);
|
|
3693
|
-
const handleRequestOpenDeleteModal =
|
|
3693
|
+
const handleRequestOpenDeleteModal = React32.useCallback(
|
|
3694
3694
|
(adventureId, traveller) => {
|
|
3695
3695
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3696
3696
|
},
|
|
3697
3697
|
[]
|
|
3698
3698
|
);
|
|
3699
|
-
const handleRequestOpenResendInviteDialog =
|
|
3699
|
+
const handleRequestOpenResendInviteDialog = React32.useCallback(
|
|
3700
3700
|
(traveller) => {
|
|
3701
3701
|
setResendInviteDialogState({ open: true, traveller });
|
|
3702
3702
|
},
|
|
3703
3703
|
[]
|
|
3704
3704
|
);
|
|
3705
|
-
const closeAddModal =
|
|
3705
|
+
const closeAddModal = React32.useCallback(() => {
|
|
3706
3706
|
setAddModalState({ open: false, adventureId: null });
|
|
3707
3707
|
}, []);
|
|
3708
|
-
const closeEditModal =
|
|
3708
|
+
const closeEditModal = React32.useCallback(() => {
|
|
3709
3709
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3710
3710
|
}, []);
|
|
3711
|
-
const closeDeleteModal =
|
|
3711
|
+
const closeDeleteModal = React32.useCallback(() => {
|
|
3712
3712
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3713
3713
|
}, []);
|
|
3714
|
-
const closeResendInviteDialog =
|
|
3714
|
+
const closeResendInviteDialog = React32.useCallback(() => {
|
|
3715
3715
|
setResendInviteDialogState({ open: false, traveller: null });
|
|
3716
3716
|
}, []);
|
|
3717
|
-
const submitInFlightRef =
|
|
3718
|
-
const handleAddSubmit =
|
|
3717
|
+
const submitInFlightRef = React32.useRef(false);
|
|
3718
|
+
const handleAddSubmit = React32.useCallback(
|
|
3719
3719
|
async (adventureId, data) => {
|
|
3720
3720
|
if (!onSubmitAddTraveller) return;
|
|
3721
3721
|
if (submitInFlightRef.current) return;
|
|
@@ -3730,7 +3730,7 @@ function BookingDetails({
|
|
|
3730
3730
|
},
|
|
3731
3731
|
[onSubmitAddTraveller, closeAddModal]
|
|
3732
3732
|
);
|
|
3733
|
-
const handleEditSubmit =
|
|
3733
|
+
const handleEditSubmit = React32.useCallback(
|
|
3734
3734
|
async (adventureId, travellerId, data) => {
|
|
3735
3735
|
if (!onSubmitEditTraveller) return;
|
|
3736
3736
|
if (submitInFlightRef.current) return;
|
|
@@ -3745,7 +3745,7 @@ function BookingDetails({
|
|
|
3745
3745
|
},
|
|
3746
3746
|
[onSubmitEditTraveller, closeEditModal]
|
|
3747
3747
|
);
|
|
3748
|
-
const handleDeleteConfirm =
|
|
3748
|
+
const handleDeleteConfirm = React32.useCallback(
|
|
3749
3749
|
async (adventureId, travellerId) => {
|
|
3750
3750
|
if (!onConfirmRemoveTraveller) return;
|
|
3751
3751
|
if (submitInFlightRef.current) return;
|
|
@@ -5542,7 +5542,7 @@ function BookingCreatedEmail({
|
|
|
5542
5542
|
}, children: i + 1 }) }),
|
|
5543
5543
|
/* @__PURE__ */ jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
|
|
5544
5544
|
] }) }) }, i)) }),
|
|
5545
|
-
nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxs(
|
|
5545
|
+
nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
|
|
5546
5546
|
idx === 0 ? /* @__PURE__ */ jsx("strong", { children: line }) : line,
|
|
5547
5547
|
idx < arr.length - 1 ? /* @__PURE__ */ jsx("br", {}) : null
|
|
5548
5548
|
] }, idx)) })
|
|
@@ -7911,11 +7911,11 @@ function DatePickerField({
|
|
|
7911
7911
|
fromDate,
|
|
7912
7912
|
className
|
|
7913
7913
|
}) {
|
|
7914
|
-
const [open, setOpen] =
|
|
7915
|
-
const containerRef =
|
|
7916
|
-
const [calendarWidth, setCalendarWidth] =
|
|
7914
|
+
const [open, setOpen] = React32.useState(false);
|
|
7915
|
+
const containerRef = React32.useRef(null);
|
|
7916
|
+
const [calendarWidth, setCalendarWidth] = React32.useState();
|
|
7917
7917
|
const hasValue = !!value;
|
|
7918
|
-
|
|
7918
|
+
React32.useEffect(() => {
|
|
7919
7919
|
if (!containerRef.current) return;
|
|
7920
7920
|
const observer = new ResizeObserver(([entry]) => {
|
|
7921
7921
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -8024,7 +8024,7 @@ function BookingForm({
|
|
|
8024
8024
|
subtitle = "Free enquiry \u2013 no commitment",
|
|
8025
8025
|
className
|
|
8026
8026
|
}) {
|
|
8027
|
-
const [values, setValues] =
|
|
8027
|
+
const [values, setValues] = React32.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
8028
8028
|
const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
8029
8029
|
const handleSubmit = (e) => {
|
|
8030
8030
|
e.preventDefault();
|
|
@@ -8592,11 +8592,11 @@ function FloatingTextarea({
|
|
|
8592
8592
|
}
|
|
8593
8593
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
8594
8594
|
var _a, _b, _c;
|
|
8595
|
-
const [open, setOpen] =
|
|
8596
|
-
const containerRef =
|
|
8595
|
+
const [open, setOpen] = React32.useState(false);
|
|
8596
|
+
const containerRef = React32.useRef(null);
|
|
8597
8597
|
const options = (_a = field.options) != null ? _a : [];
|
|
8598
8598
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
8599
|
-
|
|
8599
|
+
React32.useEffect(() => {
|
|
8600
8600
|
if (!open) return;
|
|
8601
8601
|
const handleOutside = (e) => {
|
|
8602
8602
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -9064,11 +9064,11 @@ function RegistrationForm({
|
|
|
9064
9064
|
readOnly = false
|
|
9065
9065
|
}) {
|
|
9066
9066
|
var _a;
|
|
9067
|
-
const L =
|
|
9067
|
+
const L = React32.useMemo(
|
|
9068
9068
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
|
|
9069
9069
|
[labels]
|
|
9070
9070
|
);
|
|
9071
|
-
const sortedFields =
|
|
9071
|
+
const sortedFields = React32.useMemo(
|
|
9072
9072
|
() => [...fields].sort((a, b) => {
|
|
9073
9073
|
var _a2, _b;
|
|
9074
9074
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -9076,7 +9076,7 @@ function RegistrationForm({
|
|
|
9076
9076
|
[fields]
|
|
9077
9077
|
);
|
|
9078
9078
|
const isControlled = values !== void 0;
|
|
9079
|
-
const [internal, setInternal] =
|
|
9079
|
+
const [internal, setInternal] = React32.useState(
|
|
9080
9080
|
() => initializeValues(
|
|
9081
9081
|
sortedFields,
|
|
9082
9082
|
defaultValues != null ? defaultValues : {},
|
|
@@ -9084,9 +9084,9 @@ function RegistrationForm({
|
|
|
9084
9084
|
includeTerms
|
|
9085
9085
|
)
|
|
9086
9086
|
);
|
|
9087
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
9088
|
-
const [validationErrors, setValidationErrors] =
|
|
9089
|
-
|
|
9087
|
+
const [submitAttempted, setSubmitAttempted] = React32.useState(false);
|
|
9088
|
+
const [validationErrors, setValidationErrors] = React32.useState({});
|
|
9089
|
+
React32.useEffect(() => {
|
|
9090
9090
|
if (isControlled) return;
|
|
9091
9091
|
setInternal((prev) => {
|
|
9092
9092
|
const next = initializeValues(
|
|
@@ -9143,7 +9143,7 @@ function RegistrationForm({
|
|
|
9143
9143
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
9144
9144
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
9145
9145
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
9146
|
-
|
|
9146
|
+
React32.useEffect(() => {
|
|
9147
9147
|
if (!submitAttempted || !scrollTargetId) return;
|
|
9148
9148
|
const timer = setTimeout(() => {
|
|
9149
9149
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -9596,6 +9596,281 @@ function RegistrationSuccessCard({
|
|
|
9596
9596
|
}
|
|
9597
9597
|
);
|
|
9598
9598
|
}
|
|
9599
|
+
var OTHER = "OTHER";
|
|
9600
|
+
function SectionHeading({ children }) {
|
|
9601
|
+
return /* @__PURE__ */ jsx("h2", { className: "text-lg font-heading font-bold text-foreground mb-3", children });
|
|
9602
|
+
}
|
|
9603
|
+
function FieldError({ children }) {
|
|
9604
|
+
if (!children) return null;
|
|
9605
|
+
return /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children });
|
|
9606
|
+
}
|
|
9607
|
+
function CancellationForm({
|
|
9608
|
+
adventures,
|
|
9609
|
+
identity,
|
|
9610
|
+
labels,
|
|
9611
|
+
onSubmit,
|
|
9612
|
+
submitting = false,
|
|
9613
|
+
error,
|
|
9614
|
+
className
|
|
9615
|
+
}) {
|
|
9616
|
+
var _a, _b, _c;
|
|
9617
|
+
const [selectedAdventureIds, setSelectedAdventureIds] = React32.useState(/* @__PURE__ */ new Set());
|
|
9618
|
+
const [participantsByAdventure, setParticipantsByAdventure] = React32.useState({});
|
|
9619
|
+
const [reasonCode, setReasonCode] = React32.useState("");
|
|
9620
|
+
const [reasonOther, setReasonOther] = React32.useState("");
|
|
9621
|
+
const [refundPreference, setRefundPreference] = React32.useState("");
|
|
9622
|
+
const [refundOther, setRefundOther] = React32.useState("");
|
|
9623
|
+
const [agreedToPolicy, setAgreedToPolicy] = React32.useState(false);
|
|
9624
|
+
const [contactName, setContactName] = React32.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
|
|
9625
|
+
const [contactEmail, setContactEmail] = React32.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
|
|
9626
|
+
const [contactPhone, setContactPhone] = React32.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
|
|
9627
|
+
const [errors, setErrors] = React32.useState({});
|
|
9628
|
+
const allParticipantsOf = React32.useCallback(
|
|
9629
|
+
(advId) => {
|
|
9630
|
+
var _a2, _b2;
|
|
9631
|
+
return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
|
|
9632
|
+
},
|
|
9633
|
+
[adventures]
|
|
9634
|
+
);
|
|
9635
|
+
function toggleAdventure(advId, on) {
|
|
9636
|
+
setSelectedAdventureIds((prev) => {
|
|
9637
|
+
const next = new Set(prev);
|
|
9638
|
+
if (on) next.add(advId);
|
|
9639
|
+
else next.delete(advId);
|
|
9640
|
+
return next;
|
|
9641
|
+
});
|
|
9642
|
+
setParticipantsByAdventure((prev) => {
|
|
9643
|
+
const next = __spreadValues({}, prev);
|
|
9644
|
+
if (on) next[advId] = allParticipantsOf(advId);
|
|
9645
|
+
else delete next[advId];
|
|
9646
|
+
return next;
|
|
9647
|
+
});
|
|
9648
|
+
}
|
|
9649
|
+
function toggleParticipant(advId, travellerId, on) {
|
|
9650
|
+
setParticipantsByAdventure((prev) => {
|
|
9651
|
+
var _a2;
|
|
9652
|
+
const set = new Set((_a2 = prev[advId]) != null ? _a2 : []);
|
|
9653
|
+
if (on) set.add(travellerId);
|
|
9654
|
+
else set.delete(travellerId);
|
|
9655
|
+
return __spreadProps(__spreadValues({}, prev), { [advId]: set });
|
|
9656
|
+
});
|
|
9657
|
+
}
|
|
9658
|
+
function selectAll() {
|
|
9659
|
+
const allAdv = new Set(adventures.map((a) => a.id));
|
|
9660
|
+
const byAdv = {};
|
|
9661
|
+
for (const a of adventures) byAdv[a.id] = new Set(a.participants.map((p) => p.id));
|
|
9662
|
+
setSelectedAdventureIds(allAdv);
|
|
9663
|
+
setParticipantsByAdventure(byAdv);
|
|
9664
|
+
}
|
|
9665
|
+
const allSelected = adventures.length > 0 && adventures.every((a) => selectedAdventureIds.has(a.id));
|
|
9666
|
+
function validate() {
|
|
9667
|
+
var _a2;
|
|
9668
|
+
const next = {};
|
|
9669
|
+
const selAdvIds = adventures.filter((a) => selectedAdventureIds.has(a.id)).map((a) => a.id);
|
|
9670
|
+
if (selAdvIds.length === 0) next.adventures = labels.errorSelectAdventure;
|
|
9671
|
+
for (const advId of selAdvIds) {
|
|
9672
|
+
const set = participantsByAdventure[advId];
|
|
9673
|
+
if (!set || set.size === 0) next.participants = labels.errorSelectParticipants;
|
|
9674
|
+
}
|
|
9675
|
+
if (!reasonCode) next.reason = labels.errorReasonRequired;
|
|
9676
|
+
else if (reasonCode === OTHER && !reasonOther.trim()) next.reason = labels.errorReasonOtherRequired;
|
|
9677
|
+
if (!refundPreference) next.refund = labels.errorRefundRequired;
|
|
9678
|
+
else if (refundPreference === OTHER && !refundOther.trim())
|
|
9679
|
+
next.refund = labels.errorRefundOtherRequired;
|
|
9680
|
+
if (!agreedToPolicy) next.agreement = labels.errorAgreementRequired;
|
|
9681
|
+
setErrors(next);
|
|
9682
|
+
if (Object.keys(next).length > 0) return { ok: false };
|
|
9683
|
+
const travellerIds = /* @__PURE__ */ new Set();
|
|
9684
|
+
for (const advId of selAdvIds) {
|
|
9685
|
+
for (const tid of (_a2 = participantsByAdventure[advId]) != null ? _a2 : []) travellerIds.add(tid);
|
|
9686
|
+
}
|
|
9687
|
+
return {
|
|
9688
|
+
ok: true,
|
|
9689
|
+
values: {
|
|
9690
|
+
selectedBookingAdventureIds: selAdvIds,
|
|
9691
|
+
selectedTravellerIds: [...travellerIds],
|
|
9692
|
+
reasonCode,
|
|
9693
|
+
reasonOther: reasonCode === OTHER ? reasonOther.trim() : "",
|
|
9694
|
+
refundPreference,
|
|
9695
|
+
refundOther: refundPreference === OTHER ? refundOther.trim() : "",
|
|
9696
|
+
agreedToPolicy,
|
|
9697
|
+
contact: { name: contactName.trim(), email: contactEmail.trim(), phone: contactPhone.trim() }
|
|
9698
|
+
}
|
|
9699
|
+
};
|
|
9700
|
+
}
|
|
9701
|
+
function handleSubmit(e) {
|
|
9702
|
+
e.preventDefault();
|
|
9703
|
+
const r = validate();
|
|
9704
|
+
if (r.ok && r.values) void onSubmit(r.values);
|
|
9705
|
+
}
|
|
9706
|
+
return /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: cn("space-y-8", className), noValidate: true, children: [
|
|
9707
|
+
/* @__PURE__ */ jsxs("section", { children: [
|
|
9708
|
+
/* @__PURE__ */ jsx(SectionHeading, { children: labels.identityHeading }),
|
|
9709
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-3", children: [
|
|
9710
|
+
/* @__PURE__ */ jsx(
|
|
9711
|
+
FloatingInput,
|
|
9712
|
+
{
|
|
9713
|
+
label: labels.contactNameLabel,
|
|
9714
|
+
value: contactName,
|
|
9715
|
+
onChange: (e) => setContactName(e.target.value)
|
|
9716
|
+
}
|
|
9717
|
+
),
|
|
9718
|
+
/* @__PURE__ */ jsx(
|
|
9719
|
+
FloatingInput,
|
|
9720
|
+
{
|
|
9721
|
+
label: labels.contactEmailLabel,
|
|
9722
|
+
type: "email",
|
|
9723
|
+
value: contactEmail,
|
|
9724
|
+
onChange: (e) => setContactEmail(e.target.value)
|
|
9725
|
+
}
|
|
9726
|
+
),
|
|
9727
|
+
/* @__PURE__ */ jsx(
|
|
9728
|
+
FloatingInput,
|
|
9729
|
+
{
|
|
9730
|
+
label: labels.contactPhoneLabel,
|
|
9731
|
+
value: contactPhone,
|
|
9732
|
+
onChange: (e) => setContactPhone(e.target.value)
|
|
9733
|
+
}
|
|
9734
|
+
)
|
|
9735
|
+
] })
|
|
9736
|
+
] }),
|
|
9737
|
+
/* @__PURE__ */ jsxs("section", { children: [
|
|
9738
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 mb-3", children: [
|
|
9739
|
+
/* @__PURE__ */ jsx(SectionHeading, { children: labels.adventuresHeading }),
|
|
9740
|
+
adventures.length > 1 && /* @__PURE__ */ jsx(Button, { type: "button", variant: "link", size: "sm", onClick: selectAll, disabled: allSelected, children: labels.selectAllLabel })
|
|
9741
|
+
] }),
|
|
9742
|
+
labels.adventuresHint && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-3", children: labels.adventuresHint }),
|
|
9743
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-3", children: adventures.map((adv) => {
|
|
9744
|
+
var _a2;
|
|
9745
|
+
const selected = selectedAdventureIds.has(adv.id);
|
|
9746
|
+
const partSet = (_a2 = participantsByAdventure[adv.id]) != null ? _a2 : /* @__PURE__ */ new Set();
|
|
9747
|
+
return /* @__PURE__ */ jsxs(
|
|
9748
|
+
"div",
|
|
9749
|
+
{
|
|
9750
|
+
className: cn(
|
|
9751
|
+
"rounded-lg border p-4 transition-colors",
|
|
9752
|
+
selected ? "border-primary bg-primary/5" : "border-border bg-card"
|
|
9753
|
+
),
|
|
9754
|
+
children: [
|
|
9755
|
+
/* @__PURE__ */ jsxs("label", { className: "flex items-start gap-3 cursor-pointer", children: [
|
|
9756
|
+
/* @__PURE__ */ jsx(
|
|
9757
|
+
"input",
|
|
9758
|
+
{
|
|
9759
|
+
type: "checkbox",
|
|
9760
|
+
className: "mt-1 h-4 w-4 accent-primary",
|
|
9761
|
+
checked: selected,
|
|
9762
|
+
onChange: (e) => toggleAdventure(adv.id, e.target.checked)
|
|
9763
|
+
}
|
|
9764
|
+
),
|
|
9765
|
+
/* @__PURE__ */ jsxs("span", { className: "flex-1", children: [
|
|
9766
|
+
/* @__PURE__ */ jsx("span", { className: "block font-ui font-medium text-foreground", children: adv.name }),
|
|
9767
|
+
adv.dateRange && /* @__PURE__ */ jsx("span", { className: "block text-sm text-muted-foreground", children: adv.dateRange })
|
|
9768
|
+
] })
|
|
9769
|
+
] }),
|
|
9770
|
+
selected && /* @__PURE__ */ jsxs("div", { className: "mt-4 pl-7 space-y-4", children: [
|
|
9771
|
+
adv.cancellationPolicy && /* @__PURE__ */ jsxs("div", { className: "rounded-md bg-muted/50 border border-border p-3", children: [
|
|
9772
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-ui font-semibold uppercase tracking-wide text-muted-foreground mb-1", children: labels.policyHeading }),
|
|
9773
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-foreground whitespace-pre-line", children: adv.cancellationPolicy })
|
|
9774
|
+
] }),
|
|
9775
|
+
adv.participants.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
|
|
9776
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-ui font-semibold uppercase tracking-wide text-muted-foreground mb-2", children: labels.participantsHeading }),
|
|
9777
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-1.5", children: adv.participants.map((p) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9778
|
+
/* @__PURE__ */ jsx(
|
|
9779
|
+
"input",
|
|
9780
|
+
{
|
|
9781
|
+
type: "checkbox",
|
|
9782
|
+
className: "h-4 w-4 accent-primary",
|
|
9783
|
+
checked: partSet.has(p.id),
|
|
9784
|
+
onChange: (e) => toggleParticipant(adv.id, p.id, e.target.checked)
|
|
9785
|
+
}
|
|
9786
|
+
),
|
|
9787
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: p.name })
|
|
9788
|
+
] }, p.id)) })
|
|
9789
|
+
] })
|
|
9790
|
+
] })
|
|
9791
|
+
]
|
|
9792
|
+
},
|
|
9793
|
+
adv.id
|
|
9794
|
+
);
|
|
9795
|
+
}) }),
|
|
9796
|
+
/* @__PURE__ */ jsx(FieldError, { children: errors.adventures }),
|
|
9797
|
+
/* @__PURE__ */ jsx(FieldError, { children: errors.participants })
|
|
9798
|
+
] }),
|
|
9799
|
+
/* @__PURE__ */ jsxs("section", { children: [
|
|
9800
|
+
/* @__PURE__ */ jsx(SectionHeading, { children: labels.reasonHeading }),
|
|
9801
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-2", children: labels.reasonOptions.map((opt) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9802
|
+
/* @__PURE__ */ jsx(
|
|
9803
|
+
"input",
|
|
9804
|
+
{
|
|
9805
|
+
type: "radio",
|
|
9806
|
+
name: "cancellation-reason",
|
|
9807
|
+
className: "h-4 w-4 accent-primary",
|
|
9808
|
+
checked: reasonCode === opt.value,
|
|
9809
|
+
onChange: () => setReasonCode(opt.value)
|
|
9810
|
+
}
|
|
9811
|
+
),
|
|
9812
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: opt.label })
|
|
9813
|
+
] }, opt.value)) }),
|
|
9814
|
+
reasonCode === OTHER && /* @__PURE__ */ jsx(
|
|
9815
|
+
"textarea",
|
|
9816
|
+
{
|
|
9817
|
+
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",
|
|
9818
|
+
rows: 3,
|
|
9819
|
+
placeholder: labels.reasonOtherLabel,
|
|
9820
|
+
value: reasonOther,
|
|
9821
|
+
onChange: (e) => setReasonOther(e.target.value),
|
|
9822
|
+
maxLength: 1e3
|
|
9823
|
+
}
|
|
9824
|
+
),
|
|
9825
|
+
/* @__PURE__ */ jsx(FieldError, { children: errors.reason })
|
|
9826
|
+
] }),
|
|
9827
|
+
/* @__PURE__ */ jsxs("section", { children: [
|
|
9828
|
+
/* @__PURE__ */ jsx(SectionHeading, { children: labels.refundHeading }),
|
|
9829
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-2", children: labels.refundOptions.map((opt) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9830
|
+
/* @__PURE__ */ jsx(
|
|
9831
|
+
"input",
|
|
9832
|
+
{
|
|
9833
|
+
type: "radio",
|
|
9834
|
+
name: "cancellation-refund",
|
|
9835
|
+
className: "h-4 w-4 accent-primary",
|
|
9836
|
+
checked: refundPreference === opt.value,
|
|
9837
|
+
onChange: () => setRefundPreference(opt.value)
|
|
9838
|
+
}
|
|
9839
|
+
),
|
|
9840
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: opt.label })
|
|
9841
|
+
] }, opt.value)) }),
|
|
9842
|
+
refundPreference === OTHER && /* @__PURE__ */ jsx(
|
|
9843
|
+
"textarea",
|
|
9844
|
+
{
|
|
9845
|
+
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",
|
|
9846
|
+
rows: 3,
|
|
9847
|
+
placeholder: labels.refundOtherLabel,
|
|
9848
|
+
value: refundOther,
|
|
9849
|
+
onChange: (e) => setRefundOther(e.target.value),
|
|
9850
|
+
maxLength: 1e3
|
|
9851
|
+
}
|
|
9852
|
+
),
|
|
9853
|
+
/* @__PURE__ */ jsx(FieldError, { children: errors.refund })
|
|
9854
|
+
] }),
|
|
9855
|
+
/* @__PURE__ */ jsxs("section", { children: [
|
|
9856
|
+
/* @__PURE__ */ jsxs("label", { className: "flex items-start gap-3 cursor-pointer", children: [
|
|
9857
|
+
/* @__PURE__ */ jsx(
|
|
9858
|
+
"input",
|
|
9859
|
+
{
|
|
9860
|
+
type: "checkbox",
|
|
9861
|
+
className: "mt-1 h-4 w-4 accent-primary",
|
|
9862
|
+
checked: agreedToPolicy,
|
|
9863
|
+
onChange: (e) => setAgreedToPolicy(e.target.checked)
|
|
9864
|
+
}
|
|
9865
|
+
),
|
|
9866
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: labels.agreementLabel })
|
|
9867
|
+
] }),
|
|
9868
|
+
/* @__PURE__ */ jsx(FieldError, { children: errors.agreement })
|
|
9869
|
+
] }),
|
|
9870
|
+
error && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive font-ui", role: "alert", children: error }),
|
|
9871
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "destructive", size: "lg", disabled: submitting, className: "w-full", children: submitting ? labels.submittingLabel : labels.submitLabel })
|
|
9872
|
+
] });
|
|
9873
|
+
}
|
|
9599
9874
|
var OTPCodeInput = ({
|
|
9600
9875
|
value,
|
|
9601
9876
|
onChange,
|
|
@@ -9607,10 +9882,10 @@ var OTPCodeInput = ({
|
|
|
9607
9882
|
id,
|
|
9608
9883
|
required
|
|
9609
9884
|
}) => {
|
|
9610
|
-
const baseId = id != null ? id :
|
|
9611
|
-
const inputRef =
|
|
9612
|
-
const [focused, setFocused] =
|
|
9613
|
-
const digits =
|
|
9885
|
+
const baseId = id != null ? id : React32.useId();
|
|
9886
|
+
const inputRef = React32.useRef(null);
|
|
9887
|
+
const [focused, setFocused] = React32.useState(false);
|
|
9888
|
+
const digits = React32.useMemo(() => {
|
|
9614
9889
|
const arr = value.split("").slice(0, length);
|
|
9615
9890
|
while (arr.length < length) arr.push("");
|
|
9616
9891
|
return arr;
|
|
@@ -9723,7 +9998,7 @@ function Checkbox(_a) {
|
|
|
9723
9998
|
})
|
|
9724
9999
|
);
|
|
9725
10000
|
}
|
|
9726
|
-
var AccordionVariantContext =
|
|
10001
|
+
var AccordionVariantContext = React32.createContext("default");
|
|
9727
10002
|
function Accordion(_a) {
|
|
9728
10003
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
9729
10004
|
return /* @__PURE__ */ jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(
|
|
@@ -9741,7 +10016,7 @@ function Accordion(_a) {
|
|
|
9741
10016
|
}
|
|
9742
10017
|
function AccordionItem(_a) {
|
|
9743
10018
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
9744
|
-
const variant =
|
|
10019
|
+
const variant = React32.useContext(AccordionVariantContext);
|
|
9745
10020
|
return /* @__PURE__ */ jsx(
|
|
9746
10021
|
Accordion$1.Item,
|
|
9747
10022
|
__spreadValues({
|
|
@@ -9762,7 +10037,7 @@ function AccordionTrigger(_a) {
|
|
|
9762
10037
|
"className",
|
|
9763
10038
|
"children"
|
|
9764
10039
|
]);
|
|
9765
|
-
const variant =
|
|
10040
|
+
const variant = React32.useContext(AccordionVariantContext);
|
|
9766
10041
|
return /* @__PURE__ */ jsx(Accordion$1.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
|
|
9767
10042
|
Accordion$1.Trigger,
|
|
9768
10043
|
__spreadProps(__spreadValues({
|
|
@@ -9816,7 +10091,7 @@ function AccordionContent(_a) {
|
|
|
9816
10091
|
"className",
|
|
9817
10092
|
"children"
|
|
9818
10093
|
]);
|
|
9819
|
-
const variant =
|
|
10094
|
+
const variant = React32.useContext(AccordionVariantContext);
|
|
9820
10095
|
return /* @__PURE__ */ jsx(
|
|
9821
10096
|
Accordion$1.Panel,
|
|
9822
10097
|
__spreadProps(__spreadValues({
|
|
@@ -10034,15 +10309,15 @@ function FilterPanel({
|
|
|
10034
10309
|
onSortChange
|
|
10035
10310
|
}) {
|
|
10036
10311
|
var _a, _b;
|
|
10037
|
-
const resolvedGroups =
|
|
10038
|
-
const [internalValue, setInternalValue] =
|
|
10312
|
+
const resolvedGroups = React32.useMemo(() => resolveGroups(groups), [groups]);
|
|
10313
|
+
const [internalValue, setInternalValue] = React32.useState(
|
|
10039
10314
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
10040
10315
|
);
|
|
10041
10316
|
const selected = value != null ? value : internalValue;
|
|
10042
|
-
const [expandedItems, setExpandedItems] =
|
|
10317
|
+
const [expandedItems, setExpandedItems] = React32.useState(
|
|
10043
10318
|
() => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
|
|
10044
10319
|
);
|
|
10045
|
-
const toggleExpanded =
|
|
10320
|
+
const toggleExpanded = React32.useCallback((id) => {
|
|
10046
10321
|
setExpandedItems((prev) => {
|
|
10047
10322
|
const next = new Set(prev);
|
|
10048
10323
|
if (next.has(id)) next.delete(id);
|
|
@@ -10426,11 +10701,11 @@ function FilterPanel({
|
|
|
10426
10701
|
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
10427
10702
|
function TrustpilotEmbed({ config }) {
|
|
10428
10703
|
var _a, _b, _c, _d, _e, _f;
|
|
10429
|
-
const ref =
|
|
10430
|
-
const [widgetReady, setWidgetReady] =
|
|
10431
|
-
const [delayPassed, setDelayPassed] =
|
|
10704
|
+
const ref = React32.useRef(null);
|
|
10705
|
+
const [widgetReady, setWidgetReady] = React32.useState(false);
|
|
10706
|
+
const [delayPassed, setDelayPassed] = React32.useState(false);
|
|
10432
10707
|
const showFallback = delayPassed && !widgetReady;
|
|
10433
|
-
|
|
10708
|
+
React32.useEffect(() => {
|
|
10434
10709
|
var _a2;
|
|
10435
10710
|
if (typeof document === "undefined" || !ref.current) return;
|
|
10436
10711
|
const node = ref.current;
|
|
@@ -10618,7 +10893,7 @@ function webpVariantUrl(src) {
|
|
|
10618
10893
|
return `${withoutQuery}.webp${query}`;
|
|
10619
10894
|
}
|
|
10620
10895
|
function PictureLoader() {
|
|
10621
|
-
const gradientId =
|
|
10896
|
+
const gradientId = React32.useId();
|
|
10622
10897
|
return /* @__PURE__ */ jsx(
|
|
10623
10898
|
"span",
|
|
10624
10899
|
{
|
|
@@ -10688,10 +10963,10 @@ function Picture(_a) {
|
|
|
10688
10963
|
"onError"
|
|
10689
10964
|
]);
|
|
10690
10965
|
var _a2;
|
|
10691
|
-
const ref =
|
|
10692
|
-
const [visible, setVisible] =
|
|
10693
|
-
const [loaded, setLoaded] =
|
|
10694
|
-
|
|
10966
|
+
const ref = React32.useRef(null);
|
|
10967
|
+
const [visible, setVisible] = React32.useState(eager);
|
|
10968
|
+
const [loaded, setLoaded] = React32.useState(false);
|
|
10969
|
+
React32.useEffect(() => {
|
|
10695
10970
|
if (eager || visible) return;
|
|
10696
10971
|
const el = ref.current;
|
|
10697
10972
|
if (!el || typeof IntersectionObserver === "undefined") {
|
|
@@ -10710,7 +10985,7 @@ function Picture(_a) {
|
|
|
10710
10985
|
io.observe(el);
|
|
10711
10986
|
return () => io.disconnect();
|
|
10712
10987
|
}, [eager, visible, rootMargin]);
|
|
10713
|
-
|
|
10988
|
+
React32.useEffect(() => {
|
|
10714
10989
|
setLoaded(false);
|
|
10715
10990
|
}, [src]);
|
|
10716
10991
|
const webp = webpVariantUrl(src);
|
|
@@ -10838,11 +11113,11 @@ function ItineraryModal({
|
|
|
10838
11113
|
onNext
|
|
10839
11114
|
}) {
|
|
10840
11115
|
var _a, _b, _c;
|
|
10841
|
-
const [imgIndex, setImgIndex] =
|
|
11116
|
+
const [imgIndex, setImgIndex] = React32.useState(0);
|
|
10842
11117
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
10843
11118
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
10844
11119
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
10845
|
-
|
|
11120
|
+
React32.useEffect(() => {
|
|
10846
11121
|
setImgIndex(0);
|
|
10847
11122
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
10848
11123
|
if (!stop) return null;
|
|
@@ -10969,8 +11244,8 @@ function ItineraryModal({
|
|
|
10969
11244
|
) });
|
|
10970
11245
|
}
|
|
10971
11246
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
10972
|
-
const [activeIndex, setActiveIndex] =
|
|
10973
|
-
const scrollRef =
|
|
11247
|
+
const [activeIndex, setActiveIndex] = React32.useState(null);
|
|
11248
|
+
const scrollRef = React32.useRef(null);
|
|
10974
11249
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
10975
11250
|
const scrollBy = (dir) => {
|
|
10976
11251
|
if (!scrollRef.current) return;
|
|
@@ -11062,18 +11337,18 @@ function Lightbox({
|
|
|
11062
11337
|
onClose
|
|
11063
11338
|
}) {
|
|
11064
11339
|
var _a;
|
|
11065
|
-
const [index, setIndex] =
|
|
11340
|
+
const [index, setIndex] = React32.useState(initialIndex);
|
|
11066
11341
|
const total = photos.length;
|
|
11067
11342
|
const photo = photos[index];
|
|
11068
|
-
const prev =
|
|
11343
|
+
const prev = React32.useCallback(
|
|
11069
11344
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
11070
11345
|
[total]
|
|
11071
11346
|
);
|
|
11072
|
-
const next =
|
|
11347
|
+
const next = React32.useCallback(
|
|
11073
11348
|
() => setIndex((i) => (i + 1) % total),
|
|
11074
11349
|
[total]
|
|
11075
11350
|
);
|
|
11076
|
-
|
|
11351
|
+
React32.useEffect(() => {
|
|
11077
11352
|
const onKey = (e) => {
|
|
11078
11353
|
if (e.key === "Escape") onClose();
|
|
11079
11354
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -11241,7 +11516,7 @@ function GridGallery({
|
|
|
11241
11516
|
initialVisible,
|
|
11242
11517
|
onOpen
|
|
11243
11518
|
}) {
|
|
11244
|
-
const [expanded, setExpanded] =
|
|
11519
|
+
const [expanded, setExpanded] = React32.useState(false);
|
|
11245
11520
|
const cols = gridCols(photos.length);
|
|
11246
11521
|
const hasMore = photos.length > initialVisible;
|
|
11247
11522
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -11271,7 +11546,7 @@ function CompactGridGallery({
|
|
|
11271
11546
|
initialVisible,
|
|
11272
11547
|
onOpen
|
|
11273
11548
|
}) {
|
|
11274
|
-
const [expanded, setExpanded] =
|
|
11549
|
+
const [expanded, setExpanded] = React32.useState(false);
|
|
11275
11550
|
const hasMore = photos.length > initialVisible;
|
|
11276
11551
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
11277
11552
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -11300,7 +11575,7 @@ function MasonryGallery({
|
|
|
11300
11575
|
initialVisible,
|
|
11301
11576
|
onOpen
|
|
11302
11577
|
}) {
|
|
11303
|
-
const [expanded, setExpanded] =
|
|
11578
|
+
const [expanded, setExpanded] = React32.useState(false);
|
|
11304
11579
|
const hasMore = photos.length > initialVisible;
|
|
11305
11580
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
11306
11581
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -11373,7 +11648,7 @@ function FeaturedGallery({
|
|
|
11373
11648
|
photos,
|
|
11374
11649
|
onOpen
|
|
11375
11650
|
}) {
|
|
11376
|
-
const [expanded, setExpanded] =
|
|
11651
|
+
const [expanded, setExpanded] = React32.useState(false);
|
|
11377
11652
|
const featured = photos.slice(0, 3);
|
|
11378
11653
|
const extra = photos.slice(3);
|
|
11379
11654
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -11571,9 +11846,9 @@ function PhotoGallery({
|
|
|
11571
11846
|
onPhotoClick,
|
|
11572
11847
|
className
|
|
11573
11848
|
}) {
|
|
11574
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
11575
|
-
const [carouselIndex, setCarouselIndex] =
|
|
11576
|
-
const normalised =
|
|
11849
|
+
const [lightboxIndex, setLightboxIndex] = React32.useState(null);
|
|
11850
|
+
const [carouselIndex, setCarouselIndex] = React32.useState(0);
|
|
11851
|
+
const normalised = React32.useMemo(() => photos.map(normalise), [photos]);
|
|
11577
11852
|
const handleOpen = (index) => {
|
|
11578
11853
|
setLightboxIndex(index);
|
|
11579
11854
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
@@ -11659,7 +11934,7 @@ function ItineraryDay({
|
|
|
11659
11934
|
photoLayout = "rounded",
|
|
11660
11935
|
className
|
|
11661
11936
|
}) {
|
|
11662
|
-
const photoList =
|
|
11937
|
+
const photoList = React32.useMemo(() => normalisePhotos(photos), [photos]);
|
|
11663
11938
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
11664
11939
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
11665
11940
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsx(
|
|
@@ -11714,8 +11989,8 @@ function MenuTrip({
|
|
|
11714
11989
|
bold = true,
|
|
11715
11990
|
className
|
|
11716
11991
|
}) {
|
|
11717
|
-
const scrollRef =
|
|
11718
|
-
|
|
11992
|
+
const scrollRef = React32.useRef(null);
|
|
11993
|
+
React32.useEffect(() => {
|
|
11719
11994
|
if (!scrollRef.current || !activeSection) return;
|
|
11720
11995
|
const container = scrollRef.current;
|
|
11721
11996
|
const btn = container.querySelector(
|
|
@@ -11911,8 +12186,8 @@ function PricingTrip({
|
|
|
11911
12186
|
className
|
|
11912
12187
|
}) {
|
|
11913
12188
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
11914
|
-
const [showEstimates, setShowEstimates] =
|
|
11915
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
12189
|
+
const [showEstimates, setShowEstimates] = React32.useState(false);
|
|
12190
|
+
const [showPriceInfo, setShowPriceInfo] = React32.useState(false);
|
|
11916
12191
|
if (variant === "compact") {
|
|
11917
12192
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
11918
12193
|
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -12352,14 +12627,14 @@ function SiteHeader({
|
|
|
12352
12627
|
}) {
|
|
12353
12628
|
const t = VARIANT[variant];
|
|
12354
12629
|
const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
|
|
12355
|
-
const [openMenu, setOpenMenu] =
|
|
12356
|
-
const [langOpen, setLangOpen] =
|
|
12357
|
-
const [mobileOpen, setMobileOpen] =
|
|
12358
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
12359
|
-
const [activeLang, setActiveLang] =
|
|
12630
|
+
const [openMenu, setOpenMenu] = React32.useState(null);
|
|
12631
|
+
const [langOpen, setLangOpen] = React32.useState(false);
|
|
12632
|
+
const [mobileOpen, setMobileOpen] = React32.useState(false);
|
|
12633
|
+
const [openMobileSection, setOpenMobileSection] = React32.useState(null);
|
|
12634
|
+
const [activeLang, setActiveLang] = React32.useState(currentLanguage);
|
|
12360
12635
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
12361
|
-
const menuCloseTimer =
|
|
12362
|
-
const langCloseTimer =
|
|
12636
|
+
const menuCloseTimer = React32.useRef(void 0);
|
|
12637
|
+
const langCloseTimer = React32.useRef(void 0);
|
|
12363
12638
|
const handleMenuEnter = (label) => {
|
|
12364
12639
|
clearTimeout(menuCloseTimer.current);
|
|
12365
12640
|
setOpenMenu(label);
|
|
@@ -12380,7 +12655,7 @@ function SiteHeader({
|
|
|
12380
12655
|
setOpenMenu(null);
|
|
12381
12656
|
setLangOpen(false);
|
|
12382
12657
|
};
|
|
12383
|
-
|
|
12658
|
+
React32.useEffect(() => () => {
|
|
12384
12659
|
clearTimeout(menuCloseTimer.current);
|
|
12385
12660
|
clearTimeout(langCloseTimer.current);
|
|
12386
12661
|
}, []);
|
|
@@ -12656,7 +12931,7 @@ function SiteHeader({
|
|
|
12656
12931
|
), children: [
|
|
12657
12932
|
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
12658
12933
|
const isActive = lang.code === activeLang;
|
|
12659
|
-
return /* @__PURE__ */ jsxs(
|
|
12934
|
+
return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
|
|
12660
12935
|
i > 0 && /* @__PURE__ */ jsx("span", { className: cn(
|
|
12661
12936
|
"text-xs select-none",
|
|
12662
12937
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -12718,8 +12993,8 @@ function SiteHeader({
|
|
|
12718
12993
|
);
|
|
12719
12994
|
}
|
|
12720
12995
|
function ThemeToggle({ className }) {
|
|
12721
|
-
const [dark, setDark] =
|
|
12722
|
-
|
|
12996
|
+
const [dark, setDark] = React32.useState(false);
|
|
12997
|
+
React32.useEffect(() => {
|
|
12723
12998
|
const saved = localStorage.getItem("theme");
|
|
12724
12999
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
12725
13000
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -12769,7 +13044,7 @@ var chipVariants = cva(
|
|
|
12769
13044
|
}
|
|
12770
13045
|
}
|
|
12771
13046
|
);
|
|
12772
|
-
var Chip =
|
|
13047
|
+
var Chip = React32.forwardRef(function Chip2(_a, ref) {
|
|
12773
13048
|
var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
|
|
12774
13049
|
const classes = cn(chipVariants({ variant, size }), className);
|
|
12775
13050
|
if (href) {
|
|
@@ -12871,7 +13146,7 @@ function TripCardEditorial(props) {
|
|
|
12871
13146
|
tag,
|
|
12872
13147
|
tagHref
|
|
12873
13148
|
} = props;
|
|
12874
|
-
const [internalFav, setInternalFav] =
|
|
13149
|
+
const [internalFav, setInternalFav] = React32.useState(false);
|
|
12875
13150
|
const favorited = favoritedProp != null ? favoritedProp : internalFav;
|
|
12876
13151
|
const handleFav = (e) => {
|
|
12877
13152
|
e.preventDefault();
|
|
@@ -13382,7 +13657,7 @@ function BlogPost({
|
|
|
13382
13657
|
) }),
|
|
13383
13658
|
/* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
|
|
13384
13659
|
/* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-3xl px-6 sm:px-8 pb-9 sm:pb-11", children: [
|
|
13385
|
-
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(
|
|
13660
|
+
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
|
|
13386
13661
|
i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13387
13662
|
crumb.href ? /* @__PURE__ */ jsx(
|
|
13388
13663
|
"a",
|
|
@@ -13436,7 +13711,7 @@ function BlogPost({
|
|
|
13436
13711
|
] });
|
|
13437
13712
|
}
|
|
13438
13713
|
function useHlsVideo(videoRef, src) {
|
|
13439
|
-
|
|
13714
|
+
React32.useEffect(() => {
|
|
13440
13715
|
if (!src || !videoRef.current) return;
|
|
13441
13716
|
const video = videoRef.current;
|
|
13442
13717
|
if (!src.includes(".m3u8")) return;
|
|
@@ -13480,11 +13755,11 @@ function TripHeader({
|
|
|
13480
13755
|
className
|
|
13481
13756
|
}) {
|
|
13482
13757
|
var _a;
|
|
13483
|
-
const [heroIndex, setHeroIndex] =
|
|
13484
|
-
const [videoReady, setVideoReady] =
|
|
13485
|
-
const videoRef =
|
|
13758
|
+
const [heroIndex, setHeroIndex] = React32.useState(0);
|
|
13759
|
+
const [videoReady, setVideoReady] = React32.useState(false);
|
|
13760
|
+
const videoRef = React32.useRef(null);
|
|
13486
13761
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
13487
|
-
const validImages =
|
|
13762
|
+
const validImages = React32.useMemo(
|
|
13488
13763
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
13489
13764
|
[images]
|
|
13490
13765
|
);
|
|
@@ -13499,7 +13774,7 @@ function TripHeader({
|
|
|
13499
13774
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
13500
13775
|
const hasMeta = !!(destination || duration);
|
|
13501
13776
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
13502
|
-
|
|
13777
|
+
React32.useEffect(() => {
|
|
13503
13778
|
if (!videoUrl) return;
|
|
13504
13779
|
const el = videoRef.current;
|
|
13505
13780
|
if (!el) return;
|
|
@@ -13642,7 +13917,7 @@ function TripHeader({
|
|
|
13642
13917
|
chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
|
|
13643
13918
|
),
|
|
13644
13919
|
children: [
|
|
13645
|
-
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(
|
|
13920
|
+
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxs(React32.Fragment, { children: [
|
|
13646
13921
|
i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13647
13922
|
/* @__PURE__ */ jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
13648
13923
|
] }, i)) }),
|
|
@@ -13808,10 +14083,10 @@ function LanguagePicker({
|
|
|
13808
14083
|
}) {
|
|
13809
14084
|
var _a;
|
|
13810
14085
|
const t = VARIANT2[variant];
|
|
13811
|
-
const [open, setOpen] =
|
|
13812
|
-
const ref =
|
|
14086
|
+
const [open, setOpen] = React32.useState(false);
|
|
14087
|
+
const ref = React32.useRef(null);
|
|
13813
14088
|
const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
|
|
13814
|
-
|
|
14089
|
+
React32.useEffect(() => {
|
|
13815
14090
|
if (!open) return;
|
|
13816
14091
|
const onDocClick = (e) => {
|
|
13817
14092
|
if (ref.current && !ref.current.contains(e.target)) {
|
|
@@ -14012,7 +14287,7 @@ function SiteFooter({
|
|
|
14012
14287
|
children: wrapper
|
|
14013
14288
|
},
|
|
14014
14289
|
b.alt + i
|
|
14015
|
-
) : /* @__PURE__ */ jsx(
|
|
14290
|
+
) : /* @__PURE__ */ jsx(React32.Fragment, { children: wrapper }, b.alt + i);
|
|
14016
14291
|
}) })
|
|
14017
14292
|
] }),
|
|
14018
14293
|
themes.length > 0 && /* @__PURE__ */ jsxs("div", { className: "lg:col-span-3", children: [
|
|
@@ -14187,10 +14462,10 @@ function TripPage({
|
|
|
14187
14462
|
className
|
|
14188
14463
|
}) {
|
|
14189
14464
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
|
|
14190
|
-
const [activeSection, setActiveSection] =
|
|
14191
|
-
const [accordionValue, setAccordionValue] =
|
|
14192
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
14193
|
-
const accordionSectionIds =
|
|
14465
|
+
const [activeSection, setActiveSection] = React32.useState("");
|
|
14466
|
+
const [accordionValue, setAccordionValue] = React32.useState([]);
|
|
14467
|
+
const [faqsExpanded, setFaqsExpanded] = React32.useState(false);
|
|
14468
|
+
const accordionSectionIds = React32.useMemo(
|
|
14194
14469
|
() => /* @__PURE__ */ new Set([
|
|
14195
14470
|
"when-it-operates",
|
|
14196
14471
|
"how-to-get-there",
|
|
@@ -14204,18 +14479,18 @@ function TripPage({
|
|
|
14204
14479
|
]),
|
|
14205
14480
|
[]
|
|
14206
14481
|
);
|
|
14207
|
-
const [navFloating, setNavFloating] =
|
|
14208
|
-
const [navHidden, setNavHidden] =
|
|
14209
|
-
const [isFloating, setIsFloating] =
|
|
14210
|
-
const [sidebarPos, setSidebarPos] =
|
|
14211
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
14212
|
-
const navRef =
|
|
14213
|
-
const navSentinelRef =
|
|
14214
|
-
const sentinelRef =
|
|
14215
|
-
const sidebarPlaceholderRef =
|
|
14216
|
-
const pricingBarRef =
|
|
14217
|
-
const galleryRef =
|
|
14218
|
-
const sections =
|
|
14482
|
+
const [navFloating, setNavFloating] = React32.useState(false);
|
|
14483
|
+
const [navHidden, setNavHidden] = React32.useState(false);
|
|
14484
|
+
const [isFloating, setIsFloating] = React32.useState(false);
|
|
14485
|
+
const [sidebarPos, setSidebarPos] = React32.useState(null);
|
|
14486
|
+
const [pricingBarVisible, setPricingBarVisible] = React32.useState(false);
|
|
14487
|
+
const navRef = React32.useRef(null);
|
|
14488
|
+
const navSentinelRef = React32.useRef(null);
|
|
14489
|
+
const sentinelRef = React32.useRef(null);
|
|
14490
|
+
const sidebarPlaceholderRef = React32.useRef(null);
|
|
14491
|
+
const pricingBarRef = React32.useRef(null);
|
|
14492
|
+
const galleryRef = React32.useRef(null);
|
|
14493
|
+
const sections = React32.useMemo(
|
|
14219
14494
|
() => {
|
|
14220
14495
|
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
|
|
14221
14496
|
return [
|
|
@@ -14237,7 +14512,7 @@ function TripPage({
|
|
|
14237
14512
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
14238
14513
|
[]
|
|
14239
14514
|
);
|
|
14240
|
-
|
|
14515
|
+
React32.useEffect(() => {
|
|
14241
14516
|
const sentinel = navSentinelRef.current;
|
|
14242
14517
|
if (!sentinel) return;
|
|
14243
14518
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -14245,7 +14520,7 @@ function TripPage({
|
|
|
14245
14520
|
update();
|
|
14246
14521
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
14247
14522
|
}, []);
|
|
14248
|
-
|
|
14523
|
+
React32.useEffect(() => {
|
|
14249
14524
|
const sentinel = sentinelRef.current;
|
|
14250
14525
|
if (!sentinel) return;
|
|
14251
14526
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -14253,7 +14528,7 @@ function TripPage({
|
|
|
14253
14528
|
update();
|
|
14254
14529
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
14255
14530
|
}, []);
|
|
14256
|
-
|
|
14531
|
+
React32.useEffect(() => {
|
|
14257
14532
|
const measure = () => {
|
|
14258
14533
|
if (!sidebarPlaceholderRef.current) return;
|
|
14259
14534
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -14263,7 +14538,7 @@ function TripPage({
|
|
|
14263
14538
|
window.addEventListener("resize", measure);
|
|
14264
14539
|
return () => window.removeEventListener("resize", measure);
|
|
14265
14540
|
}, [isFloating]);
|
|
14266
|
-
|
|
14541
|
+
React32.useEffect(() => {
|
|
14267
14542
|
const check = () => {
|
|
14268
14543
|
var _a2;
|
|
14269
14544
|
const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
|
|
@@ -14274,7 +14549,7 @@ function TripPage({
|
|
|
14274
14549
|
check();
|
|
14275
14550
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
14276
14551
|
}, []);
|
|
14277
|
-
|
|
14552
|
+
React32.useEffect(() => {
|
|
14278
14553
|
const check = () => {
|
|
14279
14554
|
if (!pricingBarRef.current) return;
|
|
14280
14555
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -14283,7 +14558,7 @@ function TripPage({
|
|
|
14283
14558
|
check();
|
|
14284
14559
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
14285
14560
|
}, []);
|
|
14286
|
-
|
|
14561
|
+
React32.useEffect(() => {
|
|
14287
14562
|
if (sections.length === 0) return;
|
|
14288
14563
|
setActiveSection(sections[0].id);
|
|
14289
14564
|
const update = () => {
|
|
@@ -14758,7 +15033,7 @@ function TripPage({
|
|
|
14758
15033
|
}
|
|
14759
15034
|
);
|
|
14760
15035
|
}
|
|
14761
|
-
function
|
|
15036
|
+
function SectionHeading2({
|
|
14762
15037
|
eyebrow,
|
|
14763
15038
|
title,
|
|
14764
15039
|
rightSlot
|
|
@@ -14808,11 +15083,11 @@ function CategoryPage2({
|
|
|
14808
15083
|
className
|
|
14809
15084
|
}) {
|
|
14810
15085
|
var _a;
|
|
14811
|
-
const [videoReady, setVideoReady] =
|
|
14812
|
-
const videoRef =
|
|
15086
|
+
const [videoReady, setVideoReady] = React32.useState(false);
|
|
15087
|
+
const videoRef = React32.useRef(null);
|
|
14813
15088
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
14814
15089
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
14815
|
-
|
|
15090
|
+
React32.useEffect(() => {
|
|
14816
15091
|
if (!videoUrl) return;
|
|
14817
15092
|
const el = videoRef.current;
|
|
14818
15093
|
if (!el) return;
|
|
@@ -14827,13 +15102,13 @@ function CategoryPage2({
|
|
|
14827
15102
|
io.observe(el);
|
|
14828
15103
|
return () => io.disconnect();
|
|
14829
15104
|
}, [videoUrl]);
|
|
14830
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
14831
|
-
const [tripsExpanded, setTripsExpanded] =
|
|
14832
|
-
const [filterValue, setFilterValue] =
|
|
14833
|
-
const [sort, setSort] =
|
|
15105
|
+
const [faqsExpanded, setFaqsExpanded] = React32.useState(false);
|
|
15106
|
+
const [tripsExpanded, setTripsExpanded] = React32.useState(false);
|
|
15107
|
+
const [filterValue, setFilterValue] = React32.useState({});
|
|
15108
|
+
const [sort, setSort] = React32.useState(
|
|
14834
15109
|
defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
|
|
14835
15110
|
);
|
|
14836
|
-
const sortedTrips =
|
|
15111
|
+
const sortedTrips = React32.useMemo(() => {
|
|
14837
15112
|
const active = Object.entries(filterValue).filter(
|
|
14838
15113
|
([, vals]) => vals && vals.length > 0
|
|
14839
15114
|
);
|
|
@@ -14937,7 +15212,7 @@ function CategoryPage2({
|
|
|
14937
15212
|
/* @__PURE__ */ jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
14938
15213
|
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
|
|
14939
15214
|
const isLast = i === breadcrumb.length - 1;
|
|
14940
|
-
return /* @__PURE__ */ jsxs(
|
|
15215
|
+
return /* @__PURE__ */ jsxs(React32.Fragment, { children: [
|
|
14941
15216
|
i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
14942
15217
|
crumb.href && !isLast ? /* @__PURE__ */ jsx(
|
|
14943
15218
|
"a",
|
|
@@ -14967,7 +15242,7 @@ function CategoryPage2({
|
|
|
14967
15242
|
),
|
|
14968
15243
|
popularTours && popularTours.length > 0 && /* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: [
|
|
14969
15244
|
/* @__PURE__ */ jsx(
|
|
14970
|
-
|
|
15245
|
+
SectionHeading2,
|
|
14971
15246
|
{
|
|
14972
15247
|
eyebrow: popularToursEyebrow,
|
|
14973
15248
|
title: popularToursTitle
|
|
@@ -14987,7 +15262,7 @@ function CategoryPage2({
|
|
|
14987
15262
|
}) }) })
|
|
14988
15263
|
] }),
|
|
14989
15264
|
/* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 pt-6 sm:pt-8 pb-12", children: [
|
|
14990
|
-
(tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsx(
|
|
15265
|
+
(tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
|
|
14991
15266
|
filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(
|
|
14992
15267
|
FilterPanel,
|
|
14993
15268
|
{
|
|
@@ -15225,12 +15500,12 @@ function Toast({
|
|
|
15225
15500
|
duration = 6e3,
|
|
15226
15501
|
className
|
|
15227
15502
|
}) {
|
|
15228
|
-
const [mounted, setMounted] =
|
|
15229
|
-
const [visible, setVisible] =
|
|
15230
|
-
|
|
15503
|
+
const [mounted, setMounted] = React32.useState(false);
|
|
15504
|
+
const [visible, setVisible] = React32.useState(true);
|
|
15505
|
+
React32.useEffect(() => {
|
|
15231
15506
|
setMounted(true);
|
|
15232
15507
|
}, []);
|
|
15233
|
-
|
|
15508
|
+
React32.useEffect(() => {
|
|
15234
15509
|
if (duration === 0) return;
|
|
15235
15510
|
const t = setTimeout(() => {
|
|
15236
15511
|
setVisible(false);
|
|
@@ -16732,8 +17007,8 @@ function ShareWidget({
|
|
|
16732
17007
|
title = "Invite friends & lower the price",
|
|
16733
17008
|
className
|
|
16734
17009
|
}) {
|
|
16735
|
-
const [copied, setCopied] =
|
|
16736
|
-
const [showToast, setShowToast] =
|
|
17010
|
+
const [copied, setCopied] = React32.useState(false);
|
|
17011
|
+
const [showToast, setShowToast] = React32.useState(false);
|
|
16737
17012
|
const encodedUrl = encodeURIComponent(url);
|
|
16738
17013
|
const encodedMsg = encodeURIComponent(`${message} ${url}`);
|
|
16739
17014
|
const channels = [
|
|
@@ -16883,6 +17158,6 @@ function StickyBookingCard({
|
|
|
16883
17158
|
);
|
|
16884
17159
|
}
|
|
16885
17160
|
|
|
16886
|
-
export { ActivityCard, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CategoryPage2, CounterField, CountrySearchField, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, ShareWidget, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
|
|
17161
|
+
export { ActivityCard, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CancellationForm, CategoryPage2, CounterField, CountrySearchField, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, ShareWidget, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
|
|
16887
17162
|
//# sourceMappingURL=index.js.map
|
|
16888
17163
|
//# sourceMappingURL=index.js.map
|