@planetaexo/design-system 0.35.0 → 0.37.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 +268 -160
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -1
- package/dist/index.d.ts +19 -1
- package/dist/index.js +251 -143
- 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 React8 = 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 React8__namespace = /*#__PURE__*/_interopNamespace(React8);
|
|
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 = React8__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(
|
|
@@ -323,10 +323,10 @@ function DialogDescription(_a) {
|
|
|
323
323
|
}, props)
|
|
324
324
|
);
|
|
325
325
|
}
|
|
326
|
-
var FloatingInput =
|
|
326
|
+
var FloatingInput = React8__namespace.forwardRef(
|
|
327
327
|
(_a, ref) => {
|
|
328
328
|
var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
|
|
329
|
-
const inputId = id != null ? id :
|
|
329
|
+
const inputId = id != null ? id : React8__namespace.useId();
|
|
330
330
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
|
|
331
331
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
332
332
|
"input",
|
|
@@ -366,10 +366,10 @@ var FloatingInput = React25__namespace.forwardRef(
|
|
|
366
366
|
}
|
|
367
367
|
);
|
|
368
368
|
FloatingInput.displayName = "FloatingInput";
|
|
369
|
-
var FloatingSelect =
|
|
369
|
+
var FloatingSelect = React8__namespace.forwardRef(
|
|
370
370
|
(_a, ref) => {
|
|
371
371
|
var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
|
|
372
|
-
const inputId = id != null ? id :
|
|
372
|
+
const inputId = id != null ? id : React8__namespace.useId();
|
|
373
373
|
const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
|
|
374
374
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
|
|
375
375
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -633,11 +633,11 @@ function PhoneCountrySelect({
|
|
|
633
633
|
disabled
|
|
634
634
|
}) {
|
|
635
635
|
var _a;
|
|
636
|
-
const [open, setOpen] =
|
|
637
|
-
const containerRef =
|
|
638
|
-
const listRef =
|
|
636
|
+
const [open, setOpen] = React8__namespace.useState(false);
|
|
637
|
+
const containerRef = React8__namespace.useRef(null);
|
|
638
|
+
const listRef = React8__namespace.useRef(null);
|
|
639
639
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
640
|
-
|
|
640
|
+
React8__namespace.useEffect(() => {
|
|
641
641
|
if (!open) return;
|
|
642
642
|
const handler = (e) => {
|
|
643
643
|
var _a2;
|
|
@@ -648,7 +648,7 @@ function PhoneCountrySelect({
|
|
|
648
648
|
document.addEventListener("mousedown", handler);
|
|
649
649
|
return () => document.removeEventListener("mousedown", handler);
|
|
650
650
|
}, [open]);
|
|
651
|
-
|
|
651
|
+
React8__namespace.useEffect(() => {
|
|
652
652
|
if (!open || !listRef.current) return;
|
|
653
653
|
const activeEl = listRef.current.querySelector("[data-selected=true]");
|
|
654
654
|
activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
|
|
@@ -918,8 +918,8 @@ function CalendarDayButton(_a) {
|
|
|
918
918
|
"locale"
|
|
919
919
|
]);
|
|
920
920
|
const defaultClassNames = reactDayPicker.getDefaultClassNames();
|
|
921
|
-
const ref =
|
|
922
|
-
|
|
921
|
+
const ref = React8__namespace.useRef(null);
|
|
922
|
+
React8__namespace.useEffect(() => {
|
|
923
923
|
var _a2;
|
|
924
924
|
if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
|
|
925
925
|
}, [modifiers.focused]);
|
|
@@ -950,16 +950,16 @@ function BirthDateField({
|
|
|
950
950
|
className,
|
|
951
951
|
disabled
|
|
952
952
|
}) {
|
|
953
|
-
const [open, setOpen] =
|
|
954
|
-
const [text, setText] =
|
|
953
|
+
const [open, setOpen] = React8__namespace.useState(false);
|
|
954
|
+
const [text, setText] = React8__namespace.useState(
|
|
955
955
|
value ? dateFns.format(value, "dd/MM/yyyy") : ""
|
|
956
956
|
);
|
|
957
|
-
const containerRef =
|
|
958
|
-
const inputId =
|
|
959
|
-
|
|
957
|
+
const containerRef = React8__namespace.useRef(null);
|
|
958
|
+
const inputId = React8__namespace.useId();
|
|
959
|
+
React8__namespace.useEffect(() => {
|
|
960
960
|
setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
|
|
961
961
|
}, [value]);
|
|
962
|
-
|
|
962
|
+
React8__namespace.useEffect(() => {
|
|
963
963
|
if (!open) return;
|
|
964
964
|
const handler = (e) => {
|
|
965
965
|
var _a;
|
|
@@ -1168,14 +1168,14 @@ function CountrySearchField({
|
|
|
1168
1168
|
}) {
|
|
1169
1169
|
var _a;
|
|
1170
1170
|
const list = countries != null ? countries : COUNTRIES;
|
|
1171
|
-
const [query, setQuery] =
|
|
1172
|
-
const [open, setOpen] =
|
|
1173
|
-
const containerRef =
|
|
1174
|
-
const searchRef =
|
|
1171
|
+
const [query, setQuery] = React8__namespace.useState("");
|
|
1172
|
+
const [open, setOpen] = React8__namespace.useState(false);
|
|
1173
|
+
const containerRef = React8__namespace.useRef(null);
|
|
1174
|
+
const searchRef = React8__namespace.useRef(null);
|
|
1175
1175
|
const selected = list.find((c) => c.code === value);
|
|
1176
1176
|
const isFloated = open || !!selected;
|
|
1177
1177
|
const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
|
|
1178
|
-
|
|
1178
|
+
React8__namespace.useEffect(() => {
|
|
1179
1179
|
if (!open) return;
|
|
1180
1180
|
const handler = (e) => {
|
|
1181
1181
|
var _a2;
|
|
@@ -1289,7 +1289,7 @@ function AdventureCard({
|
|
|
1289
1289
|
}) {
|
|
1290
1290
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
1291
1291
|
const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
|
|
1292
|
-
const [checkedInternal, setCheckedInternal] =
|
|
1292
|
+
const [checkedInternal, setCheckedInternal] = React8__namespace.useState(
|
|
1293
1293
|
new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
|
|
1294
1294
|
);
|
|
1295
1295
|
const isChecked = (opt) => {
|
|
@@ -1687,7 +1687,7 @@ function BookingShell({
|
|
|
1687
1687
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1688
1688
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
|
|
1689
1689
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
|
|
1690
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1690
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React8__namespace.Fragment, { children: [
|
|
1691
1691
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1692
1692
|
"span",
|
|
1693
1693
|
{
|
|
@@ -1886,7 +1886,7 @@ function TermsSection({
|
|
|
1886
1886
|
termsContent
|
|
1887
1887
|
}) {
|
|
1888
1888
|
var _a;
|
|
1889
|
-
const [modalOpen, setModalOpen] =
|
|
1889
|
+
const [modalOpen, setModalOpen] = React8__namespace.useState(false);
|
|
1890
1890
|
const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
|
|
1891
1891
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
|
|
1892
1892
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
|
|
@@ -2024,9 +2024,9 @@ function BookingWizard({
|
|
|
2024
2024
|
}) {
|
|
2025
2025
|
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;
|
|
2026
2026
|
const wizardSteps = WIZARD_STEPS_FN(labels);
|
|
2027
|
-
const [step, setStep] =
|
|
2028
|
-
const [error, setError] =
|
|
2029
|
-
const [responsible, setResponsible] =
|
|
2027
|
+
const [step, setStep] = React8__namespace.useState("responsible");
|
|
2028
|
+
const [error, setError] = React8__namespace.useState(null);
|
|
2029
|
+
const [responsible, setResponsible] = React8__namespace.useState({
|
|
2030
2030
|
firstName: "",
|
|
2031
2031
|
lastName: "",
|
|
2032
2032
|
email: "",
|
|
@@ -2045,7 +2045,7 @@ function BookingWizard({
|
|
|
2045
2045
|
return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
|
|
2046
2046
|
}, 0);
|
|
2047
2047
|
const totalPax = totalAdults + totalChildren;
|
|
2048
|
-
const [travellers, setTravellers] =
|
|
2048
|
+
const [travellers, setTravellers] = React8__namespace.useState(
|
|
2049
2049
|
Array.from({ length: Math.max(totalPax, 1) }, () => ({
|
|
2050
2050
|
firstName: "",
|
|
2051
2051
|
lastName: "",
|
|
@@ -2053,9 +2053,9 @@ function BookingWizard({
|
|
|
2053
2053
|
email: ""
|
|
2054
2054
|
}))
|
|
2055
2055
|
);
|
|
2056
|
-
const [payAmount, setPayAmount] =
|
|
2057
|
-
const [payMethod, setPayMethod] =
|
|
2058
|
-
const [termsAccepted, setTermsAccepted] =
|
|
2056
|
+
const [payAmount, setPayAmount] = React8__namespace.useState("full");
|
|
2057
|
+
const [payMethod, setPayMethod] = React8__namespace.useState("stripe");
|
|
2058
|
+
const [termsAccepted, setTermsAccepted] = React8__namespace.useState(false);
|
|
2059
2059
|
const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
2060
2060
|
const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
|
|
2061
2061
|
const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
|
|
@@ -2282,7 +2282,7 @@ function Offer({
|
|
|
2282
2282
|
className
|
|
2283
2283
|
}) {
|
|
2284
2284
|
var _a, _b, _c;
|
|
2285
|
-
const [showBooking, setShowBooking] =
|
|
2285
|
+
const [showBooking, setShowBooking] = React8__namespace.useState(false);
|
|
2286
2286
|
const isShowingCheckout = !confirmedState && (!!checkoutSlot || showBooking);
|
|
2287
2287
|
const handleBook = () => {
|
|
2288
2288
|
if (!checkoutSlot && !externalBookingFlow) setShowBooking(true);
|
|
@@ -2633,17 +2633,21 @@ function AdventureSection({
|
|
|
2633
2633
|
onAddTraveller,
|
|
2634
2634
|
onUnassignFromAdventure,
|
|
2635
2635
|
onCopyFormLink,
|
|
2636
|
+
onResendInvite,
|
|
2637
|
+
resendingInviteTravellerIds,
|
|
2638
|
+
resendInviteAriaLabel,
|
|
2636
2639
|
hasSubmitAddTraveller,
|
|
2637
2640
|
hasSubmitEditTraveller,
|
|
2638
2641
|
hasConfirmRemoveTraveller,
|
|
2639
2642
|
onRequestOpenAddModal,
|
|
2640
2643
|
onRequestOpenEditModal,
|
|
2641
2644
|
onRequestOpenDeleteModal,
|
|
2645
|
+
onRequestOpenResendInviteDialog,
|
|
2642
2646
|
cannotRemoveLastTravellerLabel,
|
|
2643
2647
|
labels
|
|
2644
2648
|
}) {
|
|
2645
2649
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
2646
|
-
const [detailsOpen, setDetailsOpen] =
|
|
2650
|
+
const [detailsOpen, setDetailsOpen] = React8__namespace.useState(false);
|
|
2647
2651
|
const handleCopyUrl = (url) => {
|
|
2648
2652
|
if (onCopyFormLink) {
|
|
2649
2653
|
onCopyFormLink(url);
|
|
@@ -2889,6 +2893,24 @@ function AdventureSection({
|
|
|
2889
2893
|
}
|
|
2890
2894
|
),
|
|
2891
2895
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [
|
|
2896
|
+
onResendInvite && t.status === "pending" && t.email && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2897
|
+
"button",
|
|
2898
|
+
{
|
|
2899
|
+
type: "button",
|
|
2900
|
+
onClick: () => {
|
|
2901
|
+
if (onRequestOpenResendInviteDialog) {
|
|
2902
|
+
onRequestOpenResendInviteDialog(t);
|
|
2903
|
+
} else {
|
|
2904
|
+
onResendInvite(t.id);
|
|
2905
|
+
}
|
|
2906
|
+
},
|
|
2907
|
+
disabled: resendingInviteTravellerIds == null ? void 0 : resendingInviteTravellerIds.has(t.id),
|
|
2908
|
+
className: "flex h-8 w-8 sm:h-7 sm:w-7 items-center justify-center rounded-lg text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:pointer-events-none",
|
|
2909
|
+
"aria-label": resendInviteAriaLabel != null ? resendInviteAriaLabel : "Resend registration invite",
|
|
2910
|
+
title: resendInviteAriaLabel != null ? resendInviteAriaLabel : "Resend registration invite",
|
|
2911
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SendIcon, { className: "w-3.5 h-3.5" })
|
|
2912
|
+
}
|
|
2913
|
+
),
|
|
2892
2914
|
(onEditTraveller || hasSubmitEditTraveller) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2893
2915
|
"button",
|
|
2894
2916
|
{
|
|
@@ -3137,8 +3159,8 @@ function AddTravellerDialog({
|
|
|
3137
3159
|
errorMessage
|
|
3138
3160
|
}) {
|
|
3139
3161
|
var _a, _b, _c, _d, _e;
|
|
3140
|
-
const [form, setForm] =
|
|
3141
|
-
|
|
3162
|
+
const [form, setForm] = React8__namespace.useState(() => createInitialAddFormData(config));
|
|
3163
|
+
React8__namespace.useEffect(() => {
|
|
3142
3164
|
if (open) {
|
|
3143
3165
|
setForm(createInitialAddFormData(config));
|
|
3144
3166
|
}
|
|
@@ -3198,7 +3220,7 @@ function EditTravellerDialog({
|
|
|
3198
3220
|
errorMessage
|
|
3199
3221
|
}) {
|
|
3200
3222
|
var _a, _b, _c, _d, _e;
|
|
3201
|
-
const [form, setForm] =
|
|
3223
|
+
const [form, setForm] = React8__namespace.useState(() => ({
|
|
3202
3224
|
firstName: "",
|
|
3203
3225
|
lastName: "",
|
|
3204
3226
|
email: "",
|
|
@@ -3207,7 +3229,7 @@ function EditTravellerDialog({
|
|
|
3207
3229
|
birthDate: "",
|
|
3208
3230
|
personType: "ADULT"
|
|
3209
3231
|
}));
|
|
3210
|
-
|
|
3232
|
+
React8__namespace.useEffect(() => {
|
|
3211
3233
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3212
3234
|
if (open && traveller) {
|
|
3213
3235
|
setForm({
|
|
@@ -3317,6 +3339,58 @@ function DeleteTravellerDialog({
|
|
|
3317
3339
|
}
|
|
3318
3340
|
);
|
|
3319
3341
|
}
|
|
3342
|
+
function ResendInviteConfirmDialog({
|
|
3343
|
+
open,
|
|
3344
|
+
travellerName: _travellerName,
|
|
3345
|
+
onClose,
|
|
3346
|
+
onConfirm,
|
|
3347
|
+
labels,
|
|
3348
|
+
submitting
|
|
3349
|
+
}) {
|
|
3350
|
+
var _a, _b, _c, _d, _e;
|
|
3351
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3352
|
+
Dialog,
|
|
3353
|
+
{
|
|
3354
|
+
open,
|
|
3355
|
+
onOpenChange: (o) => {
|
|
3356
|
+
if (!o) onClose();
|
|
3357
|
+
},
|
|
3358
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(DialogContent, { className: "sm:max-w-sm", children: [
|
|
3359
|
+
/* @__PURE__ */ jsxRuntime.jsxs(DialogHeader, { children: [
|
|
3360
|
+
/* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { children: (_a = labels == null ? void 0 : labels.title) != null ? _a : "Resend registration invite?" }),
|
|
3361
|
+
/* @__PURE__ */ jsxRuntime.jsx(DialogDescription, { children: (_b = labels == null ? void 0 : labels.body) != null ? _b : "The traveller will receive the registration form link again. This action cannot be undone." })
|
|
3362
|
+
] }),
|
|
3363
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 rounded-lg bg-amber-500/10 border border-amber-500/30 px-3 py-2", children: [
|
|
3364
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangleIcon, { className: "h-4 w-4 text-amber-600 mt-0.5 shrink-0" }),
|
|
3365
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: (_c = labels == null ? void 0 : labels.warning) != null ? _c : "After resending, you will need to wait 60 seconds to send again." })
|
|
3366
|
+
] }),
|
|
3367
|
+
/* @__PURE__ */ jsxRuntime.jsxs(DialogFooter, { children: [
|
|
3368
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3369
|
+
Button,
|
|
3370
|
+
{
|
|
3371
|
+
type: "button",
|
|
3372
|
+
variant: "outline",
|
|
3373
|
+
size: "sm",
|
|
3374
|
+
onClick: onClose,
|
|
3375
|
+
disabled: submitting,
|
|
3376
|
+
children: (_d = labels == null ? void 0 : labels.cancel) != null ? _d : "Cancel"
|
|
3377
|
+
}
|
|
3378
|
+
),
|
|
3379
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3380
|
+
Button,
|
|
3381
|
+
{
|
|
3382
|
+
type: "button",
|
|
3383
|
+
size: "sm",
|
|
3384
|
+
disabled: submitting,
|
|
3385
|
+
onClick: () => void onConfirm(),
|
|
3386
|
+
children: (_e = labels == null ? void 0 : labels.confirm) != null ? _e : "Resend invite"
|
|
3387
|
+
}
|
|
3388
|
+
)
|
|
3389
|
+
] })
|
|
3390
|
+
] })
|
|
3391
|
+
}
|
|
3392
|
+
);
|
|
3393
|
+
}
|
|
3320
3394
|
function OrderSummary({
|
|
3321
3395
|
adventures,
|
|
3322
3396
|
summaryLineItems,
|
|
@@ -3465,6 +3539,9 @@ function BookingDetails({
|
|
|
3465
3539
|
onAddTraveller,
|
|
3466
3540
|
onUnassignFromAdventure,
|
|
3467
3541
|
onCopyFormLink,
|
|
3542
|
+
onResendInvite,
|
|
3543
|
+
resendingInviteTravellerIds,
|
|
3544
|
+
resendInviteAriaLabel,
|
|
3468
3545
|
onSubmitAddTraveller,
|
|
3469
3546
|
onSubmitEditTraveller,
|
|
3470
3547
|
onConfirmRemoveTraveller,
|
|
@@ -3482,43 +3559,53 @@ function BookingDetails({
|
|
|
3482
3559
|
labels,
|
|
3483
3560
|
className
|
|
3484
3561
|
}) {
|
|
3485
|
-
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;
|
|
3562
|
+
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;
|
|
3486
3563
|
const people = totalPeople(adventures);
|
|
3487
3564
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3488
3565
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3489
3566
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3490
|
-
const [addModalState, setAddModalState] =
|
|
3567
|
+
const [addModalState, setAddModalState] = React8__namespace.useState({
|
|
3491
3568
|
open: false,
|
|
3492
3569
|
adventureId: null
|
|
3493
3570
|
});
|
|
3494
|
-
const [editModalState, setEditModalState] =
|
|
3495
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3496
|
-
const
|
|
3571
|
+
const [editModalState, setEditModalState] = React8__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3572
|
+
const [deleteModalState, setDeleteModalState] = React8__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3573
|
+
const [resendInviteDialogState, setResendInviteDialogState] = React8__namespace.useState({ open: false, traveller: null });
|
|
3574
|
+
const handleRequestOpenAddModal = React8__namespace.useCallback((adventureId) => {
|
|
3497
3575
|
setAddModalState({ open: true, adventureId });
|
|
3498
3576
|
}, []);
|
|
3499
|
-
const handleRequestOpenEditModal =
|
|
3577
|
+
const handleRequestOpenEditModal = React8__namespace.useCallback(
|
|
3500
3578
|
(adventureId, traveller) => {
|
|
3501
3579
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3502
3580
|
},
|
|
3503
3581
|
[]
|
|
3504
3582
|
);
|
|
3505
|
-
const handleRequestOpenDeleteModal =
|
|
3583
|
+
const handleRequestOpenDeleteModal = React8__namespace.useCallback(
|
|
3506
3584
|
(adventureId, traveller) => {
|
|
3507
3585
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3508
3586
|
},
|
|
3509
3587
|
[]
|
|
3510
3588
|
);
|
|
3511
|
-
const
|
|
3589
|
+
const handleRequestOpenResendInviteDialog = React8__namespace.useCallback(
|
|
3590
|
+
(traveller) => {
|
|
3591
|
+
setResendInviteDialogState({ open: true, traveller });
|
|
3592
|
+
},
|
|
3593
|
+
[]
|
|
3594
|
+
);
|
|
3595
|
+
const closeAddModal = React8__namespace.useCallback(() => {
|
|
3512
3596
|
setAddModalState({ open: false, adventureId: null });
|
|
3513
3597
|
}, []);
|
|
3514
|
-
const closeEditModal =
|
|
3598
|
+
const closeEditModal = React8__namespace.useCallback(() => {
|
|
3515
3599
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3516
3600
|
}, []);
|
|
3517
|
-
const closeDeleteModal =
|
|
3601
|
+
const closeDeleteModal = React8__namespace.useCallback(() => {
|
|
3518
3602
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3519
3603
|
}, []);
|
|
3520
|
-
const
|
|
3521
|
-
|
|
3604
|
+
const closeResendInviteDialog = React8__namespace.useCallback(() => {
|
|
3605
|
+
setResendInviteDialogState({ open: false, traveller: null });
|
|
3606
|
+
}, []);
|
|
3607
|
+
const submitInFlightRef = React8__namespace.useRef(false);
|
|
3608
|
+
const handleAddSubmit = React8__namespace.useCallback(
|
|
3522
3609
|
async (adventureId, data) => {
|
|
3523
3610
|
if (!onSubmitAddTraveller) return;
|
|
3524
3611
|
if (submitInFlightRef.current) return;
|
|
@@ -3533,7 +3620,7 @@ function BookingDetails({
|
|
|
3533
3620
|
},
|
|
3534
3621
|
[onSubmitAddTraveller, closeAddModal]
|
|
3535
3622
|
);
|
|
3536
|
-
const handleEditSubmit =
|
|
3623
|
+
const handleEditSubmit = React8__namespace.useCallback(
|
|
3537
3624
|
async (adventureId, travellerId, data) => {
|
|
3538
3625
|
if (!onSubmitEditTraveller) return;
|
|
3539
3626
|
if (submitInFlightRef.current) return;
|
|
@@ -3548,7 +3635,7 @@ function BookingDetails({
|
|
|
3548
3635
|
},
|
|
3549
3636
|
[onSubmitEditTraveller, closeEditModal]
|
|
3550
3637
|
);
|
|
3551
|
-
const handleDeleteConfirm =
|
|
3638
|
+
const handleDeleteConfirm = React8__namespace.useCallback(
|
|
3552
3639
|
async (adventureId, travellerId) => {
|
|
3553
3640
|
if (!onConfirmRemoveTraveller) return;
|
|
3554
3641
|
if (submitInFlightRef.current) return;
|
|
@@ -3653,12 +3740,16 @@ function BookingDetails({
|
|
|
3653
3740
|
onAddTraveller,
|
|
3654
3741
|
onUnassignFromAdventure,
|
|
3655
3742
|
onCopyFormLink,
|
|
3743
|
+
onResendInvite,
|
|
3744
|
+
resendingInviteTravellerIds,
|
|
3745
|
+
resendInviteAriaLabel,
|
|
3656
3746
|
hasSubmitAddTraveller,
|
|
3657
3747
|
hasSubmitEditTraveller,
|
|
3658
3748
|
hasConfirmRemoveTraveller,
|
|
3659
3749
|
onRequestOpenAddModal: handleRequestOpenAddModal,
|
|
3660
3750
|
onRequestOpenEditModal: handleRequestOpenEditModal,
|
|
3661
3751
|
onRequestOpenDeleteModal: handleRequestOpenDeleteModal,
|
|
3752
|
+
onRequestOpenResendInviteDialog: handleRequestOpenResendInviteDialog,
|
|
3662
3753
|
cannotRemoveLastTravellerLabel,
|
|
3663
3754
|
labels
|
|
3664
3755
|
},
|
|
@@ -3791,6 +3882,23 @@ function BookingDetails({
|
|
|
3791
3882
|
saving: removeTravellerSaving,
|
|
3792
3883
|
errorMessage: deleteModalState.open ? travellerFormError : null
|
|
3793
3884
|
}
|
|
3885
|
+
),
|
|
3886
|
+
onResendInvite && /* @__PURE__ */ jsxRuntime.jsx(
|
|
3887
|
+
ResendInviteConfirmDialog,
|
|
3888
|
+
{
|
|
3889
|
+
open: resendInviteDialogState.open,
|
|
3890
|
+
travellerName: resendInviteDialogState.traveller ? `${(_G = resendInviteDialogState.traveller.firstName) != null ? _G : ""} ${(_H = resendInviteDialogState.traveller.lastName) != null ? _H : ""}`.trim() : "",
|
|
3891
|
+
onClose: closeResendInviteDialog,
|
|
3892
|
+
onConfirm: () => {
|
|
3893
|
+
const traveller = resendInviteDialogState.traveller;
|
|
3894
|
+
if (traveller) {
|
|
3895
|
+
onResendInvite(traveller.id);
|
|
3896
|
+
}
|
|
3897
|
+
closeResendInviteDialog();
|
|
3898
|
+
},
|
|
3899
|
+
labels: labels == null ? void 0 : labels.resendInviteDialog,
|
|
3900
|
+
submitting: resendInviteDialogState.traveller ? resendingInviteTravellerIds == null ? void 0 : resendingInviteTravellerIds.has(resendInviteDialogState.traveller.id) : false
|
|
3901
|
+
}
|
|
3794
3902
|
)
|
|
3795
3903
|
] });
|
|
3796
3904
|
}
|
|
@@ -5001,7 +5109,7 @@ function BookingCreatedEmail({
|
|
|
5001
5109
|
}, children: i + 1 }) }),
|
|
5002
5110
|
/* @__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 }) })
|
|
5003
5111
|
] }) }) }, i)) }),
|
|
5004
|
-
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(
|
|
5112
|
+
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(React8__namespace.Fragment, { children: [
|
|
5005
5113
|
idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
|
|
5006
5114
|
idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
|
|
5007
5115
|
] }, idx)) })
|
|
@@ -6370,11 +6478,11 @@ function DatePickerField({
|
|
|
6370
6478
|
fromDate,
|
|
6371
6479
|
className
|
|
6372
6480
|
}) {
|
|
6373
|
-
const [open, setOpen] =
|
|
6374
|
-
const containerRef =
|
|
6375
|
-
const [calendarWidth, setCalendarWidth] =
|
|
6481
|
+
const [open, setOpen] = React8__namespace.useState(false);
|
|
6482
|
+
const containerRef = React8__namespace.useRef(null);
|
|
6483
|
+
const [calendarWidth, setCalendarWidth] = React8__namespace.useState();
|
|
6376
6484
|
const hasValue = !!value;
|
|
6377
|
-
|
|
6485
|
+
React8__namespace.useEffect(() => {
|
|
6378
6486
|
if (!containerRef.current) return;
|
|
6379
6487
|
const observer = new ResizeObserver(([entry]) => {
|
|
6380
6488
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -6483,7 +6591,7 @@ function BookingForm({
|
|
|
6483
6591
|
subtitle = "Free enquiry \u2013 no commitment",
|
|
6484
6592
|
className
|
|
6485
6593
|
}) {
|
|
6486
|
-
const [values, setValues] =
|
|
6594
|
+
const [values, setValues] = React8__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
6487
6595
|
const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
6488
6596
|
const handleSubmit = (e) => {
|
|
6489
6597
|
e.preventDefault();
|
|
@@ -7020,11 +7128,11 @@ function FloatingTextarea({
|
|
|
7020
7128
|
}
|
|
7021
7129
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
7022
7130
|
var _a, _b, _c;
|
|
7023
|
-
const [open, setOpen] =
|
|
7024
|
-
const containerRef =
|
|
7131
|
+
const [open, setOpen] = React8__namespace.useState(false);
|
|
7132
|
+
const containerRef = React8__namespace.useRef(null);
|
|
7025
7133
|
const options = (_a = field.options) != null ? _a : [];
|
|
7026
7134
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
7027
|
-
|
|
7135
|
+
React8__namespace.useEffect(() => {
|
|
7028
7136
|
if (!open) return;
|
|
7029
7137
|
const handleOutside = (e) => {
|
|
7030
7138
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -7413,11 +7521,11 @@ function RegistrationForm({
|
|
|
7413
7521
|
readOnly = false
|
|
7414
7522
|
}) {
|
|
7415
7523
|
var _a;
|
|
7416
|
-
const L =
|
|
7524
|
+
const L = React8__namespace.useMemo(
|
|
7417
7525
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS9), labels != null ? labels : {}),
|
|
7418
7526
|
[labels]
|
|
7419
7527
|
);
|
|
7420
|
-
const sortedFields =
|
|
7528
|
+
const sortedFields = React8__namespace.useMemo(
|
|
7421
7529
|
() => [...fields].sort((a, b) => {
|
|
7422
7530
|
var _a2, _b;
|
|
7423
7531
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -7425,7 +7533,7 @@ function RegistrationForm({
|
|
|
7425
7533
|
[fields]
|
|
7426
7534
|
);
|
|
7427
7535
|
const isControlled = values !== void 0;
|
|
7428
|
-
const [internal, setInternal] =
|
|
7536
|
+
const [internal, setInternal] = React8__namespace.useState(
|
|
7429
7537
|
() => initializeValues(
|
|
7430
7538
|
sortedFields,
|
|
7431
7539
|
defaultValues != null ? defaultValues : {},
|
|
@@ -7433,9 +7541,9 @@ function RegistrationForm({
|
|
|
7433
7541
|
includeTerms
|
|
7434
7542
|
)
|
|
7435
7543
|
);
|
|
7436
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
7437
|
-
const [validationErrors, setValidationErrors] =
|
|
7438
|
-
|
|
7544
|
+
const [submitAttempted, setSubmitAttempted] = React8__namespace.useState(false);
|
|
7545
|
+
const [validationErrors, setValidationErrors] = React8__namespace.useState({});
|
|
7546
|
+
React8__namespace.useEffect(() => {
|
|
7439
7547
|
if (isControlled) return;
|
|
7440
7548
|
setInternal((prev) => {
|
|
7441
7549
|
const next = initializeValues(
|
|
@@ -7492,7 +7600,7 @@ function RegistrationForm({
|
|
|
7492
7600
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
7493
7601
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
7494
7602
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
7495
|
-
|
|
7603
|
+
React8__namespace.useEffect(() => {
|
|
7496
7604
|
if (!submitAttempted || !scrollTargetId) return;
|
|
7497
7605
|
const timer = setTimeout(() => {
|
|
7498
7606
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -7954,10 +8062,10 @@ var OTPCodeInput = ({
|
|
|
7954
8062
|
id,
|
|
7955
8063
|
required
|
|
7956
8064
|
}) => {
|
|
7957
|
-
const baseId = id != null ? id :
|
|
7958
|
-
const inputRef =
|
|
7959
|
-
const [focused, setFocused] =
|
|
7960
|
-
const digits =
|
|
8065
|
+
const baseId = id != null ? id : React8__namespace.useId();
|
|
8066
|
+
const inputRef = React8__namespace.useRef(null);
|
|
8067
|
+
const [focused, setFocused] = React8__namespace.useState(false);
|
|
8068
|
+
const digits = React8__namespace.useMemo(() => {
|
|
7961
8069
|
const arr = value.split("").slice(0, length);
|
|
7962
8070
|
while (arr.length < length) arr.push("");
|
|
7963
8071
|
return arr;
|
|
@@ -8073,7 +8181,7 @@ function Checkbox(_a) {
|
|
|
8073
8181
|
})
|
|
8074
8182
|
);
|
|
8075
8183
|
}
|
|
8076
|
-
var AccordionVariantContext =
|
|
8184
|
+
var AccordionVariantContext = React8__namespace.createContext("default");
|
|
8077
8185
|
function Accordion(_a) {
|
|
8078
8186
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
8079
8187
|
return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -8091,7 +8199,7 @@ function Accordion(_a) {
|
|
|
8091
8199
|
}
|
|
8092
8200
|
function AccordionItem(_a) {
|
|
8093
8201
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
8094
|
-
const variant =
|
|
8202
|
+
const variant = React8__namespace.useContext(AccordionVariantContext);
|
|
8095
8203
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8096
8204
|
accordion.Accordion.Item,
|
|
8097
8205
|
__spreadValues({
|
|
@@ -8112,7 +8220,7 @@ function AccordionTrigger(_a) {
|
|
|
8112
8220
|
"className",
|
|
8113
8221
|
"children"
|
|
8114
8222
|
]);
|
|
8115
|
-
const variant =
|
|
8223
|
+
const variant = React8__namespace.useContext(AccordionVariantContext);
|
|
8116
8224
|
return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8117
8225
|
accordion.Accordion.Trigger,
|
|
8118
8226
|
__spreadProps(__spreadValues({
|
|
@@ -8166,7 +8274,7 @@ function AccordionContent(_a) {
|
|
|
8166
8274
|
"className",
|
|
8167
8275
|
"children"
|
|
8168
8276
|
]);
|
|
8169
|
-
const variant =
|
|
8277
|
+
const variant = React8__namespace.useContext(AccordionVariantContext);
|
|
8170
8278
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8171
8279
|
accordion.Accordion.Panel,
|
|
8172
8280
|
__spreadProps(__spreadValues({
|
|
@@ -8198,7 +8306,7 @@ function FilterPanel({
|
|
|
8198
8306
|
title = "Filters",
|
|
8199
8307
|
className
|
|
8200
8308
|
}) {
|
|
8201
|
-
const [internalValue, setInternalValue] =
|
|
8309
|
+
const [internalValue, setInternalValue] = React8__namespace.useState(
|
|
8202
8310
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
8203
8311
|
);
|
|
8204
8312
|
const selected = value != null ? value : internalValue;
|
|
@@ -8297,8 +8405,8 @@ function FilterPanel({
|
|
|
8297
8405
|
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
8298
8406
|
function TrustpilotEmbed({ config }) {
|
|
8299
8407
|
var _a, _b, _c, _d, _e, _f;
|
|
8300
|
-
const ref =
|
|
8301
|
-
|
|
8408
|
+
const ref = React8__namespace.useRef(null);
|
|
8409
|
+
React8__namespace.useEffect(() => {
|
|
8302
8410
|
if (typeof document === "undefined" || !ref.current) return;
|
|
8303
8411
|
let cancelled = false;
|
|
8304
8412
|
const initWidget = () => {
|
|
@@ -8430,11 +8538,11 @@ function ItineraryModal({
|
|
|
8430
8538
|
onNext
|
|
8431
8539
|
}) {
|
|
8432
8540
|
var _a, _b, _c;
|
|
8433
|
-
const [imgIndex, setImgIndex] =
|
|
8541
|
+
const [imgIndex, setImgIndex] = React8__namespace.useState(0);
|
|
8434
8542
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
8435
8543
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
8436
8544
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
8437
|
-
|
|
8545
|
+
React8__namespace.useEffect(() => {
|
|
8438
8546
|
setImgIndex(0);
|
|
8439
8547
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
8440
8548
|
if (!stop) return null;
|
|
@@ -8561,8 +8669,8 @@ function ItineraryModal({
|
|
|
8561
8669
|
) });
|
|
8562
8670
|
}
|
|
8563
8671
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
8564
|
-
const [activeIndex, setActiveIndex] =
|
|
8565
|
-
const scrollRef =
|
|
8672
|
+
const [activeIndex, setActiveIndex] = React8__namespace.useState(null);
|
|
8673
|
+
const scrollRef = React8__namespace.useRef(null);
|
|
8566
8674
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
8567
8675
|
const scrollBy = (dir) => {
|
|
8568
8676
|
if (!scrollRef.current) return;
|
|
@@ -8654,18 +8762,18 @@ function Lightbox({
|
|
|
8654
8762
|
onClose
|
|
8655
8763
|
}) {
|
|
8656
8764
|
var _a;
|
|
8657
|
-
const [index, setIndex] =
|
|
8765
|
+
const [index, setIndex] = React8__namespace.useState(initialIndex);
|
|
8658
8766
|
const total = photos.length;
|
|
8659
8767
|
const photo = photos[index];
|
|
8660
|
-
const prev =
|
|
8768
|
+
const prev = React8__namespace.useCallback(
|
|
8661
8769
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
8662
8770
|
[total]
|
|
8663
8771
|
);
|
|
8664
|
-
const next =
|
|
8772
|
+
const next = React8__namespace.useCallback(
|
|
8665
8773
|
() => setIndex((i) => (i + 1) % total),
|
|
8666
8774
|
[total]
|
|
8667
8775
|
);
|
|
8668
|
-
|
|
8776
|
+
React8__namespace.useEffect(() => {
|
|
8669
8777
|
const onKey = (e) => {
|
|
8670
8778
|
if (e.key === "Escape") onClose();
|
|
8671
8779
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -8831,7 +8939,7 @@ function GridGallery({
|
|
|
8831
8939
|
initialVisible,
|
|
8832
8940
|
onOpen
|
|
8833
8941
|
}) {
|
|
8834
|
-
const [expanded, setExpanded] =
|
|
8942
|
+
const [expanded, setExpanded] = React8__namespace.useState(false);
|
|
8835
8943
|
const cols = gridCols(photos.length);
|
|
8836
8944
|
const hasMore = photos.length > initialVisible;
|
|
8837
8945
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -8861,7 +8969,7 @@ function MasonryGallery({
|
|
|
8861
8969
|
initialVisible,
|
|
8862
8970
|
onOpen
|
|
8863
8971
|
}) {
|
|
8864
|
-
const [expanded, setExpanded] =
|
|
8972
|
+
const [expanded, setExpanded] = React8__namespace.useState(false);
|
|
8865
8973
|
const hasMore = photos.length > initialVisible;
|
|
8866
8974
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
8867
8975
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -8934,7 +9042,7 @@ function FeaturedGallery({
|
|
|
8934
9042
|
photos,
|
|
8935
9043
|
onOpen
|
|
8936
9044
|
}) {
|
|
8937
|
-
const [expanded, setExpanded] =
|
|
9045
|
+
const [expanded, setExpanded] = React8__namespace.useState(false);
|
|
8938
9046
|
const featured = photos.slice(0, 3);
|
|
8939
9047
|
const extra = photos.slice(3);
|
|
8940
9048
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -9101,9 +9209,9 @@ function PhotoGallery({
|
|
|
9101
9209
|
onPhotoClick,
|
|
9102
9210
|
className
|
|
9103
9211
|
}) {
|
|
9104
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
9105
|
-
const [carouselIndex, setCarouselIndex] =
|
|
9106
|
-
const normalised =
|
|
9212
|
+
const [lightboxIndex, setLightboxIndex] = React8__namespace.useState(null);
|
|
9213
|
+
const [carouselIndex, setCarouselIndex] = React8__namespace.useState(0);
|
|
9214
|
+
const normalised = React8__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
9107
9215
|
const handleOpen = (index) => {
|
|
9108
9216
|
setLightboxIndex(index);
|
|
9109
9217
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
@@ -9179,7 +9287,7 @@ function ItineraryDay({
|
|
|
9179
9287
|
photoLayout = "rounded",
|
|
9180
9288
|
className
|
|
9181
9289
|
}) {
|
|
9182
|
-
const photoList =
|
|
9290
|
+
const photoList = React8__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
9183
9291
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
9184
9292
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
9185
9293
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -9231,8 +9339,8 @@ function MenuTrip({
|
|
|
9231
9339
|
bold = true,
|
|
9232
9340
|
className
|
|
9233
9341
|
}) {
|
|
9234
|
-
const scrollRef =
|
|
9235
|
-
|
|
9342
|
+
const scrollRef = React8__namespace.useRef(null);
|
|
9343
|
+
React8__namespace.useEffect(() => {
|
|
9236
9344
|
if (!scrollRef.current || !activeSection) return;
|
|
9237
9345
|
const container = scrollRef.current;
|
|
9238
9346
|
const btn = container.querySelector(
|
|
@@ -9423,8 +9531,8 @@ function PricingTrip({
|
|
|
9423
9531
|
className
|
|
9424
9532
|
}) {
|
|
9425
9533
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
9426
|
-
const [showEstimates, setShowEstimates] =
|
|
9427
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
9534
|
+
const [showEstimates, setShowEstimates] = React8__namespace.useState(false);
|
|
9535
|
+
const [showPriceInfo, setShowPriceInfo] = React8__namespace.useState(false);
|
|
9428
9536
|
if (variant === "compact") {
|
|
9429
9537
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
9430
9538
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -9864,14 +9972,14 @@ function SiteHeader({
|
|
|
9864
9972
|
className
|
|
9865
9973
|
}) {
|
|
9866
9974
|
const t = VARIANT[variant];
|
|
9867
|
-
const [openMenu, setOpenMenu] =
|
|
9868
|
-
const [langOpen, setLangOpen] =
|
|
9869
|
-
const [mobileOpen, setMobileOpen] =
|
|
9870
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
9871
|
-
const [activeLang, setActiveLang] =
|
|
9975
|
+
const [openMenu, setOpenMenu] = React8__namespace.useState(null);
|
|
9976
|
+
const [langOpen, setLangOpen] = React8__namespace.useState(false);
|
|
9977
|
+
const [mobileOpen, setMobileOpen] = React8__namespace.useState(false);
|
|
9978
|
+
const [openMobileSection, setOpenMobileSection] = React8__namespace.useState(null);
|
|
9979
|
+
const [activeLang, setActiveLang] = React8__namespace.useState(currentLanguage);
|
|
9872
9980
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
9873
|
-
const menuCloseTimer =
|
|
9874
|
-
const langCloseTimer =
|
|
9981
|
+
const menuCloseTimer = React8__namespace.useRef(void 0);
|
|
9982
|
+
const langCloseTimer = React8__namespace.useRef(void 0);
|
|
9875
9983
|
const handleMenuEnter = (label) => {
|
|
9876
9984
|
clearTimeout(menuCloseTimer.current);
|
|
9877
9985
|
setOpenMenu(label);
|
|
@@ -9892,7 +10000,7 @@ function SiteHeader({
|
|
|
9892
10000
|
setOpenMenu(null);
|
|
9893
10001
|
setLangOpen(false);
|
|
9894
10002
|
};
|
|
9895
|
-
|
|
10003
|
+
React8__namespace.useEffect(() => () => {
|
|
9896
10004
|
clearTimeout(menuCloseTimer.current);
|
|
9897
10005
|
clearTimeout(langCloseTimer.current);
|
|
9898
10006
|
}, []);
|
|
@@ -10157,7 +10265,7 @@ function SiteHeader({
|
|
|
10157
10265
|
), children: [
|
|
10158
10266
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
10159
10267
|
const isActive = lang.code === activeLang;
|
|
10160
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10268
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React8__namespace.Fragment, { children: [
|
|
10161
10269
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
10162
10270
|
"text-xs select-none",
|
|
10163
10271
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -10219,8 +10327,8 @@ function SiteHeader({
|
|
|
10219
10327
|
);
|
|
10220
10328
|
}
|
|
10221
10329
|
function ThemeToggle({ className }) {
|
|
10222
|
-
const [dark, setDark] =
|
|
10223
|
-
|
|
10330
|
+
const [dark, setDark] = React8__namespace.useState(false);
|
|
10331
|
+
React8__namespace.useEffect(() => {
|
|
10224
10332
|
const saved = localStorage.getItem("theme");
|
|
10225
10333
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
10226
10334
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -10371,7 +10479,7 @@ function TripCard({
|
|
|
10371
10479
|
);
|
|
10372
10480
|
}
|
|
10373
10481
|
function useHlsVideo(videoRef, src) {
|
|
10374
|
-
|
|
10482
|
+
React8__namespace.useEffect(() => {
|
|
10375
10483
|
if (!src || !videoRef.current) return;
|
|
10376
10484
|
const video = videoRef.current;
|
|
10377
10485
|
if (!src.includes(".m3u8")) return;
|
|
@@ -10414,11 +10522,11 @@ function TripHeader({
|
|
|
10414
10522
|
className
|
|
10415
10523
|
}) {
|
|
10416
10524
|
var _a;
|
|
10417
|
-
const [heroIndex, setHeroIndex] =
|
|
10418
|
-
const [videoReady, setVideoReady] =
|
|
10419
|
-
const videoRef =
|
|
10525
|
+
const [heroIndex, setHeroIndex] = React8__namespace.useState(0);
|
|
10526
|
+
const [videoReady, setVideoReady] = React8__namespace.useState(false);
|
|
10527
|
+
const videoRef = React8__namespace.useRef(null);
|
|
10420
10528
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
10421
|
-
const validImages =
|
|
10529
|
+
const validImages = React8__namespace.useMemo(
|
|
10422
10530
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
10423
10531
|
[images]
|
|
10424
10532
|
);
|
|
@@ -10433,7 +10541,7 @@ function TripHeader({
|
|
|
10433
10541
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
10434
10542
|
const hasMeta = !!(destination || duration);
|
|
10435
10543
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
10436
|
-
|
|
10544
|
+
React8__namespace.useEffect(() => {
|
|
10437
10545
|
if (!videoUrl) return;
|
|
10438
10546
|
const el = videoRef.current;
|
|
10439
10547
|
if (!el) return;
|
|
@@ -10575,7 +10683,7 @@ function TripHeader({
|
|
|
10575
10683
|
siteHeader ? "-mt-44" : "-mt-36"
|
|
10576
10684
|
),
|
|
10577
10685
|
children: [
|
|
10578
|
-
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(
|
|
10686
|
+
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(React8__namespace.Fragment, { children: [
|
|
10579
10687
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
10580
10688
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
10581
10689
|
] }, i)) }),
|
|
@@ -10691,9 +10799,9 @@ function TripPage({
|
|
|
10691
10799
|
features,
|
|
10692
10800
|
className
|
|
10693
10801
|
}) {
|
|
10694
|
-
const [activeSection, setActiveSection] =
|
|
10695
|
-
const [accordionValue, setAccordionValue] =
|
|
10696
|
-
const accordionSectionIds =
|
|
10802
|
+
const [activeSection, setActiveSection] = React8__namespace.useState("");
|
|
10803
|
+
const [accordionValue, setAccordionValue] = React8__namespace.useState([]);
|
|
10804
|
+
const accordionSectionIds = React8__namespace.useMemo(
|
|
10697
10805
|
() => /* @__PURE__ */ new Set([
|
|
10698
10806
|
"key-info",
|
|
10699
10807
|
"what-to-bring",
|
|
@@ -10706,18 +10814,18 @@ function TripPage({
|
|
|
10706
10814
|
]),
|
|
10707
10815
|
[]
|
|
10708
10816
|
);
|
|
10709
|
-
const [navFloating, setNavFloating] =
|
|
10710
|
-
const [navHidden, setNavHidden] =
|
|
10711
|
-
const [isFloating, setIsFloating] =
|
|
10712
|
-
const [sidebarPos, setSidebarPos] =
|
|
10713
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
10714
|
-
const navRef =
|
|
10715
|
-
const navSentinelRef =
|
|
10716
|
-
const sentinelRef =
|
|
10717
|
-
const sidebarPlaceholderRef =
|
|
10718
|
-
const pricingBarRef =
|
|
10719
|
-
const galleryRef =
|
|
10720
|
-
const sections =
|
|
10817
|
+
const [navFloating, setNavFloating] = React8__namespace.useState(false);
|
|
10818
|
+
const [navHidden, setNavHidden] = React8__namespace.useState(false);
|
|
10819
|
+
const [isFloating, setIsFloating] = React8__namespace.useState(false);
|
|
10820
|
+
const [sidebarPos, setSidebarPos] = React8__namespace.useState(null);
|
|
10821
|
+
const [pricingBarVisible, setPricingBarVisible] = React8__namespace.useState(false);
|
|
10822
|
+
const navRef = React8__namespace.useRef(null);
|
|
10823
|
+
const navSentinelRef = React8__namespace.useRef(null);
|
|
10824
|
+
const sentinelRef = React8__namespace.useRef(null);
|
|
10825
|
+
const sidebarPlaceholderRef = React8__namespace.useRef(null);
|
|
10826
|
+
const pricingBarRef = React8__namespace.useRef(null);
|
|
10827
|
+
const galleryRef = React8__namespace.useRef(null);
|
|
10828
|
+
const sections = React8__namespace.useMemo(
|
|
10721
10829
|
() => [
|
|
10722
10830
|
{ id: "overview", label: "Overview", show: !!(overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) },
|
|
10723
10831
|
{
|
|
@@ -10735,7 +10843,7 @@ function TripPage({
|
|
|
10735
10843
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
10736
10844
|
[]
|
|
10737
10845
|
);
|
|
10738
|
-
|
|
10846
|
+
React8__namespace.useEffect(() => {
|
|
10739
10847
|
const sentinel = navSentinelRef.current;
|
|
10740
10848
|
if (!sentinel) return;
|
|
10741
10849
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -10743,7 +10851,7 @@ function TripPage({
|
|
|
10743
10851
|
update();
|
|
10744
10852
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
10745
10853
|
}, []);
|
|
10746
|
-
|
|
10854
|
+
React8__namespace.useEffect(() => {
|
|
10747
10855
|
const sentinel = sentinelRef.current;
|
|
10748
10856
|
if (!sentinel) return;
|
|
10749
10857
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -10751,7 +10859,7 @@ function TripPage({
|
|
|
10751
10859
|
update();
|
|
10752
10860
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
10753
10861
|
}, []);
|
|
10754
|
-
|
|
10862
|
+
React8__namespace.useEffect(() => {
|
|
10755
10863
|
const measure = () => {
|
|
10756
10864
|
if (!sidebarPlaceholderRef.current) return;
|
|
10757
10865
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -10761,7 +10869,7 @@ function TripPage({
|
|
|
10761
10869
|
window.addEventListener("resize", measure);
|
|
10762
10870
|
return () => window.removeEventListener("resize", measure);
|
|
10763
10871
|
}, [isFloating]);
|
|
10764
|
-
|
|
10872
|
+
React8__namespace.useEffect(() => {
|
|
10765
10873
|
const check = () => {
|
|
10766
10874
|
var _a;
|
|
10767
10875
|
const target = (_a = galleryRef.current) != null ? _a : pricingBarRef.current;
|
|
@@ -10772,7 +10880,7 @@ function TripPage({
|
|
|
10772
10880
|
check();
|
|
10773
10881
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
10774
10882
|
}, []);
|
|
10775
|
-
|
|
10883
|
+
React8__namespace.useEffect(() => {
|
|
10776
10884
|
const check = () => {
|
|
10777
10885
|
if (!pricingBarRef.current) return;
|
|
10778
10886
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -10781,7 +10889,7 @@ function TripPage({
|
|
|
10781
10889
|
check();
|
|
10782
10890
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
10783
10891
|
}, []);
|
|
10784
|
-
|
|
10892
|
+
React8__namespace.useEffect(() => {
|
|
10785
10893
|
if (sections.length === 0) return;
|
|
10786
10894
|
setActiveSection(sections[0].id);
|
|
10787
10895
|
const update = () => {
|
|
@@ -11303,12 +11411,12 @@ function Toast({
|
|
|
11303
11411
|
duration = 6e3,
|
|
11304
11412
|
className
|
|
11305
11413
|
}) {
|
|
11306
|
-
const [mounted, setMounted] =
|
|
11307
|
-
const [visible, setVisible] =
|
|
11308
|
-
|
|
11414
|
+
const [mounted, setMounted] = React8__namespace.useState(false);
|
|
11415
|
+
const [visible, setVisible] = React8__namespace.useState(true);
|
|
11416
|
+
React8__namespace.useEffect(() => {
|
|
11309
11417
|
setMounted(true);
|
|
11310
11418
|
}, []);
|
|
11311
|
-
|
|
11419
|
+
React8__namespace.useEffect(() => {
|
|
11312
11420
|
if (duration === 0) return;
|
|
11313
11421
|
const t = setTimeout(() => {
|
|
11314
11422
|
setVisible(false);
|
|
@@ -11715,21 +11823,21 @@ function LeadCapturePopup({
|
|
|
11715
11823
|
}) {
|
|
11716
11824
|
var _a;
|
|
11717
11825
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
11718
|
-
const [open, setOpen] =
|
|
11719
|
-
const [closing, setClosing] =
|
|
11720
|
-
const [submitted, setSubmitted] =
|
|
11721
|
-
const [submitting, setSubmitting] =
|
|
11722
|
-
const [error, setError] =
|
|
11723
|
-
const [name, setName] =
|
|
11724
|
-
const [email, setEmail] =
|
|
11725
|
-
const [travelDate, setTravelDate] =
|
|
11726
|
-
const panelRef =
|
|
11727
|
-
const nameRef =
|
|
11728
|
-
const show =
|
|
11826
|
+
const [open, setOpen] = React8.useState(false);
|
|
11827
|
+
const [closing, setClosing] = React8.useState(false);
|
|
11828
|
+
const [submitted, setSubmitted] = React8.useState(false);
|
|
11829
|
+
const [submitting, setSubmitting] = React8.useState(false);
|
|
11830
|
+
const [error, setError] = React8.useState(null);
|
|
11831
|
+
const [name, setName] = React8.useState("");
|
|
11832
|
+
const [email, setEmail] = React8.useState("");
|
|
11833
|
+
const [travelDate, setTravelDate] = React8.useState("");
|
|
11834
|
+
const panelRef = React8.useRef(null);
|
|
11835
|
+
const nameRef = React8.useRef(null);
|
|
11836
|
+
const show = React8.useCallback(() => {
|
|
11729
11837
|
if (isDismissed()) return;
|
|
11730
11838
|
setOpen(true);
|
|
11731
11839
|
}, []);
|
|
11732
|
-
|
|
11840
|
+
React8.useEffect(() => {
|
|
11733
11841
|
var _a2;
|
|
11734
11842
|
if (isDismissed()) return;
|
|
11735
11843
|
if (config.trigger === "delay") {
|
|
@@ -11756,7 +11864,7 @@ function LeadCapturePopup({
|
|
|
11756
11864
|
return () => window.removeEventListener("scroll", handler);
|
|
11757
11865
|
}
|
|
11758
11866
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
11759
|
-
|
|
11867
|
+
React8.useEffect(() => {
|
|
11760
11868
|
if (open && !submitted) {
|
|
11761
11869
|
requestAnimationFrame(() => {
|
|
11762
11870
|
var _a2;
|
|
@@ -11764,7 +11872,7 @@ function LeadCapturePopup({
|
|
|
11764
11872
|
});
|
|
11765
11873
|
}
|
|
11766
11874
|
}, [open, submitted]);
|
|
11767
|
-
const close =
|
|
11875
|
+
const close = React8.useCallback(() => {
|
|
11768
11876
|
setClosing(true);
|
|
11769
11877
|
setDismissed(config.dismissDays);
|
|
11770
11878
|
setTimeout(() => {
|
|
@@ -11772,7 +11880,7 @@ function LeadCapturePopup({
|
|
|
11772
11880
|
setClosing(false);
|
|
11773
11881
|
}, 250);
|
|
11774
11882
|
}, [config.dismissDays]);
|
|
11775
|
-
|
|
11883
|
+
React8.useEffect(() => {
|
|
11776
11884
|
if (!open) return;
|
|
11777
11885
|
const handler = (e) => {
|
|
11778
11886
|
if (e.key === "Escape") close();
|
|
@@ -11780,7 +11888,7 @@ function LeadCapturePopup({
|
|
|
11780
11888
|
document.addEventListener("keydown", handler);
|
|
11781
11889
|
return () => document.removeEventListener("keydown", handler);
|
|
11782
11890
|
}, [open, close]);
|
|
11783
|
-
const onOverlayClick =
|
|
11891
|
+
const onOverlayClick = React8.useCallback(
|
|
11784
11892
|
(e) => {
|
|
11785
11893
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
11786
11894
|
close();
|