@planetaexo/design-system 0.63.0 → 0.65.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 +2545 -621
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +822 -12
- package/dist/index.d.ts +822 -12
- package/dist/index.js +2499 -593
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React32 = require('react');
|
|
4
4
|
var classVarianceAuthority = require('class-variance-authority');
|
|
5
5
|
var clsx = require('clsx');
|
|
6
6
|
var tailwindMerge = require('tailwind-merge');
|
|
@@ -37,7 +37,7 @@ function _interopNamespace(e) {
|
|
|
37
37
|
return Object.freeze(n);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
var
|
|
40
|
+
var React32__namespace = /*#__PURE__*/_interopNamespace(React32);
|
|
41
41
|
|
|
42
42
|
var __defProp = Object.defineProperty;
|
|
43
43
|
var __defProps = Object.defineProperties;
|
|
@@ -102,7 +102,7 @@ var buttonVariants = classVarianceAuthority.cva(
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
);
|
|
105
|
-
var Button =
|
|
105
|
+
var Button = React32__namespace.forwardRef(
|
|
106
106
|
(_a, ref) => {
|
|
107
107
|
var _b = _a, { className, variant, size } = _b, props = __objRest(_b, ["className", "variant", "size"]);
|
|
108
108
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -331,10 +331,10 @@ function DialogDescription(_a) {
|
|
|
331
331
|
}, props)
|
|
332
332
|
);
|
|
333
333
|
}
|
|
334
|
-
var FloatingInput =
|
|
334
|
+
var FloatingInput = React32__namespace.forwardRef(
|
|
335
335
|
(_a, ref) => {
|
|
336
336
|
var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
|
|
337
|
-
const inputId = id != null ? id :
|
|
337
|
+
const inputId = id != null ? id : React32__namespace.useId();
|
|
338
338
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
|
|
339
339
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
340
340
|
"input",
|
|
@@ -374,10 +374,10 @@ var FloatingInput = React31__namespace.forwardRef(
|
|
|
374
374
|
}
|
|
375
375
|
);
|
|
376
376
|
FloatingInput.displayName = "FloatingInput";
|
|
377
|
-
var FloatingSelect =
|
|
377
|
+
var FloatingSelect = React32__namespace.forwardRef(
|
|
378
378
|
(_a, ref) => {
|
|
379
379
|
var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
|
|
380
|
-
const inputId = id != null ? id :
|
|
380
|
+
const inputId = id != null ? id : React32__namespace.useId();
|
|
381
381
|
const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
|
|
382
382
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
|
|
383
383
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -638,14 +638,15 @@ function PhoneCountrySelect({
|
|
|
638
638
|
value,
|
|
639
639
|
onChange,
|
|
640
640
|
className,
|
|
641
|
-
disabled
|
|
641
|
+
disabled,
|
|
642
|
+
showDial = true
|
|
642
643
|
}) {
|
|
643
644
|
var _a;
|
|
644
|
-
const [open, setOpen] =
|
|
645
|
-
const containerRef =
|
|
646
|
-
const listRef =
|
|
645
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
646
|
+
const containerRef = React32__namespace.useRef(null);
|
|
647
|
+
const listRef = React32__namespace.useRef(null);
|
|
647
648
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
648
|
-
|
|
649
|
+
React32__namespace.useEffect(() => {
|
|
649
650
|
if (!open) return;
|
|
650
651
|
const handler = (e) => {
|
|
651
652
|
var _a2;
|
|
@@ -656,7 +657,7 @@ function PhoneCountrySelect({
|
|
|
656
657
|
document.addEventListener("mousedown", handler);
|
|
657
658
|
return () => document.removeEventListener("mousedown", handler);
|
|
658
659
|
}, [open]);
|
|
659
|
-
|
|
660
|
+
React32__namespace.useEffect(() => {
|
|
660
661
|
if (!open || !listRef.current) return;
|
|
661
662
|
const activeEl = listRef.current.querySelector("[data-selected=true]");
|
|
662
663
|
activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
|
|
@@ -687,7 +688,7 @@ function PhoneCountrySelect({
|
|
|
687
688
|
),
|
|
688
689
|
children: [
|
|
689
690
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-base leading-none", children: selected.flag }),
|
|
690
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: selected.dial }),
|
|
691
|
+
showDial && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: selected.dial }),
|
|
691
692
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
692
693
|
lucideReact.ChevronDownIcon,
|
|
693
694
|
{
|
|
@@ -926,8 +927,8 @@ function CalendarDayButton(_a) {
|
|
|
926
927
|
"locale"
|
|
927
928
|
]);
|
|
928
929
|
const defaultClassNames = reactDayPicker.getDefaultClassNames();
|
|
929
|
-
const ref =
|
|
930
|
-
|
|
930
|
+
const ref = React32__namespace.useRef(null);
|
|
931
|
+
React32__namespace.useEffect(() => {
|
|
931
932
|
var _a2;
|
|
932
933
|
if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
|
|
933
934
|
}, [modifiers.focused]);
|
|
@@ -958,16 +959,16 @@ function BirthDateField({
|
|
|
958
959
|
className,
|
|
959
960
|
disabled
|
|
960
961
|
}) {
|
|
961
|
-
const [open, setOpen] =
|
|
962
|
-
const [text, setText] =
|
|
962
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
963
|
+
const [text, setText] = React32__namespace.useState(
|
|
963
964
|
value ? dateFns.format(value, "dd/MM/yyyy") : ""
|
|
964
965
|
);
|
|
965
|
-
const containerRef =
|
|
966
|
-
const inputId =
|
|
967
|
-
|
|
966
|
+
const containerRef = React32__namespace.useRef(null);
|
|
967
|
+
const inputId = React32__namespace.useId();
|
|
968
|
+
React32__namespace.useEffect(() => {
|
|
968
969
|
setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
|
|
969
970
|
}, [value]);
|
|
970
|
-
|
|
971
|
+
React32__namespace.useEffect(() => {
|
|
971
972
|
if (!open) return;
|
|
972
973
|
const handler = (e) => {
|
|
973
974
|
var _a;
|
|
@@ -1176,14 +1177,14 @@ function CountrySearchField({
|
|
|
1176
1177
|
}) {
|
|
1177
1178
|
var _a;
|
|
1178
1179
|
const list = countries != null ? countries : COUNTRIES;
|
|
1179
|
-
const [query, setQuery] =
|
|
1180
|
-
const [open, setOpen] =
|
|
1181
|
-
const containerRef =
|
|
1182
|
-
const searchRef =
|
|
1180
|
+
const [query, setQuery] = React32__namespace.useState("");
|
|
1181
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
1182
|
+
const containerRef = React32__namespace.useRef(null);
|
|
1183
|
+
const searchRef = React32__namespace.useRef(null);
|
|
1183
1184
|
const selected = list.find((c) => c.code === value);
|
|
1184
1185
|
const isFloated = open || !!selected;
|
|
1185
1186
|
const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
|
|
1186
|
-
|
|
1187
|
+
React32__namespace.useEffect(() => {
|
|
1187
1188
|
if (!open) return;
|
|
1188
1189
|
const handler = (e) => {
|
|
1189
1190
|
var _a2;
|
|
@@ -1328,10 +1329,10 @@ function AdventureCard({
|
|
|
1328
1329
|
}) {
|
|
1329
1330
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
1330
1331
|
const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
|
|
1331
|
-
const [checkedInternal, setCheckedInternal] =
|
|
1332
|
+
const [checkedInternal, setCheckedInternal] = React32__namespace.useState(
|
|
1332
1333
|
new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
|
|
1333
1334
|
);
|
|
1334
|
-
const [openDescriptionId, setOpenDescriptionId] =
|
|
1335
|
+
const [openDescriptionId, setOpenDescriptionId] = React32__namespace.useState(null);
|
|
1335
1336
|
const openDescriptionOptional = openDescriptionId ? (_e = adventure.optionals) == null ? void 0 : _e.find((o) => o.id === openDescriptionId) : void 0;
|
|
1336
1337
|
const isChecked = (opt) => {
|
|
1337
1338
|
var _a2;
|
|
@@ -1787,7 +1788,7 @@ function BookingShell({
|
|
|
1787
1788
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1788
1789
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
|
|
1789
1790
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
|
|
1790
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1791
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
1791
1792
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1792
1793
|
"span",
|
|
1793
1794
|
{
|
|
@@ -1986,7 +1987,7 @@ function TermsSection({
|
|
|
1986
1987
|
termsContent
|
|
1987
1988
|
}) {
|
|
1988
1989
|
var _a;
|
|
1989
|
-
const [modalOpen, setModalOpen] =
|
|
1990
|
+
const [modalOpen, setModalOpen] = React32__namespace.useState(false);
|
|
1990
1991
|
const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
|
|
1991
1992
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
|
|
1992
1993
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
|
|
@@ -2124,9 +2125,9 @@ function BookingWizard({
|
|
|
2124
2125
|
}) {
|
|
2125
2126
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T;
|
|
2126
2127
|
const wizardSteps = WIZARD_STEPS_FN(labels);
|
|
2127
|
-
const [step, setStep] =
|
|
2128
|
-
const [error, setError] =
|
|
2129
|
-
const [responsible, setResponsible] =
|
|
2128
|
+
const [step, setStep] = React32__namespace.useState("responsible");
|
|
2129
|
+
const [error, setError] = React32__namespace.useState(null);
|
|
2130
|
+
const [responsible, setResponsible] = React32__namespace.useState({
|
|
2130
2131
|
firstName: "",
|
|
2131
2132
|
lastName: "",
|
|
2132
2133
|
email: "",
|
|
@@ -2145,7 +2146,7 @@ function BookingWizard({
|
|
|
2145
2146
|
return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
|
|
2146
2147
|
}, 0);
|
|
2147
2148
|
const totalPax = totalAdults + totalChildren;
|
|
2148
|
-
const [travellers, setTravellers] =
|
|
2149
|
+
const [travellers, setTravellers] = React32__namespace.useState(
|
|
2149
2150
|
Array.from({ length: Math.max(totalPax, 1) }, () => ({
|
|
2150
2151
|
firstName: "",
|
|
2151
2152
|
lastName: "",
|
|
@@ -2153,9 +2154,9 @@ function BookingWizard({
|
|
|
2153
2154
|
email: ""
|
|
2154
2155
|
}))
|
|
2155
2156
|
);
|
|
2156
|
-
const [payAmount, setPayAmount] =
|
|
2157
|
-
const [payMethod, setPayMethod] =
|
|
2158
|
-
const [termsAccepted, setTermsAccepted] =
|
|
2157
|
+
const [payAmount, setPayAmount] = React32__namespace.useState("full");
|
|
2158
|
+
const [payMethod, setPayMethod] = React32__namespace.useState("stripe");
|
|
2159
|
+
const [termsAccepted, setTermsAccepted] = React32__namespace.useState(false);
|
|
2159
2160
|
const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
2160
2161
|
const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
|
|
2161
2162
|
const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
|
|
@@ -2383,7 +2384,7 @@ function Offer({
|
|
|
2383
2384
|
className
|
|
2384
2385
|
}) {
|
|
2385
2386
|
var _a, _b, _c;
|
|
2386
|
-
const [showBooking, setShowBooking] =
|
|
2387
|
+
const [showBooking, setShowBooking] = React32__namespace.useState(false);
|
|
2387
2388
|
const isShowingCheckout = !confirmedState && (!!checkoutSlot || internalDemoCheckout && showBooking);
|
|
2388
2389
|
const handleBook = () => {
|
|
2389
2390
|
if (!checkoutSlot && !externalBookingFlow && internalDemoCheckout) {
|
|
@@ -2750,7 +2751,7 @@ function AdventureSection({
|
|
|
2750
2751
|
labels
|
|
2751
2752
|
}) {
|
|
2752
2753
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
2753
|
-
const [detailsOpen, setDetailsOpen] =
|
|
2754
|
+
const [detailsOpen, setDetailsOpen] = React32__namespace.useState(false);
|
|
2754
2755
|
const handleCopyUrl = (url) => {
|
|
2755
2756
|
if (onCopyFormLink) {
|
|
2756
2757
|
onCopyFormLink(url);
|
|
@@ -3289,8 +3290,8 @@ function AddTravellerDialog({
|
|
|
3289
3290
|
errorMessage
|
|
3290
3291
|
}) {
|
|
3291
3292
|
var _a, _b, _c, _d, _e;
|
|
3292
|
-
const [form, setForm] =
|
|
3293
|
-
|
|
3293
|
+
const [form, setForm] = React32__namespace.useState(() => createInitialAddFormData(config));
|
|
3294
|
+
React32__namespace.useEffect(() => {
|
|
3294
3295
|
if (open) {
|
|
3295
3296
|
setForm(createInitialAddFormData(config));
|
|
3296
3297
|
}
|
|
@@ -3350,7 +3351,7 @@ function EditTravellerDialog({
|
|
|
3350
3351
|
errorMessage
|
|
3351
3352
|
}) {
|
|
3352
3353
|
var _a, _b, _c, _d, _e;
|
|
3353
|
-
const [form, setForm] =
|
|
3354
|
+
const [form, setForm] = React32__namespace.useState(() => ({
|
|
3354
3355
|
firstName: "",
|
|
3355
3356
|
lastName: "",
|
|
3356
3357
|
email: "",
|
|
@@ -3359,7 +3360,7 @@ function EditTravellerDialog({
|
|
|
3359
3360
|
birthDate: "",
|
|
3360
3361
|
personType: "ADULT"
|
|
3361
3362
|
}));
|
|
3362
|
-
|
|
3363
|
+
React32__namespace.useEffect(() => {
|
|
3363
3364
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3364
3365
|
if (open && traveller) {
|
|
3365
3366
|
setForm({
|
|
@@ -3695,48 +3696,48 @@ function BookingDetails({
|
|
|
3695
3696
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3696
3697
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3697
3698
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3698
|
-
const [addModalState, setAddModalState] =
|
|
3699
|
+
const [addModalState, setAddModalState] = React32__namespace.useState({
|
|
3699
3700
|
open: false,
|
|
3700
3701
|
adventureId: null
|
|
3701
3702
|
});
|
|
3702
|
-
const [editModalState, setEditModalState] =
|
|
3703
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3704
|
-
const [resendInviteDialogState, setResendInviteDialogState] =
|
|
3705
|
-
const handleRequestOpenAddModal =
|
|
3703
|
+
const [editModalState, setEditModalState] = React32__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3704
|
+
const [deleteModalState, setDeleteModalState] = React32__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3705
|
+
const [resendInviteDialogState, setResendInviteDialogState] = React32__namespace.useState({ open: false, traveller: null });
|
|
3706
|
+
const handleRequestOpenAddModal = React32__namespace.useCallback((adventureId) => {
|
|
3706
3707
|
setAddModalState({ open: true, adventureId });
|
|
3707
3708
|
}, []);
|
|
3708
|
-
const handleRequestOpenEditModal =
|
|
3709
|
+
const handleRequestOpenEditModal = React32__namespace.useCallback(
|
|
3709
3710
|
(adventureId, traveller) => {
|
|
3710
3711
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3711
3712
|
},
|
|
3712
3713
|
[]
|
|
3713
3714
|
);
|
|
3714
|
-
const handleRequestOpenDeleteModal =
|
|
3715
|
+
const handleRequestOpenDeleteModal = React32__namespace.useCallback(
|
|
3715
3716
|
(adventureId, traveller) => {
|
|
3716
3717
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3717
3718
|
},
|
|
3718
3719
|
[]
|
|
3719
3720
|
);
|
|
3720
|
-
const handleRequestOpenResendInviteDialog =
|
|
3721
|
+
const handleRequestOpenResendInviteDialog = React32__namespace.useCallback(
|
|
3721
3722
|
(traveller) => {
|
|
3722
3723
|
setResendInviteDialogState({ open: true, traveller });
|
|
3723
3724
|
},
|
|
3724
3725
|
[]
|
|
3725
3726
|
);
|
|
3726
|
-
const closeAddModal =
|
|
3727
|
+
const closeAddModal = React32__namespace.useCallback(() => {
|
|
3727
3728
|
setAddModalState({ open: false, adventureId: null });
|
|
3728
3729
|
}, []);
|
|
3729
|
-
const closeEditModal =
|
|
3730
|
+
const closeEditModal = React32__namespace.useCallback(() => {
|
|
3730
3731
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3731
3732
|
}, []);
|
|
3732
|
-
const closeDeleteModal =
|
|
3733
|
+
const closeDeleteModal = React32__namespace.useCallback(() => {
|
|
3733
3734
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3734
3735
|
}, []);
|
|
3735
|
-
const closeResendInviteDialog =
|
|
3736
|
+
const closeResendInviteDialog = React32__namespace.useCallback(() => {
|
|
3736
3737
|
setResendInviteDialogState({ open: false, traveller: null });
|
|
3737
3738
|
}, []);
|
|
3738
|
-
const submitInFlightRef =
|
|
3739
|
-
const handleAddSubmit =
|
|
3739
|
+
const submitInFlightRef = React32__namespace.useRef(false);
|
|
3740
|
+
const handleAddSubmit = React32__namespace.useCallback(
|
|
3740
3741
|
async (adventureId, data) => {
|
|
3741
3742
|
if (!onSubmitAddTraveller) return;
|
|
3742
3743
|
if (submitInFlightRef.current) return;
|
|
@@ -3751,7 +3752,7 @@ function BookingDetails({
|
|
|
3751
3752
|
},
|
|
3752
3753
|
[onSubmitAddTraveller, closeAddModal]
|
|
3753
3754
|
);
|
|
3754
|
-
const handleEditSubmit =
|
|
3755
|
+
const handleEditSubmit = React32__namespace.useCallback(
|
|
3755
3756
|
async (adventureId, travellerId, data) => {
|
|
3756
3757
|
if (!onSubmitEditTraveller) return;
|
|
3757
3758
|
if (submitInFlightRef.current) return;
|
|
@@ -3766,7 +3767,7 @@ function BookingDetails({
|
|
|
3766
3767
|
},
|
|
3767
3768
|
[onSubmitEditTraveller, closeEditModal]
|
|
3768
3769
|
);
|
|
3769
|
-
const handleDeleteConfirm =
|
|
3770
|
+
const handleDeleteConfirm = React32__namespace.useCallback(
|
|
3770
3771
|
async (adventureId, travellerId) => {
|
|
3771
3772
|
if (!onConfirmRemoveTraveller) return;
|
|
3772
3773
|
if (submitInFlightRef.current) return;
|
|
@@ -5563,7 +5564,7 @@ function BookingCreatedEmail({
|
|
|
5563
5564
|
}, children: i + 1 }) }),
|
|
5564
5565
|
/* @__PURE__ */ jsxRuntime.jsx("td", { style: { verticalAlign: "top" }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "14px", color: emailTokens.bodyText, lineHeight: "1.6", margin: 0 }, children: step }) })
|
|
5565
5566
|
] }) }) }, i)) }),
|
|
5566
|
-
nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5567
|
+
nextStepsImportant && nextStepsImportant.trim().length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginBottom: "32px", fontSize: "14px", color: emailTokens.foreground, lineHeight: "1.6" }, children: nextStepsImportant.split("\n").map((line, idx, arr) => /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
5567
5568
|
idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
|
|
5568
5569
|
idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
|
|
5569
5570
|
] }, idx)) })
|
|
@@ -7930,13 +7931,14 @@ function DatePickerField({
|
|
|
7930
7931
|
placeholder = "Select a date",
|
|
7931
7932
|
disabled,
|
|
7932
7933
|
fromDate,
|
|
7933
|
-
className
|
|
7934
|
+
className,
|
|
7935
|
+
error
|
|
7934
7936
|
}) {
|
|
7935
|
-
const [open, setOpen] =
|
|
7936
|
-
const containerRef =
|
|
7937
|
-
const [calendarWidth, setCalendarWidth] =
|
|
7937
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
7938
|
+
const containerRef = React32__namespace.useRef(null);
|
|
7939
|
+
const [calendarWidth, setCalendarWidth] = React32__namespace.useState();
|
|
7938
7940
|
const hasValue = !!value;
|
|
7939
|
-
|
|
7941
|
+
React32__namespace.useEffect(() => {
|
|
7940
7942
|
if (!containerRef.current) return;
|
|
7941
7943
|
const observer = new ResizeObserver(([entry]) => {
|
|
7942
7944
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -7944,78 +7946,91 @@ function DatePickerField({
|
|
|
7944
7946
|
observer.observe(containerRef.current);
|
|
7945
7947
|
return () => observer.disconnect();
|
|
7946
7948
|
}, []);
|
|
7947
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
7948
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7949
|
-
|
|
7950
|
-
|
|
7951
|
-
|
|
7952
|
-
|
|
7953
|
-
|
|
7954
|
-
|
|
7955
|
-
|
|
7956
|
-
|
|
7957
|
-
|
|
7958
|
-
|
|
7959
|
-
|
|
7960
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7961
|
-
"span",
|
|
7962
|
-
{
|
|
7963
|
-
className: cn(
|
|
7964
|
-
"pointer-events-none absolute left-3 transition-all duration-150 font-ui",
|
|
7965
|
-
hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
|
|
7966
|
-
),
|
|
7967
|
-
children: [
|
|
7968
|
-
label,
|
|
7969
|
-
required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
|
|
7970
|
-
]
|
|
7971
|
-
}
|
|
7949
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: cn("w-full", className), children: [
|
|
7950
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
|
|
7951
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7952
|
+
PopoverTrigger,
|
|
7953
|
+
{
|
|
7954
|
+
disabled,
|
|
7955
|
+
className: cn(
|
|
7956
|
+
"relative flex w-full items-center rounded-lg border border-border bg-background",
|
|
7957
|
+
"px-3 text-left text-base font-ui transition-colors h-14",
|
|
7958
|
+
"focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
|
|
7959
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
7960
|
+
open && "border-primary ring-1 ring-primary",
|
|
7961
|
+
error && "border-destructive focus:border-destructive focus:ring-destructive"
|
|
7972
7962
|
),
|
|
7973
|
-
|
|
7974
|
-
|
|
7963
|
+
children: [
|
|
7964
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7965
|
+
"span",
|
|
7966
|
+
{
|
|
7967
|
+
className: cn(
|
|
7968
|
+
"pointer-events-none absolute left-3 transition-all duration-150 font-ui",
|
|
7969
|
+
hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
|
|
7970
|
+
),
|
|
7971
|
+
children: [
|
|
7972
|
+
label,
|
|
7973
|
+
required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
|
|
7974
|
+
]
|
|
7975
|
+
}
|
|
7976
|
+
),
|
|
7977
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7978
|
+
"span",
|
|
7979
|
+
{
|
|
7980
|
+
className: cn(
|
|
7981
|
+
"flex-1 truncate mt-3",
|
|
7982
|
+
hasValue ? "text-foreground" : "invisible"
|
|
7983
|
+
),
|
|
7984
|
+
children: hasValue ? dateFns.format(value, "dd MMM yyyy") : placeholder
|
|
7985
|
+
}
|
|
7986
|
+
),
|
|
7987
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
|
|
7988
|
+
]
|
|
7989
|
+
}
|
|
7990
|
+
),
|
|
7991
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7992
|
+
PopoverContent,
|
|
7993
|
+
{
|
|
7994
|
+
className: "p-0",
|
|
7995
|
+
align: "start",
|
|
7996
|
+
style: calendarWidth ? { width: calendarWidth } : void 0,
|
|
7997
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7998
|
+
Calendar,
|
|
7975
7999
|
{
|
|
7976
|
-
|
|
7977
|
-
|
|
7978
|
-
|
|
7979
|
-
|
|
7980
|
-
|
|
8000
|
+
mode: "single",
|
|
8001
|
+
selected: value,
|
|
8002
|
+
onSelect: (date) => {
|
|
8003
|
+
onChange == null ? void 0 : onChange(date);
|
|
8004
|
+
setOpen(false);
|
|
8005
|
+
},
|
|
8006
|
+
fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
|
|
8007
|
+
className: "font-ui w-full",
|
|
8008
|
+
autoFocus: true
|
|
7981
8009
|
}
|
|
7982
|
-
)
|
|
7983
|
-
|
|
7984
|
-
|
|
7985
|
-
|
|
7986
|
-
)
|
|
7987
|
-
|
|
7988
|
-
|
|
7989
|
-
|
|
7990
|
-
|
|
7991
|
-
|
|
7992
|
-
style: calendarWidth ? { width: calendarWidth } : void 0,
|
|
7993
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7994
|
-
Calendar,
|
|
7995
|
-
{
|
|
7996
|
-
mode: "single",
|
|
7997
|
-
selected: value,
|
|
7998
|
-
onSelect: (date) => {
|
|
7999
|
-
onChange == null ? void 0 : onChange(date);
|
|
8000
|
-
setOpen(false);
|
|
8001
|
-
},
|
|
8002
|
-
fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
|
|
8003
|
-
className: "font-ui w-full",
|
|
8004
|
-
autoFocus: true
|
|
8005
|
-
}
|
|
8006
|
-
)
|
|
8007
|
-
}
|
|
8008
|
-
)
|
|
8009
|
-
] }) });
|
|
8010
|
+
)
|
|
8011
|
+
}
|
|
8012
|
+
)
|
|
8013
|
+
] }),
|
|
8014
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: error })
|
|
8015
|
+
] });
|
|
8016
|
+
}
|
|
8017
|
+
function dialFor(iso) {
|
|
8018
|
+
var _a, _b;
|
|
8019
|
+
return (_b = (_a = PHONE_COUNTRIES.find((c) => c.code === iso)) == null ? void 0 : _a.dial) != null ? _b : "";
|
|
8010
8020
|
}
|
|
8021
|
+
var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
8011
8022
|
function FormSection({
|
|
8012
8023
|
title,
|
|
8024
|
+
required,
|
|
8013
8025
|
children,
|
|
8014
8026
|
className
|
|
8015
8027
|
}) {
|
|
8016
8028
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-5", className), children: [
|
|
8017
8029
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
|
|
8018
|
-
/* @__PURE__ */ jsxRuntime.
|
|
8030
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: [
|
|
8031
|
+
title,
|
|
8032
|
+
required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
|
|
8033
|
+
] }),
|
|
8019
8034
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px flex-1 bg-border" })
|
|
8020
8035
|
] }),
|
|
8021
8036
|
children
|
|
@@ -8031,24 +8046,67 @@ var defaultInitial = {
|
|
|
8031
8046
|
phoneCountry: "BR",
|
|
8032
8047
|
lastName: "",
|
|
8033
8048
|
firstName: "",
|
|
8034
|
-
country: "
|
|
8049
|
+
country: "",
|
|
8035
8050
|
phone: "",
|
|
8036
|
-
email: ""
|
|
8051
|
+
email: "",
|
|
8052
|
+
contactVia: "Email"
|
|
8037
8053
|
};
|
|
8038
8054
|
function BookingForm({
|
|
8039
8055
|
defaultValues,
|
|
8040
8056
|
onSubmit,
|
|
8041
|
-
submitLabel
|
|
8057
|
+
submitLabel,
|
|
8042
8058
|
loading = false,
|
|
8043
8059
|
showHeader = true,
|
|
8044
|
-
title
|
|
8045
|
-
subtitle
|
|
8060
|
+
title,
|
|
8061
|
+
subtitle,
|
|
8062
|
+
labels,
|
|
8046
8063
|
className
|
|
8047
8064
|
}) {
|
|
8048
|
-
|
|
8049
|
-
const
|
|
8065
|
+
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;
|
|
8066
|
+
const L = labels != null ? labels : {};
|
|
8067
|
+
const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
|
|
8068
|
+
const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
|
|
8069
|
+
const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
|
|
8070
|
+
const [values, setValues] = React32__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
8071
|
+
const [errors, setErrors] = React32__namespace.useState({});
|
|
8072
|
+
const set = (key, value) => {
|
|
8073
|
+
setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
8074
|
+
setErrors(
|
|
8075
|
+
(prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
|
|
8076
|
+
);
|
|
8077
|
+
};
|
|
8078
|
+
React32__namespace.useEffect(() => {
|
|
8079
|
+
if (!defaultValues) return;
|
|
8080
|
+
setValues((prev) => {
|
|
8081
|
+
let changed = false;
|
|
8082
|
+
const next = __spreadValues({}, prev);
|
|
8083
|
+
Object.keys(defaultValues).forEach(
|
|
8084
|
+
(k) => {
|
|
8085
|
+
const incoming = defaultValues[k];
|
|
8086
|
+
if (incoming === void 0 || incoming === "") return;
|
|
8087
|
+
if (prev[k] === defaultInitial[k]) {
|
|
8088
|
+
next[k] = incoming;
|
|
8089
|
+
changed = true;
|
|
8090
|
+
}
|
|
8091
|
+
}
|
|
8092
|
+
);
|
|
8093
|
+
return changed ? next : prev;
|
|
8094
|
+
});
|
|
8095
|
+
}, [defaultValues]);
|
|
8096
|
+
const reqMsg = (_d = L.errorRequired) != null ? _d : "This field is required";
|
|
8097
|
+
const emailMsg = (_e = L.errorEmail) != null ? _e : "Enter a valid email address";
|
|
8050
8098
|
const handleSubmit = (e) => {
|
|
8051
8099
|
e.preventDefault();
|
|
8100
|
+
const next = {};
|
|
8101
|
+
if (!values.firstName.trim()) next.firstName = reqMsg;
|
|
8102
|
+
if (!values.lastName.trim()) next.lastName = reqMsg;
|
|
8103
|
+
if (!values.email.trim()) next.email = reqMsg;
|
|
8104
|
+
else if (!EMAIL_RE.test(values.email.trim())) next.email = emailMsg;
|
|
8105
|
+
if (!values.travelDate) next.travelDate = reqMsg;
|
|
8106
|
+
if (!values.phone.trim()) next.phone = reqMsg;
|
|
8107
|
+
if (!values.contactVia) next.contactVia = reqMsg;
|
|
8108
|
+
setErrors(next);
|
|
8109
|
+
if (Object.keys(next).length > 0) return;
|
|
8052
8110
|
onSubmit == null ? void 0 : onSubmit(values);
|
|
8053
8111
|
};
|
|
8054
8112
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -8059,15 +8117,14 @@ function BookingForm({
|
|
|
8059
8117
|
noValidate: true,
|
|
8060
8118
|
children: [
|
|
8061
8119
|
showHeader && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
8062
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children:
|
|
8063
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children:
|
|
8120
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: titleText }),
|
|
8121
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitleText })
|
|
8064
8122
|
] }),
|
|
8065
|
-
/* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Who's joining the adventure?", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
|
|
8123
|
+
/* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_f = L.travelersSection) != null ? _f : "Who's joining the adventure?", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
|
|
8066
8124
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8067
8125
|
CounterField,
|
|
8068
8126
|
{
|
|
8069
|
-
label: "Adults",
|
|
8070
|
-
required: true,
|
|
8127
|
+
label: (_g = L.adults) != null ? _g : "Adults",
|
|
8071
8128
|
value: values.adults,
|
|
8072
8129
|
min: 1,
|
|
8073
8130
|
onChange: (v) => set("adults", v)
|
|
@@ -8076,30 +8133,30 @@ function BookingForm({
|
|
|
8076
8133
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8077
8134
|
CounterField,
|
|
8078
8135
|
{
|
|
8079
|
-
label: "Children",
|
|
8080
|
-
sublabel: "(under 12)",
|
|
8136
|
+
label: (_h = L.children) != null ? _h : "Children",
|
|
8137
|
+
sublabel: (_i = L.childrenSublabel) != null ? _i : "(under 12)",
|
|
8081
8138
|
value: values.children,
|
|
8082
8139
|
min: 0,
|
|
8083
8140
|
onChange: (v) => set("children", v)
|
|
8084
8141
|
}
|
|
8085
8142
|
)
|
|
8086
8143
|
] }) }),
|
|
8087
|
-
/* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Your next trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
|
|
8144
|
+
/* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_j = L.tripSection) != null ? _j : "Your next trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
|
|
8088
8145
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8089
8146
|
DatePickerField,
|
|
8090
8147
|
{
|
|
8091
|
-
label: "Travel date",
|
|
8148
|
+
label: (_k = L.travelDate) != null ? _k : "Travel date",
|
|
8092
8149
|
required: true,
|
|
8093
8150
|
value: values.travelDate,
|
|
8094
8151
|
onChange: (d) => set("travelDate", d),
|
|
8095
|
-
placeholder: "Pick a date"
|
|
8152
|
+
placeholder: (_l = L.pickDate) != null ? _l : "Pick a date",
|
|
8153
|
+
error: errors.travelDate
|
|
8096
8154
|
}
|
|
8097
8155
|
),
|
|
8098
8156
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8099
8157
|
FloatingInput,
|
|
8100
8158
|
{
|
|
8101
|
-
label: "Budget (per person)",
|
|
8102
|
-
required: true,
|
|
8159
|
+
label: (_m = L.budget) != null ? _m : "Budget (per person)",
|
|
8103
8160
|
type: "number",
|
|
8104
8161
|
min: 0,
|
|
8105
8162
|
value: values.budget,
|
|
@@ -8107,7 +8164,7 @@ function BookingForm({
|
|
|
8107
8164
|
}
|
|
8108
8165
|
)
|
|
8109
8166
|
] }) }),
|
|
8110
|
-
/* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Tell us about your trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
|
|
8167
|
+
/* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_n = L.projectSection) != null ? _n : "Tell us about your trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
|
|
8111
8168
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8112
8169
|
"textarea",
|
|
8113
8170
|
{
|
|
@@ -8135,140 +8192,184 @@ function BookingForm({
|
|
|
8135
8192
|
"peer-not-placeholder-shown:top-2 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
|
|
8136
8193
|
),
|
|
8137
8194
|
children: [
|
|
8138
|
-
"Your trip in a few words",
|
|
8195
|
+
(_o = L.projectLabel) != null ? _o : "Your trip in a few words",
|
|
8139
8196
|
" ",
|
|
8140
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })
|
|
8197
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground font-normal", children: (_p = L.optional) != null ? _p : "(optional)" })
|
|
8141
8198
|
]
|
|
8142
8199
|
}
|
|
8143
8200
|
)
|
|
8144
8201
|
] }) }),
|
|
8145
|
-
/* @__PURE__ */ jsxRuntime.jsxs(FormSection, { title: "Contact details", children: [
|
|
8202
|
+
/* @__PURE__ */ jsxRuntime.jsxs(FormSection, { title: (_q = L.contactSection) != null ? _q : "Contact details", children: [
|
|
8146
8203
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8147
8204
|
"div",
|
|
8148
8205
|
{
|
|
8149
8206
|
role: "radiogroup",
|
|
8150
|
-
"aria-label": "Title",
|
|
8207
|
+
"aria-label": (_r = L.titleAria) != null ? _r : "Title",
|
|
8151
8208
|
className: "flex flex-wrap items-center gap-x-6 gap-y-3",
|
|
8152
|
-
children: ["ms", "mr"].map((c) =>
|
|
8153
|
-
|
|
8154
|
-
|
|
8155
|
-
|
|
8156
|
-
|
|
8157
|
-
|
|
8158
|
-
|
|
8159
|
-
|
|
8160
|
-
|
|
8161
|
-
|
|
8162
|
-
|
|
8163
|
-
|
|
8164
|
-
|
|
8165
|
-
|
|
8166
|
-
|
|
8167
|
-
|
|
8168
|
-
|
|
8169
|
-
|
|
8170
|
-
|
|
8171
|
-
|
|
8172
|
-
|
|
8209
|
+
children: ["ms", "mr"].map((c) => {
|
|
8210
|
+
var _a2, _b2;
|
|
8211
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8212
|
+
"label",
|
|
8213
|
+
{
|
|
8214
|
+
className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
|
|
8215
|
+
children: [
|
|
8216
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8217
|
+
"input",
|
|
8218
|
+
{
|
|
8219
|
+
type: "radio",
|
|
8220
|
+
name: "civility",
|
|
8221
|
+
value: c,
|
|
8222
|
+
checked: values.civility === c,
|
|
8223
|
+
onChange: () => set("civility", c),
|
|
8224
|
+
className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
|
|
8225
|
+
}
|
|
8226
|
+
),
|
|
8227
|
+
c === "ms" ? (_a2 = L.ms) != null ? _a2 : "Ms." : (_b2 = L.mr) != null ? _b2 : "Mr."
|
|
8228
|
+
]
|
|
8229
|
+
},
|
|
8230
|
+
c
|
|
8231
|
+
);
|
|
8232
|
+
})
|
|
8173
8233
|
}
|
|
8174
8234
|
),
|
|
8175
8235
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 min-w-0", children: [
|
|
8176
8236
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8177
8237
|
FloatingInput,
|
|
8178
8238
|
{
|
|
8179
|
-
label: "Last name",
|
|
8239
|
+
label: (_s = L.lastName) != null ? _s : "Last name",
|
|
8180
8240
|
required: true,
|
|
8181
8241
|
value: values.lastName,
|
|
8182
|
-
onChange: (e) => set("lastName", e.target.value)
|
|
8242
|
+
onChange: (e) => set("lastName", e.target.value),
|
|
8243
|
+
error: errors.lastName
|
|
8183
8244
|
}
|
|
8184
8245
|
) }),
|
|
8185
8246
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8186
8247
|
FloatingInput,
|
|
8187
8248
|
{
|
|
8188
|
-
label: "First name",
|
|
8249
|
+
label: (_t = L.firstName) != null ? _t : "First name",
|
|
8189
8250
|
required: true,
|
|
8190
8251
|
value: values.firstName,
|
|
8191
|
-
onChange: (e) => set("firstName", e.target.value)
|
|
8252
|
+
onChange: (e) => set("firstName", e.target.value),
|
|
8253
|
+
error: errors.firstName
|
|
8192
8254
|
}
|
|
8193
8255
|
) }),
|
|
8194
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxRuntime.
|
|
8195
|
-
|
|
8256
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8257
|
+
CountrySearchField,
|
|
8196
8258
|
{
|
|
8197
|
-
label: "Country of residence",
|
|
8198
|
-
required: true,
|
|
8259
|
+
label: (_u = L.country) != null ? _u : "Country of residence",
|
|
8199
8260
|
value: values.country,
|
|
8200
|
-
onChange: (
|
|
8201
|
-
|
|
8202
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, hidden: true }),
|
|
8203
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "France", children: "France" }),
|
|
8204
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "Belgium", children: "Belgium" }),
|
|
8205
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "Switzerland", children: "Switzerland" }),
|
|
8206
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "Canada", children: "Canada" }),
|
|
8207
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "Luxembourg", children: "Luxembourg" }),
|
|
8208
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "United Kingdom", children: "United Kingdom" }),
|
|
8209
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "United States", children: "United States" }),
|
|
8210
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "Other", children: "Other" })
|
|
8211
|
-
]
|
|
8261
|
+
onChange: (code) => set("country", code),
|
|
8262
|
+
countries: COUNTRIES
|
|
8212
8263
|
}
|
|
8213
8264
|
) })
|
|
8214
8265
|
] }),
|
|
8215
8266
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [
|
|
8216
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
8217
|
-
/* @__PURE__ */ jsxRuntime.
|
|
8218
|
-
PhoneCountrySelect,
|
|
8219
|
-
{
|
|
8220
|
-
value: values.phoneCountry,
|
|
8221
|
-
onChange: (code) => set("phoneCountry", code),
|
|
8222
|
-
className: "shrink-0"
|
|
8223
|
-
}
|
|
8224
|
-
),
|
|
8225
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-w-0 flex-1", children: [
|
|
8267
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
|
|
8268
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full min-w-0", children: [
|
|
8226
8269
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8227
|
-
|
|
8270
|
+
PhoneCountrySelect,
|
|
8228
8271
|
{
|
|
8229
|
-
|
|
8230
|
-
|
|
8231
|
-
|
|
8232
|
-
|
|
8233
|
-
onChange: (e) => set("phone", e.target.value),
|
|
8234
|
-
className: cn(
|
|
8235
|
-
"peer block h-14 w-full rounded-r-lg border border-border bg-background",
|
|
8236
|
-
"px-3 pt-5 pb-2 text-base text-foreground font-ui",
|
|
8237
|
-
"transition-colors placeholder-transparent",
|
|
8238
|
-
"focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary"
|
|
8239
|
-
)
|
|
8272
|
+
value: values.phoneCountry,
|
|
8273
|
+
onChange: (code) => set("phoneCountry", code),
|
|
8274
|
+
className: "shrink-0",
|
|
8275
|
+
showDial: false
|
|
8240
8276
|
}
|
|
8241
8277
|
),
|
|
8242
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8243
|
-
|
|
8244
|
-
|
|
8245
|
-
|
|
8246
|
-
|
|
8247
|
-
|
|
8248
|
-
"
|
|
8249
|
-
|
|
8250
|
-
|
|
8251
|
-
|
|
8252
|
-
|
|
8253
|
-
|
|
8254
|
-
|
|
8255
|
-
|
|
8256
|
-
|
|
8257
|
-
|
|
8258
|
-
|
|
8278
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-w-0 flex-1", children: [
|
|
8279
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8280
|
+
"input",
|
|
8281
|
+
{
|
|
8282
|
+
id: "phone",
|
|
8283
|
+
type: "tel",
|
|
8284
|
+
placeholder: " ",
|
|
8285
|
+
value: `${dialFor(values.phoneCountry)} ${values.phone}`,
|
|
8286
|
+
onChange: (e) => {
|
|
8287
|
+
const dial = dialFor(values.phoneCountry);
|
|
8288
|
+
let national = e.target.value;
|
|
8289
|
+
if (national.startsWith(dial)) national = national.slice(dial.length);
|
|
8290
|
+
national = national.replace(/^\s+/, "");
|
|
8291
|
+
set("phone", national);
|
|
8292
|
+
},
|
|
8293
|
+
className: cn(
|
|
8294
|
+
"peer block h-14 w-full rounded-r-lg border border-border bg-background",
|
|
8295
|
+
"px-3 pt-5 pb-2 text-base text-foreground font-ui",
|
|
8296
|
+
"transition-colors placeholder-transparent",
|
|
8297
|
+
"focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
|
|
8298
|
+
errors.phone && "border-destructive focus:border-destructive focus:ring-destructive"
|
|
8299
|
+
)
|
|
8300
|
+
}
|
|
8301
|
+
),
|
|
8302
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8303
|
+
"label",
|
|
8304
|
+
{
|
|
8305
|
+
htmlFor: "phone",
|
|
8306
|
+
className: cn(
|
|
8307
|
+
"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
|
|
8308
|
+
"text-base text-muted-foreground font-ui transition-all duration-150",
|
|
8309
|
+
"peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
|
|
8310
|
+
"peer-not-placeholder-shown:top-3 peer-not-placeholder-shown:translate-y-0 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
|
|
8311
|
+
),
|
|
8312
|
+
children: [
|
|
8313
|
+
(_v = L.phone) != null ? _v : "Phone",
|
|
8314
|
+
" ",
|
|
8315
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: "*" })
|
|
8316
|
+
]
|
|
8317
|
+
}
|
|
8318
|
+
)
|
|
8319
|
+
] })
|
|
8320
|
+
] }),
|
|
8321
|
+
errors.phone && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: errors.phone })
|
|
8259
8322
|
] }),
|
|
8260
8323
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8261
8324
|
FloatingInput,
|
|
8262
8325
|
{
|
|
8263
|
-
label: "Email",
|
|
8326
|
+
label: (_w = L.email) != null ? _w : "Email",
|
|
8264
8327
|
required: true,
|
|
8265
8328
|
type: "email",
|
|
8266
8329
|
value: values.email,
|
|
8267
|
-
onChange: (e) => set("email", e.target.value)
|
|
8330
|
+
onChange: (e) => set("email", e.target.value),
|
|
8331
|
+
error: errors.email
|
|
8268
8332
|
}
|
|
8269
8333
|
) })
|
|
8270
8334
|
] })
|
|
8271
8335
|
] }),
|
|
8336
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8337
|
+
FormSection,
|
|
8338
|
+
{
|
|
8339
|
+
title: (_x = L.contactViaSection) != null ? _x : "How should we contact you?",
|
|
8340
|
+
required: true,
|
|
8341
|
+
children: [
|
|
8342
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8343
|
+
"div",
|
|
8344
|
+
{
|
|
8345
|
+
role: "radiogroup",
|
|
8346
|
+
"aria-label": (_y = L.contactViaSection) != null ? _y : "How should we contact you?",
|
|
8347
|
+
className: "inline-flex flex-wrap rounded-full border border-border bg-background p-1",
|
|
8348
|
+
children: [
|
|
8349
|
+
["WhatsApp", (_z = L.contactViaWhatsApp) != null ? _z : "WhatsApp"],
|
|
8350
|
+
["Email", (_A = L.contactViaEmail) != null ? _A : "Email"],
|
|
8351
|
+
["Phone", (_B = L.contactViaPhone) != null ? _B : "Phone"]
|
|
8352
|
+
].map(([value, label]) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
8353
|
+
"button",
|
|
8354
|
+
{
|
|
8355
|
+
type: "button",
|
|
8356
|
+
role: "radio",
|
|
8357
|
+
"aria-checked": values.contactVia === value,
|
|
8358
|
+
onClick: () => set("contactVia", value),
|
|
8359
|
+
className: cn(
|
|
8360
|
+
"whitespace-nowrap rounded-full px-5 py-2 font-heading text-[13px] font-semibold transition-colors",
|
|
8361
|
+
values.contactVia === value ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:text-foreground"
|
|
8362
|
+
),
|
|
8363
|
+
children: label
|
|
8364
|
+
},
|
|
8365
|
+
value
|
|
8366
|
+
))
|
|
8367
|
+
}
|
|
8368
|
+
),
|
|
8369
|
+
errors.contactVia && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-destructive font-ui", children: errors.contactVia })
|
|
8370
|
+
]
|
|
8371
|
+
}
|
|
8372
|
+
),
|
|
8272
8373
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center pt-2", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8273
8374
|
"button",
|
|
8274
8375
|
{
|
|
@@ -8303,8 +8404,8 @@ function BookingForm({
|
|
|
8303
8404
|
}
|
|
8304
8405
|
)
|
|
8305
8406
|
] }),
|
|
8306
|
-
"Sending\u2026"
|
|
8307
|
-
] }) :
|
|
8407
|
+
(_C = L.sending) != null ? _C : "Sending\u2026"
|
|
8408
|
+
] }) : submitText
|
|
8308
8409
|
}
|
|
8309
8410
|
) })
|
|
8310
8411
|
]
|
|
@@ -8613,11 +8714,11 @@ function FloatingTextarea({
|
|
|
8613
8714
|
}
|
|
8614
8715
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
8615
8716
|
var _a, _b, _c;
|
|
8616
|
-
const [open, setOpen] =
|
|
8617
|
-
const containerRef =
|
|
8717
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
8718
|
+
const containerRef = React32__namespace.useRef(null);
|
|
8618
8719
|
const options = (_a = field.options) != null ? _a : [];
|
|
8619
8720
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
8620
|
-
|
|
8721
|
+
React32__namespace.useEffect(() => {
|
|
8621
8722
|
if (!open) return;
|
|
8622
8723
|
const handleOutside = (e) => {
|
|
8623
8724
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -9085,11 +9186,11 @@ function RegistrationForm({
|
|
|
9085
9186
|
readOnly = false
|
|
9086
9187
|
}) {
|
|
9087
9188
|
var _a;
|
|
9088
|
-
const L =
|
|
9189
|
+
const L = React32__namespace.useMemo(
|
|
9089
9190
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS12), labels != null ? labels : {}),
|
|
9090
9191
|
[labels]
|
|
9091
9192
|
);
|
|
9092
|
-
const sortedFields =
|
|
9193
|
+
const sortedFields = React32__namespace.useMemo(
|
|
9093
9194
|
() => [...fields].sort((a, b) => {
|
|
9094
9195
|
var _a2, _b;
|
|
9095
9196
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -9097,7 +9198,7 @@ function RegistrationForm({
|
|
|
9097
9198
|
[fields]
|
|
9098
9199
|
);
|
|
9099
9200
|
const isControlled = values !== void 0;
|
|
9100
|
-
const [internal, setInternal] =
|
|
9201
|
+
const [internal, setInternal] = React32__namespace.useState(
|
|
9101
9202
|
() => initializeValues(
|
|
9102
9203
|
sortedFields,
|
|
9103
9204
|
defaultValues != null ? defaultValues : {},
|
|
@@ -9105,9 +9206,9 @@ function RegistrationForm({
|
|
|
9105
9206
|
includeTerms
|
|
9106
9207
|
)
|
|
9107
9208
|
);
|
|
9108
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
9109
|
-
const [validationErrors, setValidationErrors] =
|
|
9110
|
-
|
|
9209
|
+
const [submitAttempted, setSubmitAttempted] = React32__namespace.useState(false);
|
|
9210
|
+
const [validationErrors, setValidationErrors] = React32__namespace.useState({});
|
|
9211
|
+
React32__namespace.useEffect(() => {
|
|
9111
9212
|
if (isControlled) return;
|
|
9112
9213
|
setInternal((prev) => {
|
|
9113
9214
|
const next = initializeValues(
|
|
@@ -9164,7 +9265,7 @@ function RegistrationForm({
|
|
|
9164
9265
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
9165
9266
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
9166
9267
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
9167
|
-
|
|
9268
|
+
React32__namespace.useEffect(() => {
|
|
9168
9269
|
if (!submitAttempted || !scrollTargetId) return;
|
|
9169
9270
|
const timer = setTimeout(() => {
|
|
9170
9271
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -9617,60 +9718,335 @@ function RegistrationSuccessCard({
|
|
|
9617
9718
|
}
|
|
9618
9719
|
);
|
|
9619
9720
|
}
|
|
9620
|
-
var
|
|
9621
|
-
|
|
9622
|
-
|
|
9623
|
-
|
|
9721
|
+
var OTHER = "OTHER";
|
|
9722
|
+
function SectionHeading({ children }) {
|
|
9723
|
+
return /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-lg font-heading font-bold text-foreground mb-3", children });
|
|
9724
|
+
}
|
|
9725
|
+
function FieldError({ children }) {
|
|
9726
|
+
if (!children) return null;
|
|
9727
|
+
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children });
|
|
9728
|
+
}
|
|
9729
|
+
function CancellationForm({
|
|
9730
|
+
adventures,
|
|
9731
|
+
identity,
|
|
9732
|
+
labels,
|
|
9733
|
+
onSubmit,
|
|
9734
|
+
submitting = false,
|
|
9624
9735
|
error,
|
|
9625
|
-
|
|
9626
|
-
|
|
9627
|
-
|
|
9628
|
-
|
|
9629
|
-
|
|
9630
|
-
|
|
9631
|
-
const
|
|
9632
|
-
const
|
|
9633
|
-
const [
|
|
9634
|
-
const
|
|
9635
|
-
|
|
9636
|
-
|
|
9637
|
-
|
|
9638
|
-
|
|
9639
|
-
const
|
|
9640
|
-
|
|
9641
|
-
|
|
9642
|
-
|
|
9643
|
-
|
|
9644
|
-
|
|
9645
|
-
|
|
9646
|
-
|
|
9647
|
-
|
|
9648
|
-
|
|
9649
|
-
|
|
9650
|
-
|
|
9651
|
-
|
|
9652
|
-
|
|
9653
|
-
|
|
9654
|
-
|
|
9736
|
+
className
|
|
9737
|
+
}) {
|
|
9738
|
+
var _a, _b, _c;
|
|
9739
|
+
const [selectedAdventureIds, setSelectedAdventureIds] = React32__namespace.useState(/* @__PURE__ */ new Set());
|
|
9740
|
+
const [participantsByAdventure, setParticipantsByAdventure] = React32__namespace.useState({});
|
|
9741
|
+
const [reasonCode, setReasonCode] = React32__namespace.useState("");
|
|
9742
|
+
const [reasonOther, setReasonOther] = React32__namespace.useState("");
|
|
9743
|
+
const [refundPreference, setRefundPreference] = React32__namespace.useState("");
|
|
9744
|
+
const [refundOther, setRefundOther] = React32__namespace.useState("");
|
|
9745
|
+
const [agreedToPolicy, setAgreedToPolicy] = React32__namespace.useState(false);
|
|
9746
|
+
const [contactName, setContactName] = React32__namespace.useState((_a = identity == null ? void 0 : identity.name) != null ? _a : "");
|
|
9747
|
+
const [contactEmail, setContactEmail] = React32__namespace.useState((_b = identity == null ? void 0 : identity.email) != null ? _b : "");
|
|
9748
|
+
const [contactPhone, setContactPhone] = React32__namespace.useState((_c = identity == null ? void 0 : identity.phone) != null ? _c : "");
|
|
9749
|
+
const [errors, setErrors] = React32__namespace.useState({});
|
|
9750
|
+
const allParticipantsOf = React32__namespace.useCallback(
|
|
9751
|
+
(advId) => {
|
|
9752
|
+
var _a2, _b2;
|
|
9753
|
+
return new Set(((_b2 = (_a2 = adventures.find((a) => a.id === advId)) == null ? void 0 : _a2.participants) != null ? _b2 : []).map((p) => p.id));
|
|
9754
|
+
},
|
|
9755
|
+
[adventures]
|
|
9756
|
+
);
|
|
9757
|
+
function toggleAdventure(advId, on) {
|
|
9758
|
+
setSelectedAdventureIds((prev) => {
|
|
9759
|
+
const next = new Set(prev);
|
|
9760
|
+
if (on) next.add(advId);
|
|
9761
|
+
else next.delete(advId);
|
|
9762
|
+
return next;
|
|
9763
|
+
});
|
|
9764
|
+
setParticipantsByAdventure((prev) => {
|
|
9765
|
+
const next = __spreadValues({}, prev);
|
|
9766
|
+
if (on) next[advId] = allParticipantsOf(advId);
|
|
9767
|
+
else delete next[advId];
|
|
9768
|
+
return next;
|
|
9769
|
+
});
|
|
9770
|
+
}
|
|
9771
|
+
function toggleParticipant(advId, travellerId, on) {
|
|
9772
|
+
setParticipantsByAdventure((prev) => {
|
|
9773
|
+
var _a2;
|
|
9774
|
+
const set = new Set((_a2 = prev[advId]) != null ? _a2 : []);
|
|
9775
|
+
if (on) set.add(travellerId);
|
|
9776
|
+
else set.delete(travellerId);
|
|
9777
|
+
return __spreadProps(__spreadValues({}, prev), { [advId]: set });
|
|
9778
|
+
});
|
|
9779
|
+
}
|
|
9780
|
+
function selectAll() {
|
|
9781
|
+
const allAdv = new Set(adventures.map((a) => a.id));
|
|
9782
|
+
const byAdv = {};
|
|
9783
|
+
for (const a of adventures) byAdv[a.id] = new Set(a.participants.map((p) => p.id));
|
|
9784
|
+
setSelectedAdventureIds(allAdv);
|
|
9785
|
+
setParticipantsByAdventure(byAdv);
|
|
9786
|
+
}
|
|
9787
|
+
const allSelected = adventures.length > 0 && adventures.every((a) => selectedAdventureIds.has(a.id));
|
|
9788
|
+
function validate() {
|
|
9789
|
+
var _a2;
|
|
9790
|
+
const next = {};
|
|
9791
|
+
const selAdvIds = adventures.filter((a) => selectedAdventureIds.has(a.id)).map((a) => a.id);
|
|
9792
|
+
if (selAdvIds.length === 0) next.adventures = labels.errorSelectAdventure;
|
|
9793
|
+
for (const advId of selAdvIds) {
|
|
9794
|
+
const set = participantsByAdventure[advId];
|
|
9795
|
+
if (!set || set.size === 0) next.participants = labels.errorSelectParticipants;
|
|
9796
|
+
}
|
|
9797
|
+
if (!reasonCode) next.reason = labels.errorReasonRequired;
|
|
9798
|
+
else if (reasonCode === OTHER && !reasonOther.trim()) next.reason = labels.errorReasonOtherRequired;
|
|
9799
|
+
if (!refundPreference) next.refund = labels.errorRefundRequired;
|
|
9800
|
+
else if (refundPreference === OTHER && !refundOther.trim())
|
|
9801
|
+
next.refund = labels.errorRefundOtherRequired;
|
|
9802
|
+
if (!agreedToPolicy) next.agreement = labels.errorAgreementRequired;
|
|
9803
|
+
setErrors(next);
|
|
9804
|
+
if (Object.keys(next).length > 0) return { ok: false };
|
|
9805
|
+
const travellerIds = /* @__PURE__ */ new Set();
|
|
9806
|
+
for (const advId of selAdvIds) {
|
|
9807
|
+
for (const tid of (_a2 = participantsByAdventure[advId]) != null ? _a2 : []) travellerIds.add(tid);
|
|
9808
|
+
}
|
|
9809
|
+
return {
|
|
9810
|
+
ok: true,
|
|
9811
|
+
values: {
|
|
9812
|
+
selectedBookingAdventureIds: selAdvIds,
|
|
9813
|
+
selectedTravellerIds: [...travellerIds],
|
|
9814
|
+
reasonCode,
|
|
9815
|
+
reasonOther: reasonCode === OTHER ? reasonOther.trim() : "",
|
|
9816
|
+
refundPreference,
|
|
9817
|
+
refundOther: refundPreference === OTHER ? refundOther.trim() : "",
|
|
9818
|
+
agreedToPolicy,
|
|
9819
|
+
contact: { name: contactName.trim(), email: contactEmail.trim(), phone: contactPhone.trim() }
|
|
9655
9820
|
}
|
|
9656
|
-
|
|
9657
|
-
|
|
9658
|
-
|
|
9659
|
-
|
|
9660
|
-
|
|
9661
|
-
|
|
9662
|
-
|
|
9821
|
+
};
|
|
9822
|
+
}
|
|
9823
|
+
function handleSubmit(e) {
|
|
9824
|
+
e.preventDefault();
|
|
9825
|
+
const r = validate();
|
|
9826
|
+
if (r.ok && r.values) void onSubmit(r.values);
|
|
9827
|
+
}
|
|
9828
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: cn("space-y-8", className), noValidate: true, children: [
|
|
9829
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9830
|
+
/* @__PURE__ */ jsxRuntime.jsx(SectionHeading, { children: labels.identityHeading }),
|
|
9831
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-3", children: [
|
|
9832
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9833
|
+
FloatingInput,
|
|
9834
|
+
{
|
|
9835
|
+
label: labels.contactNameLabel,
|
|
9836
|
+
value: contactName,
|
|
9837
|
+
onChange: (e) => setContactName(e.target.value)
|
|
9838
|
+
}
|
|
9663
9839
|
),
|
|
9664
|
-
|
|
9665
|
-
|
|
9666
|
-
|
|
9667
|
-
|
|
9668
|
-
|
|
9669
|
-
|
|
9670
|
-
|
|
9671
|
-
|
|
9672
|
-
|
|
9673
|
-
|
|
9840
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9841
|
+
FloatingInput,
|
|
9842
|
+
{
|
|
9843
|
+
label: labels.contactEmailLabel,
|
|
9844
|
+
type: "email",
|
|
9845
|
+
value: contactEmail,
|
|
9846
|
+
onChange: (e) => setContactEmail(e.target.value)
|
|
9847
|
+
}
|
|
9848
|
+
),
|
|
9849
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9850
|
+
FloatingInput,
|
|
9851
|
+
{
|
|
9852
|
+
label: labels.contactPhoneLabel,
|
|
9853
|
+
value: contactPhone,
|
|
9854
|
+
onChange: (e) => setContactPhone(e.target.value)
|
|
9855
|
+
}
|
|
9856
|
+
)
|
|
9857
|
+
] })
|
|
9858
|
+
] }),
|
|
9859
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9860
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3 mb-3", children: [
|
|
9861
|
+
/* @__PURE__ */ jsxRuntime.jsx(SectionHeading, { children: labels.adventuresHeading }),
|
|
9862
|
+
adventures.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "link", size: "sm", onClick: selectAll, disabled: allSelected, children: labels.selectAllLabel })
|
|
9863
|
+
] }),
|
|
9864
|
+
labels.adventuresHint && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-3", children: labels.adventuresHint }),
|
|
9865
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: adventures.map((adv) => {
|
|
9866
|
+
var _a2;
|
|
9867
|
+
const selected = selectedAdventureIds.has(adv.id);
|
|
9868
|
+
const partSet = (_a2 = participantsByAdventure[adv.id]) != null ? _a2 : /* @__PURE__ */ new Set();
|
|
9869
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9870
|
+
"div",
|
|
9871
|
+
{
|
|
9872
|
+
className: cn(
|
|
9873
|
+
"rounded-lg border p-4 transition-colors",
|
|
9874
|
+
selected ? "border-primary bg-primary/5" : "border-border bg-card"
|
|
9875
|
+
),
|
|
9876
|
+
children: [
|
|
9877
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-start gap-3 cursor-pointer", children: [
|
|
9878
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9879
|
+
"input",
|
|
9880
|
+
{
|
|
9881
|
+
type: "checkbox",
|
|
9882
|
+
className: "mt-1 h-4 w-4 accent-primary",
|
|
9883
|
+
checked: selected,
|
|
9884
|
+
onChange: (e) => toggleAdventure(adv.id, e.target.checked)
|
|
9885
|
+
}
|
|
9886
|
+
),
|
|
9887
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex-1", children: [
|
|
9888
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block font-ui font-medium text-foreground", children: adv.name }),
|
|
9889
|
+
adv.dateRange && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-sm text-muted-foreground", children: adv.dateRange })
|
|
9890
|
+
] })
|
|
9891
|
+
] }),
|
|
9892
|
+
selected && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 pl-7 space-y-4", children: [
|
|
9893
|
+
adv.cancellationPolicy && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md bg-muted/50 border border-border p-3", children: [
|
|
9894
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-ui font-semibold uppercase tracking-wide text-muted-foreground mb-1", children: labels.policyHeading }),
|
|
9895
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground whitespace-pre-line", children: adv.cancellationPolicy })
|
|
9896
|
+
] }),
|
|
9897
|
+
adv.participants.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
9898
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-ui font-semibold uppercase tracking-wide text-muted-foreground mb-2", children: labels.participantsHeading }),
|
|
9899
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1.5", children: adv.participants.map((p) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9900
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9901
|
+
"input",
|
|
9902
|
+
{
|
|
9903
|
+
type: "checkbox",
|
|
9904
|
+
className: "h-4 w-4 accent-primary",
|
|
9905
|
+
checked: partSet.has(p.id),
|
|
9906
|
+
onChange: (e) => toggleParticipant(adv.id, p.id, e.target.checked)
|
|
9907
|
+
}
|
|
9908
|
+
),
|
|
9909
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: p.name })
|
|
9910
|
+
] }, p.id)) })
|
|
9911
|
+
] })
|
|
9912
|
+
] })
|
|
9913
|
+
]
|
|
9914
|
+
},
|
|
9915
|
+
adv.id
|
|
9916
|
+
);
|
|
9917
|
+
}) }),
|
|
9918
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.adventures }),
|
|
9919
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.participants })
|
|
9920
|
+
] }),
|
|
9921
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9922
|
+
/* @__PURE__ */ jsxRuntime.jsx(SectionHeading, { children: labels.reasonHeading }),
|
|
9923
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: labels.reasonOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9924
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9925
|
+
"input",
|
|
9926
|
+
{
|
|
9927
|
+
type: "radio",
|
|
9928
|
+
name: "cancellation-reason",
|
|
9929
|
+
className: "h-4 w-4 accent-primary",
|
|
9930
|
+
checked: reasonCode === opt.value,
|
|
9931
|
+
onChange: () => setReasonCode(opt.value)
|
|
9932
|
+
}
|
|
9933
|
+
),
|
|
9934
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: opt.label })
|
|
9935
|
+
] }, opt.value)) }),
|
|
9936
|
+
reasonCode === OTHER && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9937
|
+
"textarea",
|
|
9938
|
+
{
|
|
9939
|
+
className: "mt-3 w-full rounded-lg border border-border bg-background px-3 py-2 text-base text-foreground font-ui focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
|
|
9940
|
+
rows: 3,
|
|
9941
|
+
placeholder: labels.reasonOtherLabel,
|
|
9942
|
+
value: reasonOther,
|
|
9943
|
+
onChange: (e) => setReasonOther(e.target.value),
|
|
9944
|
+
maxLength: 1e3
|
|
9945
|
+
}
|
|
9946
|
+
),
|
|
9947
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.reason })
|
|
9948
|
+
] }),
|
|
9949
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9950
|
+
/* @__PURE__ */ jsxRuntime.jsx(SectionHeading, { children: labels.refundHeading }),
|
|
9951
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: labels.refundOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
9952
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9953
|
+
"input",
|
|
9954
|
+
{
|
|
9955
|
+
type: "radio",
|
|
9956
|
+
name: "cancellation-refund",
|
|
9957
|
+
className: "h-4 w-4 accent-primary",
|
|
9958
|
+
checked: refundPreference === opt.value,
|
|
9959
|
+
onChange: () => setRefundPreference(opt.value)
|
|
9960
|
+
}
|
|
9961
|
+
),
|
|
9962
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: opt.label })
|
|
9963
|
+
] }, opt.value)) }),
|
|
9964
|
+
refundPreference === OTHER && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9965
|
+
"textarea",
|
|
9966
|
+
{
|
|
9967
|
+
className: "mt-3 w-full rounded-lg border border-border bg-background px-3 py-2 text-base text-foreground font-ui focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
|
|
9968
|
+
rows: 3,
|
|
9969
|
+
placeholder: labels.refundOtherLabel,
|
|
9970
|
+
value: refundOther,
|
|
9971
|
+
onChange: (e) => setRefundOther(e.target.value),
|
|
9972
|
+
maxLength: 1e3
|
|
9973
|
+
}
|
|
9974
|
+
),
|
|
9975
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.refund })
|
|
9976
|
+
] }),
|
|
9977
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
|
|
9978
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-start gap-3 cursor-pointer", children: [
|
|
9979
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9980
|
+
"input",
|
|
9981
|
+
{
|
|
9982
|
+
type: "checkbox",
|
|
9983
|
+
className: "mt-1 h-4 w-4 accent-primary",
|
|
9984
|
+
checked: agreedToPolicy,
|
|
9985
|
+
onChange: (e) => setAgreedToPolicy(e.target.checked)
|
|
9986
|
+
}
|
|
9987
|
+
),
|
|
9988
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: labels.agreementLabel })
|
|
9989
|
+
] }),
|
|
9990
|
+
/* @__PURE__ */ jsxRuntime.jsx(FieldError, { children: errors.agreement })
|
|
9991
|
+
] }),
|
|
9992
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive font-ui", role: "alert", children: error }),
|
|
9993
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", variant: "destructive", size: "lg", disabled: submitting, className: "w-full", children: submitting ? labels.submittingLabel : labels.submitLabel })
|
|
9994
|
+
] });
|
|
9995
|
+
}
|
|
9996
|
+
var OTPCodeInput = ({
|
|
9997
|
+
value,
|
|
9998
|
+
onChange,
|
|
9999
|
+
label,
|
|
10000
|
+
error,
|
|
10001
|
+
disabled = false,
|
|
10002
|
+
length = 6,
|
|
10003
|
+
className,
|
|
10004
|
+
id,
|
|
10005
|
+
required
|
|
10006
|
+
}) => {
|
|
10007
|
+
const baseId = id != null ? id : React32__namespace.useId();
|
|
10008
|
+
const inputRef = React32__namespace.useRef(null);
|
|
10009
|
+
const [focused, setFocused] = React32__namespace.useState(false);
|
|
10010
|
+
const digits = React32__namespace.useMemo(() => {
|
|
10011
|
+
const arr = value.split("").slice(0, length);
|
|
10012
|
+
while (arr.length < length) arr.push("");
|
|
10013
|
+
return arr;
|
|
10014
|
+
}, [value, length]);
|
|
10015
|
+
const handleChange = (e) => {
|
|
10016
|
+
const numeric = e.target.value.replace(/\D/g, "").slice(0, length);
|
|
10017
|
+
onChange(numeric);
|
|
10018
|
+
};
|
|
10019
|
+
const activeIndex = Math.min(value.length, length - 1);
|
|
10020
|
+
const errorId = error ? `${baseId}-error` : void 0;
|
|
10021
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col items-center", className), children: [
|
|
10022
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10023
|
+
"label",
|
|
10024
|
+
{
|
|
10025
|
+
htmlFor: baseId,
|
|
10026
|
+
className: cn(
|
|
10027
|
+
"self-start text-sm text-muted-foreground font-ui mb-2",
|
|
10028
|
+
required && "after:content-['*'] after:text-primary after:ml-0.5"
|
|
10029
|
+
),
|
|
10030
|
+
children: label
|
|
10031
|
+
}
|
|
10032
|
+
),
|
|
10033
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10034
|
+
"div",
|
|
10035
|
+
{
|
|
10036
|
+
className: cn(
|
|
10037
|
+
"relative",
|
|
10038
|
+
disabled && "opacity-50 pointer-events-none"
|
|
10039
|
+
),
|
|
10040
|
+
children: [
|
|
10041
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10042
|
+
"input",
|
|
10043
|
+
{
|
|
10044
|
+
ref: inputRef,
|
|
10045
|
+
id: baseId,
|
|
10046
|
+
type: "text",
|
|
10047
|
+
inputMode: "numeric",
|
|
10048
|
+
pattern: "\\d*",
|
|
10049
|
+
maxLength: length,
|
|
9674
10050
|
value,
|
|
9675
10051
|
autoComplete: "one-time-code",
|
|
9676
10052
|
"aria-label": label,
|
|
@@ -9744,7 +10120,7 @@ function Checkbox(_a) {
|
|
|
9744
10120
|
})
|
|
9745
10121
|
);
|
|
9746
10122
|
}
|
|
9747
|
-
var AccordionVariantContext =
|
|
10123
|
+
var AccordionVariantContext = React32__namespace.createContext("default");
|
|
9748
10124
|
function Accordion(_a) {
|
|
9749
10125
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
9750
10126
|
return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -9762,7 +10138,7 @@ function Accordion(_a) {
|
|
|
9762
10138
|
}
|
|
9763
10139
|
function AccordionItem(_a) {
|
|
9764
10140
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
9765
|
-
const variant =
|
|
10141
|
+
const variant = React32__namespace.useContext(AccordionVariantContext);
|
|
9766
10142
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9767
10143
|
accordion.Accordion.Item,
|
|
9768
10144
|
__spreadValues({
|
|
@@ -9778,56 +10154,66 @@ function AccordionItem(_a) {
|
|
|
9778
10154
|
function AccordionTrigger(_a) {
|
|
9779
10155
|
var _b = _a, {
|
|
9780
10156
|
className,
|
|
9781
|
-
children
|
|
10157
|
+
children,
|
|
10158
|
+
headingLevel
|
|
9782
10159
|
} = _b, props = __objRest(_b, [
|
|
9783
10160
|
"className",
|
|
9784
|
-
"children"
|
|
10161
|
+
"children",
|
|
10162
|
+
"headingLevel"
|
|
9785
10163
|
]);
|
|
9786
|
-
const variant =
|
|
9787
|
-
|
|
9788
|
-
|
|
10164
|
+
const variant = React32__namespace.useContext(AccordionVariantContext);
|
|
10165
|
+
const headingRender = headingLevel === 2 ? /* @__PURE__ */ jsxRuntime.jsx("h2", {}) : headingLevel === 4 ? /* @__PURE__ */ jsxRuntime.jsx("h4", {}) : headingLevel === 5 ? /* @__PURE__ */ jsxRuntime.jsx("h5", {}) : headingLevel === 6 ? /* @__PURE__ */ jsxRuntime.jsx("h6", {}) : void 0;
|
|
10166
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10167
|
+
accordion.Accordion.Header,
|
|
9789
10168
|
__spreadProps(__spreadValues({
|
|
9790
|
-
|
|
9791
|
-
|
|
9792
|
-
|
|
9793
|
-
|
|
9794
|
-
|
|
9795
|
-
"
|
|
9796
|
-
|
|
9797
|
-
|
|
9798
|
-
|
|
9799
|
-
|
|
9800
|
-
|
|
9801
|
-
|
|
9802
|
-
|
|
9803
|
-
|
|
9804
|
-
|
|
9805
|
-
|
|
9806
|
-
|
|
9807
|
-
|
|
9808
|
-
|
|
9809
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9810
|
-
lucideReact.ChevronDownIcon,
|
|
9811
|
-
{
|
|
9812
|
-
"data-slot": "accordion-trigger-icon",
|
|
9813
|
-
className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
|
|
9814
|
-
}
|
|
9815
|
-
),
|
|
9816
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9817
|
-
lucideReact.ChevronUpIcon,
|
|
9818
|
-
{
|
|
9819
|
-
"data-slot": "accordion-trigger-icon",
|
|
9820
|
-
className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
|
|
9821
|
-
}
|
|
10169
|
+
className: "flex"
|
|
10170
|
+
}, headingRender ? { render: headingRender } : {}), {
|
|
10171
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10172
|
+
accordion.Accordion.Trigger,
|
|
10173
|
+
__spreadProps(__spreadValues({
|
|
10174
|
+
"data-slot": "accordion-trigger",
|
|
10175
|
+
className: cn(
|
|
10176
|
+
"group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
|
|
10177
|
+
"focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
|
|
10178
|
+
variant === "default" && [
|
|
10179
|
+
"rounded-lg border border-transparent py-2.5 text-sm font-medium",
|
|
10180
|
+
"hover:underline focus-visible:border-ring",
|
|
10181
|
+
"**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
|
|
10182
|
+
],
|
|
10183
|
+
variant === "faq" && [
|
|
10184
|
+
"px-5 py-4 text-base font-bold",
|
|
10185
|
+
"hover:bg-muted/30 rounded-lg"
|
|
10186
|
+
],
|
|
10187
|
+
className
|
|
9822
10188
|
)
|
|
9823
|
-
|
|
9824
|
-
|
|
9825
|
-
|
|
9826
|
-
|
|
9827
|
-
|
|
9828
|
-
|
|
10189
|
+
}, props), {
|
|
10190
|
+
children: [
|
|
10191
|
+
children,
|
|
10192
|
+
variant === "default" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10193
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10194
|
+
lucideReact.ChevronDownIcon,
|
|
10195
|
+
{
|
|
10196
|
+
"data-slot": "accordion-trigger-icon",
|
|
10197
|
+
className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
|
|
10198
|
+
}
|
|
10199
|
+
),
|
|
10200
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10201
|
+
lucideReact.ChevronUpIcon,
|
|
10202
|
+
{
|
|
10203
|
+
"data-slot": "accordion-trigger-icon",
|
|
10204
|
+
className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
|
|
10205
|
+
}
|
|
10206
|
+
)
|
|
10207
|
+
] }),
|
|
10208
|
+
variant === "faq" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
10209
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
|
|
10210
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
|
|
10211
|
+
] })
|
|
10212
|
+
]
|
|
10213
|
+
})
|
|
10214
|
+
)
|
|
9829
10215
|
})
|
|
9830
|
-
)
|
|
10216
|
+
);
|
|
9831
10217
|
}
|
|
9832
10218
|
function AccordionContent(_a) {
|
|
9833
10219
|
var _b = _a, {
|
|
@@ -9837,7 +10223,7 @@ function AccordionContent(_a) {
|
|
|
9837
10223
|
"className",
|
|
9838
10224
|
"children"
|
|
9839
10225
|
]);
|
|
9840
|
-
const variant =
|
|
10226
|
+
const variant = React32__namespace.useContext(AccordionVariantContext);
|
|
9841
10227
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9842
10228
|
accordion.Accordion.Panel,
|
|
9843
10229
|
__spreadProps(__spreadValues({
|
|
@@ -10052,18 +10438,19 @@ function FilterPanel({
|
|
|
10052
10438
|
variant = "sidebar",
|
|
10053
10439
|
sortOptions,
|
|
10054
10440
|
sort,
|
|
10055
|
-
onSortChange
|
|
10441
|
+
onSortChange,
|
|
10442
|
+
labels
|
|
10056
10443
|
}) {
|
|
10057
|
-
var _a, _b;
|
|
10058
|
-
const resolvedGroups =
|
|
10059
|
-
const [internalValue, setInternalValue] =
|
|
10444
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
10445
|
+
const resolvedGroups = React32__namespace.useMemo(() => resolveGroups(groups), [groups]);
|
|
10446
|
+
const [internalValue, setInternalValue] = React32__namespace.useState(
|
|
10060
10447
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
10061
10448
|
);
|
|
10062
10449
|
const selected = value != null ? value : internalValue;
|
|
10063
|
-
const [expandedItems, setExpandedItems] =
|
|
10450
|
+
const [expandedItems, setExpandedItems] = React32__namespace.useState(
|
|
10064
10451
|
() => new Set(groups.flatMap((g) => getDefaultExpandedIds(g.items)))
|
|
10065
10452
|
);
|
|
10066
|
-
const toggleExpanded =
|
|
10453
|
+
const toggleExpanded = React32__namespace.useCallback((id) => {
|
|
10067
10454
|
setExpandedItems((prev) => {
|
|
10068
10455
|
const next = new Set(prev);
|
|
10069
10456
|
if (next.has(id)) next.delete(id);
|
|
@@ -10192,7 +10579,7 @@ function FilterPanel({
|
|
|
10192
10579
|
type: "button",
|
|
10193
10580
|
onClick: handleClearAll,
|
|
10194
10581
|
className: "text-sm font-ui font-semibold text-muted-foreground underline underline-offset-2 hover:text-foreground",
|
|
10195
|
-
children: "Clear all"
|
|
10582
|
+
children: (_b = labels == null ? void 0 : labels.clearAll) != null ? _b : "Clear all"
|
|
10196
10583
|
}
|
|
10197
10584
|
),
|
|
10198
10585
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -10206,9 +10593,8 @@ function FilterPanel({
|
|
|
10206
10593
|
}
|
|
10207
10594
|
),
|
|
10208
10595
|
children: [
|
|
10209
|
-
"Show ",
|
|
10210
|
-
totalSelected > 0 ? `(${totalSelected})` : ""
|
|
10211
|
-
" results"
|
|
10596
|
+
(_c = labels == null ? void 0 : labels.showResults) != null ? _c : "Show results",
|
|
10597
|
+
totalSelected > 0 ? ` (${totalSelected})` : ""
|
|
10212
10598
|
]
|
|
10213
10599
|
}
|
|
10214
10600
|
)
|
|
@@ -10233,7 +10619,7 @@ function FilterPanel({
|
|
|
10233
10619
|
}
|
|
10234
10620
|
),
|
|
10235
10621
|
children: [
|
|
10236
|
-
"Sort",
|
|
10622
|
+
(_d = labels == null ? void 0 : labels.sortLabel) != null ? _d : "Sort",
|
|
10237
10623
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" })
|
|
10238
10624
|
]
|
|
10239
10625
|
}
|
|
@@ -10343,14 +10729,15 @@ function FilterPanel({
|
|
|
10343
10729
|
className: "inline-flex items-center gap-1 rounded-full px-3 py-1.5 text-xs font-ui font-semibold text-muted-foreground hover:text-foreground transition-colors",
|
|
10344
10730
|
children: [
|
|
10345
10731
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-3 w-3" }),
|
|
10346
|
-
"Clear all
|
|
10732
|
+
(_e = labels == null ? void 0 : labels.clearAll) != null ? _e : "Clear all",
|
|
10733
|
+
" (",
|
|
10347
10734
|
totalSelected,
|
|
10348
10735
|
")"
|
|
10349
10736
|
]
|
|
10350
10737
|
}
|
|
10351
10738
|
),
|
|
10352
10739
|
sortOptions && sortOptions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
|
|
10353
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: "Sort by" }),
|
|
10740
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: (_f = labels == null ? void 0 : labels.sortByLabel) != null ? _f : "Sort by" }),
|
|
10354
10741
|
/* @__PURE__ */ jsxRuntime.jsxs(Popover, { children: [
|
|
10355
10742
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10356
10743
|
PopoverTrigger,
|
|
@@ -10367,7 +10754,7 @@ function FilterPanel({
|
|
|
10367
10754
|
}
|
|
10368
10755
|
),
|
|
10369
10756
|
children: [
|
|
10370
|
-
(
|
|
10757
|
+
(_g = activeSort == null ? void 0 : activeSort.label) != null ? _g : "Default",
|
|
10371
10758
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-3.5 w-3.5 text-muted-foreground" })
|
|
10372
10759
|
]
|
|
10373
10760
|
}
|
|
@@ -10439,7 +10826,7 @@ function FilterPanel({
|
|
|
10439
10826
|
{
|
|
10440
10827
|
onClick: handleClearAll,
|
|
10441
10828
|
className: "self-start text-sm text-muted-foreground underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring font-ui",
|
|
10442
|
-
children: "Remove all filters"
|
|
10829
|
+
children: (_h = labels == null ? void 0 : labels.removeAllFilters) != null ? _h : "Remove all filters"
|
|
10443
10830
|
}
|
|
10444
10831
|
)
|
|
10445
10832
|
] });
|
|
@@ -10447,11 +10834,11 @@ function FilterPanel({
|
|
|
10447
10834
|
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
10448
10835
|
function TrustpilotEmbed({ config }) {
|
|
10449
10836
|
var _a, _b, _c, _d, _e, _f;
|
|
10450
|
-
const ref =
|
|
10451
|
-
const [widgetReady, setWidgetReady] =
|
|
10452
|
-
const [delayPassed, setDelayPassed] =
|
|
10837
|
+
const ref = React32__namespace.useRef(null);
|
|
10838
|
+
const [widgetReady, setWidgetReady] = React32__namespace.useState(false);
|
|
10839
|
+
const [delayPassed, setDelayPassed] = React32__namespace.useState(false);
|
|
10453
10840
|
const showFallback = delayPassed && !widgetReady;
|
|
10454
|
-
|
|
10841
|
+
React32__namespace.useEffect(() => {
|
|
10455
10842
|
var _a2;
|
|
10456
10843
|
if (typeof document === "undefined" || !ref.current) return;
|
|
10457
10844
|
const node = ref.current;
|
|
@@ -10639,7 +11026,7 @@ function webpVariantUrl(src) {
|
|
|
10639
11026
|
return `${withoutQuery}.webp${query}`;
|
|
10640
11027
|
}
|
|
10641
11028
|
function PictureLoader() {
|
|
10642
|
-
const gradientId =
|
|
11029
|
+
const gradientId = React32__namespace.useId();
|
|
10643
11030
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10644
11031
|
"span",
|
|
10645
11032
|
{
|
|
@@ -10708,11 +11095,11 @@ function Picture(_a) {
|
|
|
10708
11095
|
"onLoad",
|
|
10709
11096
|
"onError"
|
|
10710
11097
|
]);
|
|
10711
|
-
var _a2;
|
|
10712
|
-
const ref =
|
|
10713
|
-
const [visible, setVisible] =
|
|
10714
|
-
const [loaded, setLoaded] =
|
|
10715
|
-
|
|
11098
|
+
var _a2, _b2;
|
|
11099
|
+
const ref = React32__namespace.useRef(null);
|
|
11100
|
+
const [visible, setVisible] = React32__namespace.useState(eager);
|
|
11101
|
+
const [loaded, setLoaded] = React32__namespace.useState(false);
|
|
11102
|
+
React32__namespace.useEffect(() => {
|
|
10716
11103
|
if (eager || visible) return;
|
|
10717
11104
|
const el = ref.current;
|
|
10718
11105
|
if (!el || typeof IntersectionObserver === "undefined") {
|
|
@@ -10731,13 +11118,14 @@ function Picture(_a) {
|
|
|
10731
11118
|
io.observe(el);
|
|
10732
11119
|
return () => io.disconnect();
|
|
10733
11120
|
}, [eager, visible, rootMargin]);
|
|
10734
|
-
|
|
11121
|
+
React32__namespace.useEffect(() => {
|
|
10735
11122
|
setLoaded(false);
|
|
10736
11123
|
}, [src]);
|
|
10737
11124
|
const webp = webpVariantUrl(src);
|
|
10738
11125
|
const realSrc = visible ? src : PLACEHOLDER_SRC;
|
|
11126
|
+
const resolvedTitle = (_a2 = imgProps.title) != null ? _a2 : typeof imgProps.alt === "string" && imgProps.alt.trim() ? imgProps.alt : void 0;
|
|
10739
11127
|
const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
|
|
10740
|
-
const fetchPriorityResolved = (
|
|
11128
|
+
const fetchPriorityResolved = (_b2 = imgProps.fetchPriority) != null ? _b2 : eager ? void 0 : "low";
|
|
10741
11129
|
const handleLoad = (e) => {
|
|
10742
11130
|
if (visible) setLoaded(true);
|
|
10743
11131
|
onLoad == null ? void 0 : onLoad(e);
|
|
@@ -10763,6 +11151,7 @@ function Picture(_a) {
|
|
|
10763
11151
|
onLoad: handleLoad,
|
|
10764
11152
|
onError: handleError
|
|
10765
11153
|
}, imgProps), {
|
|
11154
|
+
title: resolvedTitle,
|
|
10766
11155
|
fetchPriority: fetchPriorityResolved,
|
|
10767
11156
|
style: mergedStyle
|
|
10768
11157
|
})
|
|
@@ -10786,6 +11175,7 @@ function Picture(_a) {
|
|
|
10786
11175
|
onLoad: handleLoad,
|
|
10787
11176
|
onError: handleError
|
|
10788
11177
|
}, imgProps), {
|
|
11178
|
+
title: resolvedTitle,
|
|
10789
11179
|
fetchPriority: fetchPriorityResolved,
|
|
10790
11180
|
style: mergedStyle
|
|
10791
11181
|
})
|
|
@@ -10859,11 +11249,11 @@ function ItineraryModal({
|
|
|
10859
11249
|
onNext
|
|
10860
11250
|
}) {
|
|
10861
11251
|
var _a, _b, _c;
|
|
10862
|
-
const [imgIndex, setImgIndex] =
|
|
11252
|
+
const [imgIndex, setImgIndex] = React32__namespace.useState(0);
|
|
10863
11253
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
10864
11254
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
10865
11255
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
10866
|
-
|
|
11256
|
+
React32__namespace.useEffect(() => {
|
|
10867
11257
|
setImgIndex(0);
|
|
10868
11258
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
10869
11259
|
if (!stop) return null;
|
|
@@ -10990,8 +11380,8 @@ function ItineraryModal({
|
|
|
10990
11380
|
) });
|
|
10991
11381
|
}
|
|
10992
11382
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
10993
|
-
const [activeIndex, setActiveIndex] =
|
|
10994
|
-
const scrollRef =
|
|
11383
|
+
const [activeIndex, setActiveIndex] = React32__namespace.useState(null);
|
|
11384
|
+
const scrollRef = React32__namespace.useRef(null);
|
|
10995
11385
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
10996
11386
|
const scrollBy = (dir) => {
|
|
10997
11387
|
if (!scrollRef.current) return;
|
|
@@ -11080,21 +11470,22 @@ function gridCols(total) {
|
|
|
11080
11470
|
function Lightbox({
|
|
11081
11471
|
photos,
|
|
11082
11472
|
initialIndex,
|
|
11083
|
-
onClose
|
|
11473
|
+
onClose,
|
|
11474
|
+
labels
|
|
11084
11475
|
}) {
|
|
11085
|
-
var _a;
|
|
11086
|
-
const [index, setIndex] =
|
|
11476
|
+
var _a, _b, _c, _d;
|
|
11477
|
+
const [index, setIndex] = React32__namespace.useState(initialIndex);
|
|
11087
11478
|
const total = photos.length;
|
|
11088
11479
|
const photo = photos[index];
|
|
11089
|
-
const prev =
|
|
11480
|
+
const prev = React32__namespace.useCallback(
|
|
11090
11481
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
11091
11482
|
[total]
|
|
11092
11483
|
);
|
|
11093
|
-
const next =
|
|
11484
|
+
const next = React32__namespace.useCallback(
|
|
11094
11485
|
() => setIndex((i) => (i + 1) % total),
|
|
11095
11486
|
[total]
|
|
11096
11487
|
);
|
|
11097
|
-
|
|
11488
|
+
React32__namespace.useEffect(() => {
|
|
11098
11489
|
const onKey = (e) => {
|
|
11099
11490
|
if (e.key === "Escape") onClose();
|
|
11100
11491
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -11115,7 +11506,7 @@ function Lightbox({
|
|
|
11115
11506
|
type: "button",
|
|
11116
11507
|
onClick: onClose,
|
|
11117
11508
|
className: "absolute top-5 right-5 flex h-10 w-10 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors z-10",
|
|
11118
|
-
"aria-label": "Close lightbox",
|
|
11509
|
+
"aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
|
|
11119
11510
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5" })
|
|
11120
11511
|
}
|
|
11121
11512
|
),
|
|
@@ -11128,7 +11519,7 @@ function Lightbox({
|
|
|
11128
11519
|
prev();
|
|
11129
11520
|
},
|
|
11130
11521
|
className: "absolute left-4 top-1/2 -translate-y-1/2 flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/25 transition-colors z-10",
|
|
11131
|
-
"aria-label": "Previous photo",
|
|
11522
|
+
"aria-label": (_b = labels == null ? void 0 : labels.previous) != null ? _b : "Previous photo",
|
|
11132
11523
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
|
|
11133
11524
|
}
|
|
11134
11525
|
),
|
|
@@ -11141,7 +11532,7 @@ function Lightbox({
|
|
|
11141
11532
|
next();
|
|
11142
11533
|
},
|
|
11143
11534
|
className: "absolute right-4 top-1/2 -translate-y-1/2 flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/25 transition-colors z-10",
|
|
11144
|
-
"aria-label": "Next photo",
|
|
11535
|
+
"aria-label": (_c = labels == null ? void 0 : labels.next) != null ? _c : "Next photo",
|
|
11145
11536
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
|
|
11146
11537
|
}
|
|
11147
11538
|
),
|
|
@@ -11149,7 +11540,8 @@ function Lightbox({
|
|
|
11149
11540
|
Picture,
|
|
11150
11541
|
{
|
|
11151
11542
|
src: photo.src,
|
|
11152
|
-
alt: (
|
|
11543
|
+
alt: (_d = photo.alt) != null ? _d : `Photo ${index + 1}`,
|
|
11544
|
+
title: photo.caption,
|
|
11153
11545
|
className: "max-w-[calc(100%-6rem)] max-h-[calc(100vh-11rem)] object-contain rounded-lg shadow-2xl",
|
|
11154
11546
|
onClick: (e) => e.stopPropagation()
|
|
11155
11547
|
}
|
|
@@ -11219,6 +11611,7 @@ function PhotoTile({
|
|
|
11219
11611
|
{
|
|
11220
11612
|
src: photo.src,
|
|
11221
11613
|
alt: (_b = photo.alt) != null ? _b : `Photo ${index + 1}`,
|
|
11614
|
+
title: photo.caption,
|
|
11222
11615
|
className: "w-full h-full object-cover transition-transform duration-700 group-hover:scale-105",
|
|
11223
11616
|
loading: "lazy"
|
|
11224
11617
|
}
|
|
@@ -11232,8 +11625,10 @@ function PhotoTile({
|
|
|
11232
11625
|
function ShowMoreButton({
|
|
11233
11626
|
count,
|
|
11234
11627
|
expanded,
|
|
11235
|
-
onClick
|
|
11628
|
+
onClick,
|
|
11629
|
+
labels
|
|
11236
11630
|
}) {
|
|
11631
|
+
var _a, _b;
|
|
11237
11632
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
11238
11633
|
"button",
|
|
11239
11634
|
{
|
|
@@ -11247,10 +11642,11 @@ function ShowMoreButton({
|
|
|
11247
11642
|
),
|
|
11248
11643
|
children: expanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
11249
11644
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
11250
|
-
"Show less"
|
|
11645
|
+
(_a = labels == null ? void 0 : labels.showLess) != null ? _a : "Show less"
|
|
11251
11646
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
11252
11647
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.LayoutGridIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
11253
|
-
"See more
|
|
11648
|
+
(_b = labels == null ? void 0 : labels.seeMore) != null ? _b : "See more",
|
|
11649
|
+
" (",
|
|
11254
11650
|
count,
|
|
11255
11651
|
")"
|
|
11256
11652
|
] })
|
|
@@ -11260,9 +11656,10 @@ function ShowMoreButton({
|
|
|
11260
11656
|
function GridGallery({
|
|
11261
11657
|
photos,
|
|
11262
11658
|
initialVisible,
|
|
11263
|
-
onOpen
|
|
11659
|
+
onOpen,
|
|
11660
|
+
labels
|
|
11264
11661
|
}) {
|
|
11265
|
-
const [expanded, setExpanded] =
|
|
11662
|
+
const [expanded, setExpanded] = React32__namespace.useState(false);
|
|
11266
11663
|
const cols = gridCols(photos.length);
|
|
11267
11664
|
const hasMore = photos.length > initialVisible;
|
|
11268
11665
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -11282,7 +11679,8 @@ function GridGallery({
|
|
|
11282
11679
|
{
|
|
11283
11680
|
count: photos.length - initialVisible,
|
|
11284
11681
|
expanded,
|
|
11285
|
-
onClick: () => setExpanded((v) => !v)
|
|
11682
|
+
onClick: () => setExpanded((v) => !v),
|
|
11683
|
+
labels
|
|
11286
11684
|
}
|
|
11287
11685
|
)
|
|
11288
11686
|
] });
|
|
@@ -11290,9 +11688,10 @@ function GridGallery({
|
|
|
11290
11688
|
function CompactGridGallery({
|
|
11291
11689
|
photos,
|
|
11292
11690
|
initialVisible,
|
|
11293
|
-
onOpen
|
|
11691
|
+
onOpen,
|
|
11692
|
+
labels
|
|
11294
11693
|
}) {
|
|
11295
|
-
const [expanded, setExpanded] =
|
|
11694
|
+
const [expanded, setExpanded] = React32__namespace.useState(false);
|
|
11296
11695
|
const hasMore = photos.length > initialVisible;
|
|
11297
11696
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
11298
11697
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -11311,7 +11710,8 @@ function CompactGridGallery({
|
|
|
11311
11710
|
{
|
|
11312
11711
|
count: photos.length - initialVisible,
|
|
11313
11712
|
expanded,
|
|
11314
|
-
onClick: () => setExpanded((v) => !v)
|
|
11713
|
+
onClick: () => setExpanded((v) => !v),
|
|
11714
|
+
labels
|
|
11315
11715
|
}
|
|
11316
11716
|
)
|
|
11317
11717
|
] });
|
|
@@ -11319,9 +11719,10 @@ function CompactGridGallery({
|
|
|
11319
11719
|
function MasonryGallery({
|
|
11320
11720
|
photos,
|
|
11321
11721
|
initialVisible,
|
|
11322
|
-
onOpen
|
|
11722
|
+
onOpen,
|
|
11723
|
+
labels
|
|
11323
11724
|
}) {
|
|
11324
|
-
const [expanded, setExpanded] =
|
|
11725
|
+
const [expanded, setExpanded] = React32__namespace.useState(false);
|
|
11325
11726
|
const hasMore = photos.length > initialVisible;
|
|
11326
11727
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
11327
11728
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -11340,6 +11741,7 @@ function MasonryGallery({
|
|
|
11340
11741
|
{
|
|
11341
11742
|
src: p.src,
|
|
11342
11743
|
alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
|
|
11744
|
+
title: p.caption,
|
|
11343
11745
|
className: "w-full h-auto object-cover transition-transform duration-700 group-hover:scale-105",
|
|
11344
11746
|
loading: "lazy"
|
|
11345
11747
|
}
|
|
@@ -11355,7 +11757,8 @@ function MasonryGallery({
|
|
|
11355
11757
|
{
|
|
11356
11758
|
count: photos.length - initialVisible,
|
|
11357
11759
|
expanded,
|
|
11358
|
-
onClick: () => setExpanded((v) => !v)
|
|
11760
|
+
onClick: () => setExpanded((v) => !v),
|
|
11761
|
+
labels
|
|
11359
11762
|
}
|
|
11360
11763
|
)
|
|
11361
11764
|
] });
|
|
@@ -11379,6 +11782,7 @@ function FilmstripGallery({
|
|
|
11379
11782
|
{
|
|
11380
11783
|
src: p.src,
|
|
11381
11784
|
alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
|
|
11785
|
+
title: p.caption,
|
|
11382
11786
|
className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
|
|
11383
11787
|
loading: "lazy"
|
|
11384
11788
|
}
|
|
@@ -11392,9 +11796,10 @@ function FilmstripGallery({
|
|
|
11392
11796
|
}
|
|
11393
11797
|
function FeaturedGallery({
|
|
11394
11798
|
photos,
|
|
11395
|
-
onOpen
|
|
11799
|
+
onOpen,
|
|
11800
|
+
labels
|
|
11396
11801
|
}) {
|
|
11397
|
-
const [expanded, setExpanded] =
|
|
11802
|
+
const [expanded, setExpanded] = React32__namespace.useState(false);
|
|
11398
11803
|
const featured = photos.slice(0, 3);
|
|
11399
11804
|
const extra = photos.slice(3);
|
|
11400
11805
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -11444,6 +11849,7 @@ function FeaturedGallery({
|
|
|
11444
11849
|
{
|
|
11445
11850
|
src: p.src,
|
|
11446
11851
|
alt: (_b = p.alt) != null ? _b : `Photo ${i + 4}`,
|
|
11852
|
+
title: p.caption,
|
|
11447
11853
|
className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
|
|
11448
11854
|
loading: "lazy"
|
|
11449
11855
|
}
|
|
@@ -11459,7 +11865,8 @@ function FeaturedGallery({
|
|
|
11459
11865
|
{
|
|
11460
11866
|
count: extra.length,
|
|
11461
11867
|
expanded,
|
|
11462
|
-
onClick: () => setExpanded((v) => !v)
|
|
11868
|
+
onClick: () => setExpanded((v) => !v),
|
|
11869
|
+
labels
|
|
11463
11870
|
}
|
|
11464
11871
|
)
|
|
11465
11872
|
] });
|
|
@@ -11527,6 +11934,7 @@ function CarouselGallery({
|
|
|
11527
11934
|
{
|
|
11528
11935
|
src: photo.src,
|
|
11529
11936
|
alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
|
|
11937
|
+
title: photo.caption,
|
|
11530
11938
|
className: "h-full w-full object-cover transition-transform duration-500 group-hover/photo:scale-[1.02]",
|
|
11531
11939
|
loading: "lazy"
|
|
11532
11940
|
},
|
|
@@ -11590,11 +11998,12 @@ function PhotoGallery({
|
|
|
11590
11998
|
variant = "grid",
|
|
11591
11999
|
initialVisible = 6,
|
|
11592
12000
|
onPhotoClick,
|
|
12001
|
+
labels,
|
|
11593
12002
|
className
|
|
11594
12003
|
}) {
|
|
11595
|
-
const [lightboxIndex, setLightboxIndex] =
|
|
11596
|
-
const [carouselIndex, setCarouselIndex] =
|
|
11597
|
-
const normalised =
|
|
12004
|
+
const [lightboxIndex, setLightboxIndex] = React32__namespace.useState(null);
|
|
12005
|
+
const [carouselIndex, setCarouselIndex] = React32__namespace.useState(0);
|
|
12006
|
+
const normalised = React32__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
11598
12007
|
const handleOpen = (index) => {
|
|
11599
12008
|
setLightboxIndex(index);
|
|
11600
12009
|
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
@@ -11605,7 +12014,8 @@ function PhotoGallery({
|
|
|
11605
12014
|
{
|
|
11606
12015
|
photos: normalised,
|
|
11607
12016
|
initialIndex: lightboxIndex,
|
|
11608
|
-
onClose: () => setLightboxIndex(null)
|
|
12017
|
+
onClose: () => setLightboxIndex(null),
|
|
12018
|
+
labels
|
|
11609
12019
|
}
|
|
11610
12020
|
);
|
|
11611
12021
|
if (variant === "carousel" || variant === "fullBleed") {
|
|
@@ -11633,7 +12043,8 @@ function PhotoGallery({
|
|
|
11633
12043
|
{
|
|
11634
12044
|
photos: normalised,
|
|
11635
12045
|
initialVisible,
|
|
11636
|
-
onOpen: handleOpen
|
|
12046
|
+
onOpen: handleOpen,
|
|
12047
|
+
labels
|
|
11637
12048
|
}
|
|
11638
12049
|
),
|
|
11639
12050
|
variant === "gridCompact" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -11641,7 +12052,8 @@ function PhotoGallery({
|
|
|
11641
12052
|
{
|
|
11642
12053
|
photos: normalised,
|
|
11643
12054
|
initialVisible,
|
|
11644
|
-
onOpen: handleOpen
|
|
12055
|
+
onOpen: handleOpen,
|
|
12056
|
+
labels
|
|
11645
12057
|
}
|
|
11646
12058
|
),
|
|
11647
12059
|
variant === "masonry" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -11649,11 +12061,12 @@ function PhotoGallery({
|
|
|
11649
12061
|
{
|
|
11650
12062
|
photos: normalised,
|
|
11651
12063
|
initialVisible,
|
|
11652
|
-
onOpen: handleOpen
|
|
12064
|
+
onOpen: handleOpen,
|
|
12065
|
+
labels
|
|
11653
12066
|
}
|
|
11654
12067
|
),
|
|
11655
12068
|
variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
|
|
11656
|
-
variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
|
|
12069
|
+
variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen, labels }),
|
|
11657
12070
|
variant === "collage" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
|
|
11658
12071
|
variant === "collageTight" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
|
|
11659
12072
|
lightbox
|
|
@@ -11680,7 +12093,7 @@ function ItineraryDay({
|
|
|
11680
12093
|
photoLayout = "rounded",
|
|
11681
12094
|
className
|
|
11682
12095
|
}) {
|
|
11683
|
-
const photoList =
|
|
12096
|
+
const photoList = React32__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
11684
12097
|
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
11685
12098
|
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
11686
12099
|
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -11735,8 +12148,8 @@ function MenuTrip({
|
|
|
11735
12148
|
bold = true,
|
|
11736
12149
|
className
|
|
11737
12150
|
}) {
|
|
11738
|
-
const scrollRef =
|
|
11739
|
-
|
|
12151
|
+
const scrollRef = React32__namespace.useRef(null);
|
|
12152
|
+
React32__namespace.useEffect(() => {
|
|
11740
12153
|
if (!scrollRef.current || !activeSection) return;
|
|
11741
12154
|
const container = scrollRef.current;
|
|
11742
12155
|
const btn = container.querySelector(
|
|
@@ -11923,6 +12336,8 @@ function PricingTrip({
|
|
|
11923
12336
|
departureTimes,
|
|
11924
12337
|
onBook,
|
|
11925
12338
|
bookLabel = "Check availability",
|
|
12339
|
+
fromLabel = "From",
|
|
12340
|
+
perPersonLabel = "per person",
|
|
11926
12341
|
variant = "card",
|
|
11927
12342
|
sharp = false,
|
|
11928
12343
|
belowPrice,
|
|
@@ -11932,8 +12347,8 @@ function PricingTrip({
|
|
|
11932
12347
|
className
|
|
11933
12348
|
}) {
|
|
11934
12349
|
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
11935
|
-
const [showEstimates, setShowEstimates] =
|
|
11936
|
-
const [showPriceInfo, setShowPriceInfo] =
|
|
12350
|
+
const [showEstimates, setShowEstimates] = React32__namespace.useState(false);
|
|
12351
|
+
const [showPriceInfo, setShowPriceInfo] = React32__namespace.useState(false);
|
|
11937
12352
|
if (variant === "compact") {
|
|
11938
12353
|
const showOverlay = showPriceInfo && (!!priceInfo || !!currencyEstimates && currencyEstimates.length > 0);
|
|
11939
12354
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
@@ -11949,13 +12364,16 @@ function PricingTrip({
|
|
|
11949
12364
|
),
|
|
11950
12365
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center gap-3", children: [
|
|
11951
12366
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
11952
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children:
|
|
12367
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
|
|
11953
12368
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-1.5 flex-wrap", children: [
|
|
11954
12369
|
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg font-bold text-foreground font-heading leading-none", children: [
|
|
11955
12370
|
currency,
|
|
11956
12371
|
" ",
|
|
11957
12372
|
priceFrom,
|
|
11958
|
-
/* @__PURE__ */ jsxRuntime.
|
|
12373
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: [
|
|
12374
|
+
"/ ",
|
|
12375
|
+
perPersonLabel
|
|
12376
|
+
] })
|
|
11959
12377
|
] }),
|
|
11960
12378
|
(priceInfo || currencyEstimates && currencyEstimates.length > 0) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
11961
12379
|
"button",
|
|
@@ -12067,7 +12485,7 @@ function PricingTrip({
|
|
|
12067
12485
|
] }),
|
|
12068
12486
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
|
|
12069
12487
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "shrink-0 text-right", children: [
|
|
12070
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children:
|
|
12488
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
|
|
12071
12489
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xl font-bold text-foreground font-heading leading-none", children: [
|
|
12072
12490
|
currency,
|
|
12073
12491
|
" ",
|
|
@@ -12096,13 +12514,16 @@ function PricingTrip({
|
|
|
12096
12514
|
}
|
|
12097
12515
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
|
|
12098
12516
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
12099
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children:
|
|
12517
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: fromLabel }),
|
|
12100
12518
|
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-2xl font-bold text-foreground font-heading flex items-center gap-2 flex-wrap", children: [
|
|
12101
12519
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
12102
12520
|
currency,
|
|
12103
12521
|
" ",
|
|
12104
12522
|
priceFrom,
|
|
12105
|
-
/* @__PURE__ */ jsxRuntime.
|
|
12523
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: [
|
|
12524
|
+
" / ",
|
|
12525
|
+
perPersonLabel
|
|
12526
|
+
] })
|
|
12106
12527
|
] }),
|
|
12107
12528
|
priceInfo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12108
12529
|
"button",
|
|
@@ -12369,18 +12790,20 @@ function SiteHeader({
|
|
|
12369
12790
|
onSearch,
|
|
12370
12791
|
onAccount,
|
|
12371
12792
|
position = variant === "transparent" ? "overlay" : "fixed",
|
|
12793
|
+
labels,
|
|
12372
12794
|
className
|
|
12373
12795
|
}) {
|
|
12796
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
12374
12797
|
const t = VARIANT[variant];
|
|
12375
12798
|
const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
|
|
12376
|
-
const [openMenu, setOpenMenu] =
|
|
12377
|
-
const [langOpen, setLangOpen] =
|
|
12378
|
-
const [mobileOpen, setMobileOpen] =
|
|
12379
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
12380
|
-
const [activeLang, setActiveLang] =
|
|
12799
|
+
const [openMenu, setOpenMenu] = React32__namespace.useState(null);
|
|
12800
|
+
const [langOpen, setLangOpen] = React32__namespace.useState(false);
|
|
12801
|
+
const [mobileOpen, setMobileOpen] = React32__namespace.useState(false);
|
|
12802
|
+
const [openMobileSection, setOpenMobileSection] = React32__namespace.useState(null);
|
|
12803
|
+
const [activeLang, setActiveLang] = React32__namespace.useState(currentLanguage);
|
|
12381
12804
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
12382
|
-
const menuCloseTimer =
|
|
12383
|
-
const langCloseTimer =
|
|
12805
|
+
const menuCloseTimer = React32__namespace.useRef(void 0);
|
|
12806
|
+
const langCloseTimer = React32__namespace.useRef(void 0);
|
|
12384
12807
|
const handleMenuEnter = (label) => {
|
|
12385
12808
|
clearTimeout(menuCloseTimer.current);
|
|
12386
12809
|
setOpenMenu(label);
|
|
@@ -12401,7 +12824,7 @@ function SiteHeader({
|
|
|
12401
12824
|
setOpenMenu(null);
|
|
12402
12825
|
setLangOpen(false);
|
|
12403
12826
|
};
|
|
12404
|
-
|
|
12827
|
+
React32__namespace.useEffect(() => () => {
|
|
12405
12828
|
clearTimeout(menuCloseTimer.current);
|
|
12406
12829
|
clearTimeout(langCloseTimer.current);
|
|
12407
12830
|
}, []);
|
|
@@ -12428,7 +12851,7 @@ function SiteHeader({
|
|
|
12428
12851
|
{
|
|
12429
12852
|
type: "button",
|
|
12430
12853
|
onClick: () => setMobileOpen(true),
|
|
12431
|
-
"aria-label": "Open menu",
|
|
12854
|
+
"aria-label": (_a = labels == null ? void 0 : labels.openMenu) != null ? _a : "Open menu",
|
|
12432
12855
|
className: cn(
|
|
12433
12856
|
"flex lg:hidden h-9 w-9 items-center justify-center rounded-full transition-colors -ml-1.5",
|
|
12434
12857
|
t.mobileTrigger
|
|
@@ -12457,8 +12880,8 @@ function SiteHeader({
|
|
|
12457
12880
|
}
|
|
12458
12881
|
),
|
|
12459
12882
|
/* @__PURE__ */ jsxRuntime.jsx("nav", { className: "hidden lg:flex items-center gap-0.5 mx-auto", children: links.map((link) => {
|
|
12460
|
-
var
|
|
12461
|
-
const hasDropdown = !!((
|
|
12883
|
+
var _a2, _b2;
|
|
12884
|
+
const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
|
|
12462
12885
|
const isOpen = openMenu === link.label;
|
|
12463
12886
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12464
12887
|
"div",
|
|
@@ -12470,7 +12893,7 @@ function SiteHeader({
|
|
|
12470
12893
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
12471
12894
|
"a",
|
|
12472
12895
|
{
|
|
12473
|
-
href: (
|
|
12896
|
+
href: (_b2 = link.href) != null ? _b2 : "#",
|
|
12474
12897
|
onClick: hasDropdown ? (e) => e.preventDefault() : void 0,
|
|
12475
12898
|
className: cn(
|
|
12476
12899
|
"flex items-center gap-1 px-3.5 py-1.5 rounded-full",
|
|
@@ -12519,7 +12942,7 @@ function SiteHeader({
|
|
|
12519
12942
|
"button",
|
|
12520
12943
|
{
|
|
12521
12944
|
type: "button",
|
|
12522
|
-
"aria-label": "Language",
|
|
12945
|
+
"aria-label": (_b = labels == null ? void 0 : labels.language) != null ? _b : "Language",
|
|
12523
12946
|
className: cn(
|
|
12524
12947
|
"flex items-center gap-0.5 px-2.5 py-1.5 rounded-full",
|
|
12525
12948
|
"text-sm font-ui transition-colors",
|
|
@@ -12559,7 +12982,7 @@ function SiteHeader({
|
|
|
12559
12982
|
{
|
|
12560
12983
|
type: "button",
|
|
12561
12984
|
onClick: onSearch,
|
|
12562
|
-
"aria-label": "Search",
|
|
12985
|
+
"aria-label": (_c = labels == null ? void 0 : labels.search) != null ? _c : "Search",
|
|
12563
12986
|
className: cn(
|
|
12564
12987
|
"flex h-9 w-9 items-center justify-center rounded-full transition-colors",
|
|
12565
12988
|
t.icon
|
|
@@ -12572,7 +12995,7 @@ function SiteHeader({
|
|
|
12572
12995
|
{
|
|
12573
12996
|
type: "button",
|
|
12574
12997
|
onClick: onAccount,
|
|
12575
|
-
"aria-label": "Account",
|
|
12998
|
+
"aria-label": (_d = labels == null ? void 0 : labels.account) != null ? _d : "Account",
|
|
12576
12999
|
className: cn(
|
|
12577
13000
|
"flex h-9 w-9 items-center justify-center rounded-full transition-colors",
|
|
12578
13001
|
t.icon
|
|
@@ -12605,7 +13028,7 @@ function SiteHeader({
|
|
|
12605
13028
|
{
|
|
12606
13029
|
type: "button",
|
|
12607
13030
|
onClick: () => setMobileOpen(false),
|
|
12608
|
-
"aria-label": "Close menu",
|
|
13031
|
+
"aria-label": (_e = labels == null ? void 0 : labels.closeMenu) != null ? _e : "Close menu",
|
|
12609
13032
|
className: cn(
|
|
12610
13033
|
"flex h-9 w-9 items-center justify-center rounded-full transition-colors",
|
|
12611
13034
|
t.mobileTrigger
|
|
@@ -12615,8 +13038,8 @@ function SiteHeader({
|
|
|
12615
13038
|
)
|
|
12616
13039
|
] }),
|
|
12617
13040
|
/* @__PURE__ */ jsxRuntime.jsx("nav", { className: "flex-1 overflow-y-auto px-6 py-6 flex flex-col gap-1", children: links.map((link) => {
|
|
12618
|
-
var
|
|
12619
|
-
const hasDropdown = !!((
|
|
13041
|
+
var _a2, _b2;
|
|
13042
|
+
const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
|
|
12620
13043
|
const isExpanded = openMobileSection === link.label;
|
|
12621
13044
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
12622
13045
|
hasDropdown ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -12644,7 +13067,7 @@ function SiteHeader({
|
|
|
12644
13067
|
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
12645
13068
|
"a",
|
|
12646
13069
|
{
|
|
12647
|
-
href: (
|
|
13070
|
+
href: (_b2 = link.href) != null ? _b2 : "#",
|
|
12648
13071
|
onClick: () => setMobileOpen(false),
|
|
12649
13072
|
className: cn(
|
|
12650
13073
|
"flex items-center py-4 text-xl font-ui font-black transition-colors border-b border-white/8",
|
|
@@ -12654,11 +13077,11 @@ function SiteHeader({
|
|
|
12654
13077
|
}
|
|
12655
13078
|
),
|
|
12656
13079
|
hasDropdown && isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0 pl-4 pb-2", children: link.items.map((item) => {
|
|
12657
|
-
var
|
|
13080
|
+
var _a3;
|
|
12658
13081
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12659
13082
|
"a",
|
|
12660
13083
|
{
|
|
12661
|
-
href: (
|
|
13084
|
+
href: (_a3 = item.href) != null ? _a3 : "#",
|
|
12662
13085
|
onClick: () => setMobileOpen(false),
|
|
12663
13086
|
className: cn(
|
|
12664
13087
|
"py-3 text-base font-ui font-bold transition-colors border-b",
|
|
@@ -12677,7 +13100,7 @@ function SiteHeader({
|
|
|
12677
13100
|
), children: [
|
|
12678
13101
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
12679
13102
|
const isActive = lang.code === activeLang;
|
|
12680
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13103
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
12681
13104
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
12682
13105
|
"text-xs select-none",
|
|
12683
13106
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -12711,7 +13134,7 @@ function SiteHeader({
|
|
|
12711
13134
|
onSearch == null ? void 0 : onSearch();
|
|
12712
13135
|
setMobileOpen(false);
|
|
12713
13136
|
},
|
|
12714
|
-
"aria-label": "Search",
|
|
13137
|
+
"aria-label": (_f = labels == null ? void 0 : labels.search) != null ? _f : "Search",
|
|
12715
13138
|
className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
|
|
12716
13139
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "h-[18px] w-[18px]" })
|
|
12717
13140
|
}
|
|
@@ -12724,7 +13147,7 @@ function SiteHeader({
|
|
|
12724
13147
|
onAccount == null ? void 0 : onAccount();
|
|
12725
13148
|
setMobileOpen(false);
|
|
12726
13149
|
},
|
|
12727
|
-
"aria-label": "Account",
|
|
13150
|
+
"aria-label": (_g = labels == null ? void 0 : labels.account) != null ? _g : "Account",
|
|
12728
13151
|
className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
|
|
12729
13152
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserIcon, { className: "h-[18px] w-[18px]" })
|
|
12730
13153
|
}
|
|
@@ -12739,8 +13162,8 @@ function SiteHeader({
|
|
|
12739
13162
|
);
|
|
12740
13163
|
}
|
|
12741
13164
|
function ThemeToggle({ className }) {
|
|
12742
|
-
const [dark, setDark] =
|
|
12743
|
-
|
|
13165
|
+
const [dark, setDark] = React32__namespace.useState(false);
|
|
13166
|
+
React32__namespace.useEffect(() => {
|
|
12744
13167
|
const saved = localStorage.getItem("theme");
|
|
12745
13168
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
12746
13169
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -12790,7 +13213,7 @@ var chipVariants = classVarianceAuthority.cva(
|
|
|
12790
13213
|
}
|
|
12791
13214
|
}
|
|
12792
13215
|
);
|
|
12793
|
-
var Chip =
|
|
13216
|
+
var Chip = React32__namespace.forwardRef(function Chip2(_a, ref) {
|
|
12794
13217
|
var _b = _a, { className, variant, size, href, children } = _b, props = __objRest(_b, ["className", "variant", "size", "href", "children"]);
|
|
12795
13218
|
const classes = cn(chipVariants({ variant, size }), className);
|
|
12796
13219
|
if (href) {
|
|
@@ -12874,9 +13297,11 @@ function HeartIcon({ filled = false }) {
|
|
|
12874
13297
|
);
|
|
12875
13298
|
}
|
|
12876
13299
|
function TripCardEditorial(props) {
|
|
13300
|
+
var _a, _b, _c, _d;
|
|
12877
13301
|
const {
|
|
12878
13302
|
image,
|
|
12879
13303
|
imageAlt = "",
|
|
13304
|
+
labels,
|
|
12880
13305
|
title,
|
|
12881
13306
|
description,
|
|
12882
13307
|
nights,
|
|
@@ -12892,7 +13317,7 @@ function TripCardEditorial(props) {
|
|
|
12892
13317
|
tag,
|
|
12893
13318
|
tagHref
|
|
12894
13319
|
} = props;
|
|
12895
|
-
const [internalFav, setInternalFav] =
|
|
13320
|
+
const [internalFav, setInternalFav] = React32__namespace.useState(false);
|
|
12896
13321
|
const favorited = favoritedProp != null ? favoritedProp : internalFav;
|
|
12897
13322
|
const handleFav = (e) => {
|
|
12898
13323
|
e.preventDefault();
|
|
@@ -12934,7 +13359,7 @@ function TripCardEditorial(props) {
|
|
|
12934
13359
|
"button",
|
|
12935
13360
|
{
|
|
12936
13361
|
type: "button",
|
|
12937
|
-
"aria-label": favorited ? "Remove from favorites" : "Add to favorites",
|
|
13362
|
+
"aria-label": favorited ? (_a = labels == null ? void 0 : labels.removeFromFavorites) != null ? _a : "Remove from favorites" : (_b = labels == null ? void 0 : labels.addToFavorites) != null ? _b : "Add to favorites",
|
|
12938
13363
|
"aria-pressed": favorited,
|
|
12939
13364
|
onClick: handleFav,
|
|
12940
13365
|
className: cn(
|
|
@@ -12978,7 +13403,7 @@ function TripCardEditorial(props) {
|
|
|
12978
13403
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
|
|
12979
13404
|
nights,
|
|
12980
13405
|
" ",
|
|
12981
|
-
nights === 1 ? "night" : "nights"
|
|
13406
|
+
nights === 1 ? (_c = labels == null ? void 0 : labels.night) != null ? _c : "night" : (_d = labels == null ? void 0 : labels.nights) != null ? _d : "nights"
|
|
12982
13407
|
] })
|
|
12983
13408
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
12984
13409
|
price && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
|
|
@@ -13003,12 +13428,14 @@ function TripCardEditorial(props) {
|
|
|
13003
13428
|
] });
|
|
13004
13429
|
}
|
|
13005
13430
|
function TripCard(props) {
|
|
13431
|
+
var _a, _b;
|
|
13006
13432
|
if (props.variant === "editorial") {
|
|
13007
13433
|
return /* @__PURE__ */ jsxRuntime.jsx(TripCardEditorial, __spreadValues({}, props));
|
|
13008
13434
|
}
|
|
13009
13435
|
const {
|
|
13010
13436
|
image,
|
|
13011
13437
|
imageAlt = "",
|
|
13438
|
+
labels,
|
|
13012
13439
|
status,
|
|
13013
13440
|
nights,
|
|
13014
13441
|
period,
|
|
@@ -13021,6 +13448,7 @@ function TripCard(props) {
|
|
|
13021
13448
|
} = props;
|
|
13022
13449
|
const s = sizeConfig[size];
|
|
13023
13450
|
const statusInfo = status ? statusConfig[status] : null;
|
|
13451
|
+
const statusLabel = statusInfo ? status === "sold-out" ? (_a = labels == null ? void 0 : labels.soldOut) != null ? _a : statusInfo.label : status === "trending" ? (_b = labels == null ? void 0 : labels.trending) != null ? _b : statusInfo.label : statusInfo.label : null;
|
|
13024
13452
|
const meta = [
|
|
13025
13453
|
nights ? `${nights} nights` : null,
|
|
13026
13454
|
period != null ? period : null
|
|
@@ -13046,7 +13474,7 @@ function TripCard(props) {
|
|
|
13046
13474
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent" }),
|
|
13047
13475
|
statusInfo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-1.5 rounded-xl bg-card/90 px-3 py-1.5 backdrop-blur-sm shadow-sm", children: [
|
|
13048
13476
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: statusInfo.icon }),
|
|
13049
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children:
|
|
13477
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusLabel })
|
|
13050
13478
|
] }) }),
|
|
13051
13479
|
!statusInfo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10" }),
|
|
13052
13480
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
|
|
@@ -13140,6 +13568,7 @@ function BlogCard({
|
|
|
13140
13568
|
{
|
|
13141
13569
|
src: image,
|
|
13142
13570
|
alt: imageAlt,
|
|
13571
|
+
title: imageAlt || void 0,
|
|
13143
13572
|
loading: "lazy",
|
|
13144
13573
|
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
|
|
13145
13574
|
}
|
|
@@ -13403,7 +13832,7 @@ function BlogPost({
|
|
|
13403
13832
|
) }),
|
|
13404
13833
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/90 via-black/45 to-transparent" }),
|
|
13405
13834
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-3xl px-6 sm:px-8 pb-9 sm:pb-11", children: [
|
|
13406
|
-
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13835
|
+
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
13407
13836
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13408
13837
|
crumb.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
13409
13838
|
"a",
|
|
@@ -13457,7 +13886,7 @@ function BlogPost({
|
|
|
13457
13886
|
] });
|
|
13458
13887
|
}
|
|
13459
13888
|
function useHlsVideo(videoRef, src) {
|
|
13460
|
-
|
|
13889
|
+
React32__namespace.useEffect(() => {
|
|
13461
13890
|
if (!src || !videoRef.current) return;
|
|
13462
13891
|
const video = videoRef.current;
|
|
13463
13892
|
if (!src.includes(".m3u8")) return;
|
|
@@ -13493,6 +13922,8 @@ function TripHeader({
|
|
|
13493
13922
|
breadcrumb,
|
|
13494
13923
|
destination,
|
|
13495
13924
|
duration,
|
|
13925
|
+
groupSize,
|
|
13926
|
+
labels,
|
|
13496
13927
|
tagline,
|
|
13497
13928
|
chips,
|
|
13498
13929
|
belowMeta,
|
|
@@ -13500,12 +13931,12 @@ function TripHeader({
|
|
|
13500
13931
|
uiVariant = "v1",
|
|
13501
13932
|
className
|
|
13502
13933
|
}) {
|
|
13503
|
-
var _a;
|
|
13504
|
-
const [heroIndex, setHeroIndex] =
|
|
13505
|
-
const [videoReady, setVideoReady] =
|
|
13506
|
-
const videoRef =
|
|
13934
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
13935
|
+
const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
|
|
13936
|
+
const [videoReady, setVideoReady] = React32__namespace.useState(false);
|
|
13937
|
+
const videoRef = React32__namespace.useRef(null);
|
|
13507
13938
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
13508
|
-
const validImages =
|
|
13939
|
+
const validImages = React32__namespace.useMemo(
|
|
13509
13940
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
13510
13941
|
[images]
|
|
13511
13942
|
);
|
|
@@ -13518,9 +13949,9 @@ function TripHeader({
|
|
|
13518
13949
|
const currentSrc = heroSrc(safeIndex);
|
|
13519
13950
|
const showCarousel = !videoUrl && validImages.length > 1;
|
|
13520
13951
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
13521
|
-
const hasMeta = !!(destination || duration);
|
|
13952
|
+
const hasMeta = !!(destination || duration || groupSize);
|
|
13522
13953
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
13523
|
-
|
|
13954
|
+
React32__namespace.useEffect(() => {
|
|
13524
13955
|
if (!videoUrl) return;
|
|
13525
13956
|
const el = videoRef.current;
|
|
13526
13957
|
if (!el) return;
|
|
@@ -13625,7 +14056,7 @@ function TripHeader({
|
|
|
13625
14056
|
(i) => (i - 1 + validImages.length) % validImages.length
|
|
13626
14057
|
),
|
|
13627
14058
|
className: "absolute left-4 top-1/2 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
|
|
13628
|
-
"aria-label": "
|
|
14059
|
+
"aria-label": (_b = labels == null ? void 0 : labels.previousImage) != null ? _b : "Previous image",
|
|
13629
14060
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
|
|
13630
14061
|
}
|
|
13631
14062
|
),
|
|
@@ -13635,7 +14066,7 @@ function TripHeader({
|
|
|
13635
14066
|
type: "button",
|
|
13636
14067
|
onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
|
|
13637
14068
|
className: "absolute right-4 top-1/2 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
|
|
13638
|
-
"aria-label": "
|
|
14069
|
+
"aria-label": (_c = labels == null ? void 0 : labels.nextImage) != null ? _c : "Next image",
|
|
13639
14070
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
|
|
13640
14071
|
}
|
|
13641
14072
|
),
|
|
@@ -13663,7 +14094,7 @@ function TripHeader({
|
|
|
13663
14094
|
chips && chips.length > 0 ? siteHeader ? "-mt-[200px] sm:-mt-[214px]" : "-mt-[168px] sm:-mt-[182px]" : siteHeader ? "-mt-44" : "-mt-36"
|
|
13664
14095
|
),
|
|
13665
14096
|
children: [
|
|
13666
|
-
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14097
|
+
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
13667
14098
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
13668
14099
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
13669
14100
|
] }, i)) }),
|
|
@@ -13678,15 +14109,19 @@ function TripHeader({
|
|
|
13678
14109
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
|
|
13679
14110
|
nights,
|
|
13680
14111
|
" ",
|
|
13681
|
-
nights === 1 ? "
|
|
14112
|
+
nights === 1 ? (_d = labels == null ? void 0 : labels.night) != null ? _d : "night" : (_e = labels == null ? void 0 : labels.nights) != null ? _e : "nights"
|
|
13682
14113
|
] }),
|
|
13683
14114
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white/40", children: "\xB7" }),
|
|
13684
14115
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
|
|
13685
14116
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
|
|
13686
14117
|
duration.days,
|
|
13687
14118
|
" ",
|
|
13688
|
-
duration.days === 1 ? "
|
|
14119
|
+
duration.days === 1 ? (_f = labels == null ? void 0 : labels.day) != null ? _f : "day" : (_g = labels == null ? void 0 : labels.days) != null ? _g : "days"
|
|
13689
14120
|
] })
|
|
14121
|
+
] }),
|
|
14122
|
+
groupSize && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-white/85", children: [
|
|
14123
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
|
|
14124
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: groupSize })
|
|
13690
14125
|
] })
|
|
13691
14126
|
] }) : tagline ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm sm:text-base text-white/80 font-ui", children: tagline }) : null,
|
|
13692
14127
|
chips && chips.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex flex-wrap items-center gap-1.5", children: chips.map((chip, i) => /* @__PURE__ */ jsxRuntime.jsx(Chip, { href: chip.href, children: chip.label }, i)) }),
|
|
@@ -13829,10 +14264,10 @@ function LanguagePicker({
|
|
|
13829
14264
|
}) {
|
|
13830
14265
|
var _a;
|
|
13831
14266
|
const t = VARIANT2[variant];
|
|
13832
|
-
const [open, setOpen] =
|
|
13833
|
-
const ref =
|
|
14267
|
+
const [open, setOpen] = React32__namespace.useState(false);
|
|
14268
|
+
const ref = React32__namespace.useRef(null);
|
|
13834
14269
|
const active = (_a = languages.find((l) => l.code === currentLanguage)) != null ? _a : languages[0];
|
|
13835
|
-
|
|
14270
|
+
React32__namespace.useEffect(() => {
|
|
13836
14271
|
if (!open) return;
|
|
13837
14272
|
const onDocClick = (e) => {
|
|
13838
14273
|
if (ref.current && !ref.current.contains(e.target)) {
|
|
@@ -14033,7 +14468,7 @@ function SiteFooter({
|
|
|
14033
14468
|
children: wrapper
|
|
14034
14469
|
},
|
|
14035
14470
|
b.alt + i
|
|
14036
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
14471
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(React32__namespace.Fragment, { children: wrapper }, b.alt + i);
|
|
14037
14472
|
}) })
|
|
14038
14473
|
] }),
|
|
14039
14474
|
themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
|
|
@@ -14131,7 +14566,10 @@ function Stars({ count = 5 }) {
|
|
|
14131
14566
|
i
|
|
14132
14567
|
)) });
|
|
14133
14568
|
}
|
|
14134
|
-
function ItineraryTimeline({
|
|
14569
|
+
function ItineraryTimeline({
|
|
14570
|
+
steps,
|
|
14571
|
+
transferLabel
|
|
14572
|
+
}) {
|
|
14135
14573
|
return /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "relative flex flex-col gap-0", children: steps.map((step, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "relative flex gap-4 pb-8 last:pb-0", children: [
|
|
14136
14574
|
i < steps.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-3.5 top-7 bottom-0 w-px bg-border" }),
|
|
14137
14575
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 mt-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-full border-2 border-primary bg-background", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-bold text-primary font-ui", children: i + 1 }) }),
|
|
@@ -14142,7 +14580,7 @@ function ItineraryTimeline({ steps }) {
|
|
|
14142
14580
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-3 w-3 mr-1" }),
|
|
14143
14581
|
step.duration
|
|
14144
14582
|
] }),
|
|
14145
|
-
step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: "Transfer" })
|
|
14583
|
+
step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: transferLabel != null ? transferLabel : "Transfer" })
|
|
14146
14584
|
] }),
|
|
14147
14585
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-muted-foreground leading-relaxed [&_p:not(:last-child)]:mb-2 [&_strong]:text-foreground [&_strong]:font-semibold", children: step.description })
|
|
14148
14586
|
] })
|
|
@@ -14159,6 +14597,7 @@ function TripPage({
|
|
|
14159
14597
|
tagline,
|
|
14160
14598
|
destination,
|
|
14161
14599
|
duration,
|
|
14600
|
+
groupSize,
|
|
14162
14601
|
images,
|
|
14163
14602
|
videoUrl,
|
|
14164
14603
|
breadcrumb,
|
|
@@ -14182,6 +14621,7 @@ function TripPage({
|
|
|
14182
14621
|
whenItOperates,
|
|
14183
14622
|
food,
|
|
14184
14623
|
foodGallery,
|
|
14624
|
+
foodGalleryVariant = "gridCompact",
|
|
14185
14625
|
termsAndConditions,
|
|
14186
14626
|
meetingPoints,
|
|
14187
14627
|
meetingPoint,
|
|
@@ -14201,17 +14641,23 @@ function TripPage({
|
|
|
14201
14641
|
currencyEstimates,
|
|
14202
14642
|
priceInfo,
|
|
14203
14643
|
onBook,
|
|
14644
|
+
onBookingSubmit,
|
|
14645
|
+
bookingLoading,
|
|
14646
|
+
bookingDefaults,
|
|
14647
|
+
bookingLabels,
|
|
14204
14648
|
bookLabel,
|
|
14649
|
+
fromLabel,
|
|
14650
|
+
perPersonLabel,
|
|
14205
14651
|
siteHeader,
|
|
14206
14652
|
uiVariant = "v1",
|
|
14207
14653
|
features,
|
|
14208
14654
|
className
|
|
14209
14655
|
}) {
|
|
14210
14656
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
|
|
14211
|
-
const [activeSection, setActiveSection] =
|
|
14212
|
-
const [accordionValue, setAccordionValue] =
|
|
14213
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
14214
|
-
const accordionSectionIds =
|
|
14657
|
+
const [activeSection, setActiveSection] = React32__namespace.useState("");
|
|
14658
|
+
const [accordionValue, setAccordionValue] = React32__namespace.useState([]);
|
|
14659
|
+
const [faqsExpanded, setFaqsExpanded] = React32__namespace.useState(false);
|
|
14660
|
+
const accordionSectionIds = React32__namespace.useMemo(
|
|
14215
14661
|
() => /* @__PURE__ */ new Set([
|
|
14216
14662
|
"when-it-operates",
|
|
14217
14663
|
"how-to-get-there",
|
|
@@ -14225,18 +14671,18 @@ function TripPage({
|
|
|
14225
14671
|
]),
|
|
14226
14672
|
[]
|
|
14227
14673
|
);
|
|
14228
|
-
const [navFloating, setNavFloating] =
|
|
14229
|
-
const [navHidden, setNavHidden] =
|
|
14230
|
-
const [isFloating, setIsFloating] =
|
|
14231
|
-
const [sidebarPos, setSidebarPos] =
|
|
14232
|
-
const [pricingBarVisible, setPricingBarVisible] =
|
|
14233
|
-
const navRef =
|
|
14234
|
-
const navSentinelRef =
|
|
14235
|
-
const sentinelRef =
|
|
14236
|
-
const sidebarPlaceholderRef =
|
|
14237
|
-
const pricingBarRef =
|
|
14238
|
-
const galleryRef =
|
|
14239
|
-
const sections =
|
|
14674
|
+
const [navFloating, setNavFloating] = React32__namespace.useState(false);
|
|
14675
|
+
const [navHidden, setNavHidden] = React32__namespace.useState(false);
|
|
14676
|
+
const [isFloating, setIsFloating] = React32__namespace.useState(false);
|
|
14677
|
+
const [sidebarPos, setSidebarPos] = React32__namespace.useState(null);
|
|
14678
|
+
const [pricingBarVisible, setPricingBarVisible] = React32__namespace.useState(false);
|
|
14679
|
+
const navRef = React32__namespace.useRef(null);
|
|
14680
|
+
const navSentinelRef = React32__namespace.useRef(null);
|
|
14681
|
+
const sentinelRef = React32__namespace.useRef(null);
|
|
14682
|
+
const sidebarPlaceholderRef = React32__namespace.useRef(null);
|
|
14683
|
+
const pricingBarRef = React32__namespace.useRef(null);
|
|
14684
|
+
const galleryRef = React32__namespace.useRef(null);
|
|
14685
|
+
const sections = React32__namespace.useMemo(
|
|
14240
14686
|
() => {
|
|
14241
14687
|
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2;
|
|
14242
14688
|
return [
|
|
@@ -14258,7 +14704,7 @@ function TripPage({
|
|
|
14258
14704
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
14259
14705
|
[]
|
|
14260
14706
|
);
|
|
14261
|
-
|
|
14707
|
+
React32__namespace.useEffect(() => {
|
|
14262
14708
|
const sentinel = navSentinelRef.current;
|
|
14263
14709
|
if (!sentinel) return;
|
|
14264
14710
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -14266,7 +14712,7 @@ function TripPage({
|
|
|
14266
14712
|
update();
|
|
14267
14713
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
14268
14714
|
}, []);
|
|
14269
|
-
|
|
14715
|
+
React32__namespace.useEffect(() => {
|
|
14270
14716
|
const sentinel = sentinelRef.current;
|
|
14271
14717
|
if (!sentinel) return;
|
|
14272
14718
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -14274,7 +14720,7 @@ function TripPage({
|
|
|
14274
14720
|
update();
|
|
14275
14721
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
14276
14722
|
}, []);
|
|
14277
|
-
|
|
14723
|
+
React32__namespace.useEffect(() => {
|
|
14278
14724
|
const measure = () => {
|
|
14279
14725
|
if (!sidebarPlaceholderRef.current) return;
|
|
14280
14726
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -14284,7 +14730,7 @@ function TripPage({
|
|
|
14284
14730
|
window.addEventListener("resize", measure);
|
|
14285
14731
|
return () => window.removeEventListener("resize", measure);
|
|
14286
14732
|
}, [isFloating]);
|
|
14287
|
-
|
|
14733
|
+
React32__namespace.useEffect(() => {
|
|
14288
14734
|
const check = () => {
|
|
14289
14735
|
var _a2;
|
|
14290
14736
|
const target = (_a2 = galleryRef.current) != null ? _a2 : pricingBarRef.current;
|
|
@@ -14295,7 +14741,7 @@ function TripPage({
|
|
|
14295
14741
|
check();
|
|
14296
14742
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
14297
14743
|
}, []);
|
|
14298
|
-
|
|
14744
|
+
React32__namespace.useEffect(() => {
|
|
14299
14745
|
const check = () => {
|
|
14300
14746
|
if (!pricingBarRef.current) return;
|
|
14301
14747
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -14304,7 +14750,7 @@ function TripPage({
|
|
|
14304
14750
|
check();
|
|
14305
14751
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
14306
14752
|
}, []);
|
|
14307
|
-
|
|
14753
|
+
React32__namespace.useEffect(() => {
|
|
14308
14754
|
if (sections.length === 0) return;
|
|
14309
14755
|
setActiveSection(sections[0].id);
|
|
14310
14756
|
const update = () => {
|
|
@@ -14378,6 +14824,15 @@ function TripPage({
|
|
|
14378
14824
|
breadcrumb,
|
|
14379
14825
|
destination,
|
|
14380
14826
|
duration,
|
|
14827
|
+
groupSize,
|
|
14828
|
+
labels: {
|
|
14829
|
+
night: labels == null ? void 0 : labels.night,
|
|
14830
|
+
nights: labels == null ? void 0 : labels.nights,
|
|
14831
|
+
day: labels == null ? void 0 : labels.day,
|
|
14832
|
+
days: labels == null ? void 0 : labels.days,
|
|
14833
|
+
previousImage: labels == null ? void 0 : labels.previousImage,
|
|
14834
|
+
nextImage: labels == null ? void 0 : labels.nextImage
|
|
14835
|
+
},
|
|
14381
14836
|
tagline,
|
|
14382
14837
|
chips,
|
|
14383
14838
|
siteHeader,
|
|
@@ -14438,7 +14893,7 @@ function TripPage({
|
|
|
14438
14893
|
)) })
|
|
14439
14894
|
] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
|
|
14440
14895
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
|
|
14441
|
-
/* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary })
|
|
14896
|
+
/* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
|
|
14442
14897
|
] }),
|
|
14443
14898
|
included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
|
|
14444
14899
|
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
@@ -14475,7 +14930,7 @@ function TripPage({
|
|
|
14475
14930
|
id: "trip-section-when-it-operates",
|
|
14476
14931
|
className: "scroll-mt-20 border-b border-border",
|
|
14477
14932
|
children: [
|
|
14478
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14933
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14479
14934
|
(sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-5 w-5 text-primary" }),
|
|
14480
14935
|
(_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
|
|
14481
14936
|
] }) }),
|
|
@@ -14490,7 +14945,7 @@ function TripPage({
|
|
|
14490
14945
|
id: "trip-section-accommodation",
|
|
14491
14946
|
className: "scroll-mt-20 border-b border-border",
|
|
14492
14947
|
children: [
|
|
14493
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14948
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14494
14949
|
(sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
|
|
14495
14950
|
(_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
|
|
14496
14951
|
] }) }),
|
|
@@ -14499,6 +14954,13 @@ function TripPage({
|
|
|
14499
14954
|
accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
14500
14955
|
PhotoGallery,
|
|
14501
14956
|
{
|
|
14957
|
+
labels: {
|
|
14958
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
14959
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
14960
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
14961
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
14962
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
14963
|
+
},
|
|
14502
14964
|
photos: accommodationGallery,
|
|
14503
14965
|
variant: accommodationGalleryVariant,
|
|
14504
14966
|
initialVisible: 6
|
|
@@ -14515,7 +14977,7 @@ function TripPage({
|
|
|
14515
14977
|
id: "trip-section-food",
|
|
14516
14978
|
className: "scroll-mt-20 border-b border-border",
|
|
14517
14979
|
children: [
|
|
14518
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14980
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14519
14981
|
(sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UtensilsIcon, { className: "h-5 w-5 text-primary" }),
|
|
14520
14982
|
(_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
|
|
14521
14983
|
] }) }),
|
|
@@ -14524,8 +14986,15 @@ function TripPage({
|
|
|
14524
14986
|
foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
14525
14987
|
PhotoGallery,
|
|
14526
14988
|
{
|
|
14989
|
+
labels: {
|
|
14990
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
14991
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
14992
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
14993
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
14994
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
14995
|
+
},
|
|
14527
14996
|
photos: foodGallery,
|
|
14528
|
-
variant:
|
|
14997
|
+
variant: foodGalleryVariant,
|
|
14529
14998
|
initialVisible: 6
|
|
14530
14999
|
}
|
|
14531
15000
|
) })
|
|
@@ -14540,18 +15009,21 @@ function TripPage({
|
|
|
14540
15009
|
id: "trip-section-meeting",
|
|
14541
15010
|
className: "scroll-mt-20 border-b border-border",
|
|
14542
15011
|
children: [
|
|
14543
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15012
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14544
15013
|
(sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-5 w-5 text-primary" }),
|
|
14545
15014
|
(_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
|
|
14546
15015
|
] }) }),
|
|
14547
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) =>
|
|
14548
|
-
|
|
14549
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
14550
|
-
|
|
14551
|
-
/* @__PURE__ */ jsxRuntime.
|
|
14552
|
-
|
|
14553
|
-
|
|
14554
|
-
|
|
15016
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
|
|
15017
|
+
var _a2, _b2, _c2;
|
|
15018
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
|
|
15019
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
|
|
15020
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15021
|
+
mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? (_a2 = labels == null ? void 0 : labels.meetingPointActivity) != null ? _a2 : "Activity location" : mp.type === "alternative" ? (_b2 = labels == null ? void 0 : labels.meetingPointAlternative) != null ? _b2 : "Alternative meeting point" : (_c2 = labels == null ? void 0 : labels.meetingPoint) != null ? _c2 : "Meeting point" }),
|
|
15022
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
|
|
15023
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
|
|
15024
|
+
] })
|
|
15025
|
+
] }, i);
|
|
15026
|
+
}) }) })
|
|
14555
15027
|
]
|
|
14556
15028
|
}
|
|
14557
15029
|
),
|
|
@@ -14562,7 +15034,7 @@ function TripPage({
|
|
|
14562
15034
|
id: "trip-section-how-to-get-there",
|
|
14563
15035
|
className: "scroll-mt-20 border-b border-border",
|
|
14564
15036
|
children: [
|
|
14565
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15037
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14566
15038
|
(sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CompassIcon, { className: "h-5 w-5 text-primary" }),
|
|
14567
15039
|
(_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
|
|
14568
15040
|
] }) }),
|
|
@@ -14577,7 +15049,7 @@ function TripPage({
|
|
|
14577
15049
|
id: "trip-section-weather",
|
|
14578
15050
|
className: "scroll-mt-20 border-b border-border",
|
|
14579
15051
|
children: [
|
|
14580
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15052
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14581
15053
|
(sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-5 w-5 text-primary" }),
|
|
14582
15054
|
(_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
|
|
14583
15055
|
] }) }),
|
|
@@ -14592,7 +15064,7 @@ function TripPage({
|
|
|
14592
15064
|
id: "trip-section-what-to-bring",
|
|
14593
15065
|
className: "scroll-mt-20 border-b border-border",
|
|
14594
15066
|
children: [
|
|
14595
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15067
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14596
15068
|
(sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BackpackIcon, { className: "h-5 w-5 text-primary" }),
|
|
14597
15069
|
(_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
|
|
14598
15070
|
] }) }),
|
|
@@ -14607,7 +15079,7 @@ function TripPage({
|
|
|
14607
15079
|
id: "trip-section-optional-extras",
|
|
14608
15080
|
className: "scroll-mt-20 border-b border-border",
|
|
14609
15081
|
children: [
|
|
14610
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15082
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14611
15083
|
(sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CherryIcon, { className: "h-5 w-5 text-primary" }),
|
|
14612
15084
|
(_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
|
|
14613
15085
|
] }) }),
|
|
@@ -14622,7 +15094,7 @@ function TripPage({
|
|
|
14622
15094
|
id: "trip-section-terms",
|
|
14623
15095
|
className: "scroll-mt-20 border-b border-border",
|
|
14624
15096
|
children: [
|
|
14625
|
-
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
15097
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
14626
15098
|
(sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ReceiptIcon, { className: "h-5 w-5 text-primary" }),
|
|
14627
15099
|
(_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
|
|
14628
15100
|
] }) }),
|
|
@@ -14634,7 +15106,7 @@ function TripPage({
|
|
|
14634
15106
|
}
|
|
14635
15107
|
),
|
|
14636
15108
|
faqs && faqs.length > 0 && (() => {
|
|
14637
|
-
var _a2;
|
|
15109
|
+
var _a2, _b2, _c2;
|
|
14638
15110
|
const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
|
|
14639
15111
|
const hiddenCount = faqs.length - visibleFaqs.length;
|
|
14640
15112
|
return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
|
|
@@ -14656,10 +15128,11 @@ function TripPage({
|
|
|
14656
15128
|
),
|
|
14657
15129
|
children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
14658
15130
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
14659
|
-
"Show less"
|
|
15131
|
+
(_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
|
|
14660
15132
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
14661
15133
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
14662
|
-
"See more
|
|
15134
|
+
(_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
|
|
15135
|
+
" (",
|
|
14663
15136
|
hiddenCount,
|
|
14664
15137
|
")"
|
|
14665
15138
|
] })
|
|
@@ -14700,6 +15173,8 @@ function TripPage({
|
|
|
14700
15173
|
departureTimes,
|
|
14701
15174
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
14702
15175
|
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
15176
|
+
fromLabel,
|
|
15177
|
+
perPersonLabel,
|
|
14703
15178
|
variant: "card",
|
|
14704
15179
|
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
14705
15180
|
benefits,
|
|
@@ -14742,6 +15217,8 @@ function TripPage({
|
|
|
14742
15217
|
departureTimes,
|
|
14743
15218
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
14744
15219
|
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
15220
|
+
fromLabel,
|
|
15221
|
+
perPersonLabel,
|
|
14745
15222
|
variant: "card",
|
|
14746
15223
|
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
14747
15224
|
benefits,
|
|
@@ -14754,12 +15231,27 @@ function TripPage({
|
|
|
14754
15231
|
gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
14755
15232
|
PhotoGallery,
|
|
14756
15233
|
{
|
|
15234
|
+
labels: {
|
|
15235
|
+
seeMore: labels == null ? void 0 : labels.seeMore,
|
|
15236
|
+
showLess: labels == null ? void 0 : labels.showLess,
|
|
15237
|
+
close: labels == null ? void 0 : labels.galleryClose,
|
|
15238
|
+
previous: labels == null ? void 0 : labels.galleryPrevious,
|
|
15239
|
+
next: labels == null ? void 0 : labels.galleryNext
|
|
15240
|
+
},
|
|
14757
15241
|
photos: gallery,
|
|
14758
15242
|
variant: "gridCompact",
|
|
14759
15243
|
initialVisible: 8
|
|
14760
15244
|
}
|
|
14761
15245
|
) }),
|
|
14762
|
-
gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15246
|
+
gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15247
|
+
BookingForm,
|
|
15248
|
+
{
|
|
15249
|
+
labels: bookingLabels,
|
|
15250
|
+
defaultValues: bookingDefaults,
|
|
15251
|
+
onSubmit: onBookingSubmit,
|
|
15252
|
+
loading: bookingLoading
|
|
15253
|
+
}
|
|
15254
|
+
) }) }),
|
|
14763
15255
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed bottom-0 inset-x-0 z-30 lg:hidden border-t border-border bg-background/95 backdrop-blur-sm px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
14764
15256
|
PricingTrip,
|
|
14765
15257
|
{
|
|
@@ -14767,6 +15259,8 @@ function TripPage({
|
|
|
14767
15259
|
currency,
|
|
14768
15260
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
14769
15261
|
bookLabel: bookLabel != null ? bookLabel : "Book now",
|
|
15262
|
+
fromLabel,
|
|
15263
|
+
perPersonLabel,
|
|
14770
15264
|
variant: "compact",
|
|
14771
15265
|
sharp: true,
|
|
14772
15266
|
priceInfo,
|
|
@@ -14779,7 +15273,7 @@ function TripPage({
|
|
|
14779
15273
|
}
|
|
14780
15274
|
);
|
|
14781
15275
|
}
|
|
14782
|
-
function
|
|
15276
|
+
function SectionHeading2({
|
|
14783
15277
|
eyebrow,
|
|
14784
15278
|
title,
|
|
14785
15279
|
rightSlot
|
|
@@ -14800,6 +15294,7 @@ function CategoryPage2({
|
|
|
14800
15294
|
trustpilotMini,
|
|
14801
15295
|
breadcrumb,
|
|
14802
15296
|
siteHeader,
|
|
15297
|
+
heroRightSlot,
|
|
14803
15298
|
popularTours,
|
|
14804
15299
|
popularToursTitle = "More adventures calling your name",
|
|
14805
15300
|
popularToursEyebrow = "Popular tours",
|
|
@@ -14810,6 +15305,7 @@ function CategoryPage2({
|
|
|
14810
15305
|
sortOptions,
|
|
14811
15306
|
defaultSort,
|
|
14812
15307
|
tripsInitialCount = 15,
|
|
15308
|
+
tripListingSlot,
|
|
14813
15309
|
trustpilot,
|
|
14814
15310
|
reviewsTitle = "Don't just take our word for it",
|
|
14815
15311
|
reviewsSubtitle,
|
|
@@ -14826,14 +15322,20 @@ function CategoryPage2({
|
|
|
14826
15322
|
faqInitialCount = 5,
|
|
14827
15323
|
gallery,
|
|
14828
15324
|
galleryTitle,
|
|
15325
|
+
loadMoreLabel,
|
|
15326
|
+
showLessLabel,
|
|
15327
|
+
seeMoreLabel,
|
|
15328
|
+
viewAllPostsLabel,
|
|
15329
|
+
cardLabels,
|
|
15330
|
+
filterLabels,
|
|
14829
15331
|
className
|
|
14830
15332
|
}) {
|
|
14831
15333
|
var _a;
|
|
14832
|
-
const [videoReady, setVideoReady] =
|
|
14833
|
-
const videoRef =
|
|
15334
|
+
const [videoReady, setVideoReady] = React32__namespace.useState(false);
|
|
15335
|
+
const videoRef = React32__namespace.useRef(null);
|
|
14834
15336
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
14835
15337
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
14836
|
-
|
|
15338
|
+
React32__namespace.useEffect(() => {
|
|
14837
15339
|
if (!videoUrl) return;
|
|
14838
15340
|
const el = videoRef.current;
|
|
14839
15341
|
if (!el) return;
|
|
@@ -14848,13 +15350,13 @@ function CategoryPage2({
|
|
|
14848
15350
|
io.observe(el);
|
|
14849
15351
|
return () => io.disconnect();
|
|
14850
15352
|
}, [videoUrl]);
|
|
14851
|
-
const [faqsExpanded, setFaqsExpanded] =
|
|
14852
|
-
const [tripsExpanded, setTripsExpanded] =
|
|
14853
|
-
const [filterValue, setFilterValue] =
|
|
14854
|
-
const [sort, setSort] =
|
|
15353
|
+
const [faqsExpanded, setFaqsExpanded] = React32__namespace.useState(false);
|
|
15354
|
+
const [tripsExpanded, setTripsExpanded] = React32__namespace.useState(false);
|
|
15355
|
+
const [filterValue, setFilterValue] = React32__namespace.useState({});
|
|
15356
|
+
const [sort, setSort] = React32__namespace.useState(
|
|
14855
15357
|
defaultSort != null ? defaultSort : (_a = sortOptions == null ? void 0 : sortOptions[0]) == null ? void 0 : _a.id
|
|
14856
15358
|
);
|
|
14857
|
-
const sortedTrips =
|
|
15359
|
+
const sortedTrips = React32__namespace.useMemo(() => {
|
|
14858
15360
|
const active = Object.entries(filterValue).filter(
|
|
14859
15361
|
([, vals]) => vals && vals.length > 0
|
|
14860
15362
|
);
|
|
@@ -14958,7 +15460,7 @@ function CategoryPage2({
|
|
|
14958
15460
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
14959
15461
|
breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => {
|
|
14960
15462
|
const isLast = i === breadcrumb.length - 1;
|
|
14961
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15463
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React32__namespace.Fragment, { children: [
|
|
14962
15464
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
14963
15465
|
crumb.href && !isLast ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
14964
15466
|
"a",
|
|
@@ -14982,13 +15484,14 @@ function CategoryPage2({
|
|
|
14982
15484
|
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight max-w-3xl", children: title }),
|
|
14983
15485
|
intro && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 text-base sm:text-lg text-white/90 leading-relaxed max-w-2xl [&_strong]:font-semibold [&_a]:underline", children: intro }),
|
|
14984
15486
|
trustpilotMini && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 max-w-sm", children: /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) })
|
|
14985
|
-
] })
|
|
15487
|
+
] }),
|
|
15488
|
+
heroRightSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-5 z-20 sm:bottom-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex max-w-6xl justify-end px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-auto", children: heroRightSlot }) }) })
|
|
14986
15489
|
]
|
|
14987
15490
|
}
|
|
14988
15491
|
),
|
|
14989
15492
|
popularTours && popularTours.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: [
|
|
14990
15493
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14991
|
-
|
|
15494
|
+
SectionHeading2,
|
|
14992
15495
|
{
|
|
14993
15496
|
eyebrow: popularToursEyebrow,
|
|
14994
15497
|
title: popularToursTitle
|
|
@@ -15000,6 +15503,7 @@ function CategoryPage2({
|
|
|
15000
15503
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
15001
15504
|
TripCard,
|
|
15002
15505
|
__spreadProps(__spreadValues({}, cardProps), {
|
|
15506
|
+
labels: cardLabels,
|
|
15003
15507
|
variant: "overlay",
|
|
15004
15508
|
size: (_b = cardProps.size) != null ? _b : "md"
|
|
15005
15509
|
}),
|
|
@@ -15008,64 +15512,69 @@ function CategoryPage2({
|
|
|
15008
15512
|
}) }) })
|
|
15009
15513
|
] }),
|
|
15010
15514
|
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 pt-6 sm:pt-8 pb-12", children: [
|
|
15011
|
-
(tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15012
|
-
|
|
15013
|
-
|
|
15014
|
-
|
|
15015
|
-
|
|
15016
|
-
|
|
15017
|
-
|
|
15018
|
-
|
|
15019
|
-
|
|
15020
|
-
|
|
15021
|
-
|
|
15022
|
-
|
|
15023
|
-
|
|
15024
|
-
|
|
15025
|
-
|
|
15026
|
-
|
|
15027
|
-
" ",
|
|
15028
|
-
|
|
15029
|
-
|
|
15030
|
-
|
|
15031
|
-
|
|
15032
|
-
|
|
15033
|
-
|
|
15034
|
-
|
|
15035
|
-
|
|
15036
|
-
|
|
15037
|
-
|
|
15038
|
-
|
|
15039
|
-
|
|
15040
|
-
|
|
15041
|
-
|
|
15042
|
-
|
|
15043
|
-
|
|
15044
|
-
|
|
15045
|
-
|
|
15046
|
-
|
|
15047
|
-
|
|
15048
|
-
|
|
15049
|
-
|
|
15050
|
-
|
|
15051
|
-
|
|
15052
|
-
|
|
15053
|
-
|
|
15054
|
-
|
|
15055
|
-
|
|
15056
|
-
|
|
15057
|
-
|
|
15058
|
-
|
|
15059
|
-
|
|
15060
|
-
|
|
15061
|
-
|
|
15062
|
-
|
|
15063
|
-
|
|
15064
|
-
|
|
15065
|
-
|
|
15066
|
-
|
|
15067
|
-
|
|
15068
|
-
|
|
15515
|
+
(tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsxRuntime.jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
|
|
15516
|
+
tripListingSlot != null ? tripListingSlot : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15517
|
+
filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15518
|
+
FilterPanel,
|
|
15519
|
+
{
|
|
15520
|
+
variant: "horizontal",
|
|
15521
|
+
labels: filterLabels,
|
|
15522
|
+
groups: filterGroups,
|
|
15523
|
+
value: filterValue,
|
|
15524
|
+
onChange: setFilterValue,
|
|
15525
|
+
onClearAll: () => setFilterValue({}),
|
|
15526
|
+
sortOptions,
|
|
15527
|
+
sort,
|
|
15528
|
+
onSortChange: setSort
|
|
15529
|
+
}
|
|
15530
|
+
) }),
|
|
15531
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
|
|
15532
|
+
sortedTrips.length,
|
|
15533
|
+
" ",
|
|
15534
|
+
sortedTrips.length === 1 ? "trip" : "trips",
|
|
15535
|
+
" found"
|
|
15536
|
+
] }),
|
|
15537
|
+
(() => {
|
|
15538
|
+
const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
|
|
15539
|
+
const hiddenCount = sortedTrips.length - visibleTrips.length;
|
|
15540
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15541
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-6 gap-y-8 lg:gap-x-[35px] lg:gap-y-[38px]", children: visibleTrips.map((trip, i) => {
|
|
15542
|
+
const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
|
|
15543
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
15544
|
+
TripCard,
|
|
15545
|
+
__spreadProps(__spreadValues({}, cardProps), {
|
|
15546
|
+
labels: cardLabels,
|
|
15547
|
+
className: cn("w-full h-auto", cardProps.className)
|
|
15548
|
+
}),
|
|
15549
|
+
i
|
|
15550
|
+
);
|
|
15551
|
+
}) }),
|
|
15552
|
+
sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15553
|
+
"button",
|
|
15554
|
+
{
|
|
15555
|
+
type: "button",
|
|
15556
|
+
onClick: () => setTripsExpanded((v) => !v),
|
|
15557
|
+
className: cn(
|
|
15558
|
+
"inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
|
|
15559
|
+
"text-sm font-semibold text-foreground shadow-sm",
|
|
15560
|
+
"hover:bg-muted transition-colors duration-150",
|
|
15561
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
15562
|
+
),
|
|
15563
|
+
children: tripsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15564
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
15565
|
+
showLessLabel != null ? showLessLabel : "Show less"
|
|
15566
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15567
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
15568
|
+
loadMoreLabel != null ? loadMoreLabel : "Load more",
|
|
15569
|
+
" (",
|
|
15570
|
+
hiddenCount,
|
|
15571
|
+
")"
|
|
15572
|
+
] })
|
|
15573
|
+
}
|
|
15574
|
+
) })
|
|
15575
|
+
] });
|
|
15576
|
+
})()
|
|
15577
|
+
] })
|
|
15069
15578
|
] }),
|
|
15070
15579
|
trustpilot && /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12 border-t border-border", children: [
|
|
15071
15580
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground font-heading mb-2", children: reviewsTitle }),
|
|
@@ -15102,7 +15611,7 @@ function CategoryPage2({
|
|
|
15102
15611
|
href: travelGuideHref != null ? travelGuideHref : blogPostsViewAllHref,
|
|
15103
15612
|
className: "inline-flex items-center gap-1.5 text-sm font-semibold text-primary hover:underline",
|
|
15104
15613
|
children: [
|
|
15105
|
-
travelGuideHref ? travelGuideLabel : "View all posts",
|
|
15614
|
+
travelGuideHref ? travelGuideLabel : viewAllPostsLabel != null ? viewAllPostsLabel : "View all posts",
|
|
15106
15615
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4" })
|
|
15107
15616
|
]
|
|
15108
15617
|
}
|
|
@@ -15131,10 +15640,11 @@ function CategoryPage2({
|
|
|
15131
15640
|
),
|
|
15132
15641
|
children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15133
15642
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
15134
|
-
"Show less"
|
|
15643
|
+
showLessLabel != null ? showLessLabel : "Show less"
|
|
15135
15644
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15136
15645
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
|
|
15137
|
-
"See more
|
|
15646
|
+
seeMoreLabel != null ? seeMoreLabel : "See more",
|
|
15647
|
+
" (",
|
|
15138
15648
|
hiddenCount,
|
|
15139
15649
|
")"
|
|
15140
15650
|
] })
|
|
@@ -15202,6 +15712,7 @@ function ActivityCard({
|
|
|
15202
15712
|
{
|
|
15203
15713
|
src: image,
|
|
15204
15714
|
alt: imageAlt,
|
|
15715
|
+
title: imageAlt || void 0,
|
|
15205
15716
|
className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
|
|
15206
15717
|
}
|
|
15207
15718
|
),
|
|
@@ -15246,12 +15757,12 @@ function Toast({
|
|
|
15246
15757
|
duration = 6e3,
|
|
15247
15758
|
className
|
|
15248
15759
|
}) {
|
|
15249
|
-
const [mounted, setMounted] =
|
|
15250
|
-
const [visible, setVisible] =
|
|
15251
|
-
|
|
15760
|
+
const [mounted, setMounted] = React32__namespace.useState(false);
|
|
15761
|
+
const [visible, setVisible] = React32__namespace.useState(true);
|
|
15762
|
+
React32__namespace.useEffect(() => {
|
|
15252
15763
|
setMounted(true);
|
|
15253
15764
|
}, []);
|
|
15254
|
-
|
|
15765
|
+
React32__namespace.useEffect(() => {
|
|
15255
15766
|
if (duration === 0) return;
|
|
15256
15767
|
const t = setTimeout(() => {
|
|
15257
15768
|
setVisible(false);
|
|
@@ -15658,21 +16169,21 @@ function LeadCapturePopup({
|
|
|
15658
16169
|
}) {
|
|
15659
16170
|
var _a;
|
|
15660
16171
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
15661
|
-
const [open, setOpen] =
|
|
15662
|
-
const [closing, setClosing] =
|
|
15663
|
-
const [submitted, setSubmitted] =
|
|
15664
|
-
const [submitting, setSubmitting] =
|
|
15665
|
-
const [error, setError] =
|
|
15666
|
-
const [name, setName] =
|
|
15667
|
-
const [email, setEmail] =
|
|
15668
|
-
const [travelDate, setTravelDate] =
|
|
15669
|
-
const panelRef =
|
|
15670
|
-
const nameRef =
|
|
15671
|
-
const show =
|
|
16172
|
+
const [open, setOpen] = React32.useState(false);
|
|
16173
|
+
const [closing, setClosing] = React32.useState(false);
|
|
16174
|
+
const [submitted, setSubmitted] = React32.useState(false);
|
|
16175
|
+
const [submitting, setSubmitting] = React32.useState(false);
|
|
16176
|
+
const [error, setError] = React32.useState(null);
|
|
16177
|
+
const [name, setName] = React32.useState("");
|
|
16178
|
+
const [email, setEmail] = React32.useState("");
|
|
16179
|
+
const [travelDate, setTravelDate] = React32.useState("");
|
|
16180
|
+
const panelRef = React32.useRef(null);
|
|
16181
|
+
const nameRef = React32.useRef(null);
|
|
16182
|
+
const show = React32.useCallback(() => {
|
|
15672
16183
|
if (isDismissed()) return;
|
|
15673
16184
|
setOpen(true);
|
|
15674
16185
|
}, []);
|
|
15675
|
-
|
|
16186
|
+
React32.useEffect(() => {
|
|
15676
16187
|
var _a2;
|
|
15677
16188
|
if (isDismissed()) return;
|
|
15678
16189
|
if (config.trigger === "delay") {
|
|
@@ -15699,7 +16210,7 @@ function LeadCapturePopup({
|
|
|
15699
16210
|
return () => window.removeEventListener("scroll", handler);
|
|
15700
16211
|
}
|
|
15701
16212
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
15702
|
-
|
|
16213
|
+
React32.useEffect(() => {
|
|
15703
16214
|
if (open && !submitted) {
|
|
15704
16215
|
requestAnimationFrame(() => {
|
|
15705
16216
|
var _a2;
|
|
@@ -15707,7 +16218,7 @@ function LeadCapturePopup({
|
|
|
15707
16218
|
});
|
|
15708
16219
|
}
|
|
15709
16220
|
}, [open, submitted]);
|
|
15710
|
-
const close =
|
|
16221
|
+
const close = React32.useCallback(() => {
|
|
15711
16222
|
setClosing(true);
|
|
15712
16223
|
setDismissed(config.dismissDays);
|
|
15713
16224
|
setTimeout(() => {
|
|
@@ -15715,7 +16226,7 @@ function LeadCapturePopup({
|
|
|
15715
16226
|
setClosing(false);
|
|
15716
16227
|
}, 250);
|
|
15717
16228
|
}, [config.dismissDays]);
|
|
15718
|
-
|
|
16229
|
+
React32.useEffect(() => {
|
|
15719
16230
|
if (!open) return;
|
|
15720
16231
|
const handler = (e) => {
|
|
15721
16232
|
if (e.key === "Escape") close();
|
|
@@ -15723,7 +16234,7 @@ function LeadCapturePopup({
|
|
|
15723
16234
|
document.addEventListener("keydown", handler);
|
|
15724
16235
|
return () => document.removeEventListener("keydown", handler);
|
|
15725
16236
|
}, [open, close]);
|
|
15726
|
-
const onOverlayClick =
|
|
16237
|
+
const onOverlayClick = React32.useCallback(
|
|
15727
16238
|
(e) => {
|
|
15728
16239
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
15729
16240
|
close();
|
|
@@ -15961,11 +16472,11 @@ function ExoOrb({
|
|
|
15961
16472
|
trackCursor = true,
|
|
15962
16473
|
className
|
|
15963
16474
|
}) {
|
|
15964
|
-
const uid =
|
|
16475
|
+
const uid = React32.useId().replace(/:/g, "");
|
|
15965
16476
|
const id = (name) => `exo-orb-${uid}-${name}`;
|
|
15966
|
-
const rootRef =
|
|
15967
|
-
const pupilRef =
|
|
15968
|
-
|
|
16477
|
+
const rootRef = React32.useRef(null);
|
|
16478
|
+
const pupilRef = React32.useRef(null);
|
|
16479
|
+
React32.useEffect(() => {
|
|
15969
16480
|
if (!trackCursor) return;
|
|
15970
16481
|
if (typeof window === "undefined") return;
|
|
15971
16482
|
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
@@ -16161,13 +16672,13 @@ function AskExo({
|
|
|
16161
16672
|
teaserDelayMs = 2500,
|
|
16162
16673
|
teaserDurationMs = 6e3
|
|
16163
16674
|
}) {
|
|
16164
|
-
const [open, setOpen] =
|
|
16165
|
-
const [question, setQuestion] =
|
|
16166
|
-
const [teaserVisible, setTeaserVisible] =
|
|
16675
|
+
const [open, setOpen] = React32.useState(false);
|
|
16676
|
+
const [question, setQuestion] = React32.useState("");
|
|
16677
|
+
const [teaserVisible, setTeaserVisible] = React32.useState(false);
|
|
16167
16678
|
const teaserEnabled = !!teaser && teaser !== "";
|
|
16168
|
-
const inputRef =
|
|
16169
|
-
const textareaRef =
|
|
16170
|
-
|
|
16679
|
+
const inputRef = React32.useRef(null);
|
|
16680
|
+
const textareaRef = React32.useRef(null);
|
|
16681
|
+
React32.useEffect(() => {
|
|
16171
16682
|
if (!open) {
|
|
16172
16683
|
setQuestion("");
|
|
16173
16684
|
return;
|
|
@@ -16179,7 +16690,7 @@ function AskExo({
|
|
|
16179
16690
|
}, 200);
|
|
16180
16691
|
return () => clearTimeout(t);
|
|
16181
16692
|
}, [open, variant]);
|
|
16182
|
-
|
|
16693
|
+
React32.useEffect(() => {
|
|
16183
16694
|
if (!open) return;
|
|
16184
16695
|
const onKey = (e) => {
|
|
16185
16696
|
if (e.key === "Escape") setOpen(false);
|
|
@@ -16187,7 +16698,7 @@ function AskExo({
|
|
|
16187
16698
|
document.addEventListener("keydown", onKey);
|
|
16188
16699
|
return () => document.removeEventListener("keydown", onKey);
|
|
16189
16700
|
}, [open]);
|
|
16190
|
-
|
|
16701
|
+
React32.useEffect(() => {
|
|
16191
16702
|
if (!teaserEnabled || open) return;
|
|
16192
16703
|
if (typeof window === "undefined") return;
|
|
16193
16704
|
const showTimer = setTimeout(() => setTeaserVisible(true), teaserDelayMs);
|
|
@@ -16200,7 +16711,7 @@ function AskExo({
|
|
|
16200
16711
|
clearTimeout(hideTimer);
|
|
16201
16712
|
};
|
|
16202
16713
|
}, [teaserEnabled, teaserDelayMs, teaserDurationMs, open]);
|
|
16203
|
-
|
|
16714
|
+
React32.useEffect(() => {
|
|
16204
16715
|
if (open) setTeaserVisible(false);
|
|
16205
16716
|
}, [open]);
|
|
16206
16717
|
const askExo = (q) => {
|
|
@@ -16753,8 +17264,8 @@ function ShareWidget({
|
|
|
16753
17264
|
title = "Invite friends & lower the price",
|
|
16754
17265
|
className
|
|
16755
17266
|
}) {
|
|
16756
|
-
const [copied, setCopied] =
|
|
16757
|
-
const [showToast, setShowToast] =
|
|
17267
|
+
const [copied, setCopied] = React32__namespace.useState(false);
|
|
17268
|
+
const [showToast, setShowToast] = React32__namespace.useState(false);
|
|
16758
17269
|
const encodedUrl = encodeURIComponent(url);
|
|
16759
17270
|
const encodedMsg = encodeURIComponent(`${message} ${url}`);
|
|
16760
17271
|
const channels = [
|
|
@@ -16903,13 +17414,1410 @@ function StickyBookingCard({
|
|
|
16903
17414
|
}
|
|
16904
17415
|
);
|
|
16905
17416
|
}
|
|
17417
|
+
var DEFAULT_TRUSTPILOT = {
|
|
17418
|
+
businessUnitId: "6171e6a56fc555750dd81ae7",
|
|
17419
|
+
templateId: "5419b732fbfb950b10de65e5",
|
|
17420
|
+
locale: "en-US",
|
|
17421
|
+
styleHeight: "24px",
|
|
17422
|
+
styleWidth: "100%",
|
|
17423
|
+
token: "d3580e48-fedc-4b14-b705-172180cf241d",
|
|
17424
|
+
theme: "dark",
|
|
17425
|
+
fallbackHref: "https://www.trustpilot.com/review/planetaexo.com",
|
|
17426
|
+
fallbackLabel: "Excellent"
|
|
17427
|
+
};
|
|
17428
|
+
function RatingStars({ stars = 5 }) {
|
|
17429
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", "aria-hidden": true, children: Array.from({ length: 5 }).map((_, i) => {
|
|
17430
|
+
const filled = i + 1 <= Math.round(stars);
|
|
17431
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
17432
|
+
"span",
|
|
17433
|
+
{
|
|
17434
|
+
className: cn(
|
|
17435
|
+
"flex h-5 w-5 items-center justify-center rounded-[3px]",
|
|
17436
|
+
filled ? "bg-primary" : "bg-white/30"
|
|
17437
|
+
),
|
|
17438
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.StarIcon, { className: "h-3 w-3 fill-white text-white" })
|
|
17439
|
+
},
|
|
17440
|
+
i
|
|
17441
|
+
);
|
|
17442
|
+
}) });
|
|
17443
|
+
}
|
|
17444
|
+
function Rating({ label, stars = 5, provider, href }) {
|
|
17445
|
+
const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17446
|
+
label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-bold text-white", children: label }),
|
|
17447
|
+
/* @__PURE__ */ jsxRuntime.jsx(RatingStars, { stars }),
|
|
17448
|
+
provider && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1 text-sm font-ui font-bold text-white", children: [
|
|
17449
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.StarIcon, { className: "h-4 w-4 fill-primary text-primary" }),
|
|
17450
|
+
provider
|
|
17451
|
+
] })
|
|
17452
|
+
] });
|
|
17453
|
+
if (href) {
|
|
17454
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
17455
|
+
"a",
|
|
17456
|
+
{
|
|
17457
|
+
href,
|
|
17458
|
+
target: "_blank",
|
|
17459
|
+
rel: "noreferrer noopener",
|
|
17460
|
+
"aria-label": `${label != null ? label : ""} ${stars} out of 5 \u2014 ${provider != null ? provider : "reviews"}`.trim(),
|
|
17461
|
+
className: "inline-flex items-center gap-2.5 transition-opacity hover:opacity-90",
|
|
17462
|
+
children: content
|
|
17463
|
+
}
|
|
17464
|
+
);
|
|
17465
|
+
}
|
|
17466
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex items-center gap-2.5", children: content });
|
|
17467
|
+
}
|
|
17468
|
+
function HomeHeader({
|
|
17469
|
+
images,
|
|
17470
|
+
videoUrl,
|
|
17471
|
+
eyebrow,
|
|
17472
|
+
title,
|
|
17473
|
+
subtitle,
|
|
17474
|
+
cta,
|
|
17475
|
+
trustpilot,
|
|
17476
|
+
rating,
|
|
17477
|
+
pressLogos,
|
|
17478
|
+
pressLabel = "In the press",
|
|
17479
|
+
pressLabelHref,
|
|
17480
|
+
siteHeader,
|
|
17481
|
+
align = "center",
|
|
17482
|
+
className
|
|
17483
|
+
}) {
|
|
17484
|
+
var _a;
|
|
17485
|
+
const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
|
|
17486
|
+
const [videoReady, setVideoReady] = React32__namespace.useState(false);
|
|
17487
|
+
const videoRef = React32__namespace.useRef(null);
|
|
17488
|
+
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
17489
|
+
const validImages = React32__namespace.useMemo(
|
|
17490
|
+
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
17491
|
+
[images]
|
|
17492
|
+
);
|
|
17493
|
+
const hasHeroImage = validImages.length > 0;
|
|
17494
|
+
const heroSrc = (i) => {
|
|
17495
|
+
var _a2;
|
|
17496
|
+
return (_a2 = validImages[i]) != null ? _a2 : "";
|
|
17497
|
+
};
|
|
17498
|
+
const safeIndex = Math.min(heroIndex, Math.max(0, validImages.length - 1));
|
|
17499
|
+
const currentSrc = heroSrc(safeIndex);
|
|
17500
|
+
const showCarousel = !videoUrl && validImages.length > 1;
|
|
17501
|
+
const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
|
|
17502
|
+
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
17503
|
+
React32__namespace.useEffect(() => {
|
|
17504
|
+
if (!videoUrl) return;
|
|
17505
|
+
const el = videoRef.current;
|
|
17506
|
+
if (!el) return;
|
|
17507
|
+
const observer = new IntersectionObserver(
|
|
17508
|
+
([entry]) => {
|
|
17509
|
+
if (entry.isIntersecting) {
|
|
17510
|
+
el.play().catch(() => {
|
|
17511
|
+
});
|
|
17512
|
+
} else {
|
|
17513
|
+
el.pause();
|
|
17514
|
+
}
|
|
17515
|
+
},
|
|
17516
|
+
{ threshold: 0.1 }
|
|
17517
|
+
);
|
|
17518
|
+
observer.observe(el);
|
|
17519
|
+
return () => observer.disconnect();
|
|
17520
|
+
}, [videoUrl]);
|
|
17521
|
+
const isCenter = align === "center";
|
|
17522
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17523
|
+
"section",
|
|
17524
|
+
{
|
|
17525
|
+
className: cn(
|
|
17526
|
+
"relative w-full overflow-hidden",
|
|
17527
|
+
"h-screen min-h-[640px]",
|
|
17528
|
+
hasHeroImage ? "bg-muted" : "bg-zinc-900",
|
|
17529
|
+
className
|
|
17530
|
+
),
|
|
17531
|
+
"data-home-header-align": align,
|
|
17532
|
+
children: [
|
|
17533
|
+
!videoUrl && !hasHeroImage && /* @__PURE__ */ jsxRuntime.jsx(
|
|
17534
|
+
"div",
|
|
17535
|
+
{
|
|
17536
|
+
className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950",
|
|
17537
|
+
"aria-hidden": true
|
|
17538
|
+
}
|
|
17539
|
+
),
|
|
17540
|
+
videoUrl ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17541
|
+
hasHeroImage ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
17542
|
+
Picture,
|
|
17543
|
+
{
|
|
17544
|
+
src: validImages[0],
|
|
17545
|
+
alt: "",
|
|
17546
|
+
"aria-hidden": true,
|
|
17547
|
+
fetchPriority: "high",
|
|
17548
|
+
eager: true,
|
|
17549
|
+
className: cn(
|
|
17550
|
+
"absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
|
|
17551
|
+
videoReady ? "opacity-0 pointer-events-none" : "opacity-100"
|
|
17552
|
+
)
|
|
17553
|
+
}
|
|
17554
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
17555
|
+
"div",
|
|
17556
|
+
{
|
|
17557
|
+
className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950 transition-opacity duration-700",
|
|
17558
|
+
"aria-hidden": true
|
|
17559
|
+
}
|
|
17560
|
+
),
|
|
17561
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17562
|
+
"video",
|
|
17563
|
+
{
|
|
17564
|
+
ref: videoRef,
|
|
17565
|
+
src: isHls ? void 0 : videoUrl,
|
|
17566
|
+
autoPlay: true,
|
|
17567
|
+
muted: true,
|
|
17568
|
+
loop: true,
|
|
17569
|
+
playsInline: true,
|
|
17570
|
+
preload: "auto",
|
|
17571
|
+
poster: hasHeroImage ? validImages[0] : void 0,
|
|
17572
|
+
onCanPlay: () => setVideoReady(true),
|
|
17573
|
+
className: cn(
|
|
17574
|
+
"absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
|
|
17575
|
+
videoReady ? "opacity-100" : "opacity-0"
|
|
17576
|
+
)
|
|
17577
|
+
}
|
|
17578
|
+
)
|
|
17579
|
+
] }) : hasHeroImage ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
17580
|
+
Picture,
|
|
17581
|
+
{
|
|
17582
|
+
src: currentSrc,
|
|
17583
|
+
alt: title,
|
|
17584
|
+
fetchPriority: safeIndex === 0 ? "high" : "auto",
|
|
17585
|
+
eager: safeIndex === 0,
|
|
17586
|
+
className: "absolute inset-0 h-full w-full object-cover transition-opacity duration-700"
|
|
17587
|
+
}
|
|
17588
|
+
) : null,
|
|
17589
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/30", "aria-hidden": true }),
|
|
17590
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17591
|
+
"div",
|
|
17592
|
+
{
|
|
17593
|
+
className: "absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-black/30",
|
|
17594
|
+
"aria-hidden": true
|
|
17595
|
+
}
|
|
17596
|
+
),
|
|
17597
|
+
siteHeader && /* @__PURE__ */ jsxRuntime.jsx(
|
|
17598
|
+
SiteHeader,
|
|
17599
|
+
__spreadProps(__spreadValues({}, Array.isArray(siteHeader) ? { links: siteHeader } : typeof siteHeader === "object" ? siteHeader : {}), {
|
|
17600
|
+
position: "overlay"
|
|
17601
|
+
})
|
|
17602
|
+
),
|
|
17603
|
+
showCarousel && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17604
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17605
|
+
"button",
|
|
17606
|
+
{
|
|
17607
|
+
type: "button",
|
|
17608
|
+
onClick: () => setHeroIndex(
|
|
17609
|
+
(i) => (i - 1 + validImages.length) % validImages.length
|
|
17610
|
+
),
|
|
17611
|
+
className: "absolute left-4 top-1/2 z-20 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
|
|
17612
|
+
"aria-label": "Previous image",
|
|
17613
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
|
|
17614
|
+
}
|
|
17615
|
+
),
|
|
17616
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17617
|
+
"button",
|
|
17618
|
+
{
|
|
17619
|
+
type: "button",
|
|
17620
|
+
onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
|
|
17621
|
+
className: "absolute right-4 top-1/2 z-20 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
|
|
17622
|
+
"aria-label": "Next image",
|
|
17623
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
|
|
17624
|
+
}
|
|
17625
|
+
)
|
|
17626
|
+
] }),
|
|
17627
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
17628
|
+
"div",
|
|
17629
|
+
{
|
|
17630
|
+
className: cn(
|
|
17631
|
+
"absolute inset-0 z-10 flex flex-col justify-center",
|
|
17632
|
+
"mx-auto w-full max-w-6xl px-6 sm:px-8",
|
|
17633
|
+
"pt-[72px]",
|
|
17634
|
+
// clear the overlay header
|
|
17635
|
+
pressLogos && pressLogos.length > 0 ? "pb-28" : "pb-16",
|
|
17636
|
+
isCenter ? "items-center text-center" : "items-start text-left"
|
|
17637
|
+
),
|
|
17638
|
+
children: [
|
|
17639
|
+
eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs sm:text-sm font-ui font-bold uppercase tracking-[0.2em] text-primary-400", children: eyebrow }),
|
|
17640
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17641
|
+
"h1",
|
|
17642
|
+
{
|
|
17643
|
+
className: cn(
|
|
17644
|
+
"font-heading font-black uppercase text-white leading-[0.95]",
|
|
17645
|
+
"text-5xl sm:text-6xl lg:text-7xl",
|
|
17646
|
+
isCenter ? "max-w-4xl" : "max-w-3xl"
|
|
17647
|
+
),
|
|
17648
|
+
children: title
|
|
17649
|
+
}
|
|
17650
|
+
),
|
|
17651
|
+
subtitle && /* @__PURE__ */ jsxRuntime.jsx(
|
|
17652
|
+
"p",
|
|
17653
|
+
{
|
|
17654
|
+
className: cn(
|
|
17655
|
+
"mt-5 text-lg sm:text-xl font-sans text-white/90",
|
|
17656
|
+
isCenter ? "max-w-2xl" : "max-w-xl"
|
|
17657
|
+
),
|
|
17658
|
+
children: subtitle
|
|
17659
|
+
}
|
|
17660
|
+
),
|
|
17661
|
+
cta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: cta.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
17662
|
+
"a",
|
|
17663
|
+
{
|
|
17664
|
+
href: cta.href,
|
|
17665
|
+
onClick: cta.onClick,
|
|
17666
|
+
className: buttonVariants({ size: "lg" }),
|
|
17667
|
+
children: cta.label
|
|
17668
|
+
}
|
|
17669
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "lg", onClick: cta.onClick, children: cta.label }) }),
|
|
17670
|
+
tpConfig ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17671
|
+
"div",
|
|
17672
|
+
{
|
|
17673
|
+
className: cn(
|
|
17674
|
+
"home-trustpilot relative mt-8",
|
|
17675
|
+
// Wide enough for the Micro Star to show the full "Excellent
|
|
17676
|
+
// ★★★★★ Trustpilot" lockup — at 260px the Trustpilot wordmark
|
|
17677
|
+
// was clipped.
|
|
17678
|
+
isCenter && "w-full max-w-[340px]"
|
|
17679
|
+
),
|
|
17680
|
+
children: [
|
|
17681
|
+
/* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: tpConfig }),
|
|
17682
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17683
|
+
"a",
|
|
17684
|
+
{
|
|
17685
|
+
href: (_a = tpConfig.fallbackHref) != null ? _a : "https://www.trustpilot.com/review/planetaexo.com",
|
|
17686
|
+
target: "_blank",
|
|
17687
|
+
rel: "noopener noreferrer",
|
|
17688
|
+
"aria-label": "Read our reviews on Trustpilot",
|
|
17689
|
+
className: "absolute inset-0 z-10"
|
|
17690
|
+
}
|
|
17691
|
+
)
|
|
17692
|
+
]
|
|
17693
|
+
}
|
|
17694
|
+
) : rating ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsxRuntime.jsx(Rating, __spreadValues({}, rating)) }) : null
|
|
17695
|
+
]
|
|
17696
|
+
}
|
|
17697
|
+
),
|
|
17698
|
+
pressLogos && pressLogos.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0 z-10 pb-7", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto flex w-full max-w-6xl flex-wrap items-center justify-center gap-x-7 gap-y-3 px-6 sm:px-8", children: [
|
|
17699
|
+
pressLabelHref ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
17700
|
+
"a",
|
|
17701
|
+
{
|
|
17702
|
+
href: pressLabelHref,
|
|
17703
|
+
target: "_blank",
|
|
17704
|
+
rel: "noopener noreferrer",
|
|
17705
|
+
className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70 transition-colors hover:text-white",
|
|
17706
|
+
children: pressLabel
|
|
17707
|
+
}
|
|
17708
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70", children: pressLabel }),
|
|
17709
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-nowrap items-center justify-center gap-x-7", children: [
|
|
17710
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden h-5 w-px bg-white/25 sm:block", "aria-hidden": true }),
|
|
17711
|
+
pressLogos.map((logo, i) => {
|
|
17712
|
+
var _a2, _b, _c, _d;
|
|
17713
|
+
const content = logo.src ? (
|
|
17714
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
17715
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17716
|
+
"img",
|
|
17717
|
+
{
|
|
17718
|
+
src: logo.src,
|
|
17719
|
+
alt: (_b = (_a2 = logo.alt) != null ? _a2 : logo.label) != null ? _b : "Press logo",
|
|
17720
|
+
className: "h-12 w-12 shrink-0 select-none object-contain",
|
|
17721
|
+
draggable: false
|
|
17722
|
+
}
|
|
17723
|
+
)
|
|
17724
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-heading text-base font-bold uppercase tracking-wide", children: logo.label });
|
|
17725
|
+
return logo.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
17726
|
+
"a",
|
|
17727
|
+
{
|
|
17728
|
+
href: logo.href,
|
|
17729
|
+
target: "_blank",
|
|
17730
|
+
rel: "noopener noreferrer",
|
|
17731
|
+
"aria-label": (_d = (_c = logo.alt) != null ? _c : logo.label) != null ? _d : "Press article",
|
|
17732
|
+
className: "shrink-0 text-white/80 opacity-100 transition-opacity hover:opacity-100 hover:text-white focus-visible:opacity-100 [&>img]:opacity-80 [&>img]:hover:opacity-100 [&>img]:transition-opacity",
|
|
17733
|
+
children: content
|
|
17734
|
+
},
|
|
17735
|
+
i
|
|
17736
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
17737
|
+
"span",
|
|
17738
|
+
{
|
|
17739
|
+
className: "shrink-0 text-white/80 [&>img]:opacity-80",
|
|
17740
|
+
children: content
|
|
17741
|
+
},
|
|
17742
|
+
i
|
|
17743
|
+
);
|
|
17744
|
+
})
|
|
17745
|
+
] })
|
|
17746
|
+
] }) })
|
|
17747
|
+
]
|
|
17748
|
+
}
|
|
17749
|
+
);
|
|
17750
|
+
}
|
|
17751
|
+
var ACCENT_PILL = "bg-primary text-primary-foreground";
|
|
17752
|
+
var ACCENT_BUTTON = "bg-primary text-primary-foreground hover:bg-primary/90";
|
|
17753
|
+
var THEME = {
|
|
17754
|
+
dark: {
|
|
17755
|
+
section: "bg-neutral-950",
|
|
17756
|
+
heading: "text-white",
|
|
17757
|
+
body: "text-white/60",
|
|
17758
|
+
tabTrack: "bg-white/5 border-white/10",
|
|
17759
|
+
tabActive: ACCENT_PILL,
|
|
17760
|
+
tabIdle: "text-white/60 hover:text-white",
|
|
17761
|
+
cardRing: "focus-visible:ring-white/70 focus-visible:ring-offset-neutral-950",
|
|
17762
|
+
divider: "border-white/15"
|
|
17763
|
+
},
|
|
17764
|
+
light: {
|
|
17765
|
+
/* Explicit light colours (not mode-aware tokens) so this variant stays a
|
|
17766
|
+
light surface even when the app is in dark mode. */
|
|
17767
|
+
section: "bg-white",
|
|
17768
|
+
heading: "text-neutral-900",
|
|
17769
|
+
body: "text-neutral-500",
|
|
17770
|
+
tabTrack: "bg-neutral-100 border-black/10",
|
|
17771
|
+
tabActive: ACCENT_PILL,
|
|
17772
|
+
tabIdle: "text-neutral-500 hover:text-neutral-900",
|
|
17773
|
+
cardRing: "focus-visible:ring-neutral-900/40 focus-visible:ring-offset-white",
|
|
17774
|
+
divider: "border-black/10"
|
|
17775
|
+
}
|
|
17776
|
+
};
|
|
17777
|
+
var BENTO_SPAN = {
|
|
17778
|
+
featured: "col-span-2 row-span-2",
|
|
17779
|
+
tall: "col-span-2 sm:col-span-1 row-span-2",
|
|
17780
|
+
wide: "col-span-2",
|
|
17781
|
+
normal: "col-span-2 sm:col-span-1"
|
|
17782
|
+
};
|
|
17783
|
+
function BentoTile({
|
|
17784
|
+
card,
|
|
17785
|
+
ring
|
|
17786
|
+
}) {
|
|
17787
|
+
var _a, _b, _c;
|
|
17788
|
+
const isFeatured = card.size === "featured";
|
|
17789
|
+
const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17790
|
+
card.image ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17791
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17792
|
+
Picture,
|
|
17793
|
+
{
|
|
17794
|
+
src: card.image,
|
|
17795
|
+
alt: (_a = card.imageAlt) != null ? _a : card.label,
|
|
17796
|
+
loading: "lazy",
|
|
17797
|
+
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
|
|
17798
|
+
}
|
|
17799
|
+
),
|
|
17800
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/85 via-black/15 to-transparent" })
|
|
17801
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
17802
|
+
"div",
|
|
17803
|
+
{
|
|
17804
|
+
className: cn(
|
|
17805
|
+
"absolute inset-0 bg-gradient-to-br",
|
|
17806
|
+
(_b = card.gradient) != null ? _b : "from-primary-800 to-primary-900"
|
|
17807
|
+
)
|
|
17808
|
+
}
|
|
17809
|
+
),
|
|
17810
|
+
card.tripCount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute right-3 top-3 z-10 rounded-full bg-white/90 px-2.5 py-1 text-[11px] font-ui font-bold uppercase tracking-wide text-neutral-900", children: card.tripCount }),
|
|
17811
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-x-0 bottom-0 z-10 p-5", children: [
|
|
17812
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17813
|
+
"h3",
|
|
17814
|
+
{
|
|
17815
|
+
className: cn(
|
|
17816
|
+
"font-heading font-bold uppercase leading-tight tracking-wide text-white",
|
|
17817
|
+
isFeatured ? "text-2xl sm:text-3xl" : "text-lg sm:text-xl"
|
|
17818
|
+
),
|
|
17819
|
+
children: card.label
|
|
17820
|
+
}
|
|
17821
|
+
),
|
|
17822
|
+
card.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 max-h-0 overflow-hidden text-sm leading-snug text-white/85 opacity-0 transition-all duration-300 group-hover:mt-2 group-hover:max-h-32 group-hover:opacity-100", children: card.description }),
|
|
17823
|
+
card.ctaLabel && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-2 inline-flex items-center gap-1 text-sm font-ui font-bold text-primary-400", children: [
|
|
17824
|
+
card.ctaLabel,
|
|
17825
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
|
|
17826
|
+
] })
|
|
17827
|
+
] })
|
|
17828
|
+
] });
|
|
17829
|
+
const tileClass = cn(
|
|
17830
|
+
"group relative overflow-hidden rounded-2xl bg-muted shadow-sm",
|
|
17831
|
+
BENTO_SPAN[(_c = card.size) != null ? _c : "normal"]
|
|
17832
|
+
);
|
|
17833
|
+
return card.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
17834
|
+
"a",
|
|
17835
|
+
{
|
|
17836
|
+
href: card.href,
|
|
17837
|
+
className: cn(
|
|
17838
|
+
tileClass,
|
|
17839
|
+
"block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
17840
|
+
ring
|
|
17841
|
+
),
|
|
17842
|
+
children: inner
|
|
17843
|
+
}
|
|
17844
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: tileClass, children: inner });
|
|
17845
|
+
}
|
|
17846
|
+
function AdventureExplorer({
|
|
17847
|
+
tabs,
|
|
17848
|
+
eyebrow,
|
|
17849
|
+
heading,
|
|
17850
|
+
subheading,
|
|
17851
|
+
defaultTabId,
|
|
17852
|
+
viewAllLabel = "View All Adventures",
|
|
17853
|
+
viewAllHref,
|
|
17854
|
+
theme = "dark",
|
|
17855
|
+
layout = "carousel",
|
|
17856
|
+
bentoLimit,
|
|
17857
|
+
moreLabel = "More wild places",
|
|
17858
|
+
className
|
|
17859
|
+
}) {
|
|
17860
|
+
var _a, _b, _c, _d, _e;
|
|
17861
|
+
const [activeId, setActiveId] = React32__namespace.useState(
|
|
17862
|
+
defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
|
|
17863
|
+
);
|
|
17864
|
+
const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
|
|
17865
|
+
const t = THEME[theme];
|
|
17866
|
+
const ctaHref = (_d = (_c = active == null ? void 0 : active.viewAllHref) != null ? _c : viewAllHref) != null ? _d : "#";
|
|
17867
|
+
const showCta = viewAllLabel.length > 0;
|
|
17868
|
+
const hasHeading = !!(eyebrow || heading || subheading);
|
|
17869
|
+
const cards = (_e = active == null ? void 0 : active.cards) != null ? _e : [];
|
|
17870
|
+
const limited = layout === "bento" && bentoLimit != null && cards.length > bentoLimit;
|
|
17871
|
+
const gridCards = limited ? cards.slice(0, bentoLimit) : cards;
|
|
17872
|
+
const moreCards = limited ? cards.slice(bentoLimit) : [];
|
|
17873
|
+
const showHeadCta = showCta && !limited;
|
|
17874
|
+
return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-10 sm:py-16", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
17875
|
+
hasHeading && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8 flex flex-wrap items-end justify-between gap-6", children: [
|
|
17876
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
|
|
17877
|
+
eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
|
|
17878
|
+
heading && /* @__PURE__ */ jsxRuntime.jsx(
|
|
17879
|
+
"h2",
|
|
17880
|
+
{
|
|
17881
|
+
className: cn(
|
|
17882
|
+
"font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
|
|
17883
|
+
t.heading
|
|
17884
|
+
),
|
|
17885
|
+
children: heading
|
|
17886
|
+
}
|
|
17887
|
+
),
|
|
17888
|
+
subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 text-base", t.body), children: subheading })
|
|
17889
|
+
] }),
|
|
17890
|
+
showHeadCta && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17891
|
+
"a",
|
|
17892
|
+
{
|
|
17893
|
+
href: ctaHref,
|
|
17894
|
+
className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
|
|
17895
|
+
children: [
|
|
17896
|
+
viewAllLabel,
|
|
17897
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
|
|
17898
|
+
]
|
|
17899
|
+
}
|
|
17900
|
+
)
|
|
17901
|
+
] }),
|
|
17902
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
|
|
17903
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17904
|
+
"div",
|
|
17905
|
+
{
|
|
17906
|
+
role: "tablist",
|
|
17907
|
+
"aria-label": "Explore categories",
|
|
17908
|
+
className: cn(
|
|
17909
|
+
"inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
|
|
17910
|
+
t.tabTrack
|
|
17911
|
+
),
|
|
17912
|
+
children: tabs.map((tab) => {
|
|
17913
|
+
const isActive = tab.id === (active == null ? void 0 : active.id);
|
|
17914
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
17915
|
+
"button",
|
|
17916
|
+
{
|
|
17917
|
+
type: "button",
|
|
17918
|
+
role: "tab",
|
|
17919
|
+
"aria-selected": isActive,
|
|
17920
|
+
onClick: () => setActiveId(tab.id),
|
|
17921
|
+
className: cn(
|
|
17922
|
+
"shrink-0 rounded-full px-5 py-2 text-sm font-ui font-bold transition-colors",
|
|
17923
|
+
isActive ? t.tabActive : t.tabIdle
|
|
17924
|
+
),
|
|
17925
|
+
children: tab.label
|
|
17926
|
+
},
|
|
17927
|
+
tab.id
|
|
17928
|
+
);
|
|
17929
|
+
})
|
|
17930
|
+
}
|
|
17931
|
+
),
|
|
17932
|
+
showCta && !hasHeading && /* @__PURE__ */ jsxRuntime.jsx(
|
|
17933
|
+
"a",
|
|
17934
|
+
{
|
|
17935
|
+
href: ctaHref,
|
|
17936
|
+
className: cn(
|
|
17937
|
+
"hidden shrink-0 items-center rounded-full px-6 py-2.5 text-sm font-heading font-bold transition-colors sm:inline-flex",
|
|
17938
|
+
ACCENT_BUTTON
|
|
17939
|
+
),
|
|
17940
|
+
children: viewAllLabel
|
|
17941
|
+
}
|
|
17942
|
+
)
|
|
17943
|
+
] }),
|
|
17944
|
+
layout === "bento" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 grid auto-rows-[170px] grid-cols-2 gap-4 sm:mt-8 sm:auto-rows-[200px] lg:grid-cols-4", children: gridCards.map((card, i) => /* @__PURE__ */ jsxRuntime.jsx(BentoTile, { card, ring: t.cardRing }, i)) }),
|
|
17945
|
+
limited && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17946
|
+
"div",
|
|
17947
|
+
{
|
|
17948
|
+
className: cn(
|
|
17949
|
+
"mt-7 flex flex-wrap items-center justify-between gap-x-8 gap-y-3 border-t pt-6",
|
|
17950
|
+
t.divider
|
|
17951
|
+
),
|
|
17952
|
+
children: [
|
|
17953
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2", children: [
|
|
17954
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-ui font-bold uppercase tracking-[0.18em] text-primary", children: moreLabel }),
|
|
17955
|
+
moreCards.map((card, i) => {
|
|
17956
|
+
var _a2;
|
|
17957
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17958
|
+
"a",
|
|
17959
|
+
{
|
|
17960
|
+
href: (_a2 = card.href) != null ? _a2 : "#",
|
|
17961
|
+
className: "group inline-flex items-baseline gap-2",
|
|
17962
|
+
children: [
|
|
17963
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17964
|
+
"span",
|
|
17965
|
+
{
|
|
17966
|
+
className: cn(
|
|
17967
|
+
"font-heading text-base font-bold transition-colors group-hover:text-primary",
|
|
17968
|
+
t.heading
|
|
17969
|
+
),
|
|
17970
|
+
children: card.label
|
|
17971
|
+
}
|
|
17972
|
+
),
|
|
17973
|
+
card.tripCount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-sm", t.body), children: card.tripCount })
|
|
17974
|
+
]
|
|
17975
|
+
},
|
|
17976
|
+
i
|
|
17977
|
+
);
|
|
17978
|
+
})
|
|
17979
|
+
] }),
|
|
17980
|
+
showCta && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17981
|
+
"a",
|
|
17982
|
+
{
|
|
17983
|
+
href: ctaHref,
|
|
17984
|
+
className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
|
|
17985
|
+
children: [
|
|
17986
|
+
viewAllLabel,
|
|
17987
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
|
|
17988
|
+
]
|
|
17989
|
+
}
|
|
17990
|
+
)
|
|
17991
|
+
]
|
|
17992
|
+
}
|
|
17993
|
+
),
|
|
17994
|
+
layout !== "bento" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "-mx-6 mt-6 flex gap-3 overflow-x-auto px-6 pb-2 snap-x snap-mandatory scroll-px-6 scroll-smooth scrollbar-none sm:mx-0 sm:mt-8 sm:gap-4 sm:px-0 sm:scroll-px-0", children: active == null ? void 0 : active.cards.map((card, i) => {
|
|
17995
|
+
var _a2, _b2;
|
|
17996
|
+
const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17997
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17998
|
+
Picture,
|
|
17999
|
+
{
|
|
18000
|
+
src: (_a2 = card.image) != null ? _a2 : "",
|
|
18001
|
+
alt: (_b2 = card.imageAlt) != null ? _b2 : card.label,
|
|
18002
|
+
loading: "lazy",
|
|
18003
|
+
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
|
|
18004
|
+
}
|
|
18005
|
+
),
|
|
18006
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/15 to-transparent" }),
|
|
18007
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-x-0 bottom-0 p-4 font-heading text-sm font-bold uppercase leading-tight tracking-wide text-white", children: card.label })
|
|
18008
|
+
] });
|
|
18009
|
+
const cardClass = "group relative aspect-[9/16] w-40 shrink-0 snap-start overflow-hidden rounded-2xl bg-muted sm:w-44 lg:w-48";
|
|
18010
|
+
return card.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
18011
|
+
"a",
|
|
18012
|
+
{
|
|
18013
|
+
href: card.href,
|
|
18014
|
+
className: cn(
|
|
18015
|
+
cardClass,
|
|
18016
|
+
"block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
18017
|
+
t.cardRing
|
|
18018
|
+
),
|
|
18019
|
+
children: inner
|
|
18020
|
+
},
|
|
18021
|
+
i
|
|
18022
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cardClass, children: inner }, i);
|
|
18023
|
+
}) }),
|
|
18024
|
+
showCta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 sm:hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
18025
|
+
"a",
|
|
18026
|
+
{
|
|
18027
|
+
href: ctaHref,
|
|
18028
|
+
className: cn(
|
|
18029
|
+
"inline-flex w-full items-center justify-center rounded-full px-6 py-3 text-sm font-heading font-bold transition-colors",
|
|
18030
|
+
ACCENT_BUTTON
|
|
18031
|
+
),
|
|
18032
|
+
children: viewAllLabel
|
|
18033
|
+
}
|
|
18034
|
+
) })
|
|
18035
|
+
] }) });
|
|
18036
|
+
}
|
|
18037
|
+
var THEME2 = {
|
|
18038
|
+
light: {
|
|
18039
|
+
section: "bg-neutral-100",
|
|
18040
|
+
heading: "text-neutral-900",
|
|
18041
|
+
title: "text-neutral-800",
|
|
18042
|
+
body: "text-neutral-500",
|
|
18043
|
+
icon: "text-primary",
|
|
18044
|
+
card: "bg-white border-black/10 shadow-sm",
|
|
18045
|
+
chip: "bg-primary/10 text-primary",
|
|
18046
|
+
number: "text-primary"
|
|
18047
|
+
},
|
|
18048
|
+
dark: {
|
|
18049
|
+
section: "bg-neutral-950",
|
|
18050
|
+
heading: "text-white",
|
|
18051
|
+
title: "text-white",
|
|
18052
|
+
body: "text-white/60",
|
|
18053
|
+
icon: "text-primary-400",
|
|
18054
|
+
card: "bg-white/5 border-white/10",
|
|
18055
|
+
chip: "bg-primary-400/15 text-primary-400",
|
|
18056
|
+
number: "text-primary-400"
|
|
18057
|
+
}
|
|
18058
|
+
};
|
|
18059
|
+
var COLS = {
|
|
18060
|
+
2: "sm:grid-cols-2",
|
|
18061
|
+
3: "sm:grid-cols-2 lg:grid-cols-3",
|
|
18062
|
+
4: "sm:grid-cols-2 lg:grid-cols-4"
|
|
18063
|
+
};
|
|
18064
|
+
function USP({
|
|
18065
|
+
items,
|
|
18066
|
+
heading,
|
|
18067
|
+
subheading,
|
|
18068
|
+
columns,
|
|
18069
|
+
variant = "minimal",
|
|
18070
|
+
theme = "light",
|
|
18071
|
+
className
|
|
18072
|
+
}) {
|
|
18073
|
+
const t = THEME2[theme];
|
|
18074
|
+
const cols = columns != null ? columns : Math.min(Math.max(items.length, 2), 4);
|
|
18075
|
+
const isInline = variant === "inline";
|
|
18076
|
+
const isCard = variant === "card";
|
|
18077
|
+
const isNumbered = variant === "numbered";
|
|
18078
|
+
const stacked = !isInline;
|
|
18079
|
+
return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-14 sm:py-20", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
18080
|
+
(heading || subheading) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18081
|
+
"div",
|
|
18082
|
+
{
|
|
18083
|
+
className: cn(
|
|
18084
|
+
"mb-12 max-w-2xl",
|
|
18085
|
+
isNumbered ? "text-left" : "mx-auto text-center"
|
|
18086
|
+
),
|
|
18087
|
+
children: [
|
|
18088
|
+
heading && /* @__PURE__ */ jsxRuntime.jsx(
|
|
18089
|
+
"h2",
|
|
18090
|
+
{
|
|
18091
|
+
className: cn(
|
|
18092
|
+
"font-heading font-bold uppercase tracking-wide",
|
|
18093
|
+
isNumbered ? "text-3xl sm:text-4xl lg:text-5xl" : "text-2xl sm:text-3xl",
|
|
18094
|
+
t.heading
|
|
18095
|
+
),
|
|
18096
|
+
children: heading
|
|
18097
|
+
}
|
|
18098
|
+
),
|
|
18099
|
+
subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 font-sans text-base", t.body), children: subheading })
|
|
18100
|
+
]
|
|
18101
|
+
}
|
|
18102
|
+
),
|
|
18103
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
18104
|
+
"div",
|
|
18105
|
+
{
|
|
18106
|
+
className: cn(
|
|
18107
|
+
"grid grid-cols-1 gap-x-8 gap-y-10",
|
|
18108
|
+
COLS[cols]
|
|
18109
|
+
),
|
|
18110
|
+
children: [
|
|
18111
|
+
isNumbered && items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18112
|
+
"div",
|
|
18113
|
+
{
|
|
18114
|
+
className: cn(
|
|
18115
|
+
"flex flex-col rounded-2xl border p-6 text-left sm:p-7",
|
|
18116
|
+
t.card
|
|
18117
|
+
),
|
|
18118
|
+
children: [
|
|
18119
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18120
|
+
"span",
|
|
18121
|
+
{
|
|
18122
|
+
className: cn(
|
|
18123
|
+
"mb-4 font-sans text-xl font-semibold italic",
|
|
18124
|
+
t.number
|
|
18125
|
+
),
|
|
18126
|
+
children: String(i + 1).padStart(2, "0")
|
|
18127
|
+
}
|
|
18128
|
+
),
|
|
18129
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18130
|
+
"h3",
|
|
18131
|
+
{
|
|
18132
|
+
className: cn(
|
|
18133
|
+
"font-heading text-lg font-bold leading-snug",
|
|
18134
|
+
t.heading
|
|
18135
|
+
),
|
|
18136
|
+
children: item.title
|
|
18137
|
+
}
|
|
18138
|
+
),
|
|
18139
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-2 font-sans text-base leading-relaxed", t.body), children: item.description })
|
|
18140
|
+
]
|
|
18141
|
+
},
|
|
18142
|
+
i
|
|
18143
|
+
)),
|
|
18144
|
+
!isNumbered && items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18145
|
+
"div",
|
|
18146
|
+
{
|
|
18147
|
+
className: cn(
|
|
18148
|
+
isCard && cn("rounded-2xl border p-6 sm:p-7", t.card),
|
|
18149
|
+
stacked ? "flex flex-col items-center text-center" : "flex items-start gap-4 text-left"
|
|
18150
|
+
),
|
|
18151
|
+
children: [
|
|
18152
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18153
|
+
"span",
|
|
18154
|
+
{
|
|
18155
|
+
className: cn(
|
|
18156
|
+
"flex shrink-0 items-center justify-center",
|
|
18157
|
+
isCard ? cn("h-14 w-14 rounded-full [&>svg]:size-7", t.chip) : cn("[&>svg]:size-8", t.icon),
|
|
18158
|
+
stacked && "mb-4"
|
|
18159
|
+
),
|
|
18160
|
+
children: item.icon
|
|
18161
|
+
}
|
|
18162
|
+
),
|
|
18163
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: isInline ? "flex-1" : "contents", children: [
|
|
18164
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18165
|
+
"h3",
|
|
18166
|
+
{
|
|
18167
|
+
className: cn(
|
|
18168
|
+
"font-heading text-sm font-bold uppercase leading-snug tracking-wide",
|
|
18169
|
+
t.title,
|
|
18170
|
+
stacked && "mb-3"
|
|
18171
|
+
),
|
|
18172
|
+
children: item.title
|
|
18173
|
+
}
|
|
18174
|
+
),
|
|
18175
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18176
|
+
"p",
|
|
18177
|
+
{
|
|
18178
|
+
className: cn(
|
|
18179
|
+
"font-sans text-base leading-relaxed",
|
|
18180
|
+
t.body,
|
|
18181
|
+
isInline && "mt-1.5"
|
|
18182
|
+
),
|
|
18183
|
+
children: item.description
|
|
18184
|
+
}
|
|
18185
|
+
)
|
|
18186
|
+
] })
|
|
18187
|
+
]
|
|
18188
|
+
},
|
|
18189
|
+
i
|
|
18190
|
+
))
|
|
18191
|
+
]
|
|
18192
|
+
}
|
|
18193
|
+
)
|
|
18194
|
+
] }) });
|
|
18195
|
+
}
|
|
18196
|
+
function RotatingSubtitle({
|
|
18197
|
+
phrases,
|
|
18198
|
+
interval,
|
|
18199
|
+
className
|
|
18200
|
+
}) {
|
|
18201
|
+
const [index, setIndex] = React32__namespace.useState(0);
|
|
18202
|
+
React32__namespace.useEffect(() => {
|
|
18203
|
+
var _a;
|
|
18204
|
+
if (phrases.length < 2) return;
|
|
18205
|
+
const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
|
|
18206
|
+
if (reduce) return;
|
|
18207
|
+
const id = setInterval(
|
|
18208
|
+
() => setIndex((i) => (i + 1) % phrases.length),
|
|
18209
|
+
interval
|
|
18210
|
+
);
|
|
18211
|
+
return () => clearInterval(id);
|
|
18212
|
+
}, [phrases.length, interval]);
|
|
18213
|
+
return (
|
|
18214
|
+
/* Grid-stacks all phrases so the box keeps the height of the tallest line
|
|
18215
|
+
and the crossfade has no layout shift. */
|
|
18216
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("grid", className), children: phrases.map((phrase, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
18217
|
+
"span",
|
|
18218
|
+
{
|
|
18219
|
+
"aria-hidden": i !== index,
|
|
18220
|
+
className: cn(
|
|
18221
|
+
"col-start-1 row-start-1 transition-opacity duration-700",
|
|
18222
|
+
i === index ? "opacity-100" : "opacity-0"
|
|
18223
|
+
),
|
|
18224
|
+
children: phrase
|
|
18225
|
+
},
|
|
18226
|
+
phrase + i
|
|
18227
|
+
)) })
|
|
18228
|
+
);
|
|
18229
|
+
}
|
|
18230
|
+
function CtaBanner({
|
|
18231
|
+
image,
|
|
18232
|
+
imageAlt = "",
|
|
18233
|
+
title,
|
|
18234
|
+
subtitle,
|
|
18235
|
+
cta,
|
|
18236
|
+
rotateInterval = 3e3,
|
|
18237
|
+
parallax = true,
|
|
18238
|
+
overlayOpacity = 35,
|
|
18239
|
+
className
|
|
18240
|
+
}) {
|
|
18241
|
+
const phrases = React32__namespace.useMemo(
|
|
18242
|
+
() => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
|
|
18243
|
+
[subtitle]
|
|
18244
|
+
);
|
|
18245
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18246
|
+
"section",
|
|
18247
|
+
{
|
|
18248
|
+
className: cn(
|
|
18249
|
+
"relative w-full overflow-hidden",
|
|
18250
|
+
"flex items-center justify-center",
|
|
18251
|
+
"min-h-[360px] py-24 sm:py-28 lg:py-32",
|
|
18252
|
+
"bg-muted",
|
|
18253
|
+
className
|
|
18254
|
+
),
|
|
18255
|
+
children: [
|
|
18256
|
+
parallax ? (
|
|
18257
|
+
/* Parallax: fixed-attachment CSS background (sm+). Uses a plain div so
|
|
18258
|
+
`bg-fixed` works; on mobile it falls back to a normal cover image. */
|
|
18259
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18260
|
+
"div",
|
|
18261
|
+
{
|
|
18262
|
+
"aria-hidden": true,
|
|
18263
|
+
role: imageAlt ? "img" : void 0,
|
|
18264
|
+
"aria-label": imageAlt || void 0,
|
|
18265
|
+
className: "absolute inset-0 bg-cover bg-center sm:bg-fixed",
|
|
18266
|
+
style: { backgroundImage: `url("${image}")` }
|
|
18267
|
+
}
|
|
18268
|
+
)
|
|
18269
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
18270
|
+
Picture,
|
|
18271
|
+
{
|
|
18272
|
+
src: image,
|
|
18273
|
+
alt: imageAlt,
|
|
18274
|
+
eager: true,
|
|
18275
|
+
className: "absolute inset-0 h-full w-full object-cover"
|
|
18276
|
+
}
|
|
18277
|
+
),
|
|
18278
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18279
|
+
"div",
|
|
18280
|
+
{
|
|
18281
|
+
className: "absolute inset-0 bg-black",
|
|
18282
|
+
style: { opacity: overlayOpacity / 100 },
|
|
18283
|
+
"aria-hidden": true
|
|
18284
|
+
}
|
|
18285
|
+
),
|
|
18286
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 mx-auto flex w-full max-w-4xl flex-col items-center px-6 text-center", children: [
|
|
18287
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-heading text-4xl font-black uppercase leading-none tracking-tight text-white sm:text-5xl lg:text-[3.25rem]", children: title }),
|
|
18288
|
+
phrases.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 font-sans text-xl font-semibold text-white sm:text-2xl lg:text-[1.7rem]", children: phrases.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx(RotatingSubtitle, { phrases, interval: rotateInterval }) : phrases[0] }),
|
|
18289
|
+
cta && (cta.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
18290
|
+
"a",
|
|
18291
|
+
{
|
|
18292
|
+
href: cta.href,
|
|
18293
|
+
onClick: cta.onClick,
|
|
18294
|
+
className: "mt-8 inline-block border-b border-white/70 pb-1.5 font-ui text-xs font-light uppercase tracking-[0.2em] text-white transition-colors hover:border-white hover:text-white/80",
|
|
18295
|
+
children: cta.label
|
|
18296
|
+
}
|
|
18297
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
18298
|
+
"button",
|
|
18299
|
+
{
|
|
18300
|
+
type: "button",
|
|
18301
|
+
onClick: cta.onClick,
|
|
18302
|
+
className: "mt-8 inline-block border-b border-white/70 pb-1.5 font-ui text-xs font-light uppercase tracking-[0.2em] text-white transition-colors hover:border-white hover:text-white/80",
|
|
18303
|
+
children: cta.label
|
|
18304
|
+
}
|
|
18305
|
+
))
|
|
18306
|
+
] })
|
|
18307
|
+
]
|
|
18308
|
+
}
|
|
18309
|
+
);
|
|
18310
|
+
}
|
|
18311
|
+
var THEME3 = {
|
|
18312
|
+
light: {
|
|
18313
|
+
section: "bg-background",
|
|
18314
|
+
heading: "text-foreground",
|
|
18315
|
+
sub: "text-muted-foreground",
|
|
18316
|
+
rowTitle: "text-foreground",
|
|
18317
|
+
rowBorder: "border-border",
|
|
18318
|
+
rowArrow: "text-primary"
|
|
18319
|
+
},
|
|
18320
|
+
dark: {
|
|
18321
|
+
section: "bg-neutral-950",
|
|
18322
|
+
heading: "text-white",
|
|
18323
|
+
sub: "text-white/60",
|
|
18324
|
+
rowTitle: "text-white",
|
|
18325
|
+
rowBorder: "border-white/10",
|
|
18326
|
+
rowArrow: "text-primary-400"
|
|
18327
|
+
}
|
|
18328
|
+
};
|
|
18329
|
+
function BlogJournal({
|
|
18330
|
+
eyebrow,
|
|
18331
|
+
title,
|
|
18332
|
+
subtitle,
|
|
18333
|
+
link,
|
|
18334
|
+
feature,
|
|
18335
|
+
posts,
|
|
18336
|
+
theme = "light",
|
|
18337
|
+
className
|
|
18338
|
+
}) {
|
|
18339
|
+
var _a, _b, _c, _d;
|
|
18340
|
+
const t = THEME3[theme];
|
|
18341
|
+
const featRel = feature.external ? "noopener noreferrer" : void 0;
|
|
18342
|
+
const featTarget = feature.external ? "_blank" : void 0;
|
|
18343
|
+
return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-20 sm:py-28", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
18344
|
+
(title || eyebrow || link) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
|
|
18345
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
|
|
18346
|
+
eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
|
|
18347
|
+
title && /* @__PURE__ */ jsxRuntime.jsx(
|
|
18348
|
+
"h2",
|
|
18349
|
+
{
|
|
18350
|
+
className: cn(
|
|
18351
|
+
"font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
|
|
18352
|
+
t.heading
|
|
18353
|
+
),
|
|
18354
|
+
children: title
|
|
18355
|
+
}
|
|
18356
|
+
),
|
|
18357
|
+
subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 text-base", t.sub), children: subtitle })
|
|
18358
|
+
] }),
|
|
18359
|
+
link && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18360
|
+
"a",
|
|
18361
|
+
{
|
|
18362
|
+
href: (_a = link.href) != null ? _a : "#",
|
|
18363
|
+
className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
|
|
18364
|
+
children: [
|
|
18365
|
+
link.label,
|
|
18366
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
|
|
18367
|
+
]
|
|
18368
|
+
}
|
|
18369
|
+
)
|
|
18370
|
+
] }),
|
|
18371
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid items-stretch gap-7 lg:grid-cols-[1.12fr_0.88fr]", children: [
|
|
18372
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
18373
|
+
"a",
|
|
18374
|
+
{
|
|
18375
|
+
href: (_b = feature.href) != null ? _b : "#",
|
|
18376
|
+
target: featTarget,
|
|
18377
|
+
rel: featRel,
|
|
18378
|
+
className: "group relative flex min-h-[420px] items-end overflow-hidden rounded-2xl text-white shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 lg:min-h-[480px]",
|
|
18379
|
+
children: [
|
|
18380
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18381
|
+
Picture,
|
|
18382
|
+
{
|
|
18383
|
+
src: feature.image,
|
|
18384
|
+
alt: (_c = feature.imageAlt) != null ? _c : feature.title,
|
|
18385
|
+
loading: "lazy",
|
|
18386
|
+
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
|
|
18387
|
+
}
|
|
18388
|
+
),
|
|
18389
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/25 to-transparent" }),
|
|
18390
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative p-8 sm:p-9", children: [
|
|
18391
|
+
feature.tag && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-3.5 inline-block rounded-full bg-primary px-3 py-1 text-[11px] font-ui font-bold uppercase tracking-[0.12em] text-primary-foreground", children: feature.tag }),
|
|
18392
|
+
feature.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs font-ui font-bold uppercase tracking-[0.1em] text-primary-400", children: feature.date }),
|
|
18393
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mt-2.5 max-w-[20ch] font-heading text-2xl font-bold leading-[1.08] sm:text-3xl lg:text-4xl", children: feature.title }),
|
|
18394
|
+
feature.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-3 max-w-[46ch] text-sm leading-relaxed text-white/85", children: feature.excerpt }),
|
|
18395
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-5 inline-flex items-center gap-1.5 font-ui text-sm font-bold", children: [
|
|
18396
|
+
(_d = feature.ctaLabel) != null ? _d : "Read the guide",
|
|
18397
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
|
|
18398
|
+
] })
|
|
18399
|
+
] })
|
|
18400
|
+
]
|
|
18401
|
+
}
|
|
18402
|
+
),
|
|
18403
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col justify-center", children: posts.map((post, i) => {
|
|
18404
|
+
var _a2, _b2;
|
|
18405
|
+
return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18406
|
+
"a",
|
|
18407
|
+
{
|
|
18408
|
+
href: (_a2 = post.href) != null ? _a2 : "#",
|
|
18409
|
+
target: post.external ? "_blank" : void 0,
|
|
18410
|
+
rel: post.external ? "noopener noreferrer" : void 0,
|
|
18411
|
+
className: cn(
|
|
18412
|
+
"group grid grid-cols-[64px_1fr_auto] items-center gap-4 border-t py-5 transition-[padding] duration-300 hover:pl-3 sm:grid-cols-[78px_1fr_auto]",
|
|
18413
|
+
t.rowBorder,
|
|
18414
|
+
i === 0 && "border-t-0 pt-0"
|
|
18415
|
+
),
|
|
18416
|
+
children: [
|
|
18417
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18418
|
+
Picture,
|
|
18419
|
+
{
|
|
18420
|
+
src: post.image,
|
|
18421
|
+
alt: (_b2 = post.imageAlt) != null ? _b2 : post.title,
|
|
18422
|
+
loading: "lazy",
|
|
18423
|
+
className: "h-16 w-16 rounded-xl object-cover sm:h-[78px] sm:w-[78px]"
|
|
18424
|
+
}
|
|
18425
|
+
),
|
|
18426
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
|
|
18427
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] font-ui font-bold uppercase tracking-[0.1em] text-primary", children: [
|
|
18428
|
+
post.category,
|
|
18429
|
+
post.category && post.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("ml-2 font-semibold", t.sub), children: post.date }),
|
|
18430
|
+
!post.category && post.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-semibold", t.sub), children: post.date })
|
|
18431
|
+
] }),
|
|
18432
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18433
|
+
"h4",
|
|
18434
|
+
{
|
|
18435
|
+
className: cn(
|
|
18436
|
+
"mt-1.5 font-heading text-base font-bold leading-snug sm:text-lg",
|
|
18437
|
+
t.rowTitle
|
|
18438
|
+
),
|
|
18439
|
+
children: post.title
|
|
18440
|
+
}
|
|
18441
|
+
)
|
|
18442
|
+
] }),
|
|
18443
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18444
|
+
lucideReact.ArrowRightIcon,
|
|
18445
|
+
{
|
|
18446
|
+
className: cn(
|
|
18447
|
+
"h-5 w-5 shrink-0 transition-transform group-hover:translate-x-1",
|
|
18448
|
+
t.rowArrow
|
|
18449
|
+
)
|
|
18450
|
+
}
|
|
18451
|
+
)
|
|
18452
|
+
]
|
|
18453
|
+
}
|
|
18454
|
+
) }, i);
|
|
18455
|
+
}) })
|
|
18456
|
+
] })
|
|
18457
|
+
] }) });
|
|
18458
|
+
}
|
|
18459
|
+
var SURFACE_WHITE = "bg-white";
|
|
18460
|
+
var SURFACE_SAND = "bg-[oklch(0.94_0.016_86)]";
|
|
18461
|
+
var SURFACE_PRIMARY_700 = "bg-[oklch(0.52_0.082_179)]";
|
|
18462
|
+
var SURFACE_PRIMARY_800 = "bg-[oklch(0.39_0.062_179)]";
|
|
18463
|
+
var SURFACE_PRIMARY_900 = "bg-[oklch(0.27_0.040_179)]";
|
|
18464
|
+
function SectionHead({
|
|
18465
|
+
eyebrow,
|
|
18466
|
+
title,
|
|
18467
|
+
subtitle,
|
|
18468
|
+
link,
|
|
18469
|
+
align = "between",
|
|
18470
|
+
theme = "light"
|
|
18471
|
+
}) {
|
|
18472
|
+
var _a;
|
|
18473
|
+
const isCenter = align === "center";
|
|
18474
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18475
|
+
"div",
|
|
18476
|
+
{
|
|
18477
|
+
className: cn(
|
|
18478
|
+
"mb-10 flex flex-wrap items-end gap-6",
|
|
18479
|
+
isCenter ? "flex-col items-center text-center" : "justify-between"
|
|
18480
|
+
),
|
|
18481
|
+
children: [
|
|
18482
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("max-w-2xl", isCenter && "mx-auto"), children: [
|
|
18483
|
+
eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
|
|
18484
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18485
|
+
"h2",
|
|
18486
|
+
{
|
|
18487
|
+
className: cn(
|
|
18488
|
+
"font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
|
|
18489
|
+
theme === "dark" ? "text-white" : "text-foreground"
|
|
18490
|
+
),
|
|
18491
|
+
children: title
|
|
18492
|
+
}
|
|
18493
|
+
),
|
|
18494
|
+
subtitle && /* @__PURE__ */ jsxRuntime.jsx(
|
|
18495
|
+
"p",
|
|
18496
|
+
{
|
|
18497
|
+
className: cn(
|
|
18498
|
+
"mt-3 text-base",
|
|
18499
|
+
theme === "dark" ? "text-white/70" : "text-muted-foreground"
|
|
18500
|
+
),
|
|
18501
|
+
children: subtitle
|
|
18502
|
+
}
|
|
18503
|
+
)
|
|
18504
|
+
] }),
|
|
18505
|
+
link && !isCenter && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18506
|
+
"a",
|
|
18507
|
+
{
|
|
18508
|
+
href: (_a = link.href) != null ? _a : "#",
|
|
18509
|
+
className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
|
|
18510
|
+
children: [
|
|
18511
|
+
link.label,
|
|
18512
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
|
|
18513
|
+
]
|
|
18514
|
+
}
|
|
18515
|
+
)
|
|
18516
|
+
]
|
|
18517
|
+
}
|
|
18518
|
+
);
|
|
18519
|
+
}
|
|
18520
|
+
function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
|
|
18521
|
+
var _a;
|
|
18522
|
+
const railRef = React32__namespace.useRef(null);
|
|
18523
|
+
const scrollByCard = (dir) => {
|
|
18524
|
+
const rail = railRef.current;
|
|
18525
|
+
if (!rail) return;
|
|
18526
|
+
const card = rail.querySelector("[data-rail-card]");
|
|
18527
|
+
const amount = card ? card.offsetWidth + 22 : rail.clientWidth * 0.8;
|
|
18528
|
+
rail.scrollBy({ left: dir * amount, behavior: "smooth" });
|
|
18529
|
+
};
|
|
18530
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: cn(SURFACE_SAND, "py-20 sm:py-28"), children: [
|
|
18531
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
|
|
18532
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
|
|
18533
|
+
eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
|
|
18534
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-heading text-3xl font-black uppercase leading-[1.05] text-foreground sm:text-4xl lg:text-5xl", children: title }),
|
|
18535
|
+
subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-3 text-base text-muted-foreground", children: subtitle })
|
|
18536
|
+
] }),
|
|
18537
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
|
|
18538
|
+
link && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18539
|
+
"a",
|
|
18540
|
+
{
|
|
18541
|
+
href: (_a = link.href) != null ? _a : "#",
|
|
18542
|
+
className: "group mr-2 hidden items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800 sm:inline-flex",
|
|
18543
|
+
children: [
|
|
18544
|
+
link.label,
|
|
18545
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
|
|
18546
|
+
]
|
|
18547
|
+
}
|
|
18548
|
+
),
|
|
18549
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18550
|
+
"button",
|
|
18551
|
+
{
|
|
18552
|
+
type: "button",
|
|
18553
|
+
onClick: () => scrollByCard(-1),
|
|
18554
|
+
"aria-label": "Previous expeditions",
|
|
18555
|
+
className: "flex h-11 w-11 items-center justify-center rounded-full border border-border bg-background text-foreground transition-colors hover:border-primary hover:bg-primary hover:text-primary-foreground",
|
|
18556
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
|
|
18557
|
+
}
|
|
18558
|
+
),
|
|
18559
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18560
|
+
"button",
|
|
18561
|
+
{
|
|
18562
|
+
type: "button",
|
|
18563
|
+
onClick: () => scrollByCard(1),
|
|
18564
|
+
"aria-label": "Next expeditions",
|
|
18565
|
+
className: "flex h-11 w-11 items-center justify-center rounded-full border border-border bg-background text-foreground transition-colors hover:border-primary hover:bg-primary hover:text-primary-foreground",
|
|
18566
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
|
|
18567
|
+
}
|
|
18568
|
+
)
|
|
18569
|
+
] })
|
|
18570
|
+
] }) }),
|
|
18571
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
18572
|
+
"div",
|
|
18573
|
+
{
|
|
18574
|
+
ref: railRef,
|
|
18575
|
+
className: "flex snap-x snap-mandatory gap-[22px] overflow-x-auto scroll-pl-6 px-6 pb-4 [scrollbar-width:none] sm:scroll-pl-8 sm:px-8 [&::-webkit-scrollbar]:hidden",
|
|
18576
|
+
children: trips.map((trip, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
18577
|
+
"div",
|
|
18578
|
+
{
|
|
18579
|
+
"data-rail-card": true,
|
|
18580
|
+
className: "w-[320px] shrink-0 snap-start sm:w-[340px]",
|
|
18581
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(TripCard, __spreadValues({ variant: "editorial" }, trip))
|
|
18582
|
+
},
|
|
18583
|
+
i
|
|
18584
|
+
))
|
|
18585
|
+
}
|
|
18586
|
+
) })
|
|
18587
|
+
] });
|
|
18588
|
+
}
|
|
18589
|
+
function PopularCloud({ eyebrow, title, subtitle, chips }) {
|
|
18590
|
+
return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_WHITE, "py-20 sm:py-28"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
18591
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18592
|
+
SectionHead,
|
|
18593
|
+
{
|
|
18594
|
+
eyebrow,
|
|
18595
|
+
title,
|
|
18596
|
+
subtitle,
|
|
18597
|
+
align: "center"
|
|
18598
|
+
}
|
|
18599
|
+
),
|
|
18600
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex max-w-3xl flex-wrap items-center justify-center gap-3", children: chips.map((chip, i) => {
|
|
18601
|
+
var _a;
|
|
18602
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
18603
|
+
Chip,
|
|
18604
|
+
{
|
|
18605
|
+
href: chip.href,
|
|
18606
|
+
variant: chip.featured ? "solid" : "outline",
|
|
18607
|
+
size: (_a = chip.size) != null ? _a : "md",
|
|
18608
|
+
className: "transition-transform hover:-translate-y-0.5",
|
|
18609
|
+
children: chip.label
|
|
18610
|
+
},
|
|
18611
|
+
i
|
|
18612
|
+
);
|
|
18613
|
+
}) })
|
|
18614
|
+
] }) });
|
|
18615
|
+
}
|
|
18616
|
+
function StatsBand({ items }) {
|
|
18617
|
+
return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_PRIMARY_700, "py-16 text-white sm:py-20"), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-x-6 gap-y-10 text-center lg:grid-cols-4", children: items.map((stat, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
18618
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-heading text-4xl font-black leading-none text-[oklch(0.94_0.05_179)] sm:text-5xl lg:text-6xl", children: stat.value }),
|
|
18619
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 text-sm font-medium text-white/90", children: stat.label })
|
|
18620
|
+
] }, i)) }) }) });
|
|
18621
|
+
}
|
|
18622
|
+
function ReviewStars({ stars = 5 }) {
|
|
18623
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 flex items-center gap-0.5", "aria-label": `${stars} out of 5 stars`, children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
18624
|
+
lucideReact.StarIcon,
|
|
18625
|
+
{
|
|
18626
|
+
className: cn(
|
|
18627
|
+
"h-4 w-4",
|
|
18628
|
+
i + 1 <= Math.round(stars) ? "fill-amber-400 text-amber-400" : "fill-white/15 text-white/15"
|
|
18629
|
+
)
|
|
18630
|
+
},
|
|
18631
|
+
i
|
|
18632
|
+
)) });
|
|
18633
|
+
}
|
|
18634
|
+
function ReviewsBand({ eyebrow, title, subtitle, link, items, note }) {
|
|
18635
|
+
return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_PRIMARY_900, "py-20 text-white sm:py-28"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
18636
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18637
|
+
SectionHead,
|
|
18638
|
+
{
|
|
18639
|
+
eyebrow,
|
|
18640
|
+
title,
|
|
18641
|
+
subtitle,
|
|
18642
|
+
link,
|
|
18643
|
+
theme: "dark"
|
|
18644
|
+
}
|
|
18645
|
+
),
|
|
18646
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid gap-5 sm:grid-cols-2 lg:grid-cols-3", children: items.map((review, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18647
|
+
"figure",
|
|
18648
|
+
{
|
|
18649
|
+
className: "rounded-2xl border border-white/10 bg-white/5 p-7 transition-colors hover:bg-white/10",
|
|
18650
|
+
children: [
|
|
18651
|
+
/* @__PURE__ */ jsxRuntime.jsx(ReviewStars, { stars: review.stars }),
|
|
18652
|
+
/* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "font-sans text-lg italic leading-relaxed text-white/90", children: [
|
|
18653
|
+
"\u201C",
|
|
18654
|
+
review.quote,
|
|
18655
|
+
"\u201D"
|
|
18656
|
+
] }),
|
|
18657
|
+
/* @__PURE__ */ jsxRuntime.jsxs("figcaption", { className: "mt-5 text-sm font-medium text-white/60", children: [
|
|
18658
|
+
"\u2014 ",
|
|
18659
|
+
review.author
|
|
18660
|
+
] })
|
|
18661
|
+
]
|
|
18662
|
+
},
|
|
18663
|
+
i
|
|
18664
|
+
)) }),
|
|
18665
|
+
note && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-8 text-center text-xs text-white/40", children: note })
|
|
18666
|
+
] }) });
|
|
18667
|
+
}
|
|
18668
|
+
function NewHome({
|
|
18669
|
+
hero,
|
|
18670
|
+
explorer,
|
|
18671
|
+
expeditions,
|
|
18672
|
+
popular,
|
|
18673
|
+
stats,
|
|
18674
|
+
usp,
|
|
18675
|
+
reviews,
|
|
18676
|
+
journal,
|
|
18677
|
+
cta,
|
|
18678
|
+
footer,
|
|
18679
|
+
className
|
|
18680
|
+
}) {
|
|
18681
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full bg-background", className), children: [
|
|
18682
|
+
/* @__PURE__ */ jsxRuntime.jsx(HomeHeader, __spreadValues({}, hero)),
|
|
18683
|
+
explorer && /* @__PURE__ */ jsxRuntime.jsx(
|
|
18684
|
+
AdventureExplorer,
|
|
18685
|
+
__spreadProps(__spreadValues({}, explorer), {
|
|
18686
|
+
className: cn(SURFACE_WHITE, explorer.className)
|
|
18687
|
+
})
|
|
18688
|
+
),
|
|
18689
|
+
expeditions && /* @__PURE__ */ jsxRuntime.jsx(ExpeditionsRail, __spreadValues({}, expeditions)),
|
|
18690
|
+
popular && /* @__PURE__ */ jsxRuntime.jsx(PopularCloud, __spreadValues({}, popular)),
|
|
18691
|
+
stats && /* @__PURE__ */ jsxRuntime.jsx(StatsBand, __spreadValues({}, stats)),
|
|
18692
|
+
usp && /* @__PURE__ */ jsxRuntime.jsx(USP, __spreadProps(__spreadValues({}, usp), { className: cn(SURFACE_PRIMARY_800, usp.className) })),
|
|
18693
|
+
reviews && /* @__PURE__ */ jsxRuntime.jsx(ReviewsBand, __spreadValues({}, reviews)),
|
|
18694
|
+
journal && /* @__PURE__ */ jsxRuntime.jsx(BlogJournal, __spreadProps(__spreadValues({}, journal), { className: cn(SURFACE_WHITE, journal.className) })),
|
|
18695
|
+
cta && /* @__PURE__ */ jsxRuntime.jsx(CtaBanner, __spreadValues({}, cta)),
|
|
18696
|
+
footer && /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, __spreadValues({}, footer))
|
|
18697
|
+
] });
|
|
18698
|
+
}
|
|
18699
|
+
var ACTIVE_PILL = "bg-primary text-white shadow-sm";
|
|
18700
|
+
var VARIANT3 = {
|
|
18701
|
+
black: {
|
|
18702
|
+
track: "bg-white/5 border-white/10",
|
|
18703
|
+
idle: "text-white/55 hover:text-white",
|
|
18704
|
+
ring: "focus-visible:ring-white/70"
|
|
18705
|
+
},
|
|
18706
|
+
white: {
|
|
18707
|
+
track: "bg-neutral-100 border-black/10",
|
|
18708
|
+
idle: "text-neutral-500 hover:text-neutral-900",
|
|
18709
|
+
ring: "focus-visible:ring-neutral-900/40"
|
|
18710
|
+
}
|
|
18711
|
+
};
|
|
18712
|
+
var SIZE = {
|
|
18713
|
+
sm: "px-4 py-1.5 text-[13px]",
|
|
18714
|
+
md: "px-5 py-2 text-sm"
|
|
18715
|
+
};
|
|
18716
|
+
function SegmentedControl({
|
|
18717
|
+
items,
|
|
18718
|
+
value,
|
|
18719
|
+
defaultValue,
|
|
18720
|
+
onValueChange,
|
|
18721
|
+
variant = "black",
|
|
18722
|
+
size = "md",
|
|
18723
|
+
fullWidth = false,
|
|
18724
|
+
collapse = false,
|
|
18725
|
+
"aria-label": ariaLabel = "Options",
|
|
18726
|
+
className
|
|
18727
|
+
}) {
|
|
18728
|
+
var _a;
|
|
18729
|
+
const isControlled = value != null;
|
|
18730
|
+
const [internal, setInternal] = React32__namespace.useState(
|
|
18731
|
+
defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
|
|
18732
|
+
);
|
|
18733
|
+
const active = isControlled ? value : internal;
|
|
18734
|
+
const select = (id) => {
|
|
18735
|
+
if (!isControlled) setInternal(id);
|
|
18736
|
+
onValueChange == null ? void 0 : onValueChange(id);
|
|
18737
|
+
};
|
|
18738
|
+
const onKeyDown = (e) => {
|
|
18739
|
+
if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return;
|
|
18740
|
+
e.preventDefault();
|
|
18741
|
+
const enabled = items.filter((i) => !i.disabled);
|
|
18742
|
+
const idx = enabled.findIndex((i) => i.id === active);
|
|
18743
|
+
if (idx === -1) return;
|
|
18744
|
+
const next = e.key === "ArrowRight" ? enabled[(idx + 1) % enabled.length] : enabled[(idx - 1 + enabled.length) % enabled.length];
|
|
18745
|
+
select(next.id);
|
|
18746
|
+
};
|
|
18747
|
+
const v = VARIANT3[variant];
|
|
18748
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
18749
|
+
"div",
|
|
18750
|
+
{
|
|
18751
|
+
role: "radiogroup",
|
|
18752
|
+
"aria-label": ariaLabel,
|
|
18753
|
+
onKeyDown,
|
|
18754
|
+
className: cn(
|
|
18755
|
+
"inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
|
|
18756
|
+
fullWidth && "flex w-full",
|
|
18757
|
+
v.track,
|
|
18758
|
+
className
|
|
18759
|
+
),
|
|
18760
|
+
children: items.map((item) => {
|
|
18761
|
+
const isActive = item.id === active;
|
|
18762
|
+
const Icon = item.icon;
|
|
18763
|
+
const showLabel = collapse === "all" ? false : collapse ? isActive : true;
|
|
18764
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18765
|
+
"button",
|
|
18766
|
+
{
|
|
18767
|
+
type: "button",
|
|
18768
|
+
role: "radio",
|
|
18769
|
+
"aria-checked": isActive,
|
|
18770
|
+
"aria-label": collapse && !showLabel ? item.label : void 0,
|
|
18771
|
+
title: collapse && !showLabel ? item.label : void 0,
|
|
18772
|
+
disabled: item.disabled,
|
|
18773
|
+
tabIndex: isActive ? 0 : -1,
|
|
18774
|
+
onClick: () => select(item.id),
|
|
18775
|
+
className: cn(
|
|
18776
|
+
"inline-flex shrink-0 items-center justify-center rounded-full font-ui font-bold transition-all duration-300 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-40",
|
|
18777
|
+
showLabel && Icon ? "gap-2" : "gap-0",
|
|
18778
|
+
variant === "black" ? "focus-visible:ring-offset-neutral-950" : "focus-visible:ring-offset-white",
|
|
18779
|
+
fullWidth && "flex-1",
|
|
18780
|
+
SIZE[size],
|
|
18781
|
+
/* Icon-only segments are square-ish — drop the side padding so
|
|
18782
|
+
the icon centres in a circular pill. */
|
|
18783
|
+
collapse && !showLabel && (size === "sm" ? "!px-1.5" : "!px-2"),
|
|
18784
|
+
isActive ? ACTIVE_PILL : v.idle,
|
|
18785
|
+
v.ring
|
|
18786
|
+
),
|
|
18787
|
+
children: [
|
|
18788
|
+
Icon && /* @__PURE__ */ jsxRuntime.jsx(
|
|
18789
|
+
Icon,
|
|
18790
|
+
{
|
|
18791
|
+
className: cn("shrink-0", size === "sm" ? "size-4" : "size-[18px]")
|
|
18792
|
+
}
|
|
18793
|
+
),
|
|
18794
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18795
|
+
"span",
|
|
18796
|
+
{
|
|
18797
|
+
className: cn(
|
|
18798
|
+
"overflow-hidden whitespace-nowrap transition-all duration-300 ease-out",
|
|
18799
|
+
showLabel ? "max-w-[12ch] opacity-100" : "max-w-0 opacity-0"
|
|
18800
|
+
),
|
|
18801
|
+
children: item.label
|
|
18802
|
+
}
|
|
18803
|
+
)
|
|
18804
|
+
]
|
|
18805
|
+
},
|
|
18806
|
+
item.id
|
|
18807
|
+
);
|
|
18808
|
+
})
|
|
18809
|
+
}
|
|
18810
|
+
);
|
|
18811
|
+
}
|
|
16906
18812
|
|
|
16907
18813
|
exports.ActivityCard = ActivityCard;
|
|
18814
|
+
exports.AdventureExplorer = AdventureExplorer;
|
|
16908
18815
|
exports.AgentContactCard = AgentContactCard;
|
|
16909
18816
|
exports.Alert = Alert;
|
|
16910
18817
|
exports.AskExo = AskExo;
|
|
16911
18818
|
exports.BirthDateField = BirthDateField;
|
|
16912
18819
|
exports.BlogCard = BlogCard;
|
|
18820
|
+
exports.BlogJournal = BlogJournal;
|
|
16913
18821
|
exports.BlogPost = BlogPost;
|
|
16914
18822
|
exports.BookingAdventureCard = BookingAdventureCard;
|
|
16915
18823
|
exports.BookingCancellationEmail = BookingCancellationEmail;
|
|
@@ -16923,9 +18831,19 @@ exports.BookingShell = BookingShell;
|
|
|
16923
18831
|
exports.BookingSummary = BookingSummary;
|
|
16924
18832
|
exports.Button = Button;
|
|
16925
18833
|
exports.COUNTRIES = COUNTRIES;
|
|
18834
|
+
exports.CancellationForm = CancellationForm;
|
|
16926
18835
|
exports.CategoryPage2 = CategoryPage2;
|
|
18836
|
+
exports.Chip = Chip;
|
|
16927
18837
|
exports.CounterField = CounterField;
|
|
16928
18838
|
exports.CountrySearchField = CountrySearchField;
|
|
18839
|
+
exports.CtaBanner = CtaBanner;
|
|
18840
|
+
exports.DEFAULT_FOOTER_BADGES = DEFAULT_FOOTER_BADGES;
|
|
18841
|
+
exports.DEFAULT_FOOTER_DESTINATIONS = DEFAULT_FOOTER_DESTINATIONS;
|
|
18842
|
+
exports.DEFAULT_FOOTER_LANGUAGES = DEFAULT_FOOTER_LANGUAGES;
|
|
18843
|
+
exports.DEFAULT_FOOTER_LEGAL = DEFAULT_FOOTER_LEGAL;
|
|
18844
|
+
exports.DEFAULT_FOOTER_PAGES = DEFAULT_FOOTER_PAGES;
|
|
18845
|
+
exports.DEFAULT_FOOTER_SOCIALS = DEFAULT_FOOTER_SOCIALS;
|
|
18846
|
+
exports.DEFAULT_FOOTER_THEMES = DEFAULT_FOOTER_THEMES;
|
|
16929
18847
|
exports.DEFAULT_HEADER_LINKS = DEFAULT_HEADER_LINKS;
|
|
16930
18848
|
exports.DEFAULT_LANGUAGES = DEFAULT_LANGUAGES;
|
|
16931
18849
|
exports.DEPARTURE_STATUS_MAP = STATUS_MAP;
|
|
@@ -16943,11 +18861,13 @@ exports.FloatingInput = FloatingInput;
|
|
|
16943
18861
|
exports.FloatingSelect = FloatingSelect;
|
|
16944
18862
|
exports.GroupProgressBar = GroupProgressBar;
|
|
16945
18863
|
exports.GroupStatusBanner = GroupStatusBanner;
|
|
18864
|
+
exports.HomeHeader = HomeHeader;
|
|
16946
18865
|
exports.Itinerary = Itinerary;
|
|
16947
18866
|
exports.ItineraryDay = ItineraryDay;
|
|
16948
18867
|
exports.LOGO_PLANETAEXO_DATA_URI = LOGO_PLANETAEXO_DATA_URI;
|
|
16949
18868
|
exports.LeadCapturePopup = LeadCapturePopup;
|
|
16950
18869
|
exports.MenuTrip = MenuTrip;
|
|
18870
|
+
exports.NewHome = NewHome;
|
|
16951
18871
|
exports.NotificationEmail = NotificationEmail;
|
|
16952
18872
|
exports.OTPCodeInput = OTPCodeInput;
|
|
16953
18873
|
exports.Offer = Offer;
|
|
@@ -16973,7 +18893,9 @@ exports.RegistrationProgressBar = RegistrationProgressBar;
|
|
|
16973
18893
|
exports.RegistrationReminderEmail = RegistrationReminderEmail;
|
|
16974
18894
|
exports.RegistrationReminderIndividualEmail = RegistrationReminderIndividualEmail;
|
|
16975
18895
|
exports.RegistrationSuccessCard = RegistrationSuccessCard;
|
|
18896
|
+
exports.SegmentedControl = SegmentedControl;
|
|
16976
18897
|
exports.ShareWidget = ShareWidget;
|
|
18898
|
+
exports.SiteFooter = SiteFooter;
|
|
16977
18899
|
exports.SiteHeader = SiteHeader;
|
|
16978
18900
|
exports.StatusBadge = StatusBadge2;
|
|
16979
18901
|
exports.StickyBookingCard = StickyBookingCard;
|
|
@@ -16987,7 +18909,9 @@ exports.TripCard = TripCard;
|
|
|
16987
18909
|
exports.TripHeader = TripHeader;
|
|
16988
18910
|
exports.TripPage = TripPage;
|
|
16989
18911
|
exports.TrustpilotEmbed = TrustpilotEmbed;
|
|
18912
|
+
exports.USP = USP;
|
|
16990
18913
|
exports.buttonVariants = buttonVariants;
|
|
18914
|
+
exports.chipVariants = chipVariants;
|
|
16991
18915
|
exports.cn = cn;
|
|
16992
18916
|
exports.emailTokens = emailTokens;
|
|
16993
18917
|
exports.formatCpf = formatCpf;
|