@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.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React8 from 'react';
|
|
2
2
|
import { useState, useRef, useCallback, useEffect } 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 = React8.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(
|
|
@@ -302,10 +302,10 @@ function DialogDescription(_a) {
|
|
|
302
302
|
}, props)
|
|
303
303
|
);
|
|
304
304
|
}
|
|
305
|
-
var FloatingInput =
|
|
305
|
+
var FloatingInput = React8.forwardRef(
|
|
306
306
|
(_a, ref) => {
|
|
307
307
|
var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
|
|
308
|
-
const inputId = id != null ? id :
|
|
308
|
+
const inputId = id != null ? id : React8.useId();
|
|
309
309
|
return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
|
|
310
310
|
/* @__PURE__ */ jsx(
|
|
311
311
|
"input",
|
|
@@ -345,10 +345,10 @@ var FloatingInput = React25.forwardRef(
|
|
|
345
345
|
}
|
|
346
346
|
);
|
|
347
347
|
FloatingInput.displayName = "FloatingInput";
|
|
348
|
-
var FloatingSelect =
|
|
348
|
+
var FloatingSelect = React8.forwardRef(
|
|
349
349
|
(_a, ref) => {
|
|
350
350
|
var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
|
|
351
|
-
const inputId = id != null ? id :
|
|
351
|
+
const inputId = id != null ? id : React8.useId();
|
|
352
352
|
const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
|
|
353
353
|
return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
|
|
354
354
|
/* @__PURE__ */ jsx(
|
|
@@ -612,11 +612,11 @@ function PhoneCountrySelect({
|
|
|
612
612
|
disabled
|
|
613
613
|
}) {
|
|
614
614
|
var _a;
|
|
615
|
-
const [open, setOpen] =
|
|
616
|
-
const containerRef =
|
|
617
|
-
const listRef =
|
|
615
|
+
const [open, setOpen] = React8.useState(false);
|
|
616
|
+
const containerRef = React8.useRef(null);
|
|
617
|
+
const listRef = React8.useRef(null);
|
|
618
618
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
619
|
-
|
|
619
|
+
React8.useEffect(() => {
|
|
620
620
|
if (!open) return;
|
|
621
621
|
const handler = (e) => {
|
|
622
622
|
var _a2;
|
|
@@ -627,7 +627,7 @@ function PhoneCountrySelect({
|
|
|
627
627
|
document.addEventListener("mousedown", handler);
|
|
628
628
|
return () => document.removeEventListener("mousedown", handler);
|
|
629
629
|
}, [open]);
|
|
630
|
-
|
|
630
|
+
React8.useEffect(() => {
|
|
631
631
|
if (!open || !listRef.current) return;
|
|
632
632
|
const activeEl = listRef.current.querySelector("[data-selected=true]");
|
|
633
633
|
activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
|
|
@@ -897,8 +897,8 @@ function CalendarDayButton(_a) {
|
|
|
897
897
|
"locale"
|
|
898
898
|
]);
|
|
899
899
|
const defaultClassNames = getDefaultClassNames();
|
|
900
|
-
const ref =
|
|
901
|
-
|
|
900
|
+
const ref = React8.useRef(null);
|
|
901
|
+
React8.useEffect(() => {
|
|
902
902
|
var _a2;
|
|
903
903
|
if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
|
|
904
904
|
}, [modifiers.focused]);
|
|
@@ -929,16 +929,16 @@ function BirthDateField({
|
|
|
929
929
|
className,
|
|
930
930
|
disabled
|
|
931
931
|
}) {
|
|
932
|
-
const [open, setOpen] =
|
|
933
|
-
const [text, setText] =
|
|
932
|
+
const [open, setOpen] = React8.useState(false);
|
|
933
|
+
const [text, setText] = React8.useState(
|
|
934
934
|
value ? format(value, "dd/MM/yyyy") : ""
|
|
935
935
|
);
|
|
936
|
-
const containerRef =
|
|
937
|
-
const inputId =
|
|
938
|
-
|
|
936
|
+
const containerRef = React8.useRef(null);
|
|
937
|
+
const inputId = React8.useId();
|
|
938
|
+
React8.useEffect(() => {
|
|
939
939
|
setText(value ? format(value, "dd/MM/yyyy") : "");
|
|
940
940
|
}, [value]);
|
|
941
|
-
|
|
941
|
+
React8.useEffect(() => {
|
|
942
942
|
if (!open) return;
|
|
943
943
|
const handler = (e) => {
|
|
944
944
|
var _a;
|
|
@@ -1147,14 +1147,14 @@ function CountrySearchField({
|
|
|
1147
1147
|
}) {
|
|
1148
1148
|
var _a;
|
|
1149
1149
|
const list = countries != null ? countries : COUNTRIES;
|
|
1150
|
-
const [query, setQuery] =
|
|
1151
|
-
const [open, setOpen] =
|
|
1152
|
-
const containerRef =
|
|
1153
|
-
const searchRef =
|
|
1150
|
+
const [query, setQuery] = React8.useState("");
|
|
1151
|
+
const [open, setOpen] = React8.useState(false);
|
|
1152
|
+
const containerRef = React8.useRef(null);
|
|
1153
|
+
const searchRef = React8.useRef(null);
|
|
1154
1154
|
const selected = list.find((c) => c.code === value);
|
|
1155
1155
|
const isFloated = open || !!selected;
|
|
1156
1156
|
const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
|
|
1157
|
-
|
|
1157
|
+
React8.useEffect(() => {
|
|
1158
1158
|
if (!open) return;
|
|
1159
1159
|
const handler = (e) => {
|
|
1160
1160
|
var _a2;
|
|
@@ -1268,7 +1268,7 @@ function AdventureCard({
|
|
|
1268
1268
|
}) {
|
|
1269
1269
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
1270
1270
|
const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
|
|
1271
|
-
const [checkedInternal, setCheckedInternal] =
|
|
1271
|
+
const [checkedInternal, setCheckedInternal] = React8.useState(
|
|
1272
1272
|
new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
|
|
1273
1273
|
);
|
|
1274
1274
|
const isChecked = (opt) => {
|
|
@@ -1666,7 +1666,7 @@ function BookingShell({
|
|
|
1666
1666
|
return /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1667
1667
|
/* @__PURE__ */ jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
|
|
1668
1668
|
/* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
|
|
1669
|
-
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(
|
|
1669
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxs(React8.Fragment, { children: [
|
|
1670
1670
|
/* @__PURE__ */ jsx(
|
|
1671
1671
|
"span",
|
|
1672
1672
|
{
|
|
@@ -1865,7 +1865,7 @@ function TermsSection({
|
|
|
1865
1865
|
termsContent
|
|
1866
1866
|
}) {
|
|
1867
1867
|
var _a;
|
|
1868
|
-
const [modalOpen, setModalOpen] =
|
|
1868
|
+
const [modalOpen, setModalOpen] = React8.useState(false);
|
|
1869
1869
|
const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
|
|
1870
1870
|
return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
|
|
1871
1871
|
/* @__PURE__ */ jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
|
|
@@ -2003,9 +2003,9 @@ function BookingWizard({
|
|
|
2003
2003
|
}) {
|
|
2004
2004
|
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;
|
|
2005
2005
|
const wizardSteps = WIZARD_STEPS_FN(labels);
|
|
2006
|
-
const [step, setStep] =
|
|
2007
|
-
const [error, setError] =
|
|
2008
|
-
const [responsible, setResponsible] =
|
|
2006
|
+
const [step, setStep] = React8.useState("responsible");
|
|
2007
|
+
const [error, setError] = React8.useState(null);
|
|
2008
|
+
const [responsible, setResponsible] = React8.useState({
|
|
2009
2009
|
firstName: "",
|
|
2010
2010
|
lastName: "",
|
|
2011
2011
|
email: "",
|
|
@@ -2024,7 +2024,7 @@ function BookingWizard({
|
|
|
2024
2024
|
return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
|
|
2025
2025
|
}, 0);
|
|
2026
2026
|
const totalPax = totalAdults + totalChildren;
|
|
2027
|
-
const [travellers, setTravellers] =
|
|
2027
|
+
const [travellers, setTravellers] = React8.useState(
|
|
2028
2028
|
Array.from({ length: Math.max(totalPax, 1) }, () => ({
|
|
2029
2029
|
firstName: "",
|
|
2030
2030
|
lastName: "",
|
|
@@ -2032,9 +2032,9 @@ function BookingWizard({
|
|
|
2032
2032
|
email: ""
|
|
2033
2033
|
}))
|
|
2034
2034
|
);
|
|
2035
|
-
const [payAmount, setPayAmount] =
|
|
2036
|
-
const [payMethod, setPayMethod] =
|
|
2037
|
-
const [termsAccepted, setTermsAccepted] =
|
|
2035
|
+
const [payAmount, setPayAmount] = React8.useState("full");
|
|
2036
|
+
const [payMethod, setPayMethod] = React8.useState("stripe");
|
|
2037
|
+
const [termsAccepted, setTermsAccepted] = React8.useState(false);
|
|
2038
2038
|
const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
2039
2039
|
const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
|
|
2040
2040
|
const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
|
|
@@ -2261,7 +2261,7 @@ function Offer({
|
|
|
2261
2261
|
className
|
|
2262
2262
|
}) {
|
|
2263
2263
|
var _a, _b, _c;
|
|
2264
|
-
const [showBooking, setShowBooking] =
|
|
2264
|
+
const [showBooking, setShowBooking] = React8.useState(false);
|
|
2265
2265
|
const isShowingCheckout = !confirmedState && (!!checkoutSlot || showBooking);
|
|
2266
2266
|
const handleBook = () => {
|
|
2267
2267
|
if (!checkoutSlot && !externalBookingFlow) setShowBooking(true);
|
|
@@ -2612,17 +2612,21 @@ function AdventureSection({
|
|
|
2612
2612
|
onAddTraveller,
|
|
2613
2613
|
onUnassignFromAdventure,
|
|
2614
2614
|
onCopyFormLink,
|
|
2615
|
+
onResendInvite,
|
|
2616
|
+
resendingInviteTravellerIds,
|
|
2617
|
+
resendInviteAriaLabel,
|
|
2615
2618
|
hasSubmitAddTraveller,
|
|
2616
2619
|
hasSubmitEditTraveller,
|
|
2617
2620
|
hasConfirmRemoveTraveller,
|
|
2618
2621
|
onRequestOpenAddModal,
|
|
2619
2622
|
onRequestOpenEditModal,
|
|
2620
2623
|
onRequestOpenDeleteModal,
|
|
2624
|
+
onRequestOpenResendInviteDialog,
|
|
2621
2625
|
cannotRemoveLastTravellerLabel,
|
|
2622
2626
|
labels
|
|
2623
2627
|
}) {
|
|
2624
2628
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
2625
|
-
const [detailsOpen, setDetailsOpen] =
|
|
2629
|
+
const [detailsOpen, setDetailsOpen] = React8.useState(false);
|
|
2626
2630
|
const handleCopyUrl = (url) => {
|
|
2627
2631
|
if (onCopyFormLink) {
|
|
2628
2632
|
onCopyFormLink(url);
|
|
@@ -2868,6 +2872,24 @@ function AdventureSection({
|
|
|
2868
2872
|
}
|
|
2869
2873
|
),
|
|
2870
2874
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [
|
|
2875
|
+
onResendInvite && t.status === "pending" && t.email && /* @__PURE__ */ jsx(
|
|
2876
|
+
"button",
|
|
2877
|
+
{
|
|
2878
|
+
type: "button",
|
|
2879
|
+
onClick: () => {
|
|
2880
|
+
if (onRequestOpenResendInviteDialog) {
|
|
2881
|
+
onRequestOpenResendInviteDialog(t);
|
|
2882
|
+
} else {
|
|
2883
|
+
onResendInvite(t.id);
|
|
2884
|
+
}
|
|
2885
|
+
},
|
|
2886
|
+
disabled: resendingInviteTravellerIds == null ? void 0 : resendingInviteTravellerIds.has(t.id),
|
|
2887
|
+
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",
|
|
2888
|
+
"aria-label": resendInviteAriaLabel != null ? resendInviteAriaLabel : "Resend registration invite",
|
|
2889
|
+
title: resendInviteAriaLabel != null ? resendInviteAriaLabel : "Resend registration invite",
|
|
2890
|
+
children: /* @__PURE__ */ jsx(SendIcon, { className: "w-3.5 h-3.5" })
|
|
2891
|
+
}
|
|
2892
|
+
),
|
|
2871
2893
|
(onEditTraveller || hasSubmitEditTraveller) && /* @__PURE__ */ jsx(
|
|
2872
2894
|
"button",
|
|
2873
2895
|
{
|
|
@@ -3116,8 +3138,8 @@ function AddTravellerDialog({
|
|
|
3116
3138
|
errorMessage
|
|
3117
3139
|
}) {
|
|
3118
3140
|
var _a, _b, _c, _d, _e;
|
|
3119
|
-
const [form, setForm] =
|
|
3120
|
-
|
|
3141
|
+
const [form, setForm] = React8.useState(() => createInitialAddFormData(config));
|
|
3142
|
+
React8.useEffect(() => {
|
|
3121
3143
|
if (open) {
|
|
3122
3144
|
setForm(createInitialAddFormData(config));
|
|
3123
3145
|
}
|
|
@@ -3177,7 +3199,7 @@ function EditTravellerDialog({
|
|
|
3177
3199
|
errorMessage
|
|
3178
3200
|
}) {
|
|
3179
3201
|
var _a, _b, _c, _d, _e;
|
|
3180
|
-
const [form, setForm] =
|
|
3202
|
+
const [form, setForm] = React8.useState(() => ({
|
|
3181
3203
|
firstName: "",
|
|
3182
3204
|
lastName: "",
|
|
3183
3205
|
email: "",
|
|
@@ -3186,7 +3208,7 @@ function EditTravellerDialog({
|
|
|
3186
3208
|
birthDate: "",
|
|
3187
3209
|
personType: "ADULT"
|
|
3188
3210
|
}));
|
|
3189
|
-
|
|
3211
|
+
React8.useEffect(() => {
|
|
3190
3212
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3191
3213
|
if (open && traveller) {
|
|
3192
3214
|
setForm({
|
|
@@ -3296,6 +3318,58 @@ function DeleteTravellerDialog({
|
|
|
3296
3318
|
}
|
|
3297
3319
|
);
|
|
3298
3320
|
}
|
|
3321
|
+
function ResendInviteConfirmDialog({
|
|
3322
|
+
open,
|
|
3323
|
+
travellerName: _travellerName,
|
|
3324
|
+
onClose,
|
|
3325
|
+
onConfirm,
|
|
3326
|
+
labels,
|
|
3327
|
+
submitting
|
|
3328
|
+
}) {
|
|
3329
|
+
var _a, _b, _c, _d, _e;
|
|
3330
|
+
return /* @__PURE__ */ jsx(
|
|
3331
|
+
Dialog,
|
|
3332
|
+
{
|
|
3333
|
+
open,
|
|
3334
|
+
onOpenChange: (o) => {
|
|
3335
|
+
if (!o) onClose();
|
|
3336
|
+
},
|
|
3337
|
+
children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-sm", children: [
|
|
3338
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
3339
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: (_a = labels == null ? void 0 : labels.title) != null ? _a : "Resend registration invite?" }),
|
|
3340
|
+
/* @__PURE__ */ 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." })
|
|
3341
|
+
] }),
|
|
3342
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 rounded-lg bg-amber-500/10 border border-amber-500/30 px-3 py-2", children: [
|
|
3343
|
+
/* @__PURE__ */ jsx(AlertTriangleIcon, { className: "h-4 w-4 text-amber-600 mt-0.5 shrink-0" }),
|
|
3344
|
+
/* @__PURE__ */ 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." })
|
|
3345
|
+
] }),
|
|
3346
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
3347
|
+
/* @__PURE__ */ jsx(
|
|
3348
|
+
Button,
|
|
3349
|
+
{
|
|
3350
|
+
type: "button",
|
|
3351
|
+
variant: "outline",
|
|
3352
|
+
size: "sm",
|
|
3353
|
+
onClick: onClose,
|
|
3354
|
+
disabled: submitting,
|
|
3355
|
+
children: (_d = labels == null ? void 0 : labels.cancel) != null ? _d : "Cancel"
|
|
3356
|
+
}
|
|
3357
|
+
),
|
|
3358
|
+
/* @__PURE__ */ jsx(
|
|
3359
|
+
Button,
|
|
3360
|
+
{
|
|
3361
|
+
type: "button",
|
|
3362
|
+
size: "sm",
|
|
3363
|
+
disabled: submitting,
|
|
3364
|
+
onClick: () => void onConfirm(),
|
|
3365
|
+
children: (_e = labels == null ? void 0 : labels.confirm) != null ? _e : "Resend invite"
|
|
3366
|
+
}
|
|
3367
|
+
)
|
|
3368
|
+
] })
|
|
3369
|
+
] })
|
|
3370
|
+
}
|
|
3371
|
+
);
|
|
3372
|
+
}
|
|
3299
3373
|
function OrderSummary({
|
|
3300
3374
|
adventures,
|
|
3301
3375
|
summaryLineItems,
|
|
@@ -3444,6 +3518,9 @@ function BookingDetails({
|
|
|
3444
3518
|
onAddTraveller,
|
|
3445
3519
|
onUnassignFromAdventure,
|
|
3446
3520
|
onCopyFormLink,
|
|
3521
|
+
onResendInvite,
|
|
3522
|
+
resendingInviteTravellerIds,
|
|
3523
|
+
resendInviteAriaLabel,
|
|
3447
3524
|
onSubmitAddTraveller,
|
|
3448
3525
|
onSubmitEditTraveller,
|
|
3449
3526
|
onConfirmRemoveTraveller,
|
|
@@ -3461,43 +3538,53 @@ function BookingDetails({
|
|
|
3461
3538
|
labels,
|
|
3462
3539
|
className
|
|
3463
3540
|
}) {
|
|
3464
|
-
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;
|
|
3541
|
+
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;
|
|
3465
3542
|
const people = totalPeople(adventures);
|
|
3466
3543
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3467
3544
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3468
3545
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3469
|
-
const [addModalState, setAddModalState] =
|
|
3546
|
+
const [addModalState, setAddModalState] = React8.useState({
|
|
3470
3547
|
open: false,
|
|
3471
3548
|
adventureId: null
|
|
3472
3549
|
});
|
|
3473
|
-
const [editModalState, setEditModalState] =
|
|
3474
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3475
|
-
const
|
|
3550
|
+
const [editModalState, setEditModalState] = React8.useState({ open: false, adventureId: null, traveller: null });
|
|
3551
|
+
const [deleteModalState, setDeleteModalState] = React8.useState({ open: false, adventureId: null, traveller: null });
|
|
3552
|
+
const [resendInviteDialogState, setResendInviteDialogState] = React8.useState({ open: false, traveller: null });
|
|
3553
|
+
const handleRequestOpenAddModal = React8.useCallback((adventureId) => {
|
|
3476
3554
|
setAddModalState({ open: true, adventureId });
|
|
3477
3555
|
}, []);
|
|
3478
|
-
const handleRequestOpenEditModal =
|
|
3556
|
+
const handleRequestOpenEditModal = React8.useCallback(
|
|
3479
3557
|
(adventureId, traveller) => {
|
|
3480
3558
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3481
3559
|
},
|
|
3482
3560
|
[]
|
|
3483
3561
|
);
|
|
3484
|
-
const handleRequestOpenDeleteModal =
|
|
3562
|
+
const handleRequestOpenDeleteModal = React8.useCallback(
|
|
3485
3563
|
(adventureId, traveller) => {
|
|
3486
3564
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3487
3565
|
},
|
|
3488
3566
|
[]
|
|
3489
3567
|
);
|
|
3490
|
-
const
|
|
3568
|
+
const handleRequestOpenResendInviteDialog = React8.useCallback(
|
|
3569
|
+
(traveller) => {
|
|
3570
|
+
setResendInviteDialogState({ open: true, traveller });
|
|
3571
|
+
},
|
|
3572
|
+
[]
|
|
3573
|
+
);
|
|
3574
|
+
const closeAddModal = React8.useCallback(() => {
|
|
3491
3575
|
setAddModalState({ open: false, adventureId: null });
|
|
3492
3576
|
}, []);
|
|
3493
|
-
const closeEditModal =
|
|
3577
|
+
const closeEditModal = React8.useCallback(() => {
|
|
3494
3578
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3495
3579
|
}, []);
|
|
3496
|
-
const closeDeleteModal =
|
|
3580
|
+
const closeDeleteModal = React8.useCallback(() => {
|
|
3497
3581
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3498
3582
|
}, []);
|
|
3499
|
-
const
|
|
3500
|
-
|
|
3583
|
+
const closeResendInviteDialog = React8.useCallback(() => {
|
|
3584
|
+
setResendInviteDialogState({ open: false, traveller: null });
|
|
3585
|
+
}, []);
|
|
3586
|
+
const submitInFlightRef = React8.useRef(false);
|
|
3587
|
+
const handleAddSubmit = React8.useCallback(
|
|
3501
3588
|
async (adventureId, data) => {
|
|
3502
3589
|
if (!onSubmitAddTraveller) return;
|
|
3503
3590
|
if (submitInFlightRef.current) return;
|
|
@@ -3512,7 +3599,7 @@ function BookingDetails({
|
|
|
3512
3599
|
},
|
|
3513
3600
|
[onSubmitAddTraveller, closeAddModal]
|
|
3514
3601
|
);
|
|
3515
|
-
const handleEditSubmit =
|
|
3602
|
+
const handleEditSubmit = React8.useCallback(
|
|
3516
3603
|
async (adventureId, travellerId, data) => {
|
|
3517
3604
|
if (!onSubmitEditTraveller) return;
|
|
3518
3605
|
if (submitInFlightRef.current) return;
|
|
@@ -3527,7 +3614,7 @@ function BookingDetails({
|
|
|
3527
3614
|
},
|
|
3528
3615
|
[onSubmitEditTraveller, closeEditModal]
|
|
3529
3616
|
);
|
|
3530
|
-
const handleDeleteConfirm =
|
|
3617
|
+
const handleDeleteConfirm = React8.useCallback(
|
|
3531
3618
|
async (adventureId, travellerId) => {
|
|
3532
3619
|
if (!onConfirmRemoveTraveller) return;
|
|
3533
3620
|
if (submitInFlightRef.current) return;
|
|
@@ -3632,12 +3719,16 @@ function BookingDetails({
|
|
|
3632
3719
|
onAddTraveller,
|
|
3633
3720
|
onUnassignFromAdventure,
|
|
3634
3721
|
onCopyFormLink,
|
|
3722
|
+
onResendInvite,
|
|
3723
|
+
resendingInviteTravellerIds,
|
|
3724
|
+
resendInviteAriaLabel,
|
|
3635
3725
|
hasSubmitAddTraveller,
|
|
3636
3726
|
hasSubmitEditTraveller,
|
|
3637
3727
|
hasConfirmRemoveTraveller,
|
|
3638
3728
|
onRequestOpenAddModal: handleRequestOpenAddModal,
|
|
3639
3729
|
onRequestOpenEditModal: handleRequestOpenEditModal,
|
|
3640
3730
|
onRequestOpenDeleteModal: handleRequestOpenDeleteModal,
|
|
3731
|
+
onRequestOpenResendInviteDialog: handleRequestOpenResendInviteDialog,
|
|
3641
3732
|
cannotRemoveLastTravellerLabel,
|
|
3642
3733
|
labels
|
|
3643
3734
|
},
|
|
@@ -3770,6 +3861,23 @@ function BookingDetails({
|
|
|
3770
3861
|
saving: removeTravellerSaving,
|
|
3771
3862
|
errorMessage: deleteModalState.open ? travellerFormError : null
|
|
3772
3863
|
}
|
|
3864
|
+
),
|
|
3865
|
+
onResendInvite && /* @__PURE__ */ jsx(
|
|
3866
|
+
ResendInviteConfirmDialog,
|
|
3867
|
+
{
|
|
3868
|
+
open: resendInviteDialogState.open,
|
|
3869
|
+
travellerName: resendInviteDialogState.traveller ? `${(_G = resendInviteDialogState.traveller.firstName) != null ? _G : ""} ${(_H = resendInviteDialogState.traveller.lastName) != null ? _H : ""}`.trim() : "",
|
|
3870
|
+
onClose: closeResendInviteDialog,
|
|
3871
|
+
onConfirm: () => {
|
|
3872
|
+
const traveller = resendInviteDialogState.traveller;
|
|
3873
|
+
if (traveller) {
|
|
3874
|
+
onResendInvite(traveller.id);
|
|
3875
|
+
}
|
|
3876
|
+
closeResendInviteDialog();
|
|
3877
|
+
},
|
|
3878
|
+
labels: labels == null ? void 0 : labels.resendInviteDialog,
|
|
3879
|
+
submitting: resendInviteDialogState.traveller ? resendingInviteTravellerIds == null ? void 0 : resendingInviteTravellerIds.has(resendInviteDialogState.traveller.id) : false
|
|
3880
|
+
}
|
|
3773
3881
|
)
|
|
3774
3882
|
] });
|
|
3775
3883
|
}
|
|
@@ -4980,7 +5088,7 @@ function BookingCreatedEmail({
|
|
|
4980
5088
|
}, children: i + 1 }) }),
|
|
4981
5089
|
/* @__PURE__ */ jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
|
|
4982
5090
|
] }) }) }, i)) }),
|
|
4983
|
-
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(
|
|
5091
|
+
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(React8.Fragment, { children: [
|
|
4984
5092
|
idx === 0 ? /* @__PURE__ */ jsx("strong", { children: line }) : line,
|
|
4985
5093
|
idx < arr.length - 1 ? /* @__PURE__ */ jsx("br", {}) : null
|
|
4986
5094
|
] }, idx)) })
|
|
@@ -6349,11 +6457,11 @@ function DatePickerField({
|
|
|
6349
6457
|
fromDate,
|
|
6350
6458
|
className
|
|
6351
6459
|
}) {
|
|
6352
|
-
const [open, setOpen] =
|
|
6353
|
-
const containerRef =
|
|
6354
|
-
const [calendarWidth, setCalendarWidth] =
|
|
6460
|
+
const [open, setOpen] = React8.useState(false);
|
|
6461
|
+
const containerRef = React8.useRef(null);
|
|
6462
|
+
const [calendarWidth, setCalendarWidth] = React8.useState();
|
|
6355
6463
|
const hasValue = !!value;
|
|
6356
|
-
|
|
6464
|
+
React8.useEffect(() => {
|
|
6357
6465
|
if (!containerRef.current) return;
|
|
6358
6466
|
const observer = new ResizeObserver(([entry]) => {
|
|
6359
6467
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -6462,7 +6570,7 @@ function BookingForm({
|
|
|
6462
6570
|
subtitle = "Free enquiry \u2013 no commitment",
|
|
6463
6571
|
className
|
|
6464
6572
|
}) {
|
|
6465
|
-
const [values, setValues] =
|
|
6573
|
+
const [values, setValues] = React8.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
6466
6574
|
const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
6467
6575
|
const handleSubmit = (e) => {
|
|
6468
6576
|
e.preventDefault();
|
|
@@ -6999,11 +7107,11 @@ function FloatingTextarea({
|
|
|
6999
7107
|
}
|
|
7000
7108
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
7001
7109
|
var _a, _b, _c;
|
|
7002
|
-
const [open, setOpen] =
|
|
7003
|
-
const containerRef =
|
|
7110
|
+
const [open, setOpen] = React8.useState(false);
|
|
7111
|
+
const containerRef = React8.useRef(null);
|
|
7004
7112
|
const options = (_a = field.options) != null ? _a : [];
|
|
7005
7113
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
7006
|
-
|
|
7114
|
+
React8.useEffect(() => {
|
|
7007
7115
|
if (!open) return;
|
|
7008
7116
|
const handleOutside = (e) => {
|
|
7009
7117
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -7392,11 +7500,11 @@ function RegistrationForm({
|
|
|
7392
7500
|
readOnly = false
|
|
7393
7501
|
}) {
|
|
7394
7502
|
var _a;
|
|
7395
|
-
const L =
|
|
7503
|
+
const L = React8.useMemo(
|
|
7396
7504
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS9), labels != null ? labels : {}),
|
|
7397
7505
|
[labels]
|
|
7398
7506
|
);
|
|
7399
|
-
const sortedFields =
|
|
7507
|
+
const sortedFields = React8.useMemo(
|
|
7400
7508
|
() => [...fields].sort((a, b) => {
|
|
7401
7509
|
var _a2, _b;
|
|
7402
7510
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -7404,7 +7512,7 @@ function RegistrationForm({
|
|
|
7404
7512
|
[fields]
|
|
7405
7513
|
);
|
|
7406
7514
|
const isControlled = values !== void 0;
|
|
7407
|
-
const [internal, setInternal] =
|
|
7515
|
+
const [internal, setInternal] = React8.useState(
|
|
7408
7516
|
() => initializeValues(
|
|
7409
7517
|
sortedFields,
|
|
7410
7518
|
defaultValues != null ? defaultValues : {},
|
|
@@ -7412,9 +7520,9 @@ function RegistrationForm({
|
|
|
7412
7520
|
includeTerms
|
|
7413
7521
|
)
|
|
7414
7522
|
);
|
|
7415
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
7416
|
-
const [validationErrors, setValidationErrors] =
|
|
7417
|
-
|
|
7523
|
+
const [submitAttempted, setSubmitAttempted] = React8.useState(false);
|
|
7524
|
+
const [validationErrors, setValidationErrors] = React8.useState({});
|
|
7525
|
+
React8.useEffect(() => {
|
|
7418
7526
|
if (isControlled) return;
|
|
7419
7527
|
setInternal((prev) => {
|
|
7420
7528
|
const next = initializeValues(
|
|
@@ -7471,7 +7579,7 @@ function RegistrationForm({
|
|
|
7471
7579
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
7472
7580
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
7473
7581
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
7474
|
-
|
|
7582
|
+
React8.useEffect(() => {
|
|
7475
7583
|
if (!submitAttempted || !scrollTargetId) return;
|
|
7476
7584
|
const timer = setTimeout(() => {
|
|
7477
7585
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -7933,10 +8041,10 @@ var OTPCodeInput = ({
|
|
|
7933
8041
|
id,
|
|
7934
8042
|
required
|
|
7935
8043
|
}) => {
|
|
7936
|
-
const baseId = id != null ? id :
|
|
7937
|
-
const inputRef =
|
|
7938
|
-
const [focused, setFocused] =
|
|
7939
|
-
const digits =
|
|
8044
|
+
const baseId = id != null ? id : React8.useId();
|
|
8045
|
+
const inputRef = React8.useRef(null);
|
|
8046
|
+
const [focused, setFocused] = React8.useState(false);
|
|
8047
|
+
const digits = React8.useMemo(() => {
|
|
7940
8048
|
const arr = value.split("").slice(0, length);
|
|
7941
8049
|
while (arr.length < length) arr.push("");
|
|
7942
8050
|
return arr;
|
|
@@ -8052,7 +8160,7 @@ function Checkbox(_a) {
|
|
|
8052
8160
|
})
|
|
8053
8161
|
);
|
|
8054
8162
|
}
|
|
8055
|
-
var AccordionVariantContext =
|
|
8163
|
+
var AccordionVariantContext = React8.createContext("default");
|
|
8056
8164
|
function Accordion(_a) {
|
|
8057
8165
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
8058
8166
|
return /* @__PURE__ */ jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(
|
|
@@ -8070,7 +8178,7 @@ function Accordion(_a) {
|
|
|
8070
8178
|
}
|
|
8071
8179
|
function AccordionItem(_a) {
|
|
8072
8180
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
8073
|
-
const variant =
|
|
8181
|
+
const variant = React8.useContext(AccordionVariantContext);
|
|
8074
8182
|
return /* @__PURE__ */ jsx(
|
|
8075
8183
|
Accordion$1.Item,
|
|
8076
8184
|
__spreadValues({
|
|
@@ -8091,7 +8199,7 @@ function AccordionTrigger(_a) {
|
|
|
8091
8199
|
"className",
|
|
8092
8200
|
"children"
|
|
8093
8201
|
]);
|
|
8094
|
-
const variant =
|
|
8202
|
+
const variant = React8.useContext(AccordionVariantContext);
|
|
8095
8203
|
return /* @__PURE__ */ jsx(Accordion$1.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
|
|
8096
8204
|
Accordion$1.Trigger,
|
|
8097
8205
|
__spreadProps(__spreadValues({
|
|
@@ -8145,7 +8253,7 @@ function AccordionContent(_a) {
|
|
|
8145
8253
|
"className",
|
|
8146
8254
|
"children"
|
|
8147
8255
|
]);
|
|
8148
|
-
const variant =
|
|
8256
|
+
const variant = React8.useContext(AccordionVariantContext);
|
|
8149
8257
|
return /* @__PURE__ */ jsx(
|
|
8150
8258
|
Accordion$1.Panel,
|
|
8151
8259
|
__spreadProps(__spreadValues({
|
|
@@ -8177,7 +8285,7 @@ function FilterPanel({
|
|
|
8177
8285
|
title = "Filters",
|
|
8178
8286
|
className
|
|
8179
8287
|
}) {
|
|
8180
|
-
const [internalValue, setInternalValue] =
|
|
8288
|
+
const [internalValue, setInternalValue] = React8.useState(
|
|
8181
8289
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
8182
8290
|
);
|
|
8183
8291
|
const selected = value != null ? value : internalValue;
|
|
@@ -8276,8 +8384,8 @@ function FilterPanel({
|
|
|
8276
8384
|
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
8277
8385
|
function TrustpilotEmbed({ config }) {
|
|
8278
8386
|
var _a, _b, _c, _d, _e, _f;
|
|
8279
|
-
const ref =
|
|
8280
|
-
|
|
8387
|
+
const ref = React8.useRef(null);
|
|
8388
|
+
React8.useEffect(() => {
|
|
8281
8389
|
if (typeof document === "undefined" || !ref.current) return;
|
|
8282
8390
|
let cancelled = false;
|
|
8283
8391
|
const initWidget = () => {
|
|
@@ -8409,11 +8517,11 @@ function ItineraryModal({
|
|
|
8409
8517
|
onNext
|
|
8410
8518
|
}) {
|
|
8411
8519
|
var _a, _b, _c;
|
|
8412
|
-
const [imgIndex, setImgIndex] =
|
|
8520
|
+
const [imgIndex, setImgIndex] = React8.useState(0);
|
|
8413
8521
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
8414
8522
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
8415
8523
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
8416
|
-
|
|
8524
|
+
React8.useEffect(() => {
|
|
8417
8525
|
setImgIndex(0);
|
|
8418
8526
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
8419
8527
|
if (!stop) return null;
|
|
@@ -8540,8 +8648,8 @@ function ItineraryModal({
|
|
|
8540
8648
|
) });
|
|
8541
8649
|
}
|
|
8542
8650
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
8543
|
-
const [activeIndex, setActiveIndex] =
|
|
8544
|
-
const scrollRef =
|
|
8651
|
+
const [activeIndex, setActiveIndex] = React8.useState(null);
|
|
8652
|
+
const scrollRef = React8.useRef(null);
|
|
8545
8653
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
8546
8654
|
const scrollBy = (dir) => {
|
|
8547
8655
|
if (!scrollRef.current) return;
|
|
@@ -8633,18 +8741,18 @@ function Lightbox({
|
|
|
8633
8741
|
onClose
|
|
8634
8742
|
}) {
|
|
8635
8743
|
var _a;
|
|
8636
|
-
const [index, setIndex] =
|
|
8744
|
+
const [index, setIndex] = React8.useState(initialIndex);
|
|
8637
8745
|
const total = photos.length;
|
|
8638
8746
|
const photo = photos[index];
|
|
8639
|
-
const prev =
|
|
8747
|
+
const prev = React8.useCallback(
|
|
8640
8748
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
8641
8749
|
[total]
|
|
8642
8750
|
);
|
|
8643
|
-
const next =
|
|
8751
|
+
const next = React8.useCallback(
|
|
8644
8752
|
() => setIndex((i) => (i + 1) % total),
|
|
8645
8753
|
[total]
|
|
8646
8754
|
);
|
|
8647
|
-
|
|
8755
|
+
React8.useEffect(() => {
|
|
8648
8756
|
const onKey = (e) => {
|
|
8649
8757
|
if (e.key === "Escape") onClose();
|
|
8650
8758
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -8810,7 +8918,7 @@ function GridGallery({
|
|
|
8810
8918
|
initialVisible,
|
|
8811
8919
|
onOpen
|
|
8812
8920
|
}) {
|
|
8813
|
-
const [expanded, setExpanded] =
|
|
8921
|
+
const [expanded, setExpanded] = React8.useState(false);
|
|
8814
8922
|
const cols = gridCols(photos.length);
|
|
8815
8923
|
const hasMore = photos.length > initialVisible;
|
|
8816
8924
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -8840,7 +8948,7 @@ function MasonryGallery({
|
|
|
8840
8948
|
initialVisible,
|
|
8841
8949
|
onOpen
|
|
8842
8950
|
}) {
|
|
8843
|
-
const [expanded, setExpanded] =
|
|
8951
|
+
const [expanded, setExpanded] = React8.useState(false);
|
|
8844
8952
|
const hasMore = photos.length > initialVisible;
|
|
8845
8953
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
8846
8954
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -8913,7 +9021,7 @@ function FeaturedGallery({
|
|
|
8913
9021
|
photos,
|
|
8914
9022
|
onOpen
|
|
8915
9023
|
}) {
|
|
8916
|
-
const [expanded, setExpanded] =
|
|
9024
|
+
const [expanded, setExpanded] = React8.useState(false);
|
|
8917
9025
|
const featured = photos.slice(0, 3);
|
|
8918
9026
|
const extra = photos.slice(3);
|
|
8919
9027
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -9080,9 +9188,9 @@ function PhotoGallery({
|
|
|
9080
9188
|
onPhotoClick,
|
|
9081
9189
|
className
|
|
9082
9190
|
}) {
|
|
9083
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
9084
|
-
const [carouselIndex, setCarouselIndex] =
|
|
9085
|
-
const normalised =
|
|
9191
|
+
const [lightboxIndex, setLightboxIndex] = React8.useState(null);
|
|
9192
|
+
const [carouselIndex, setCarouselIndex] = React8.useState(0);
|
|
9193
|
+
const normalised = React8.useMemo(() => photos.map(normalise), [photos]);
|
|
9086
9194
|
const handleOpen = (index) => {
|
|
9087
9195
|
setLightboxIndex(index);
|
|
9088
9196
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
@@ -9158,7 +9266,7 @@ function ItineraryDay({
|
|
|
9158
9266
|
photoLayout = "rounded",
|
|
9159
9267
|
className
|
|
9160
9268
|
}) {
|
|
9161
|
-
const photoList =
|
|
9269
|
+
const photoList = React8.useMemo(() => normalisePhotos(photos), [photos]);
|
|
9162
9270
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
9163
9271
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
9164
9272
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsx(
|
|
@@ -9210,8 +9318,8 @@ function MenuTrip({
|
|
|
9210
9318
|
bold = true,
|
|
9211
9319
|
className
|
|
9212
9320
|
}) {
|
|
9213
|
-
const scrollRef =
|
|
9214
|
-
|
|
9321
|
+
const scrollRef = React8.useRef(null);
|
|
9322
|
+
React8.useEffect(() => {
|
|
9215
9323
|
if (!scrollRef.current || !activeSection) return;
|
|
9216
9324
|
const container = scrollRef.current;
|
|
9217
9325
|
const btn = container.querySelector(
|
|
@@ -9402,8 +9510,8 @@ function PricingTrip({
|
|
|
9402
9510
|
className
|
|
9403
9511
|
}) {
|
|
9404
9512
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
9405
|
-
const [showEstimates, setShowEstimates] =
|
|
9406
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
9513
|
+
const [showEstimates, setShowEstimates] = React8.useState(false);
|
|
9514
|
+
const [showPriceInfo, setShowPriceInfo] = React8.useState(false);
|
|
9407
9515
|
if (variant === "compact") {
|
|
9408
9516
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
9409
9517
|
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -9843,14 +9951,14 @@ function SiteHeader({
|
|
|
9843
9951
|
className
|
|
9844
9952
|
}) {
|
|
9845
9953
|
const t = VARIANT[variant];
|
|
9846
|
-
const [openMenu, setOpenMenu] =
|
|
9847
|
-
const [langOpen, setLangOpen] =
|
|
9848
|
-
const [mobileOpen, setMobileOpen] =
|
|
9849
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
9850
|
-
const [activeLang, setActiveLang] =
|
|
9954
|
+
const [openMenu, setOpenMenu] = React8.useState(null);
|
|
9955
|
+
const [langOpen, setLangOpen] = React8.useState(false);
|
|
9956
|
+
const [mobileOpen, setMobileOpen] = React8.useState(false);
|
|
9957
|
+
const [openMobileSection, setOpenMobileSection] = React8.useState(null);
|
|
9958
|
+
const [activeLang, setActiveLang] = React8.useState(currentLanguage);
|
|
9851
9959
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
9852
|
-
const menuCloseTimer =
|
|
9853
|
-
const langCloseTimer =
|
|
9960
|
+
const menuCloseTimer = React8.useRef(void 0);
|
|
9961
|
+
const langCloseTimer = React8.useRef(void 0);
|
|
9854
9962
|
const handleMenuEnter = (label) => {
|
|
9855
9963
|
clearTimeout(menuCloseTimer.current);
|
|
9856
9964
|
setOpenMenu(label);
|
|
@@ -9871,7 +9979,7 @@ function SiteHeader({
|
|
|
9871
9979
|
setOpenMenu(null);
|
|
9872
9980
|
setLangOpen(false);
|
|
9873
9981
|
};
|
|
9874
|
-
|
|
9982
|
+
React8.useEffect(() => () => {
|
|
9875
9983
|
clearTimeout(menuCloseTimer.current);
|
|
9876
9984
|
clearTimeout(langCloseTimer.current);
|
|
9877
9985
|
}, []);
|
|
@@ -10136,7 +10244,7 @@ function SiteHeader({
|
|
|
10136
10244
|
), children: [
|
|
10137
10245
|
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
10138
10246
|
const isActive = lang.code === activeLang;
|
|
10139
|
-
return /* @__PURE__ */ jsxs(
|
|
10247
|
+
return /* @__PURE__ */ jsxs(React8.Fragment, { children: [
|
|
10140
10248
|
i > 0 && /* @__PURE__ */ jsx("span", { className: cn(
|
|
10141
10249
|
"text-xs select-none",
|
|
10142
10250
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -10198,8 +10306,8 @@ function SiteHeader({
|
|
|
10198
10306
|
);
|
|
10199
10307
|
}
|
|
10200
10308
|
function ThemeToggle({ className }) {
|
|
10201
|
-
const [dark, setDark] =
|
|
10202
|
-
|
|
10309
|
+
const [dark, setDark] = React8.useState(false);
|
|
10310
|
+
React8.useEffect(() => {
|
|
10203
10311
|
const saved = localStorage.getItem("theme");
|
|
10204
10312
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
10205
10313
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -10350,7 +10458,7 @@ function TripCard({
|
|
|
10350
10458
|
);
|
|
10351
10459
|
}
|
|
10352
10460
|
function useHlsVideo(videoRef, src) {
|
|
10353
|
-
|
|
10461
|
+
React8.useEffect(() => {
|
|
10354
10462
|
if (!src || !videoRef.current) return;
|
|
10355
10463
|
const video = videoRef.current;
|
|
10356
10464
|
if (!src.includes(".m3u8")) return;
|
|
@@ -10393,11 +10501,11 @@ function TripHeader({
|
|
|
10393
10501
|
className
|
|
10394
10502
|
}) {
|
|
10395
10503
|
var _a;
|
|
10396
|
-
const [heroIndex, setHeroIndex] =
|
|
10397
|
-
const [videoReady, setVideoReady] =
|
|
10398
|
-
const videoRef =
|
|
10504
|
+
const [heroIndex, setHeroIndex] = React8.useState(0);
|
|
10505
|
+
const [videoReady, setVideoReady] = React8.useState(false);
|
|
10506
|
+
const videoRef = React8.useRef(null);
|
|
10399
10507
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
10400
|
-
const validImages =
|
|
10508
|
+
const validImages = React8.useMemo(
|
|
10401
10509
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
10402
10510
|
[images]
|
|
10403
10511
|
);
|
|
@@ -10412,7 +10520,7 @@ function TripHeader({
|
|
|
10412
10520
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
10413
10521
|
const hasMeta = !!(destination || duration);
|
|
10414
10522
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
10415
|
-
|
|
10523
|
+
React8.useEffect(() => {
|
|
10416
10524
|
if (!videoUrl) return;
|
|
10417
10525
|
const el = videoRef.current;
|
|
10418
10526
|
if (!el) return;
|
|
@@ -10554,7 +10662,7 @@ function TripHeader({
|
|
|
10554
10662
|
siteHeader ? "-mt-44" : "-mt-36"
|
|
10555
10663
|
),
|
|
10556
10664
|
children: [
|
|
10557
|
-
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(
|
|
10665
|
+
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(React8.Fragment, { children: [
|
|
10558
10666
|
i > 0 && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
10559
10667
|
/* @__PURE__ */ jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
10560
10668
|
] }, i)) }),
|
|
@@ -10670,9 +10778,9 @@ function TripPage({
|
|
|
10670
10778
|
features,
|
|
10671
10779
|
className
|
|
10672
10780
|
}) {
|
|
10673
|
-
const [activeSection, setActiveSection] =
|
|
10674
|
-
const [accordionValue, setAccordionValue] =
|
|
10675
|
-
const accordionSectionIds =
|
|
10781
|
+
const [activeSection, setActiveSection] = React8.useState("");
|
|
10782
|
+
const [accordionValue, setAccordionValue] = React8.useState([]);
|
|
10783
|
+
const accordionSectionIds = React8.useMemo(
|
|
10676
10784
|
() => /* @__PURE__ */ new Set([
|
|
10677
10785
|
"key-info",
|
|
10678
10786
|
"what-to-bring",
|
|
@@ -10685,18 +10793,18 @@ function TripPage({
|
|
|
10685
10793
|
]),
|
|
10686
10794
|
[]
|
|
10687
10795
|
);
|
|
10688
|
-
const [navFloating, setNavFloating] =
|
|
10689
|
-
const [navHidden, setNavHidden] =
|
|
10690
|
-
const [isFloating, setIsFloating] =
|
|
10691
|
-
const [sidebarPos, setSidebarPos] =
|
|
10692
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
10693
|
-
const navRef =
|
|
10694
|
-
const navSentinelRef =
|
|
10695
|
-
const sentinelRef =
|
|
10696
|
-
const sidebarPlaceholderRef =
|
|
10697
|
-
const pricingBarRef =
|
|
10698
|
-
const galleryRef =
|
|
10699
|
-
const sections =
|
|
10796
|
+
const [navFloating, setNavFloating] = React8.useState(false);
|
|
10797
|
+
const [navHidden, setNavHidden] = React8.useState(false);
|
|
10798
|
+
const [isFloating, setIsFloating] = React8.useState(false);
|
|
10799
|
+
const [sidebarPos, setSidebarPos] = React8.useState(null);
|
|
10800
|
+
const [pricingBarVisible, setPricingBarVisible] = React8.useState(false);
|
|
10801
|
+
const navRef = React8.useRef(null);
|
|
10802
|
+
const navSentinelRef = React8.useRef(null);
|
|
10803
|
+
const sentinelRef = React8.useRef(null);
|
|
10804
|
+
const sidebarPlaceholderRef = React8.useRef(null);
|
|
10805
|
+
const pricingBarRef = React8.useRef(null);
|
|
10806
|
+
const galleryRef = React8.useRef(null);
|
|
10807
|
+
const sections = React8.useMemo(
|
|
10700
10808
|
() => [
|
|
10701
10809
|
{ id: "overview", label: "Overview", show: !!(overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) },
|
|
10702
10810
|
{
|
|
@@ -10714,7 +10822,7 @@ function TripPage({
|
|
|
10714
10822
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
10715
10823
|
[]
|
|
10716
10824
|
);
|
|
10717
|
-
|
|
10825
|
+
React8.useEffect(() => {
|
|
10718
10826
|
const sentinel = navSentinelRef.current;
|
|
10719
10827
|
if (!sentinel) return;
|
|
10720
10828
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -10722,7 +10830,7 @@ function TripPage({
|
|
|
10722
10830
|
update();
|
|
10723
10831
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
10724
10832
|
}, []);
|
|
10725
|
-
|
|
10833
|
+
React8.useEffect(() => {
|
|
10726
10834
|
const sentinel = sentinelRef.current;
|
|
10727
10835
|
if (!sentinel) return;
|
|
10728
10836
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -10730,7 +10838,7 @@ function TripPage({
|
|
|
10730
10838
|
update();
|
|
10731
10839
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
10732
10840
|
}, []);
|
|
10733
|
-
|
|
10841
|
+
React8.useEffect(() => {
|
|
10734
10842
|
const measure = () => {
|
|
10735
10843
|
if (!sidebarPlaceholderRef.current) return;
|
|
10736
10844
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -10740,7 +10848,7 @@ function TripPage({
|
|
|
10740
10848
|
window.addEventListener("resize", measure);
|
|
10741
10849
|
return () => window.removeEventListener("resize", measure);
|
|
10742
10850
|
}, [isFloating]);
|
|
10743
|
-
|
|
10851
|
+
React8.useEffect(() => {
|
|
10744
10852
|
const check = () => {
|
|
10745
10853
|
var _a;
|
|
10746
10854
|
const target = (_a = galleryRef.current) != null ? _a : pricingBarRef.current;
|
|
@@ -10751,7 +10859,7 @@ function TripPage({
|
|
|
10751
10859
|
check();
|
|
10752
10860
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
10753
10861
|
}, []);
|
|
10754
|
-
|
|
10862
|
+
React8.useEffect(() => {
|
|
10755
10863
|
const check = () => {
|
|
10756
10864
|
if (!pricingBarRef.current) return;
|
|
10757
10865
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -10760,7 +10868,7 @@ function TripPage({
|
|
|
10760
10868
|
check();
|
|
10761
10869
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
10762
10870
|
}, []);
|
|
10763
|
-
|
|
10871
|
+
React8.useEffect(() => {
|
|
10764
10872
|
if (sections.length === 0) return;
|
|
10765
10873
|
setActiveSection(sections[0].id);
|
|
10766
10874
|
const update = () => {
|
|
@@ -11282,12 +11390,12 @@ function Toast({
|
|
|
11282
11390
|
duration = 6e3,
|
|
11283
11391
|
className
|
|
11284
11392
|
}) {
|
|
11285
|
-
const [mounted, setMounted] =
|
|
11286
|
-
const [visible, setVisible] =
|
|
11287
|
-
|
|
11393
|
+
const [mounted, setMounted] = React8.useState(false);
|
|
11394
|
+
const [visible, setVisible] = React8.useState(true);
|
|
11395
|
+
React8.useEffect(() => {
|
|
11288
11396
|
setMounted(true);
|
|
11289
11397
|
}, []);
|
|
11290
|
-
|
|
11398
|
+
React8.useEffect(() => {
|
|
11291
11399
|
if (duration === 0) return;
|
|
11292
11400
|
const t = setTimeout(() => {
|
|
11293
11401
|
setVisible(false);
|