@planetaexo/design-system 0.23.0 → 0.23.1
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 +1114 -539
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +254 -18
- package/dist/index.d.ts +254 -18
- package/dist/index.js +1095 -524
- 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 React25 = 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 React25__namespace = /*#__PURE__*/_interopNamespace(React25);
|
|
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 = React25__namespace.forwardRef(
|
|
106
106
|
(_a, ref) => {
|
|
107
107
|
var _b = _a, { className, variant, size } = _b, props = __objRest(_b, ["className", "variant", "size"]);
|
|
108
108
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -323,10 +323,10 @@ function DialogDescription(_a) {
|
|
|
323
323
|
}, props)
|
|
324
324
|
);
|
|
325
325
|
}
|
|
326
|
-
var FloatingInput =
|
|
326
|
+
var FloatingInput = React25__namespace.forwardRef(
|
|
327
327
|
(_a, ref) => {
|
|
328
328
|
var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
|
|
329
|
-
const inputId = id != null ? id :
|
|
329
|
+
const inputId = id != null ? id : React25__namespace.useId();
|
|
330
330
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
|
|
331
331
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
332
332
|
"input",
|
|
@@ -366,10 +366,10 @@ var FloatingInput = React23__namespace.forwardRef(
|
|
|
366
366
|
}
|
|
367
367
|
);
|
|
368
368
|
FloatingInput.displayName = "FloatingInput";
|
|
369
|
-
var FloatingSelect =
|
|
369
|
+
var FloatingSelect = React25__namespace.forwardRef(
|
|
370
370
|
(_a, ref) => {
|
|
371
371
|
var _b = _a, { label, error, id, className, required, children, value } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children", "value"]);
|
|
372
|
-
const inputId = id != null ? id :
|
|
372
|
+
const inputId = id != null ? id : React25__namespace.useId();
|
|
373
373
|
const hasValue = typeof value === "string" ? value !== "" : value !== void 0 && value !== null;
|
|
374
374
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
|
|
375
375
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -633,11 +633,11 @@ function PhoneCountrySelect({
|
|
|
633
633
|
disabled
|
|
634
634
|
}) {
|
|
635
635
|
var _a;
|
|
636
|
-
const [open, setOpen] =
|
|
637
|
-
const containerRef =
|
|
638
|
-
const listRef =
|
|
636
|
+
const [open, setOpen] = React25__namespace.useState(false);
|
|
637
|
+
const containerRef = React25__namespace.useRef(null);
|
|
638
|
+
const listRef = React25__namespace.useRef(null);
|
|
639
639
|
const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
|
|
640
|
-
|
|
640
|
+
React25__namespace.useEffect(() => {
|
|
641
641
|
if (!open) return;
|
|
642
642
|
const handler = (e) => {
|
|
643
643
|
var _a2;
|
|
@@ -648,7 +648,7 @@ function PhoneCountrySelect({
|
|
|
648
648
|
document.addEventListener("mousedown", handler);
|
|
649
649
|
return () => document.removeEventListener("mousedown", handler);
|
|
650
650
|
}, [open]);
|
|
651
|
-
|
|
651
|
+
React25__namespace.useEffect(() => {
|
|
652
652
|
if (!open || !listRef.current) return;
|
|
653
653
|
const activeEl = listRef.current.querySelector("[data-selected=true]");
|
|
654
654
|
activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
|
|
@@ -918,8 +918,8 @@ function CalendarDayButton(_a) {
|
|
|
918
918
|
"locale"
|
|
919
919
|
]);
|
|
920
920
|
const defaultClassNames = reactDayPicker.getDefaultClassNames();
|
|
921
|
-
const ref =
|
|
922
|
-
|
|
921
|
+
const ref = React25__namespace.useRef(null);
|
|
922
|
+
React25__namespace.useEffect(() => {
|
|
923
923
|
var _a2;
|
|
924
924
|
if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
|
|
925
925
|
}, [modifiers.focused]);
|
|
@@ -950,16 +950,16 @@ function BirthDateField({
|
|
|
950
950
|
className,
|
|
951
951
|
disabled
|
|
952
952
|
}) {
|
|
953
|
-
const [open, setOpen] =
|
|
954
|
-
const [text, setText] =
|
|
953
|
+
const [open, setOpen] = React25__namespace.useState(false);
|
|
954
|
+
const [text, setText] = React25__namespace.useState(
|
|
955
955
|
value ? dateFns.format(value, "dd/MM/yyyy") : ""
|
|
956
956
|
);
|
|
957
|
-
const containerRef =
|
|
958
|
-
const inputId =
|
|
959
|
-
|
|
957
|
+
const containerRef = React25__namespace.useRef(null);
|
|
958
|
+
const inputId = React25__namespace.useId();
|
|
959
|
+
React25__namespace.useEffect(() => {
|
|
960
960
|
setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
|
|
961
961
|
}, [value]);
|
|
962
|
-
|
|
962
|
+
React25__namespace.useEffect(() => {
|
|
963
963
|
if (!open) return;
|
|
964
964
|
const handler = (e) => {
|
|
965
965
|
var _a;
|
|
@@ -1168,14 +1168,14 @@ function CountrySearchField({
|
|
|
1168
1168
|
}) {
|
|
1169
1169
|
var _a;
|
|
1170
1170
|
const list = countries != null ? countries : COUNTRIES;
|
|
1171
|
-
const [query, setQuery] =
|
|
1172
|
-
const [open, setOpen] =
|
|
1173
|
-
const containerRef =
|
|
1174
|
-
const searchRef =
|
|
1171
|
+
const [query, setQuery] = React25__namespace.useState("");
|
|
1172
|
+
const [open, setOpen] = React25__namespace.useState(false);
|
|
1173
|
+
const containerRef = React25__namespace.useRef(null);
|
|
1174
|
+
const searchRef = React25__namespace.useRef(null);
|
|
1175
1175
|
const selected = list.find((c) => c.code === value);
|
|
1176
1176
|
const isFloated = open || !!selected;
|
|
1177
1177
|
const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
|
|
1178
|
-
|
|
1178
|
+
React25__namespace.useEffect(() => {
|
|
1179
1179
|
if (!open) return;
|
|
1180
1180
|
const handler = (e) => {
|
|
1181
1181
|
var _a2;
|
|
@@ -1289,7 +1289,7 @@ function AdventureCard({
|
|
|
1289
1289
|
}) {
|
|
1290
1290
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
1291
1291
|
const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
|
|
1292
|
-
const [checkedInternal, setCheckedInternal] =
|
|
1292
|
+
const [checkedInternal, setCheckedInternal] = React25__namespace.useState(
|
|
1293
1293
|
new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
|
|
1294
1294
|
);
|
|
1295
1295
|
const isChecked = (opt) => {
|
|
@@ -1687,7 +1687,7 @@ function BookingShell({
|
|
|
1687
1687
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1688
1688
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
|
|
1689
1689
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: title }),
|
|
1690
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1690
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: steps.map((label, i) => /* @__PURE__ */ jsxRuntime.jsxs(React25__namespace.Fragment, { children: [
|
|
1691
1691
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1692
1692
|
"span",
|
|
1693
1693
|
{
|
|
@@ -1886,7 +1886,7 @@ function TermsSection({
|
|
|
1886
1886
|
termsContent
|
|
1887
1887
|
}) {
|
|
1888
1888
|
var _a;
|
|
1889
|
-
const [modalOpen, setModalOpen] =
|
|
1889
|
+
const [modalOpen, setModalOpen] = React25__namespace.useState(false);
|
|
1890
1890
|
const i18n = (_a = TERMS_I18N[locale]) != null ? _a : TERMS_I18N.en;
|
|
1891
1891
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border p-4 flex flex-col gap-3", children: [
|
|
1892
1892
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: title }),
|
|
@@ -1955,7 +1955,7 @@ function BookingConfirmedCard({
|
|
|
1955
1955
|
" ",
|
|
1956
1956
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold text-foreground font-heading", children: bookingNumber })
|
|
1957
1957
|
] }),
|
|
1958
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
1958
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground font-sans max-w-sm mx-auto leading-relaxed", children: message != null ? message : /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
1959
1959
|
"A confirmation email has been sent to",
|
|
1960
1960
|
" ",
|
|
1961
1961
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold text-foreground", children: email || "your email" }),
|
|
@@ -1981,6 +1981,32 @@ function BookingConfirmedCard({
|
|
|
1981
1981
|
)
|
|
1982
1982
|
] });
|
|
1983
1983
|
}
|
|
1984
|
+
function TransferDetailsBlock({
|
|
1985
|
+
label,
|
|
1986
|
+
items,
|
|
1987
|
+
className
|
|
1988
|
+
}) {
|
|
1989
|
+
if (!items.length) return null;
|
|
1990
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1991
|
+
"div",
|
|
1992
|
+
{
|
|
1993
|
+
className: [
|
|
1994
|
+
"w-full max-w-md mx-auto rounded-xl border border-border bg-muted/40 px-5 py-4 text-left",
|
|
1995
|
+
className != null ? className : ""
|
|
1996
|
+
].filter(Boolean).join(" "),
|
|
1997
|
+
children: [
|
|
1998
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 text-xs uppercase tracking-wide text-muted-foreground font-heading", children: label }),
|
|
1999
|
+
/* @__PURE__ */ jsxRuntime.jsx("dl", { className: "space-y-1.5 text-sm font-mono", children: items.map(([term, value], i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [
|
|
2000
|
+
/* @__PURE__ */ jsxRuntime.jsxs("dt", { className: "text-muted-foreground shrink-0", children: [
|
|
2001
|
+
term,
|
|
2002
|
+
":"
|
|
2003
|
+
] }),
|
|
2004
|
+
/* @__PURE__ */ jsxRuntime.jsx("dd", { className: "text-foreground font-semibold break-all", children: value })
|
|
2005
|
+
] }, i)) })
|
|
2006
|
+
]
|
|
2007
|
+
}
|
|
2008
|
+
);
|
|
2009
|
+
}
|
|
1984
2010
|
var WIZARD_STEPS_FN = (l) => {
|
|
1985
2011
|
var _a, _b, _c, _d, _e, _f;
|
|
1986
2012
|
return [
|
|
@@ -1998,9 +2024,9 @@ function BookingWizard({
|
|
|
1998
2024
|
}) {
|
|
1999
2025
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T;
|
|
2000
2026
|
const wizardSteps = WIZARD_STEPS_FN(labels);
|
|
2001
|
-
const [step, setStep] =
|
|
2002
|
-
const [error, setError] =
|
|
2003
|
-
const [responsible, setResponsible] =
|
|
2027
|
+
const [step, setStep] = React25__namespace.useState("responsible");
|
|
2028
|
+
const [error, setError] = React25__namespace.useState(null);
|
|
2029
|
+
const [responsible, setResponsible] = React25__namespace.useState({
|
|
2004
2030
|
firstName: "",
|
|
2005
2031
|
lastName: "",
|
|
2006
2032
|
email: "",
|
|
@@ -2019,7 +2045,7 @@ function BookingWizard({
|
|
|
2019
2045
|
return s + ((_b2 = (_a2 = a.slots) == null ? void 0 : _a2.children) != null ? _b2 : 0);
|
|
2020
2046
|
}, 0);
|
|
2021
2047
|
const totalPax = totalAdults + totalChildren;
|
|
2022
|
-
const [travellers, setTravellers] =
|
|
2048
|
+
const [travellers, setTravellers] = React25__namespace.useState(
|
|
2023
2049
|
Array.from({ length: Math.max(totalPax, 1) }, () => ({
|
|
2024
2050
|
firstName: "",
|
|
2025
2051
|
lastName: "",
|
|
@@ -2027,9 +2053,9 @@ function BookingWizard({
|
|
|
2027
2053
|
email: ""
|
|
2028
2054
|
}))
|
|
2029
2055
|
);
|
|
2030
|
-
const [payAmount, setPayAmount] =
|
|
2031
|
-
const [payMethod, setPayMethod] =
|
|
2032
|
-
const [termsAccepted, setTermsAccepted] =
|
|
2056
|
+
const [payAmount, setPayAmount] = React25__namespace.useState("full");
|
|
2057
|
+
const [payMethod, setPayMethod] = React25__namespace.useState("stripe");
|
|
2058
|
+
const [termsAccepted, setTermsAccepted] = React25__namespace.useState(false);
|
|
2033
2059
|
const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
2034
2060
|
const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
|
|
2035
2061
|
const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
|
|
@@ -2256,7 +2282,7 @@ function Offer({
|
|
|
2256
2282
|
className
|
|
2257
2283
|
}) {
|
|
2258
2284
|
var _a, _b, _c;
|
|
2259
|
-
const [showBooking, setShowBooking] =
|
|
2285
|
+
const [showBooking, setShowBooking] = React25__namespace.useState(false);
|
|
2260
2286
|
const isShowingCheckout = !confirmedState && (!!checkoutSlot || showBooking);
|
|
2261
2287
|
const handleBook = () => {
|
|
2262
2288
|
if (!checkoutSlot && !externalBookingFlow) setShowBooking(true);
|
|
@@ -2617,7 +2643,7 @@ function AdventureSection({
|
|
|
2617
2643
|
labels
|
|
2618
2644
|
}) {
|
|
2619
2645
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
2620
|
-
const [detailsOpen, setDetailsOpen] =
|
|
2646
|
+
const [detailsOpen, setDetailsOpen] = React25__namespace.useState(false);
|
|
2621
2647
|
const handleCopyUrl = (url) => {
|
|
2622
2648
|
if (onCopyFormLink) {
|
|
2623
2649
|
onCopyFormLink(url);
|
|
@@ -3111,8 +3137,8 @@ function AddTravellerDialog({
|
|
|
3111
3137
|
errorMessage
|
|
3112
3138
|
}) {
|
|
3113
3139
|
var _a, _b, _c, _d, _e;
|
|
3114
|
-
const [form, setForm] =
|
|
3115
|
-
|
|
3140
|
+
const [form, setForm] = React25__namespace.useState(() => createInitialAddFormData(config));
|
|
3141
|
+
React25__namespace.useEffect(() => {
|
|
3116
3142
|
if (open) {
|
|
3117
3143
|
setForm(createInitialAddFormData(config));
|
|
3118
3144
|
}
|
|
@@ -3172,7 +3198,7 @@ function EditTravellerDialog({
|
|
|
3172
3198
|
errorMessage
|
|
3173
3199
|
}) {
|
|
3174
3200
|
var _a, _b, _c, _d, _e;
|
|
3175
|
-
const [form, setForm] =
|
|
3201
|
+
const [form, setForm] = React25__namespace.useState(() => ({
|
|
3176
3202
|
firstName: "",
|
|
3177
3203
|
lastName: "",
|
|
3178
3204
|
email: "",
|
|
@@ -3181,7 +3207,7 @@ function EditTravellerDialog({
|
|
|
3181
3207
|
birthDate: "",
|
|
3182
3208
|
personType: "ADULT"
|
|
3183
3209
|
}));
|
|
3184
|
-
|
|
3210
|
+
React25__namespace.useEffect(() => {
|
|
3185
3211
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3186
3212
|
if (open && traveller) {
|
|
3187
3213
|
setForm({
|
|
@@ -3461,38 +3487,38 @@ function BookingDetails({
|
|
|
3461
3487
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3462
3488
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3463
3489
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3464
|
-
const [addModalState, setAddModalState] =
|
|
3490
|
+
const [addModalState, setAddModalState] = React25__namespace.useState({
|
|
3465
3491
|
open: false,
|
|
3466
3492
|
adventureId: null
|
|
3467
3493
|
});
|
|
3468
|
-
const [editModalState, setEditModalState] =
|
|
3469
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3470
|
-
const handleRequestOpenAddModal =
|
|
3494
|
+
const [editModalState, setEditModalState] = React25__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3495
|
+
const [deleteModalState, setDeleteModalState] = React25__namespace.useState({ open: false, adventureId: null, traveller: null });
|
|
3496
|
+
const handleRequestOpenAddModal = React25__namespace.useCallback((adventureId) => {
|
|
3471
3497
|
setAddModalState({ open: true, adventureId });
|
|
3472
3498
|
}, []);
|
|
3473
|
-
const handleRequestOpenEditModal =
|
|
3499
|
+
const handleRequestOpenEditModal = React25__namespace.useCallback(
|
|
3474
3500
|
(adventureId, traveller) => {
|
|
3475
3501
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3476
3502
|
},
|
|
3477
3503
|
[]
|
|
3478
3504
|
);
|
|
3479
|
-
const handleRequestOpenDeleteModal =
|
|
3505
|
+
const handleRequestOpenDeleteModal = React25__namespace.useCallback(
|
|
3480
3506
|
(adventureId, traveller) => {
|
|
3481
3507
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3482
3508
|
},
|
|
3483
3509
|
[]
|
|
3484
3510
|
);
|
|
3485
|
-
const closeAddModal =
|
|
3511
|
+
const closeAddModal = React25__namespace.useCallback(() => {
|
|
3486
3512
|
setAddModalState({ open: false, adventureId: null });
|
|
3487
3513
|
}, []);
|
|
3488
|
-
const closeEditModal =
|
|
3514
|
+
const closeEditModal = React25__namespace.useCallback(() => {
|
|
3489
3515
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3490
3516
|
}, []);
|
|
3491
|
-
const closeDeleteModal =
|
|
3517
|
+
const closeDeleteModal = React25__namespace.useCallback(() => {
|
|
3492
3518
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3493
3519
|
}, []);
|
|
3494
|
-
const submitInFlightRef =
|
|
3495
|
-
const handleAddSubmit =
|
|
3520
|
+
const submitInFlightRef = React25__namespace.useRef(false);
|
|
3521
|
+
const handleAddSubmit = React25__namespace.useCallback(
|
|
3496
3522
|
async (adventureId, data) => {
|
|
3497
3523
|
if (!onSubmitAddTraveller) return;
|
|
3498
3524
|
if (submitInFlightRef.current) return;
|
|
@@ -3507,7 +3533,7 @@ function BookingDetails({
|
|
|
3507
3533
|
},
|
|
3508
3534
|
[onSubmitAddTraveller, closeAddModal]
|
|
3509
3535
|
);
|
|
3510
|
-
const handleEditSubmit =
|
|
3536
|
+
const handleEditSubmit = React25__namespace.useCallback(
|
|
3511
3537
|
async (adventureId, travellerId, data) => {
|
|
3512
3538
|
if (!onSubmitEditTraveller) return;
|
|
3513
3539
|
if (submitInFlightRef.current) return;
|
|
@@ -3522,7 +3548,7 @@ function BookingDetails({
|
|
|
3522
3548
|
},
|
|
3523
3549
|
[onSubmitEditTraveller, closeEditModal]
|
|
3524
3550
|
);
|
|
3525
|
-
const handleDeleteConfirm =
|
|
3551
|
+
const handleDeleteConfirm = React25__namespace.useCallback(
|
|
3526
3552
|
async (adventureId, travellerId) => {
|
|
3527
3553
|
if (!onConfirmRemoveTraveller) return;
|
|
3528
3554
|
if (submitInFlightRef.current) return;
|
|
@@ -4252,7 +4278,7 @@ function BookingConfirmationEmail({
|
|
|
4252
4278
|
}, children: i + 1 }) }),
|
|
4253
4279
|
/* @__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 }) })
|
|
4254
4280
|
] }) }) }, i)) }),
|
|
4255
|
-
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(
|
|
4281
|
+
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(React25__namespace.Fragment, { children: [
|
|
4256
4282
|
idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
|
|
4257
4283
|
idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
|
|
4258
4284
|
] }, idx)) })
|
|
@@ -4705,11 +4731,11 @@ function DatePickerField({
|
|
|
4705
4731
|
fromDate,
|
|
4706
4732
|
className
|
|
4707
4733
|
}) {
|
|
4708
|
-
const [open, setOpen] =
|
|
4709
|
-
const containerRef =
|
|
4710
|
-
const [calendarWidth, setCalendarWidth] =
|
|
4734
|
+
const [open, setOpen] = React25__namespace.useState(false);
|
|
4735
|
+
const containerRef = React25__namespace.useRef(null);
|
|
4736
|
+
const [calendarWidth, setCalendarWidth] = React25__namespace.useState();
|
|
4711
4737
|
const hasValue = !!value;
|
|
4712
|
-
|
|
4738
|
+
React25__namespace.useEffect(() => {
|
|
4713
4739
|
if (!containerRef.current) return;
|
|
4714
4740
|
const observer = new ResizeObserver(([entry]) => {
|
|
4715
4741
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -4818,7 +4844,7 @@ function BookingForm({
|
|
|
4818
4844
|
subtitle = "Free enquiry \u2013 no commitment",
|
|
4819
4845
|
className
|
|
4820
4846
|
}) {
|
|
4821
|
-
const [values, setValues] =
|
|
4847
|
+
const [values, setValues] = React25__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
4822
4848
|
const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
4823
4849
|
const handleSubmit = (e) => {
|
|
4824
4850
|
e.preventDefault();
|
|
@@ -5355,11 +5381,11 @@ function FloatingTextarea({
|
|
|
5355
5381
|
}
|
|
5356
5382
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
5357
5383
|
var _a, _b, _c;
|
|
5358
|
-
const [open, setOpen] =
|
|
5359
|
-
const containerRef =
|
|
5384
|
+
const [open, setOpen] = React25__namespace.useState(false);
|
|
5385
|
+
const containerRef = React25__namespace.useRef(null);
|
|
5360
5386
|
const options = (_a = field.options) != null ? _a : [];
|
|
5361
5387
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
5362
|
-
|
|
5388
|
+
React25__namespace.useEffect(() => {
|
|
5363
5389
|
if (!open) return;
|
|
5364
5390
|
const handleOutside = (e) => {
|
|
5365
5391
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -5748,11 +5774,11 @@ function RegistrationForm({
|
|
|
5748
5774
|
readOnly = false
|
|
5749
5775
|
}) {
|
|
5750
5776
|
var _a;
|
|
5751
|
-
const L =
|
|
5777
|
+
const L = React25__namespace.useMemo(
|
|
5752
5778
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS4), labels != null ? labels : {}),
|
|
5753
5779
|
[labels]
|
|
5754
5780
|
);
|
|
5755
|
-
const sortedFields =
|
|
5781
|
+
const sortedFields = React25__namespace.useMemo(
|
|
5756
5782
|
() => [...fields].sort((a, b) => {
|
|
5757
5783
|
var _a2, _b;
|
|
5758
5784
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -5760,7 +5786,7 @@ function RegistrationForm({
|
|
|
5760
5786
|
[fields]
|
|
5761
5787
|
);
|
|
5762
5788
|
const isControlled = values !== void 0;
|
|
5763
|
-
const [internal, setInternal] =
|
|
5789
|
+
const [internal, setInternal] = React25__namespace.useState(
|
|
5764
5790
|
() => initializeValues(
|
|
5765
5791
|
sortedFields,
|
|
5766
5792
|
defaultValues != null ? defaultValues : {},
|
|
@@ -5768,9 +5794,9 @@ function RegistrationForm({
|
|
|
5768
5794
|
includeTerms
|
|
5769
5795
|
)
|
|
5770
5796
|
);
|
|
5771
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
5772
|
-
const [validationErrors, setValidationErrors] =
|
|
5773
|
-
|
|
5797
|
+
const [submitAttempted, setSubmitAttempted] = React25__namespace.useState(false);
|
|
5798
|
+
const [validationErrors, setValidationErrors] = React25__namespace.useState({});
|
|
5799
|
+
React25__namespace.useEffect(() => {
|
|
5774
5800
|
if (isControlled) return;
|
|
5775
5801
|
setInternal((prev) => {
|
|
5776
5802
|
const next = initializeValues(
|
|
@@ -5827,7 +5853,7 @@ function RegistrationForm({
|
|
|
5827
5853
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
5828
5854
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
5829
5855
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
5830
|
-
|
|
5856
|
+
React25__namespace.useEffect(() => {
|
|
5831
5857
|
if (!submitAttempted || !scrollTargetId) return;
|
|
5832
5858
|
const timer = setTimeout(() => {
|
|
5833
5859
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -6289,10 +6315,10 @@ var OTPCodeInput = ({
|
|
|
6289
6315
|
id,
|
|
6290
6316
|
required
|
|
6291
6317
|
}) => {
|
|
6292
|
-
const baseId = id != null ? id :
|
|
6293
|
-
const inputRef =
|
|
6294
|
-
const [focused, setFocused] =
|
|
6295
|
-
const digits =
|
|
6318
|
+
const baseId = id != null ? id : React25__namespace.useId();
|
|
6319
|
+
const inputRef = React25__namespace.useRef(null);
|
|
6320
|
+
const [focused, setFocused] = React25__namespace.useState(false);
|
|
6321
|
+
const digits = React25__namespace.useMemo(() => {
|
|
6296
6322
|
const arr = value.split("").slice(0, length);
|
|
6297
6323
|
while (arr.length < length) arr.push("");
|
|
6298
6324
|
return arr;
|
|
@@ -6408,7 +6434,7 @@ function Checkbox(_a) {
|
|
|
6408
6434
|
})
|
|
6409
6435
|
);
|
|
6410
6436
|
}
|
|
6411
|
-
var AccordionVariantContext =
|
|
6437
|
+
var AccordionVariantContext = React25__namespace.createContext("default");
|
|
6412
6438
|
function Accordion(_a) {
|
|
6413
6439
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
6414
6440
|
return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -6426,7 +6452,7 @@ function Accordion(_a) {
|
|
|
6426
6452
|
}
|
|
6427
6453
|
function AccordionItem(_a) {
|
|
6428
6454
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
6429
|
-
const variant =
|
|
6455
|
+
const variant = React25__namespace.useContext(AccordionVariantContext);
|
|
6430
6456
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6431
6457
|
accordion.Accordion.Item,
|
|
6432
6458
|
__spreadValues({
|
|
@@ -6447,7 +6473,7 @@ function AccordionTrigger(_a) {
|
|
|
6447
6473
|
"className",
|
|
6448
6474
|
"children"
|
|
6449
6475
|
]);
|
|
6450
|
-
const variant =
|
|
6476
|
+
const variant = React25__namespace.useContext(AccordionVariantContext);
|
|
6451
6477
|
return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6452
6478
|
accordion.Accordion.Trigger,
|
|
6453
6479
|
__spreadProps(__spreadValues({
|
|
@@ -6501,7 +6527,7 @@ function AccordionContent(_a) {
|
|
|
6501
6527
|
"className",
|
|
6502
6528
|
"children"
|
|
6503
6529
|
]);
|
|
6504
|
-
const variant =
|
|
6530
|
+
const variant = React25__namespace.useContext(AccordionVariantContext);
|
|
6505
6531
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6506
6532
|
accordion.Accordion.Panel,
|
|
6507
6533
|
__spreadProps(__spreadValues({
|
|
@@ -6533,7 +6559,7 @@ function FilterPanel({
|
|
|
6533
6559
|
title = "Filters",
|
|
6534
6560
|
className
|
|
6535
6561
|
}) {
|
|
6536
|
-
const [internalValue, setInternalValue] =
|
|
6562
|
+
const [internalValue, setInternalValue] = React25__namespace.useState(
|
|
6537
6563
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
6538
6564
|
);
|
|
6539
6565
|
const selected = value != null ? value : internalValue;
|
|
@@ -6629,6 +6655,76 @@ function FilterPanel({
|
|
|
6629
6655
|
)
|
|
6630
6656
|
] });
|
|
6631
6657
|
}
|
|
6658
|
+
var TRUSTPILOT_SCRIPT_SRC = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js";
|
|
6659
|
+
function TrustpilotEmbed({ config }) {
|
|
6660
|
+
var _a, _b, _c, _d, _e, _f;
|
|
6661
|
+
const ref = React25__namespace.useRef(null);
|
|
6662
|
+
React25__namespace.useEffect(() => {
|
|
6663
|
+
if (typeof document === "undefined" || !ref.current) return;
|
|
6664
|
+
let cancelled = false;
|
|
6665
|
+
const initWidget = () => {
|
|
6666
|
+
if (cancelled || !ref.current) return;
|
|
6667
|
+
const tp = window.Trustpilot;
|
|
6668
|
+
if (tp == null ? void 0 : tp.loadFromElement) {
|
|
6669
|
+
tp.loadFromElement(ref.current, true);
|
|
6670
|
+
}
|
|
6671
|
+
};
|
|
6672
|
+
const existing = document.querySelector(
|
|
6673
|
+
`script[src="${TRUSTPILOT_SCRIPT_SRC}"]`
|
|
6674
|
+
);
|
|
6675
|
+
if (existing) {
|
|
6676
|
+
const tp = window.Trustpilot;
|
|
6677
|
+
if (tp == null ? void 0 : tp.loadFromElement) {
|
|
6678
|
+
initWidget();
|
|
6679
|
+
} else {
|
|
6680
|
+
existing.addEventListener("load", initWidget, { once: true });
|
|
6681
|
+
}
|
|
6682
|
+
return () => {
|
|
6683
|
+
cancelled = true;
|
|
6684
|
+
existing.removeEventListener("load", initWidget);
|
|
6685
|
+
};
|
|
6686
|
+
}
|
|
6687
|
+
const s = document.createElement("script");
|
|
6688
|
+
s.src = TRUSTPILOT_SCRIPT_SRC;
|
|
6689
|
+
s.async = true;
|
|
6690
|
+
s.addEventListener("load", initWidget, { once: true });
|
|
6691
|
+
document.body.appendChild(s);
|
|
6692
|
+
return () => {
|
|
6693
|
+
cancelled = true;
|
|
6694
|
+
s.removeEventListener("load", initWidget);
|
|
6695
|
+
};
|
|
6696
|
+
}, [config]);
|
|
6697
|
+
const sku = Array.isArray(config.sku) ? config.sku.join(",") : config.sku;
|
|
6698
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6699
|
+
"div",
|
|
6700
|
+
{
|
|
6701
|
+
ref,
|
|
6702
|
+
className: "trustpilot-widget",
|
|
6703
|
+
"data-locale": (_a = config.locale) != null ? _a : "en-US",
|
|
6704
|
+
"data-template-id": (_b = config.templateId) != null ? _b : "5763bccae0a06d08e809ecbb",
|
|
6705
|
+
"data-businessunit-id": config.businessUnitId,
|
|
6706
|
+
"data-style-height": (_c = config.styleHeight) != null ? _c : "700px",
|
|
6707
|
+
"data-style-width": (_d = config.styleWidth) != null ? _d : "100%",
|
|
6708
|
+
"data-sku": sku,
|
|
6709
|
+
"data-no-reviews": (_e = config.noReviews) != null ? _e : "hide",
|
|
6710
|
+
"data-fullwidth": "true",
|
|
6711
|
+
"data-theme": config.theme,
|
|
6712
|
+
"data-token": config.token,
|
|
6713
|
+
"data-scroll-to-list": config.scrollToList ? "true" : void 0,
|
|
6714
|
+
"data-style-alignment": config.styleAlignment,
|
|
6715
|
+
"data-star-color": config.starColor,
|
|
6716
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
6717
|
+
"a",
|
|
6718
|
+
{
|
|
6719
|
+
href: (_f = config.fallbackHref) != null ? _f : "https://www.trustpilot.com/",
|
|
6720
|
+
target: "_blank",
|
|
6721
|
+
rel: "noopener noreferrer",
|
|
6722
|
+
children: "Trustpilot"
|
|
6723
|
+
}
|
|
6724
|
+
)
|
|
6725
|
+
}
|
|
6726
|
+
);
|
|
6727
|
+
}
|
|
6632
6728
|
function ItineraryDayCard({
|
|
6633
6729
|
stop,
|
|
6634
6730
|
onOpen
|
|
@@ -6695,11 +6791,11 @@ function ItineraryModal({
|
|
|
6695
6791
|
onNext
|
|
6696
6792
|
}) {
|
|
6697
6793
|
var _a, _b, _c;
|
|
6698
|
-
const [imgIndex, setImgIndex] =
|
|
6794
|
+
const [imgIndex, setImgIndex] = React25__namespace.useState(0);
|
|
6699
6795
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
6700
6796
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
6701
6797
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
6702
|
-
|
|
6798
|
+
React25__namespace.useEffect(() => {
|
|
6703
6799
|
setImgIndex(0);
|
|
6704
6800
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
6705
6801
|
if (!stop) return null;
|
|
@@ -6826,8 +6922,8 @@ function ItineraryModal({
|
|
|
6826
6922
|
) });
|
|
6827
6923
|
}
|
|
6828
6924
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
6829
|
-
const [activeIndex, setActiveIndex] =
|
|
6830
|
-
const scrollRef =
|
|
6925
|
+
const [activeIndex, setActiveIndex] = React25__namespace.useState(null);
|
|
6926
|
+
const scrollRef = React25__namespace.useRef(null);
|
|
6831
6927
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
6832
6928
|
const scrollBy = (dir) => {
|
|
6833
6929
|
if (!scrollRef.current) return;
|
|
@@ -6905,147 +7001,6 @@ function Itinerary({ title, subtitle, stops, className }) {
|
|
|
6905
7001
|
)
|
|
6906
7002
|
] });
|
|
6907
7003
|
}
|
|
6908
|
-
function MenuTrip({
|
|
6909
|
-
sections,
|
|
6910
|
-
activeSection,
|
|
6911
|
-
onSelect,
|
|
6912
|
-
variant = "pill",
|
|
6913
|
-
bold = true,
|
|
6914
|
-
className
|
|
6915
|
-
}) {
|
|
6916
|
-
const scrollRef = React23__namespace.useRef(null);
|
|
6917
|
-
React23__namespace.useEffect(() => {
|
|
6918
|
-
if (!scrollRef.current || !activeSection) return;
|
|
6919
|
-
const container = scrollRef.current;
|
|
6920
|
-
const btn = container.querySelector(
|
|
6921
|
-
`[data-section="${activeSection}"]`
|
|
6922
|
-
);
|
|
6923
|
-
if (!btn) return;
|
|
6924
|
-
const btnLeft = btn.offsetLeft;
|
|
6925
|
-
const btnRight = btnLeft + btn.offsetWidth;
|
|
6926
|
-
const cLeft = container.scrollLeft;
|
|
6927
|
-
const cRight = cLeft + container.offsetWidth;
|
|
6928
|
-
if (btnLeft < cLeft) {
|
|
6929
|
-
container.scrollTo({ left: btnLeft - 16, behavior: "smooth" });
|
|
6930
|
-
} else if (btnRight > cRight) {
|
|
6931
|
-
container.scrollTo({ left: btnRight - container.offsetWidth + 16, behavior: "smooth" });
|
|
6932
|
-
}
|
|
6933
|
-
}, [activeSection]);
|
|
6934
|
-
if (variant === "underline") {
|
|
6935
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6936
|
-
"div",
|
|
6937
|
-
{
|
|
6938
|
-
ref: scrollRef,
|
|
6939
|
-
className: cn(
|
|
6940
|
-
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
6941
|
-
"border-b border-border",
|
|
6942
|
-
className
|
|
6943
|
-
),
|
|
6944
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-end gap-0", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
6945
|
-
"button",
|
|
6946
|
-
{
|
|
6947
|
-
"data-section": s.id,
|
|
6948
|
-
type: "button",
|
|
6949
|
-
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
6950
|
-
className: cn(
|
|
6951
|
-
"relative px-4 py-2.5 text-sm font-ui whitespace-nowrap transition-colors duration-150",
|
|
6952
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
|
|
6953
|
-
"after:absolute after:inset-x-0 after:bottom-0 after:h-0.5 after:rounded-full after:transition-all",
|
|
6954
|
-
bold ? "font-semibold" : "font-normal",
|
|
6955
|
-
activeSection === s.id ? "text-foreground after:bg-primary" : "text-muted-foreground hover:text-foreground after:bg-transparent"
|
|
6956
|
-
),
|
|
6957
|
-
children: s.label
|
|
6958
|
-
},
|
|
6959
|
-
s.id
|
|
6960
|
-
)) })
|
|
6961
|
-
}
|
|
6962
|
-
);
|
|
6963
|
-
}
|
|
6964
|
-
if (variant === "outlined") {
|
|
6965
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6966
|
-
"div",
|
|
6967
|
-
{
|
|
6968
|
-
ref: scrollRef,
|
|
6969
|
-
className: cn(
|
|
6970
|
-
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
6971
|
-
className
|
|
6972
|
-
),
|
|
6973
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-2", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
6974
|
-
"button",
|
|
6975
|
-
{
|
|
6976
|
-
"data-section": s.id,
|
|
6977
|
-
type: "button",
|
|
6978
|
-
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
6979
|
-
className: cn(
|
|
6980
|
-
"rounded-full border px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
6981
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
6982
|
-
bold ? "font-semibold" : "font-normal",
|
|
6983
|
-
activeSection === s.id ? "border-foreground bg-foreground text-background" : "border-border bg-background text-muted-foreground hover:border-foreground/50 hover:text-foreground"
|
|
6984
|
-
),
|
|
6985
|
-
children: s.label
|
|
6986
|
-
},
|
|
6987
|
-
s.id
|
|
6988
|
-
)) })
|
|
6989
|
-
}
|
|
6990
|
-
);
|
|
6991
|
-
}
|
|
6992
|
-
if (variant === "floating") {
|
|
6993
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6994
|
-
"div",
|
|
6995
|
-
{
|
|
6996
|
-
ref: scrollRef,
|
|
6997
|
-
className: cn(
|
|
6998
|
-
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
6999
|
-
"py-1 px-0.5",
|
|
7000
|
-
/* padding so shadow isn't clipped by overflow */
|
|
7001
|
-
className
|
|
7002
|
-
),
|
|
7003
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-0.5 rounded-full border border-border/40 bg-background/90 backdrop-blur-md shadow-sm px-1.5 py-1.5", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7004
|
-
"button",
|
|
7005
|
-
{
|
|
7006
|
-
"data-section": s.id,
|
|
7007
|
-
type: "button",
|
|
7008
|
-
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
7009
|
-
className: cn(
|
|
7010
|
-
"rounded-full px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
7011
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7012
|
-
bold ? "font-semibold" : "font-normal",
|
|
7013
|
-
activeSection === s.id ? "bg-foreground text-background shadow-sm" : "text-foreground/60 hover:text-foreground hover:bg-muted/60"
|
|
7014
|
-
),
|
|
7015
|
-
children: s.label
|
|
7016
|
-
},
|
|
7017
|
-
s.id
|
|
7018
|
-
)) })
|
|
7019
|
-
}
|
|
7020
|
-
);
|
|
7021
|
-
}
|
|
7022
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7023
|
-
"div",
|
|
7024
|
-
{
|
|
7025
|
-
ref: scrollRef,
|
|
7026
|
-
className: cn(
|
|
7027
|
-
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
7028
|
-
className
|
|
7029
|
-
),
|
|
7030
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-1 p-1", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7031
|
-
"button",
|
|
7032
|
-
{
|
|
7033
|
-
"data-section": s.id,
|
|
7034
|
-
type: "button",
|
|
7035
|
-
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
7036
|
-
className: cn(
|
|
7037
|
-
"rounded-full px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
7038
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7039
|
-
bold ? "font-semibold" : "font-normal",
|
|
7040
|
-
activeSection === s.id ? "bg-foreground text-background shadow-sm" : "bg-white text-foreground/70 hover:text-foreground shadow-sm"
|
|
7041
|
-
),
|
|
7042
|
-
children: s.label
|
|
7043
|
-
},
|
|
7044
|
-
s.id
|
|
7045
|
-
)) })
|
|
7046
|
-
}
|
|
7047
|
-
);
|
|
7048
|
-
}
|
|
7049
7004
|
function normalise(p) {
|
|
7050
7005
|
return typeof p === "string" ? { src: p } : p;
|
|
7051
7006
|
}
|
|
@@ -7060,18 +7015,18 @@ function Lightbox({
|
|
|
7060
7015
|
onClose
|
|
7061
7016
|
}) {
|
|
7062
7017
|
var _a;
|
|
7063
|
-
const [index, setIndex] =
|
|
7018
|
+
const [index, setIndex] = React25__namespace.useState(initialIndex);
|
|
7064
7019
|
const total = photos.length;
|
|
7065
7020
|
const photo = photos[index];
|
|
7066
|
-
const prev =
|
|
7021
|
+
const prev = React25__namespace.useCallback(
|
|
7067
7022
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
7068
7023
|
[total]
|
|
7069
7024
|
);
|
|
7070
|
-
const next =
|
|
7025
|
+
const next = React25__namespace.useCallback(
|
|
7071
7026
|
() => setIndex((i) => (i + 1) % total),
|
|
7072
7027
|
[total]
|
|
7073
7028
|
);
|
|
7074
|
-
|
|
7029
|
+
React25__namespace.useEffect(() => {
|
|
7075
7030
|
const onKey = (e) => {
|
|
7076
7031
|
if (e.key === "Escape") onClose();
|
|
7077
7032
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -7145,55 +7100,27 @@ function Lightbox({
|
|
|
7145
7100
|
]
|
|
7146
7101
|
}
|
|
7147
7102
|
),
|
|
7148
|
-
total > 1 && /* @__PURE__ */ jsxRuntime.
|
|
7103
|
+
total > 1 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7149
7104
|
"div",
|
|
7150
7105
|
{
|
|
7151
|
-
className: "absolute bottom-5 inset-x-0 flex items-center justify-center
|
|
7106
|
+
className: "absolute bottom-5 inset-x-0 flex items-center justify-center px-5",
|
|
7152
7107
|
onClick: (e) => e.stopPropagation(),
|
|
7153
|
-
children:
|
|
7154
|
-
|
|
7155
|
-
|
|
7156
|
-
|
|
7157
|
-
|
|
7158
|
-
|
|
7159
|
-
|
|
7160
|
-
prev();
|
|
7161
|
-
},
|
|
7162
|
-
className: "flex h-9 w-9 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",
|
|
7163
|
-
"aria-label": "Previous photo",
|
|
7164
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-4 w-4" })
|
|
7165
|
-
}
|
|
7166
|
-
),
|
|
7167
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5", children: photos.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7168
|
-
"button",
|
|
7169
|
-
{
|
|
7170
|
-
type: "button",
|
|
7171
|
-
onClick: (e) => {
|
|
7172
|
-
e.stopPropagation();
|
|
7173
|
-
setIndex(i);
|
|
7174
|
-
},
|
|
7175
|
-
"aria-label": `Go to photo ${i + 1}`,
|
|
7176
|
-
className: cn(
|
|
7177
|
-
"h-1.5 rounded-full transition-all duration-300 focus-visible:outline-none",
|
|
7178
|
-
i === index ? "w-6 bg-primary" : "w-1.5 bg-white/40 hover:bg-white/70"
|
|
7179
|
-
)
|
|
7108
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5", children: photos.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7109
|
+
"button",
|
|
7110
|
+
{
|
|
7111
|
+
type: "button",
|
|
7112
|
+
onClick: (e) => {
|
|
7113
|
+
e.stopPropagation();
|
|
7114
|
+
setIndex(i);
|
|
7180
7115
|
},
|
|
7181
|
-
i
|
|
7182
|
-
|
|
7183
|
-
|
|
7184
|
-
|
|
7185
|
-
|
|
7186
|
-
|
|
7187
|
-
|
|
7188
|
-
|
|
7189
|
-
next();
|
|
7190
|
-
},
|
|
7191
|
-
className: "flex h-9 w-9 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",
|
|
7192
|
-
"aria-label": "Next photo",
|
|
7193
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-4 w-4" })
|
|
7194
|
-
}
|
|
7195
|
-
)
|
|
7196
|
-
]
|
|
7116
|
+
"aria-label": `Go to photo ${i + 1}`,
|
|
7117
|
+
className: cn(
|
|
7118
|
+
"h-1.5 rounded-full transition-all duration-300 focus-visible:outline-none",
|
|
7119
|
+
i === index ? "w-6 bg-primary" : "w-1.5 bg-white/40 hover:bg-white/70"
|
|
7120
|
+
)
|
|
7121
|
+
},
|
|
7122
|
+
i
|
|
7123
|
+
)) })
|
|
7197
7124
|
}
|
|
7198
7125
|
)
|
|
7199
7126
|
]
|
|
@@ -7265,7 +7192,7 @@ function GridGallery({
|
|
|
7265
7192
|
initialVisible,
|
|
7266
7193
|
onOpen
|
|
7267
7194
|
}) {
|
|
7268
|
-
const [expanded, setExpanded] =
|
|
7195
|
+
const [expanded, setExpanded] = React25__namespace.useState(false);
|
|
7269
7196
|
const cols = gridCols(photos.length);
|
|
7270
7197
|
const hasMore = photos.length > initialVisible;
|
|
7271
7198
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -7295,7 +7222,7 @@ function MasonryGallery({
|
|
|
7295
7222
|
initialVisible,
|
|
7296
7223
|
onOpen
|
|
7297
7224
|
}) {
|
|
7298
|
-
const [expanded, setExpanded] =
|
|
7225
|
+
const [expanded, setExpanded] = React25__namespace.useState(false);
|
|
7299
7226
|
const hasMore = photos.length > initialVisible;
|
|
7300
7227
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
7301
7228
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -7368,7 +7295,7 @@ function FeaturedGallery({
|
|
|
7368
7295
|
photos,
|
|
7369
7296
|
onOpen
|
|
7370
7297
|
}) {
|
|
7371
|
-
const [expanded, setExpanded] =
|
|
7298
|
+
const [expanded, setExpanded] = React25__namespace.useState(false);
|
|
7372
7299
|
const featured = photos.slice(0, 3);
|
|
7373
7300
|
const extra = photos.slice(3);
|
|
7374
7301
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -7438,66 +7365,386 @@ function FeaturedGallery({
|
|
|
7438
7365
|
)
|
|
7439
7366
|
] });
|
|
7440
7367
|
}
|
|
7441
|
-
function
|
|
7368
|
+
function CarouselGallery({
|
|
7442
7369
|
photos,
|
|
7443
|
-
|
|
7444
|
-
|
|
7445
|
-
|
|
7370
|
+
index,
|
|
7371
|
+
onIndexChange,
|
|
7372
|
+
onOpen,
|
|
7446
7373
|
className
|
|
7447
7374
|
}) {
|
|
7448
|
-
|
|
7449
|
-
const
|
|
7450
|
-
const
|
|
7451
|
-
|
|
7452
|
-
|
|
7453
|
-
|
|
7454
|
-
|
|
7455
|
-
|
|
7456
|
-
|
|
7457
|
-
|
|
7458
|
-
|
|
7459
|
-
|
|
7460
|
-
|
|
7461
|
-
|
|
7462
|
-
|
|
7463
|
-
|
|
7464
|
-
|
|
7465
|
-
|
|
7466
|
-
|
|
7467
|
-
|
|
7468
|
-
|
|
7469
|
-
|
|
7470
|
-
|
|
7471
|
-
|
|
7472
|
-
|
|
7473
|
-
|
|
7474
|
-
|
|
7475
|
-
|
|
7476
|
-
|
|
7477
|
-
|
|
7478
|
-
|
|
7479
|
-
|
|
7480
|
-
|
|
7481
|
-
|
|
7482
|
-
|
|
7483
|
-
|
|
7484
|
-
|
|
7485
|
-
|
|
7486
|
-
|
|
7487
|
-
|
|
7488
|
-
|
|
7489
|
-
|
|
7490
|
-
|
|
7491
|
-
|
|
7492
|
-
|
|
7493
|
-
|
|
7494
|
-
|
|
7495
|
-
|
|
7496
|
-
|
|
7497
|
-
|
|
7498
|
-
|
|
7499
|
-
|
|
7500
|
-
|
|
7375
|
+
var _a;
|
|
7376
|
+
const total = photos.length;
|
|
7377
|
+
const photo = photos[index];
|
|
7378
|
+
const prev = () => onIndexChange((index - 1 + total) % total);
|
|
7379
|
+
const next = () => onIndexChange((index + 1) % total);
|
|
7380
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7381
|
+
"div",
|
|
7382
|
+
{
|
|
7383
|
+
className: cn(
|
|
7384
|
+
"relative w-full aspect-[4/3] sm:aspect-[16/10] overflow-hidden bg-muted group/photo",
|
|
7385
|
+
className
|
|
7386
|
+
),
|
|
7387
|
+
children: [
|
|
7388
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7389
|
+
"button",
|
|
7390
|
+
{
|
|
7391
|
+
type: "button",
|
|
7392
|
+
onClick: () => onOpen(index),
|
|
7393
|
+
"aria-label": `Open photo ${index + 1} fullscreen`,
|
|
7394
|
+
className: "absolute inset-0 w-full h-full cursor-zoom-in focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
7395
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7396
|
+
"img",
|
|
7397
|
+
{
|
|
7398
|
+
src: photo.src,
|
|
7399
|
+
alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
|
|
7400
|
+
className: "h-full w-full object-cover transition-transform duration-500 group-hover/photo:scale-[1.02]",
|
|
7401
|
+
loading: "lazy"
|
|
7402
|
+
},
|
|
7403
|
+
photo.src
|
|
7404
|
+
)
|
|
7405
|
+
}
|
|
7406
|
+
),
|
|
7407
|
+
total > 1 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7408
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7409
|
+
"button",
|
|
7410
|
+
{
|
|
7411
|
+
type: "button",
|
|
7412
|
+
onClick: prev,
|
|
7413
|
+
"aria-label": "Previous photo",
|
|
7414
|
+
className: cn(
|
|
7415
|
+
"absolute left-3 sm:left-4 top-1/2 -translate-y-1/2 z-10",
|
|
7416
|
+
"flex h-8 w-8 items-center justify-center rounded-full",
|
|
7417
|
+
"bg-black/25 text-white backdrop-blur-sm",
|
|
7418
|
+
"hover:bg-black/45 transition-colors",
|
|
7419
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60"
|
|
7420
|
+
),
|
|
7421
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-4 w-4" })
|
|
7422
|
+
}
|
|
7423
|
+
),
|
|
7424
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7425
|
+
"button",
|
|
7426
|
+
{
|
|
7427
|
+
type: "button",
|
|
7428
|
+
onClick: next,
|
|
7429
|
+
"aria-label": "Next photo",
|
|
7430
|
+
className: cn(
|
|
7431
|
+
"absolute right-3 sm:right-4 top-1/2 -translate-y-1/2 z-10",
|
|
7432
|
+
"flex h-8 w-8 items-center justify-center rounded-full",
|
|
7433
|
+
"bg-black/25 text-white backdrop-blur-sm",
|
|
7434
|
+
"hover:bg-black/45 transition-colors",
|
|
7435
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60"
|
|
7436
|
+
),
|
|
7437
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-4 w-4" })
|
|
7438
|
+
}
|
|
7439
|
+
)
|
|
7440
|
+
] }),
|
|
7441
|
+
total > 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-3 sm:bottom-4 inset-x-0 z-10 flex justify-center pointer-events-none", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-auto flex items-center gap-1.5 rounded-full bg-black/25 backdrop-blur-sm px-2 py-1.5", children: photos.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7442
|
+
"button",
|
|
7443
|
+
{
|
|
7444
|
+
type: "button",
|
|
7445
|
+
onClick: () => onIndexChange(i),
|
|
7446
|
+
"aria-label": `Go to photo ${i + 1}`,
|
|
7447
|
+
className: cn(
|
|
7448
|
+
"h-1.5 rounded-full transition-all duration-300",
|
|
7449
|
+
i === index ? "w-5 bg-white" : "w-1.5 bg-white/45 hover:bg-white/75"
|
|
7450
|
+
)
|
|
7451
|
+
},
|
|
7452
|
+
i
|
|
7453
|
+
)) }) })
|
|
7454
|
+
]
|
|
7455
|
+
}
|
|
7456
|
+
);
|
|
7457
|
+
}
|
|
7458
|
+
function PhotoGallery({
|
|
7459
|
+
photos,
|
|
7460
|
+
variant = "grid",
|
|
7461
|
+
initialVisible = 6,
|
|
7462
|
+
onPhotoClick,
|
|
7463
|
+
className
|
|
7464
|
+
}) {
|
|
7465
|
+
const [lightboxIndex, setLightboxIndex] = React25__namespace.useState(null);
|
|
7466
|
+
const [carouselIndex, setCarouselIndex] = React25__namespace.useState(0);
|
|
7467
|
+
const normalised = React25__namespace.useMemo(() => photos.map(normalise), [photos]);
|
|
7468
|
+
const handleOpen = (index) => {
|
|
7469
|
+
setLightboxIndex(index);
|
|
7470
|
+
onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
|
|
7471
|
+
};
|
|
7472
|
+
if (normalised.length === 0) return null;
|
|
7473
|
+
const lightbox = lightboxIndex !== null && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7474
|
+
Lightbox,
|
|
7475
|
+
{
|
|
7476
|
+
photos: normalised,
|
|
7477
|
+
initialIndex: lightboxIndex,
|
|
7478
|
+
onClose: () => setLightboxIndex(null)
|
|
7479
|
+
}
|
|
7480
|
+
);
|
|
7481
|
+
if (variant === "carousel" || variant === "fullBleed") {
|
|
7482
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7483
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7484
|
+
CarouselGallery,
|
|
7485
|
+
{
|
|
7486
|
+
photos: normalised,
|
|
7487
|
+
index: carouselIndex,
|
|
7488
|
+
onIndexChange: setCarouselIndex,
|
|
7489
|
+
onOpen: handleOpen,
|
|
7490
|
+
className: cn(
|
|
7491
|
+
variant === "carousel" && "rounded-2xl",
|
|
7492
|
+
variant === "fullBleed" && "w-screen mx-[calc(50%-50vw)] lg:w-full lg:mx-0",
|
|
7493
|
+
className
|
|
7494
|
+
)
|
|
7495
|
+
}
|
|
7496
|
+
),
|
|
7497
|
+
lightbox
|
|
7498
|
+
] });
|
|
7499
|
+
}
|
|
7500
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", className), children: [
|
|
7501
|
+
variant === "grid" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7502
|
+
GridGallery,
|
|
7503
|
+
{
|
|
7504
|
+
photos: normalised,
|
|
7505
|
+
initialVisible,
|
|
7506
|
+
onOpen: handleOpen
|
|
7507
|
+
}
|
|
7508
|
+
),
|
|
7509
|
+
variant === "masonry" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7510
|
+
MasonryGallery,
|
|
7511
|
+
{
|
|
7512
|
+
photos: normalised,
|
|
7513
|
+
initialVisible,
|
|
7514
|
+
onOpen: handleOpen
|
|
7515
|
+
}
|
|
7516
|
+
),
|
|
7517
|
+
variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
|
|
7518
|
+
variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
|
|
7519
|
+
lightbox
|
|
7520
|
+
] });
|
|
7521
|
+
}
|
|
7522
|
+
var itineraryDaySpecIcons = {
|
|
7523
|
+
hiking: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FootprintsIcon, { className: "h-5 w-5", strokeWidth: 1.75 }),
|
|
7524
|
+
swimming: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.WavesIcon, { className: "h-5 w-5", strokeWidth: 1.75 }),
|
|
7525
|
+
driving: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarIcon, { className: "h-5 w-5", strokeWidth: 1.75 }),
|
|
7526
|
+
boat: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SailboatIcon, { className: "h-5 w-5", strokeWidth: 1.75 }),
|
|
7527
|
+
lodging: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.HomeIcon, { className: "h-5 w-5", strokeWidth: 1.75 })
|
|
7528
|
+
};
|
|
7529
|
+
function normalisePhotos(input) {
|
|
7530
|
+
const list = Array.isArray(input) ? input : [input];
|
|
7531
|
+
return list.filter(Boolean).map((p) => typeof p === "string" ? { src: p } : p);
|
|
7532
|
+
}
|
|
7533
|
+
function ItineraryDay({
|
|
7534
|
+
dayNumber,
|
|
7535
|
+
dayLabel,
|
|
7536
|
+
title,
|
|
7537
|
+
photos,
|
|
7538
|
+
specs,
|
|
7539
|
+
description,
|
|
7540
|
+
photoLayout = "rounded",
|
|
7541
|
+
className
|
|
7542
|
+
}) {
|
|
7543
|
+
const photoList = React25__namespace.useMemo(() => normalisePhotos(photos), [photos]);
|
|
7544
|
+
const isFullBleed = photoLayout === "fullBleed" || photoLayout === "fullBleedBottom";
|
|
7545
|
+
const photoPosition = photoLayout === "fullBleedBottom" ? "bottom" : "top";
|
|
7546
|
+
const gallery = photoList.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7547
|
+
PhotoGallery,
|
|
7548
|
+
{
|
|
7549
|
+
photos: photoList,
|
|
7550
|
+
variant: isFullBleed ? "fullBleed" : "carousel"
|
|
7551
|
+
}
|
|
7552
|
+
);
|
|
7553
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn("w-full flex flex-col gap-5", className), children: [
|
|
7554
|
+
photoPosition === "top" && gallery,
|
|
7555
|
+
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-col gap-2", children: [
|
|
7556
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground font-ui", children: dayLabel != null ? dayLabel : `Day ${dayNumber}` }),
|
|
7557
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground leading-tight font-heading", children: title })
|
|
7558
|
+
] }),
|
|
7559
|
+
specs && specs.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-3 sm:gap-2.5", children: specs.map((spec, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7560
|
+
"li",
|
|
7561
|
+
{
|
|
7562
|
+
className: "flex items-start gap-3 text-base text-foreground font-ui",
|
|
7563
|
+
children: [
|
|
7564
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 shrink-0 text-foreground", "aria-hidden": true, children: spec.icon }),
|
|
7565
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
7566
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [
|
|
7567
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: spec.label }),
|
|
7568
|
+
spec.detail && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: spec.detail })
|
|
7569
|
+
] }),
|
|
7570
|
+
spec.subdetail && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: spec.subdetail })
|
|
7571
|
+
] })
|
|
7572
|
+
]
|
|
7573
|
+
},
|
|
7574
|
+
i
|
|
7575
|
+
)) }),
|
|
7576
|
+
description && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7577
|
+
"div",
|
|
7578
|
+
{
|
|
7579
|
+
className: cn(
|
|
7580
|
+
"text-base text-foreground/85 leading-relaxed space-y-3",
|
|
7581
|
+
"[&_strong]:font-semibold [&_strong]:text-foreground",
|
|
7582
|
+
"[&_a]:text-primary [&_a]:underline [&_a]:underline-offset-2 hover:[&_a]:no-underline"
|
|
7583
|
+
),
|
|
7584
|
+
children: description
|
|
7585
|
+
}
|
|
7586
|
+
),
|
|
7587
|
+
photoPosition === "bottom" && gallery
|
|
7588
|
+
] });
|
|
7589
|
+
}
|
|
7590
|
+
function MenuTrip({
|
|
7591
|
+
sections,
|
|
7592
|
+
activeSection,
|
|
7593
|
+
onSelect,
|
|
7594
|
+
variant = "pill",
|
|
7595
|
+
bold = true,
|
|
7596
|
+
className
|
|
7597
|
+
}) {
|
|
7598
|
+
const scrollRef = React25__namespace.useRef(null);
|
|
7599
|
+
React25__namespace.useEffect(() => {
|
|
7600
|
+
if (!scrollRef.current || !activeSection) return;
|
|
7601
|
+
const container = scrollRef.current;
|
|
7602
|
+
const btn = container.querySelector(
|
|
7603
|
+
`[data-section="${activeSection}"]`
|
|
7604
|
+
);
|
|
7605
|
+
if (!btn) return;
|
|
7606
|
+
const btnLeft = btn.offsetLeft;
|
|
7607
|
+
const btnRight = btnLeft + btn.offsetWidth;
|
|
7608
|
+
const cLeft = container.scrollLeft;
|
|
7609
|
+
const cRight = cLeft + container.offsetWidth;
|
|
7610
|
+
if (btnLeft < cLeft) {
|
|
7611
|
+
container.scrollTo({ left: btnLeft - 16, behavior: "smooth" });
|
|
7612
|
+
} else if (btnRight > cRight) {
|
|
7613
|
+
container.scrollTo({ left: btnRight - container.offsetWidth + 16, behavior: "smooth" });
|
|
7614
|
+
}
|
|
7615
|
+
}, [activeSection]);
|
|
7616
|
+
if (variant === "underline") {
|
|
7617
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7618
|
+
"div",
|
|
7619
|
+
{
|
|
7620
|
+
ref: scrollRef,
|
|
7621
|
+
className: cn(
|
|
7622
|
+
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
7623
|
+
"border-b border-border",
|
|
7624
|
+
className
|
|
7625
|
+
),
|
|
7626
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-end gap-0", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7627
|
+
"button",
|
|
7628
|
+
{
|
|
7629
|
+
"data-section": s.id,
|
|
7630
|
+
type: "button",
|
|
7631
|
+
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
7632
|
+
className: cn(
|
|
7633
|
+
"relative px-4 py-2.5 text-sm font-ui whitespace-nowrap transition-colors duration-150",
|
|
7634
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
|
|
7635
|
+
"after:absolute after:inset-x-0 after:bottom-0 after:h-0.5 after:rounded-full after:transition-all",
|
|
7636
|
+
bold ? "font-semibold" : "font-normal",
|
|
7637
|
+
activeSection === s.id ? "text-foreground after:bg-primary" : "text-muted-foreground hover:text-foreground after:bg-transparent"
|
|
7638
|
+
),
|
|
7639
|
+
children: s.label
|
|
7640
|
+
},
|
|
7641
|
+
s.id
|
|
7642
|
+
)) })
|
|
7643
|
+
}
|
|
7644
|
+
);
|
|
7645
|
+
}
|
|
7646
|
+
if (variant === "outlined") {
|
|
7647
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7648
|
+
"div",
|
|
7649
|
+
{
|
|
7650
|
+
ref: scrollRef,
|
|
7651
|
+
className: cn(
|
|
7652
|
+
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
7653
|
+
className
|
|
7654
|
+
),
|
|
7655
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-2", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7656
|
+
"button",
|
|
7657
|
+
{
|
|
7658
|
+
"data-section": s.id,
|
|
7659
|
+
type: "button",
|
|
7660
|
+
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
7661
|
+
className: cn(
|
|
7662
|
+
"rounded-full border px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
7663
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7664
|
+
bold ? "font-semibold" : "font-normal",
|
|
7665
|
+
activeSection === s.id ? "border-foreground bg-foreground text-background" : "border-border bg-background text-muted-foreground hover:border-foreground/50 hover:text-foreground"
|
|
7666
|
+
),
|
|
7667
|
+
children: s.label
|
|
7668
|
+
},
|
|
7669
|
+
s.id
|
|
7670
|
+
)) })
|
|
7671
|
+
}
|
|
7672
|
+
);
|
|
7673
|
+
}
|
|
7674
|
+
if (variant === "floating") {
|
|
7675
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7676
|
+
"div",
|
|
7677
|
+
{
|
|
7678
|
+
ref: scrollRef,
|
|
7679
|
+
className: cn(
|
|
7680
|
+
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
7681
|
+
"py-1 px-0.5",
|
|
7682
|
+
/* padding so shadow isn't clipped by overflow */
|
|
7683
|
+
className
|
|
7684
|
+
),
|
|
7685
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-0.5 rounded-full border border-border/40 bg-background/90 backdrop-blur-md shadow-sm px-1.5 py-1.5", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7686
|
+
"button",
|
|
7687
|
+
{
|
|
7688
|
+
"data-section": s.id,
|
|
7689
|
+
type: "button",
|
|
7690
|
+
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
7691
|
+
className: cn(
|
|
7692
|
+
"rounded-full px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
7693
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7694
|
+
bold ? "font-semibold" : "font-normal",
|
|
7695
|
+
activeSection === s.id ? "bg-foreground text-background shadow-sm" : "text-foreground/60 hover:text-foreground hover:bg-muted/60"
|
|
7696
|
+
),
|
|
7697
|
+
children: s.label
|
|
7698
|
+
},
|
|
7699
|
+
s.id
|
|
7700
|
+
)) })
|
|
7701
|
+
}
|
|
7702
|
+
);
|
|
7703
|
+
}
|
|
7704
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7705
|
+
"div",
|
|
7706
|
+
{
|
|
7707
|
+
ref: scrollRef,
|
|
7708
|
+
className: cn(
|
|
7709
|
+
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
7710
|
+
className
|
|
7711
|
+
),
|
|
7712
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-1 p-1", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7713
|
+
"button",
|
|
7714
|
+
{
|
|
7715
|
+
"data-section": s.id,
|
|
7716
|
+
type: "button",
|
|
7717
|
+
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
7718
|
+
className: cn(
|
|
7719
|
+
"rounded-full px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
7720
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7721
|
+
bold ? "font-semibold" : "font-normal",
|
|
7722
|
+
activeSection === s.id ? "bg-foreground text-background shadow-sm" : "bg-white text-foreground/70 hover:text-foreground shadow-sm"
|
|
7723
|
+
),
|
|
7724
|
+
children: s.label
|
|
7725
|
+
},
|
|
7726
|
+
s.id
|
|
7727
|
+
)) })
|
|
7728
|
+
}
|
|
7729
|
+
);
|
|
7730
|
+
}
|
|
7731
|
+
var badgeVariants = classVarianceAuthority.cva(
|
|
7732
|
+
"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
|
|
7733
|
+
{
|
|
7734
|
+
variants: {
|
|
7735
|
+
variant: {
|
|
7736
|
+
default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
|
|
7737
|
+
secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
|
|
7738
|
+
destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
|
|
7739
|
+
outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
|
|
7740
|
+
ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
|
|
7741
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
7742
|
+
}
|
|
7743
|
+
},
|
|
7744
|
+
defaultVariants: {
|
|
7745
|
+
variant: "default"
|
|
7746
|
+
}
|
|
7747
|
+
}
|
|
7501
7748
|
);
|
|
7502
7749
|
function Badge(_a) {
|
|
7503
7750
|
var _b = _a, {
|
|
@@ -7529,34 +7776,124 @@ function PricingTrip({
|
|
|
7529
7776
|
currency = "CHF",
|
|
7530
7777
|
season,
|
|
7531
7778
|
departureTimes,
|
|
7532
|
-
pricingOptions,
|
|
7533
7779
|
onBook,
|
|
7534
7780
|
bookLabel = "Check availability",
|
|
7535
7781
|
variant = "card",
|
|
7782
|
+
sharp = false,
|
|
7783
|
+
belowPrice,
|
|
7784
|
+
benefits,
|
|
7785
|
+
currencyEstimates,
|
|
7786
|
+
priceInfo,
|
|
7536
7787
|
className
|
|
7537
7788
|
}) {
|
|
7538
|
-
const
|
|
7789
|
+
const rOuter = sharp ? "rounded-none" : "rounded-2xl";
|
|
7790
|
+
const [showEstimates, setShowEstimates] = React25__namespace.useState(false);
|
|
7791
|
+
const [showPriceInfo, setShowPriceInfo] = React25__namespace.useState(false);
|
|
7539
7792
|
if (variant === "compact") {
|
|
7540
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex
|
|
7541
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
7542
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7543
|
-
|
|
7544
|
-
|
|
7545
|
-
|
|
7546
|
-
|
|
7547
|
-
|
|
7793
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
|
|
7794
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
7795
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
7796
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
|
|
7797
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-1.5 flex-wrap", children: [
|
|
7798
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg font-bold text-foreground font-heading leading-none", children: [
|
|
7799
|
+
currency,
|
|
7800
|
+
" ",
|
|
7801
|
+
priceFrom,
|
|
7802
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: "/ per person" })
|
|
7803
|
+
] }),
|
|
7804
|
+
(priceInfo || currencyEstimates && currencyEstimates.length > 0) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7805
|
+
"button",
|
|
7806
|
+
{
|
|
7807
|
+
type: "button",
|
|
7808
|
+
onClick: () => setShowPriceInfo((v) => !v),
|
|
7809
|
+
"aria-label": "Price details and currency estimates",
|
|
7810
|
+
"aria-expanded": showPriceInfo,
|
|
7811
|
+
className: cn(
|
|
7812
|
+
"inline-flex h-4 w-4 items-center justify-center rounded-full translate-y-px",
|
|
7813
|
+
"text-muted-foreground hover:text-foreground transition-colors",
|
|
7814
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
7815
|
+
),
|
|
7816
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7817
|
+
lucideReact.ChevronDownIcon,
|
|
7818
|
+
{
|
|
7819
|
+
className: cn(
|
|
7820
|
+
"h-4 w-4 transition-transform",
|
|
7821
|
+
showPriceInfo && "rotate-180"
|
|
7822
|
+
)
|
|
7823
|
+
}
|
|
7824
|
+
)
|
|
7825
|
+
}
|
|
7826
|
+
)
|
|
7827
|
+
] })
|
|
7828
|
+
] }),
|
|
7829
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7830
|
+
"button",
|
|
7831
|
+
{
|
|
7832
|
+
type: "button",
|
|
7833
|
+
onClick: onBook,
|
|
7834
|
+
className: cn(
|
|
7835
|
+
"shrink-0 rounded-full bg-primary px-5 py-2 text-sm font-semibold",
|
|
7836
|
+
"text-primary-foreground font-ui transition-colors hover:bg-primary/90",
|
|
7837
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
7838
|
+
),
|
|
7839
|
+
children: bookLabel
|
|
7840
|
+
}
|
|
7841
|
+
)
|
|
7548
7842
|
] }),
|
|
7549
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7550
|
-
"
|
|
7843
|
+
showPriceInfo && (priceInfo || currencyEstimates && currencyEstimates.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7844
|
+
"div",
|
|
7551
7845
|
{
|
|
7552
|
-
type: "button",
|
|
7553
|
-
onClick: onBook,
|
|
7554
7846
|
className: cn(
|
|
7555
|
-
"
|
|
7556
|
-
"
|
|
7557
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
7847
|
+
"rounded-xl border border-border bg-muted/40 overflow-hidden",
|
|
7848
|
+
"font-ui text-sm leading-relaxed text-foreground"
|
|
7558
7849
|
),
|
|
7559
|
-
children:
|
|
7850
|
+
children: [
|
|
7851
|
+
priceInfo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7852
|
+
"div",
|
|
7853
|
+
{
|
|
7854
|
+
className: cn(
|
|
7855
|
+
"p-3",
|
|
7856
|
+
"[&_a]:font-semibold [&_a]:text-primary [&_a]:underline-offset-4",
|
|
7857
|
+
"[&_a]:underline [&_a]:decoration-primary/30 hover:[&_a]:decoration-primary"
|
|
7858
|
+
),
|
|
7859
|
+
children: priceInfo
|
|
7860
|
+
}
|
|
7861
|
+
),
|
|
7862
|
+
currencyEstimates && currencyEstimates.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7863
|
+
"div",
|
|
7864
|
+
{
|
|
7865
|
+
className: cn(
|
|
7866
|
+
"bg-background",
|
|
7867
|
+
priceInfo && "border-t border-border"
|
|
7868
|
+
),
|
|
7869
|
+
children: [
|
|
7870
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 pt-3 pb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "See estimates in other currencies" }),
|
|
7871
|
+
currencyEstimates.map((est, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7872
|
+
"div",
|
|
7873
|
+
{
|
|
7874
|
+
className: cn(
|
|
7875
|
+
"flex items-center justify-between px-3 py-2 text-sm",
|
|
7876
|
+
"border-t border-border"
|
|
7877
|
+
),
|
|
7878
|
+
children: [
|
|
7879
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: est.currency }),
|
|
7880
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-semibold text-foreground", children: [
|
|
7881
|
+
est.symbol ? `${est.symbol} ` : "",
|
|
7882
|
+
est.price
|
|
7883
|
+
] })
|
|
7884
|
+
]
|
|
7885
|
+
},
|
|
7886
|
+
i
|
|
7887
|
+
)),
|
|
7888
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "px-3 py-2 text-[11px] leading-snug text-muted-foreground bg-muted/40 italic border-t border-border", children: [
|
|
7889
|
+
"Estimates based on the current exchange rate. The final price charged is in ",
|
|
7890
|
+
currency,
|
|
7891
|
+
"."
|
|
7892
|
+
] })
|
|
7893
|
+
]
|
|
7894
|
+
}
|
|
7895
|
+
)
|
|
7896
|
+
]
|
|
7560
7897
|
}
|
|
7561
7898
|
)
|
|
7562
7899
|
] });
|
|
@@ -7566,7 +7903,8 @@ function PricingTrip({
|
|
|
7566
7903
|
"div",
|
|
7567
7904
|
{
|
|
7568
7905
|
className: cn(
|
|
7569
|
-
"flex items-center gap-4
|
|
7906
|
+
"flex items-center gap-4 border border-border bg-card px-5 py-3 shadow-sm",
|
|
7907
|
+
rOuter,
|
|
7570
7908
|
className
|
|
7571
7909
|
),
|
|
7572
7910
|
children: [
|
|
@@ -7610,67 +7948,103 @@ function PricingTrip({
|
|
|
7610
7948
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
|
|
7611
7949
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
7612
7950
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: "From" }),
|
|
7613
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-
|
|
7614
|
-
|
|
7615
|
-
|
|
7616
|
-
|
|
7617
|
-
|
|
7951
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-2xl font-bold text-foreground font-heading flex items-center gap-2 flex-wrap", children: [
|
|
7952
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
7953
|
+
currency,
|
|
7954
|
+
" ",
|
|
7955
|
+
priceFrom,
|
|
7956
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: " / per person" })
|
|
7957
|
+
] }),
|
|
7958
|
+
priceInfo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7959
|
+
"button",
|
|
7960
|
+
{
|
|
7961
|
+
type: "button",
|
|
7962
|
+
onClick: () => setShowPriceInfo((v) => !v),
|
|
7963
|
+
"aria-label": "Why does the price vary?",
|
|
7964
|
+
"aria-expanded": showPriceInfo,
|
|
7965
|
+
className: cn(
|
|
7966
|
+
"inline-flex h-5 w-5 items-center justify-center rounded-full",
|
|
7967
|
+
"translate-y-[3px] -translate-x-[3px]",
|
|
7968
|
+
"text-muted-foreground hover:text-foreground transition-colors",
|
|
7969
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
7970
|
+
),
|
|
7971
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7972
|
+
lucideReact.ChevronDownIcon,
|
|
7973
|
+
{
|
|
7974
|
+
className: cn(
|
|
7975
|
+
"h-4 w-4 transition-transform",
|
|
7976
|
+
showPriceInfo && "rotate-180"
|
|
7977
|
+
)
|
|
7978
|
+
}
|
|
7979
|
+
)
|
|
7980
|
+
}
|
|
7981
|
+
)
|
|
7618
7982
|
] })
|
|
7619
7983
|
] }),
|
|
7620
|
-
|
|
7621
|
-
|
|
7622
|
-
|
|
7623
|
-
|
|
7624
|
-
|
|
7625
|
-
|
|
7626
|
-
|
|
7627
|
-
|
|
7628
|
-
|
|
7984
|
+
priceInfo && showPriceInfo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7985
|
+
"div",
|
|
7986
|
+
{
|
|
7987
|
+
className: cn(
|
|
7988
|
+
"rounded-xl border border-border bg-muted/40 p-4",
|
|
7989
|
+
"font-ui text-sm leading-relaxed text-foreground",
|
|
7990
|
+
"[&_a]:font-semibold [&_a]:text-primary [&_a]:underline-offset-4",
|
|
7991
|
+
"[&_a]:underline [&_a]:decoration-primary/30 hover:[&_a]:decoration-primary"
|
|
7992
|
+
),
|
|
7993
|
+
children: priceInfo
|
|
7994
|
+
}
|
|
7995
|
+
),
|
|
7996
|
+
belowPrice && /* @__PURE__ */ jsxRuntime.jsx("div", { children: belowPrice }),
|
|
7997
|
+
benefits && benefits.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-2", children: benefits.map((b, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7998
|
+
"li",
|
|
7999
|
+
{
|
|
8000
|
+
className: "flex items-start gap-2.5 text-sm text-foreground font-ui",
|
|
8001
|
+
children: [
|
|
8002
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "h-4 w-4 shrink-0 text-primary mt-0.5" }),
|
|
8003
|
+
b
|
|
8004
|
+
]
|
|
8005
|
+
},
|
|
8006
|
+
i
|
|
8007
|
+
)) }),
|
|
8008
|
+
currencyEstimates && currencyEstimates.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
7629
8009
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7630
8010
|
"button",
|
|
7631
8011
|
{
|
|
7632
8012
|
type: "button",
|
|
7633
|
-
onClick: () =>
|
|
8013
|
+
onClick: () => setShowEstimates((v) => !v),
|
|
7634
8014
|
className: "flex items-center gap-1 text-xs text-primary font-ui text-left hover:underline underline-offset-2",
|
|
7635
|
-
children:
|
|
7636
|
-
"
|
|
8015
|
+
children: showEstimates ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
8016
|
+
"Hide estimates in other currencies ",
|
|
7637
8017
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-3 w-3" })
|
|
7638
8018
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7639
|
-
"Show
|
|
8019
|
+
"Show estimates in other currencies ",
|
|
7640
8020
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-3 w-3" })
|
|
7641
8021
|
] })
|
|
7642
8022
|
}
|
|
7643
8023
|
),
|
|
7644
|
-
|
|
7645
|
-
|
|
7646
|
-
|
|
7647
|
-
|
|
7648
|
-
|
|
7649
|
-
|
|
7650
|
-
|
|
7651
|
-
|
|
7652
|
-
|
|
7653
|
-
|
|
7654
|
-
|
|
7655
|
-
|
|
7656
|
-
|
|
7657
|
-
opt.originalPrice
|
|
7658
|
-
] }),
|
|
7659
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-bold text-foreground font-ui", children: [
|
|
7660
|
-
currency,
|
|
7661
|
-
" ",
|
|
7662
|
-
opt.price,
|
|
7663
|
-
opt.unit && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-normal text-muted-foreground", children: [
|
|
7664
|
-
" ",
|
|
7665
|
-
"/ ",
|
|
7666
|
-
opt.unit
|
|
7667
|
-
] })
|
|
8024
|
+
showEstimates && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-border overflow-hidden", children: [
|
|
8025
|
+
currencyEstimates.map((est, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8026
|
+
"div",
|
|
8027
|
+
{
|
|
8028
|
+
className: cn(
|
|
8029
|
+
"flex items-center justify-between px-3 py-2 text-sm font-ui",
|
|
8030
|
+
i < currencyEstimates.length - 1 && "border-b border-border"
|
|
8031
|
+
),
|
|
8032
|
+
children: [
|
|
8033
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: est.currency }),
|
|
8034
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-semibold text-foreground", children: [
|
|
8035
|
+
est.symbol ? `${est.symbol} ` : "",
|
|
8036
|
+
est.price
|
|
7668
8037
|
] })
|
|
7669
|
-
]
|
|
7670
|
-
|
|
7671
|
-
|
|
7672
|
-
|
|
7673
|
-
|
|
8038
|
+
]
|
|
8039
|
+
},
|
|
8040
|
+
i
|
|
8041
|
+
)),
|
|
8042
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "px-3 py-2 text-[11px] leading-snug text-muted-foreground bg-muted/40 italic font-ui border-t border-border", children: [
|
|
8043
|
+
"Estimates based on the current exchange rate. The final price charged is in ",
|
|
8044
|
+
currency,
|
|
8045
|
+
"."
|
|
8046
|
+
] })
|
|
8047
|
+
] })
|
|
7674
8048
|
] }),
|
|
7675
8049
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7676
8050
|
"button",
|
|
@@ -7858,14 +8232,14 @@ function SiteHeader({
|
|
|
7858
8232
|
className
|
|
7859
8233
|
}) {
|
|
7860
8234
|
const t = VARIANT[variant];
|
|
7861
|
-
const [openMenu, setOpenMenu] =
|
|
7862
|
-
const [langOpen, setLangOpen] =
|
|
7863
|
-
const [mobileOpen, setMobileOpen] =
|
|
7864
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
7865
|
-
const [activeLang, setActiveLang] =
|
|
8235
|
+
const [openMenu, setOpenMenu] = React25__namespace.useState(null);
|
|
8236
|
+
const [langOpen, setLangOpen] = React25__namespace.useState(false);
|
|
8237
|
+
const [mobileOpen, setMobileOpen] = React25__namespace.useState(false);
|
|
8238
|
+
const [openMobileSection, setOpenMobileSection] = React25__namespace.useState(null);
|
|
8239
|
+
const [activeLang, setActiveLang] = React25__namespace.useState(currentLanguage);
|
|
7866
8240
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
7867
|
-
const menuCloseTimer =
|
|
7868
|
-
const langCloseTimer =
|
|
8241
|
+
const menuCloseTimer = React25__namespace.useRef(void 0);
|
|
8242
|
+
const langCloseTimer = React25__namespace.useRef(void 0);
|
|
7869
8243
|
const handleMenuEnter = (label) => {
|
|
7870
8244
|
clearTimeout(menuCloseTimer.current);
|
|
7871
8245
|
setOpenMenu(label);
|
|
@@ -7886,7 +8260,7 @@ function SiteHeader({
|
|
|
7886
8260
|
setOpenMenu(null);
|
|
7887
8261
|
setLangOpen(false);
|
|
7888
8262
|
};
|
|
7889
|
-
|
|
8263
|
+
React25__namespace.useEffect(() => () => {
|
|
7890
8264
|
clearTimeout(menuCloseTimer.current);
|
|
7891
8265
|
clearTimeout(langCloseTimer.current);
|
|
7892
8266
|
}, []);
|
|
@@ -8151,7 +8525,7 @@ function SiteHeader({
|
|
|
8151
8525
|
), children: [
|
|
8152
8526
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
8153
8527
|
const isActive = lang.code === activeLang;
|
|
8154
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8528
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React25__namespace.Fragment, { children: [
|
|
8155
8529
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
8156
8530
|
"text-xs select-none",
|
|
8157
8531
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -8213,8 +8587,8 @@ function SiteHeader({
|
|
|
8213
8587
|
);
|
|
8214
8588
|
}
|
|
8215
8589
|
function ThemeToggle({ className }) {
|
|
8216
|
-
const [dark, setDark] =
|
|
8217
|
-
|
|
8590
|
+
const [dark, setDark] = React25__namespace.useState(false);
|
|
8591
|
+
React25__namespace.useEffect(() => {
|
|
8218
8592
|
const saved = localStorage.getItem("theme");
|
|
8219
8593
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
8220
8594
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -8365,7 +8739,7 @@ function TripCard({
|
|
|
8365
8739
|
);
|
|
8366
8740
|
}
|
|
8367
8741
|
function useHlsVideo(videoRef, src) {
|
|
8368
|
-
|
|
8742
|
+
React25__namespace.useEffect(() => {
|
|
8369
8743
|
if (!src || !videoRef.current) return;
|
|
8370
8744
|
const video = videoRef.current;
|
|
8371
8745
|
if (!src.includes(".m3u8")) return;
|
|
@@ -8402,16 +8776,17 @@ function TripHeader({
|
|
|
8402
8776
|
destination,
|
|
8403
8777
|
duration,
|
|
8404
8778
|
tagline,
|
|
8779
|
+
belowMeta,
|
|
8405
8780
|
siteHeader,
|
|
8406
8781
|
uiVariant = "v1",
|
|
8407
8782
|
className
|
|
8408
8783
|
}) {
|
|
8409
8784
|
var _a;
|
|
8410
|
-
const [heroIndex, setHeroIndex] =
|
|
8411
|
-
const [videoReady, setVideoReady] =
|
|
8412
|
-
const videoRef =
|
|
8785
|
+
const [heroIndex, setHeroIndex] = React25__namespace.useState(0);
|
|
8786
|
+
const [videoReady, setVideoReady] = React25__namespace.useState(false);
|
|
8787
|
+
const videoRef = React25__namespace.useRef(null);
|
|
8413
8788
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
8414
|
-
const validImages =
|
|
8789
|
+
const validImages = React25__namespace.useMemo(
|
|
8415
8790
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
8416
8791
|
[images]
|
|
8417
8792
|
);
|
|
@@ -8426,7 +8801,7 @@ function TripHeader({
|
|
|
8426
8801
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
8427
8802
|
const hasMeta = !!(destination || duration);
|
|
8428
8803
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
8429
|
-
|
|
8804
|
+
React25__namespace.useEffect(() => {
|
|
8430
8805
|
if (!videoUrl) return;
|
|
8431
8806
|
const el = videoRef.current;
|
|
8432
8807
|
if (!el) return;
|
|
@@ -8568,7 +8943,7 @@ function TripHeader({
|
|
|
8568
8943
|
siteHeader ? "-mt-44" : "-mt-36"
|
|
8569
8944
|
),
|
|
8570
8945
|
children: [
|
|
8571
|
-
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(
|
|
8946
|
+
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(React25__namespace.Fragment, { children: [
|
|
8572
8947
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
8573
8948
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
8574
8949
|
] }, i)) }),
|
|
@@ -8593,7 +8968,8 @@ function TripHeader({
|
|
|
8593
8968
|
duration.days === 1 ? "dia" : "dias"
|
|
8594
8969
|
] })
|
|
8595
8970
|
] })
|
|
8596
|
-
] }) : tagline ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm sm:text-base text-white/80 font-ui", children: tagline }) : null
|
|
8971
|
+
] }) : tagline ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm sm:text-base text-white/80 font-ui", children: tagline }) : null,
|
|
8972
|
+
belowMeta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3", children: belowMeta })
|
|
8597
8973
|
]
|
|
8598
8974
|
}
|
|
8599
8975
|
) })
|
|
@@ -8626,12 +9002,12 @@ function ItineraryTimeline({ steps }) {
|
|
|
8626
9002
|
] }),
|
|
8627
9003
|
step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: "Transfer" })
|
|
8628
9004
|
] }),
|
|
8629
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-
|
|
9005
|
+
/* @__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 })
|
|
8630
9006
|
] })
|
|
8631
9007
|
] }, i)) });
|
|
8632
9008
|
}
|
|
8633
9009
|
function Checklist({ items, icon }) {
|
|
8634
|
-
return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-2", children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-2.5 text-
|
|
9010
|
+
return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-2", children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-2.5 text-base text-foreground", children: [
|
|
8635
9011
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 shrink-0 text-primary", children: icon != null ? icon : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "h-4 w-4" }) }),
|
|
8636
9012
|
item
|
|
8637
9013
|
] }, i)) });
|
|
@@ -8646,21 +9022,36 @@ function TripPage({
|
|
|
8646
9022
|
breadcrumb,
|
|
8647
9023
|
highlights,
|
|
8648
9024
|
infoGroups,
|
|
9025
|
+
keyInfo,
|
|
8649
9026
|
recommendedFor,
|
|
8650
9027
|
overview,
|
|
9028
|
+
overviewHighlights,
|
|
8651
9029
|
itinerary,
|
|
9030
|
+
itineraryDays,
|
|
8652
9031
|
gallery,
|
|
8653
9032
|
included,
|
|
9033
|
+
notIncluded,
|
|
8654
9034
|
whatToBring,
|
|
8655
9035
|
weather,
|
|
9036
|
+
optionalExtras,
|
|
9037
|
+
accommodation,
|
|
9038
|
+
food,
|
|
9039
|
+
termsAndConditions,
|
|
8656
9040
|
meetingPoints,
|
|
9041
|
+
meetingPoint,
|
|
8657
9042
|
faqs,
|
|
9043
|
+
sectionIcons,
|
|
8658
9044
|
reviews,
|
|
9045
|
+
trustpilot,
|
|
9046
|
+
trustpilotMini,
|
|
9047
|
+
trustpilotHero,
|
|
8659
9048
|
priceFrom,
|
|
8660
9049
|
currency = "CHF",
|
|
8661
9050
|
season,
|
|
8662
9051
|
departureTimes,
|
|
8663
|
-
|
|
9052
|
+
benefits,
|
|
9053
|
+
currencyEstimates,
|
|
9054
|
+
priceInfo,
|
|
8664
9055
|
onBook,
|
|
8665
9056
|
bookLabel,
|
|
8666
9057
|
siteHeader,
|
|
@@ -8668,34 +9059,51 @@ function TripPage({
|
|
|
8668
9059
|
features,
|
|
8669
9060
|
className
|
|
8670
9061
|
}) {
|
|
8671
|
-
const [activeSection, setActiveSection] =
|
|
8672
|
-
const [
|
|
8673
|
-
const
|
|
8674
|
-
|
|
8675
|
-
|
|
8676
|
-
|
|
8677
|
-
|
|
8678
|
-
|
|
8679
|
-
|
|
8680
|
-
|
|
8681
|
-
|
|
8682
|
-
|
|
8683
|
-
|
|
9062
|
+
const [activeSection, setActiveSection] = React25__namespace.useState("");
|
|
9063
|
+
const [accordionValue, setAccordionValue] = React25__namespace.useState([]);
|
|
9064
|
+
const accordionSectionIds = React25__namespace.useMemo(
|
|
9065
|
+
() => /* @__PURE__ */ new Set([
|
|
9066
|
+
"key-info",
|
|
9067
|
+
"what-to-bring",
|
|
9068
|
+
"weather",
|
|
9069
|
+
"optional-extras",
|
|
9070
|
+
"accommodation",
|
|
9071
|
+
"food",
|
|
9072
|
+
"meeting",
|
|
9073
|
+
"terms"
|
|
9074
|
+
]),
|
|
9075
|
+
[]
|
|
9076
|
+
);
|
|
9077
|
+
const [navFloating, setNavFloating] = React25__namespace.useState(false);
|
|
9078
|
+
const [navHidden, setNavHidden] = React25__namespace.useState(false);
|
|
9079
|
+
const [isFloating, setIsFloating] = React25__namespace.useState(false);
|
|
9080
|
+
const [sidebarPos, setSidebarPos] = React25__namespace.useState(null);
|
|
9081
|
+
const [pricingBarVisible, setPricingBarVisible] = React25__namespace.useState(false);
|
|
9082
|
+
const navRef = React25__namespace.useRef(null);
|
|
9083
|
+
const navSentinelRef = React25__namespace.useRef(null);
|
|
9084
|
+
const sentinelRef = React25__namespace.useRef(null);
|
|
9085
|
+
const sidebarPlaceholderRef = React25__namespace.useRef(null);
|
|
9086
|
+
const pricingBarRef = React25__namespace.useRef(null);
|
|
9087
|
+
const galleryRef = React25__namespace.useRef(null);
|
|
9088
|
+
const sections = React25__namespace.useMemo(
|
|
8684
9089
|
() => [
|
|
8685
|
-
{ id: "
|
|
8686
|
-
{
|
|
8687
|
-
|
|
8688
|
-
|
|
8689
|
-
|
|
8690
|
-
|
|
8691
|
-
{ id: "
|
|
9090
|
+
{ id: "overview", label: "Overview", show: !!(overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) },
|
|
9091
|
+
{
|
|
9092
|
+
id: "itinerary",
|
|
9093
|
+
label: "Itinerary",
|
|
9094
|
+
show: !!((itineraryDays == null ? void 0 : itineraryDays.length) || (itinerary == null ? void 0 : itinerary.length))
|
|
9095
|
+
},
|
|
9096
|
+
{ id: "included", label: "What is Included", show: !!(included == null ? void 0 : included.length) },
|
|
9097
|
+
{ id: "what-to-bring", label: "What to Bring", show: !!(whatToBring == null ? void 0 : whatToBring.length) },
|
|
9098
|
+
{ id: "accommodation", label: "Accommodation", show: !!accommodation },
|
|
9099
|
+
{ id: "terms", label: "Terms", show: !!termsAndConditions },
|
|
8692
9100
|
{ id: "faq", label: "FAQ", show: !!(faqs == null ? void 0 : faqs.length) },
|
|
8693
|
-
{ id: "
|
|
9101
|
+
{ id: "reviews", label: "Reviews", show: !!(trustpilot || (reviews == null ? void 0 : reviews.length)) }
|
|
8694
9102
|
].filter((s) => s.show),
|
|
8695
9103
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
8696
9104
|
[]
|
|
8697
9105
|
);
|
|
8698
|
-
|
|
9106
|
+
React25__namespace.useEffect(() => {
|
|
8699
9107
|
const sentinel = navSentinelRef.current;
|
|
8700
9108
|
if (!sentinel) return;
|
|
8701
9109
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -8703,7 +9111,7 @@ function TripPage({
|
|
|
8703
9111
|
update();
|
|
8704
9112
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
8705
9113
|
}, []);
|
|
8706
|
-
|
|
9114
|
+
React25__namespace.useEffect(() => {
|
|
8707
9115
|
const sentinel = sentinelRef.current;
|
|
8708
9116
|
if (!sentinel) return;
|
|
8709
9117
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -8711,7 +9119,7 @@ function TripPage({
|
|
|
8711
9119
|
update();
|
|
8712
9120
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
8713
9121
|
}, []);
|
|
8714
|
-
|
|
9122
|
+
React25__namespace.useEffect(() => {
|
|
8715
9123
|
const measure = () => {
|
|
8716
9124
|
if (!sidebarPlaceholderRef.current) return;
|
|
8717
9125
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -8721,7 +9129,7 @@ function TripPage({
|
|
|
8721
9129
|
window.addEventListener("resize", measure);
|
|
8722
9130
|
return () => window.removeEventListener("resize", measure);
|
|
8723
9131
|
}, [isFloating]);
|
|
8724
|
-
|
|
9132
|
+
React25__namespace.useEffect(() => {
|
|
8725
9133
|
const check = () => {
|
|
8726
9134
|
var _a;
|
|
8727
9135
|
const target = (_a = galleryRef.current) != null ? _a : pricingBarRef.current;
|
|
@@ -8732,7 +9140,7 @@ function TripPage({
|
|
|
8732
9140
|
check();
|
|
8733
9141
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
8734
9142
|
}, []);
|
|
8735
|
-
|
|
9143
|
+
React25__namespace.useEffect(() => {
|
|
8736
9144
|
const check = () => {
|
|
8737
9145
|
if (!pricingBarRef.current) return;
|
|
8738
9146
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -8741,7 +9149,7 @@ function TripPage({
|
|
|
8741
9149
|
check();
|
|
8742
9150
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
8743
9151
|
}, []);
|
|
8744
|
-
|
|
9152
|
+
React25__namespace.useEffect(() => {
|
|
8745
9153
|
if (sections.length === 0) return;
|
|
8746
9154
|
setActiveSection(sections[0].id);
|
|
8747
9155
|
const update = () => {
|
|
@@ -8776,20 +9184,28 @@ function TripPage({
|
|
|
8776
9184
|
}
|
|
8777
9185
|
};
|
|
8778
9186
|
const scrollToSection = (id) => {
|
|
8779
|
-
|
|
8780
|
-
|
|
8781
|
-
|
|
8782
|
-
|
|
8783
|
-
|
|
8784
|
-
|
|
8785
|
-
|
|
8786
|
-
|
|
8787
|
-
|
|
8788
|
-
|
|
8789
|
-
scrollEl
|
|
8790
|
-
|
|
8791
|
-
|
|
9187
|
+
const performScroll = () => {
|
|
9188
|
+
var _a, _b, _c;
|
|
9189
|
+
const el = document.getElementById(`trip-section-${id}`);
|
|
9190
|
+
if (!el) return;
|
|
9191
|
+
const navHeight = (_b = (_a = navRef.current) == null ? void 0 : _a.offsetHeight) != null ? _b : 56;
|
|
9192
|
+
const scrollEl = (_c = navRef.current) == null ? void 0 : _c.closest("main");
|
|
9193
|
+
const currentScroll = scrollEl ? scrollEl.scrollTop : window.scrollY;
|
|
9194
|
+
const elTop = el.getBoundingClientRect().top;
|
|
9195
|
+
const containerTop = scrollEl ? scrollEl.getBoundingClientRect().top : 0;
|
|
9196
|
+
const target = currentScroll + (elTop - containerTop) - navHeight - 12;
|
|
9197
|
+
if (scrollEl) {
|
|
9198
|
+
scrollEl.scrollTo({ top: target, behavior: "smooth" });
|
|
9199
|
+
} else {
|
|
9200
|
+
window.scrollTo({ top: target, behavior: "smooth" });
|
|
9201
|
+
}
|
|
9202
|
+
};
|
|
9203
|
+
if (accordionSectionIds.has(id)) {
|
|
9204
|
+
setAccordionValue([id]);
|
|
9205
|
+
window.setTimeout(performScroll, 320);
|
|
9206
|
+
return;
|
|
8792
9207
|
}
|
|
9208
|
+
performScroll();
|
|
8793
9209
|
};
|
|
8794
9210
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8795
9211
|
"div",
|
|
@@ -8809,10 +9225,11 @@ function TripPage({
|
|
|
8809
9225
|
duration,
|
|
8810
9226
|
tagline,
|
|
8811
9227
|
siteHeader,
|
|
8812
|
-
uiVariant
|
|
9228
|
+
uiVariant,
|
|
9229
|
+
belowMeta: trustpilotHero ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
|
|
8813
9230
|
}
|
|
8814
9231
|
),
|
|
8815
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-
|
|
9232
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
|
|
8816
9233
|
highlights && highlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 flex flex-wrap justify-center gap-6 py-2", children: highlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2 text-center", children: [
|
|
8817
9234
|
h.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full border-2 border-border text-foreground", children: h.icon }),
|
|
8818
9235
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
|
|
@@ -8822,7 +9239,7 @@ function TripPage({
|
|
|
8822
9239
|
"div",
|
|
8823
9240
|
{
|
|
8824
9241
|
className: cn(
|
|
8825
|
-
"
|
|
9242
|
+
"pt-8 pb-2 flex justify-center transition-opacity duration-150",
|
|
8826
9243
|
navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
|
|
8827
9244
|
),
|
|
8828
9245
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -8839,67 +9256,208 @@ function TripPage({
|
|
|
8839
9256
|
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
|
|
8840
9257
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
|
|
8841
9258
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
|
|
8842
|
-
|
|
8843
|
-
/* @__PURE__ */ jsxRuntime.
|
|
8844
|
-
|
|
8845
|
-
|
|
8846
|
-
|
|
8847
|
-
|
|
8848
|
-
|
|
8849
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8850
|
-
|
|
8851
|
-
] }, i)) })
|
|
8852
|
-
|
|
8853
|
-
overview && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
|
|
8854
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-4", children: "Overview" }),
|
|
8855
|
-
recommendedFor && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2.5 rounded-xl bg-primary/8 border border-primary/20 p-4 mb-4", children: [
|
|
9259
|
+
(overview || (overviewHighlights == null ? void 0 : overviewHighlights.length)) && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
|
|
9260
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
9261
|
+
(sectionIcons == null ? void 0 : sectionIcons.overview) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.overview }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-5 w-5 text-primary" }),
|
|
9262
|
+
"Overview"
|
|
9263
|
+
] }),
|
|
9264
|
+
overview && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-lg text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview }),
|
|
9265
|
+
overviewHighlights && overviewHighlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("flex flex-col gap-5", overview && "mt-8"), children: overviewHighlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-4", children: [
|
|
9266
|
+
h.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center text-foreground [&_svg]:h-8 [&_svg]:w-8", children: h.icon }),
|
|
9267
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 pt-1 text-base text-foreground leading-relaxed [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: h.description })
|
|
9268
|
+
] }, i)) }),
|
|
9269
|
+
recommendedFor && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 flex items-start gap-2.5 rounded-xl bg-primary/8 border border-primary/20 p-4", children: [
|
|
8856
9270
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
|
|
8857
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-
|
|
9271
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground font-ui", children: [
|
|
8858
9272
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: "Recommended for: " }),
|
|
8859
9273
|
recommendedFor
|
|
8860
9274
|
] })
|
|
8861
|
-
] })
|
|
8862
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview })
|
|
9275
|
+
] })
|
|
8863
9276
|
] }),
|
|
8864
|
-
|
|
8865
|
-
/* @__PURE__ */ jsxRuntime.
|
|
9277
|
+
itineraryDays && itineraryDays.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
|
|
9278
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-6 flex items-center gap-2", children: [
|
|
9279
|
+
(sectionIcons == null ? void 0 : sectionIcons.itinerary) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.itinerary }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-5 w-5 text-primary" }),
|
|
9280
|
+
"Itinerary"
|
|
9281
|
+
] }),
|
|
9282
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-12", children: itineraryDays.map((day) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
9283
|
+
ItineraryDay,
|
|
9284
|
+
__spreadProps(__spreadValues({}, day), {
|
|
9285
|
+
photoLayout: "fullBleedBottom"
|
|
9286
|
+
}),
|
|
9287
|
+
day.dayNumber
|
|
9288
|
+
)) })
|
|
9289
|
+
] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
|
|
9290
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-6 flex items-center gap-2", children: [
|
|
9291
|
+
(sectionIcons == null ? void 0 : sectionIcons.itinerary) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.itinerary }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-5 w-5 text-primary" }),
|
|
9292
|
+
"Itinerary"
|
|
9293
|
+
] }),
|
|
8866
9294
|
/* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary })
|
|
8867
9295
|
] }),
|
|
8868
9296
|
included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
|
|
8869
9297
|
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
8870
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
|
|
9298
|
+
(sectionIcons == null ? void 0 : sectionIcons.whatIsIncluded) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatIsIncluded }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
|
|
8871
9299
|
"Included"
|
|
8872
9300
|
] }),
|
|
8873
9301
|
/* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: included })
|
|
8874
9302
|
] }),
|
|
8875
|
-
|
|
8876
|
-
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
8877
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
|
|
8878
|
-
"What to bring"
|
|
8879
|
-
] }),
|
|
8880
|
-
/* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-4 w-4" }) })
|
|
8881
|
-
] }),
|
|
8882
|
-
weather && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-weather", className: "scroll-mt-20", children: [
|
|
9303
|
+
notIncluded && notIncluded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-not-included", className: "scroll-mt-20", children: [
|
|
8883
9304
|
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
8884
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.
|
|
8885
|
-
"
|
|
9305
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5 text-muted-foreground" }),
|
|
9306
|
+
"Not included"
|
|
8886
9307
|
] }),
|
|
8887
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8888
|
-
|
|
8889
|
-
|
|
8890
|
-
|
|
8891
|
-
|
|
8892
|
-
|
|
8893
|
-
|
|
8894
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
|
|
8895
|
-
/* @__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" }) }),
|
|
8896
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
8897
|
-
mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? "Activity location" : mp.type === "alternative" ? "Alternative meeting point" : "Meeting point" }),
|
|
8898
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
|
|
8899
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
|
|
8900
|
-
] })
|
|
8901
|
-
] }, i)) })
|
|
9308
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9309
|
+
Checklist,
|
|
9310
|
+
{
|
|
9311
|
+
items: notIncluded,
|
|
9312
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-4 w-4 text-muted-foreground" })
|
|
9313
|
+
}
|
|
9314
|
+
)
|
|
8902
9315
|
] }),
|
|
9316
|
+
((infoGroups == null ? void 0 : infoGroups.length) || keyInfo || (whatToBring == null ? void 0 : whatToBring.length) || weather || optionalExtras || accommodation || food || (meetingPoints == null ? void 0 : meetingPoints.length) || meetingPoint || termsAndConditions) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9317
|
+
Accordion,
|
|
9318
|
+
{
|
|
9319
|
+
multiple: false,
|
|
9320
|
+
value: accordionValue,
|
|
9321
|
+
onValueChange: setAccordionValue,
|
|
9322
|
+
className: "border-t border-border",
|
|
9323
|
+
children: [
|
|
9324
|
+
(keyInfo || infoGroups && infoGroups.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9325
|
+
AccordionItem,
|
|
9326
|
+
{
|
|
9327
|
+
value: "key-info",
|
|
9328
|
+
id: "trip-section-key-info",
|
|
9329
|
+
className: "scroll-mt-20 border-b border-border",
|
|
9330
|
+
children: [
|
|
9331
|
+
/* @__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: [
|
|
9332
|
+
(sectionIcons == null ? void 0 : sectionIcons.keyInfo) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.keyInfo }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-5 w-5 text-primary" }),
|
|
9333
|
+
"Key info"
|
|
9334
|
+
] }) }),
|
|
9335
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: keyInfo ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: keyInfo }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-6", children: infoGroups.map((group, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
9336
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
9337
|
+
group.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: group.icon }),
|
|
9338
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading", children: group.title })
|
|
9339
|
+
] }),
|
|
9340
|
+
/* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: group.items }),
|
|
9341
|
+
i < infoGroups.length - 1 && /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mt-6" })
|
|
9342
|
+
] }, i)) }) })
|
|
9343
|
+
]
|
|
9344
|
+
}
|
|
9345
|
+
),
|
|
9346
|
+
(meetingPoint || meetingPoints && meetingPoints.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9347
|
+
AccordionItem,
|
|
9348
|
+
{
|
|
9349
|
+
value: "meeting",
|
|
9350
|
+
id: "trip-section-meeting",
|
|
9351
|
+
className: "scroll-mt-20 border-b border-border",
|
|
9352
|
+
children: [
|
|
9353
|
+
/* @__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: [
|
|
9354
|
+
(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" }),
|
|
9355
|
+
"Meeting point"
|
|
9356
|
+
] }) }),
|
|
9357
|
+
/* @__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) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
|
|
9358
|
+
/* @__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" }) }),
|
|
9359
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
9360
|
+
mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? "Activity location" : mp.type === "alternative" ? "Alternative meeting point" : "Meeting point" }),
|
|
9361
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
|
|
9362
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
|
|
9363
|
+
] })
|
|
9364
|
+
] }, i)) }) })
|
|
9365
|
+
]
|
|
9366
|
+
}
|
|
9367
|
+
),
|
|
9368
|
+
optionalExtras && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9369
|
+
AccordionItem,
|
|
9370
|
+
{
|
|
9371
|
+
value: "optional-extras",
|
|
9372
|
+
id: "trip-section-optional-extras",
|
|
9373
|
+
className: "scroll-mt-20 border-b border-border",
|
|
9374
|
+
children: [
|
|
9375
|
+
/* @__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: [
|
|
9376
|
+
(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.SparklesIcon, { className: "h-5 w-5 text-primary" }),
|
|
9377
|
+
"Optional extras"
|
|
9378
|
+
] }) }),
|
|
9379
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: optionalExtras }) })
|
|
9380
|
+
]
|
|
9381
|
+
}
|
|
9382
|
+
),
|
|
9383
|
+
whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9384
|
+
AccordionItem,
|
|
9385
|
+
{
|
|
9386
|
+
value: "what-to-bring",
|
|
9387
|
+
id: "trip-section-what-to-bring",
|
|
9388
|
+
className: "scroll-mt-20 border-b border-border",
|
|
9389
|
+
children: [
|
|
9390
|
+
/* @__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: [
|
|
9391
|
+
(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" }),
|
|
9392
|
+
"What to bring"
|
|
9393
|
+
] }) }),
|
|
9394
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-4 w-4" }) }) })
|
|
9395
|
+
]
|
|
9396
|
+
}
|
|
9397
|
+
),
|
|
9398
|
+
accommodation && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9399
|
+
AccordionItem,
|
|
9400
|
+
{
|
|
9401
|
+
value: "accommodation",
|
|
9402
|
+
id: "trip-section-accommodation",
|
|
9403
|
+
className: "scroll-mt-20 border-b border-border",
|
|
9404
|
+
children: [
|
|
9405
|
+
/* @__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: [
|
|
9406
|
+
(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" }),
|
|
9407
|
+
"Accommodation"
|
|
9408
|
+
] }) }),
|
|
9409
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: accommodation }) })
|
|
9410
|
+
]
|
|
9411
|
+
}
|
|
9412
|
+
),
|
|
9413
|
+
food && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9414
|
+
AccordionItem,
|
|
9415
|
+
{
|
|
9416
|
+
value: "food",
|
|
9417
|
+
id: "trip-section-food",
|
|
9418
|
+
className: "scroll-mt-20 border-b border-border",
|
|
9419
|
+
children: [
|
|
9420
|
+
/* @__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: [
|
|
9421
|
+
(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" }),
|
|
9422
|
+
"Food"
|
|
9423
|
+
] }) }),
|
|
9424
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: food }) })
|
|
9425
|
+
]
|
|
9426
|
+
}
|
|
9427
|
+
),
|
|
9428
|
+
weather && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9429
|
+
AccordionItem,
|
|
9430
|
+
{
|
|
9431
|
+
value: "weather",
|
|
9432
|
+
id: "trip-section-weather",
|
|
9433
|
+
className: "scroll-mt-20 border-b border-border",
|
|
9434
|
+
children: [
|
|
9435
|
+
/* @__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: [
|
|
9436
|
+
(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" }),
|
|
9437
|
+
"Weather"
|
|
9438
|
+
] }) }),
|
|
9439
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-start gap-3 rounded-xl bg-muted/60 border border-border p-5", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-2 [&_strong]:font-semibold", children: weather }) }) })
|
|
9440
|
+
]
|
|
9441
|
+
}
|
|
9442
|
+
),
|
|
9443
|
+
termsAndConditions && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9444
|
+
AccordionItem,
|
|
9445
|
+
{
|
|
9446
|
+
value: "terms",
|
|
9447
|
+
id: "trip-section-terms",
|
|
9448
|
+
className: "scroll-mt-20 border-b border-border",
|
|
9449
|
+
children: [
|
|
9450
|
+
/* @__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: [
|
|
9451
|
+
(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" }),
|
|
9452
|
+
"Terms & conditions"
|
|
9453
|
+
] }) }),
|
|
9454
|
+
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: termsAndConditions }) })
|
|
9455
|
+
]
|
|
9456
|
+
}
|
|
9457
|
+
)
|
|
9458
|
+
]
|
|
9459
|
+
}
|
|
9460
|
+
),
|
|
8903
9461
|
faqs && faqs.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
|
|
8904
9462
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: "FAQ" }),
|
|
8905
9463
|
/* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: faqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
|
|
@@ -8907,14 +9465,18 @@ function TripPage({
|
|
|
8907
9465
|
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
|
|
8908
9466
|
] }, i)) })
|
|
8909
9467
|
] }),
|
|
8910
|
-
|
|
9468
|
+
trustpilot ? /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
|
|
9469
|
+
/* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
|
|
9470
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: "What our guests think" }),
|
|
9471
|
+
/* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilot })
|
|
9472
|
+
] }) : reviews && reviews.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-reviews", className: "scroll-mt-20", children: [
|
|
8911
9473
|
/* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
|
|
8912
9474
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: "What our guests think" }),
|
|
8913
9475
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
|
|
8914
9476
|
var _a;
|
|
8915
9477
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
|
|
8916
9478
|
/* @__PURE__ */ jsxRuntime.jsx(Stars, { count: (_a = r.rating) != null ? _a : 5 }),
|
|
8917
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-
|
|
9479
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
|
|
8918
9480
|
"\u201C",
|
|
8919
9481
|
r.text,
|
|
8920
9482
|
"\u201D"
|
|
@@ -8934,10 +9496,13 @@ function TripPage({
|
|
|
8934
9496
|
currency,
|
|
8935
9497
|
season,
|
|
8936
9498
|
departureTimes,
|
|
8937
|
-
pricingOptions,
|
|
8938
9499
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
8939
9500
|
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
8940
|
-
variant: "card"
|
|
9501
|
+
variant: "card",
|
|
9502
|
+
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
9503
|
+
benefits,
|
|
9504
|
+
currencyEstimates,
|
|
9505
|
+
priceInfo
|
|
8941
9506
|
}
|
|
8942
9507
|
) }) })
|
|
8943
9508
|
] })
|
|
@@ -8950,7 +9515,7 @@ function TripPage({
|
|
|
8950
9515
|
"fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
|
|
8951
9516
|
navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
|
|
8952
9517
|
),
|
|
8953
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-
|
|
9518
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8954
9519
|
MenuTrip,
|
|
8955
9520
|
{
|
|
8956
9521
|
sections,
|
|
@@ -8973,10 +9538,13 @@ function TripPage({
|
|
|
8973
9538
|
currency,
|
|
8974
9539
|
season,
|
|
8975
9540
|
departureTimes,
|
|
8976
|
-
pricingOptions,
|
|
8977
9541
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
8978
9542
|
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
8979
|
-
variant: "card"
|
|
9543
|
+
variant: "card",
|
|
9544
|
+
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
9545
|
+
benefits,
|
|
9546
|
+
currencyEstimates,
|
|
9547
|
+
priceInfo
|
|
8980
9548
|
}
|
|
8981
9549
|
) })
|
|
8982
9550
|
}
|
|
@@ -8989,7 +9557,7 @@ function TripPage({
|
|
|
8989
9557
|
initialVisible: 6
|
|
8990
9558
|
}
|
|
8991
9559
|
) }),
|
|
8992
|
-
gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-
|
|
9560
|
+
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(BookingForm, { onSubmit: onBook ? (values) => onBook() : void 0 }) }) }),
|
|
8993
9561
|
/* @__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(
|
|
8994
9562
|
PricingTrip,
|
|
8995
9563
|
{
|
|
@@ -8997,7 +9565,10 @@ function TripPage({
|
|
|
8997
9565
|
currency,
|
|
8998
9566
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
8999
9567
|
bookLabel: bookLabel != null ? bookLabel : "Book now",
|
|
9000
|
-
variant: "compact"
|
|
9568
|
+
variant: "compact",
|
|
9569
|
+
sharp: true,
|
|
9570
|
+
priceInfo,
|
|
9571
|
+
currencyEstimates
|
|
9001
9572
|
}
|
|
9002
9573
|
) }),
|
|
9003
9574
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" })
|
|
@@ -9106,12 +9677,12 @@ function Toast({
|
|
|
9106
9677
|
duration = 6e3,
|
|
9107
9678
|
className
|
|
9108
9679
|
}) {
|
|
9109
|
-
const [mounted, setMounted] =
|
|
9110
|
-
const [visible, setVisible] =
|
|
9111
|
-
|
|
9680
|
+
const [mounted, setMounted] = React25__namespace.useState(false);
|
|
9681
|
+
const [visible, setVisible] = React25__namespace.useState(true);
|
|
9682
|
+
React25__namespace.useEffect(() => {
|
|
9112
9683
|
setMounted(true);
|
|
9113
9684
|
}, []);
|
|
9114
|
-
|
|
9685
|
+
React25__namespace.useEffect(() => {
|
|
9115
9686
|
if (duration === 0) return;
|
|
9116
9687
|
const t = setTimeout(() => {
|
|
9117
9688
|
setVisible(false);
|
|
@@ -9518,21 +10089,21 @@ function LeadCapturePopup({
|
|
|
9518
10089
|
}) {
|
|
9519
10090
|
var _a;
|
|
9520
10091
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
9521
|
-
const [open, setOpen] =
|
|
9522
|
-
const [closing, setClosing] =
|
|
9523
|
-
const [submitted, setSubmitted] =
|
|
9524
|
-
const [submitting, setSubmitting] =
|
|
9525
|
-
const [error, setError] =
|
|
9526
|
-
const [name, setName] =
|
|
9527
|
-
const [email, setEmail] =
|
|
9528
|
-
const [travelDate, setTravelDate] =
|
|
9529
|
-
const panelRef =
|
|
9530
|
-
const nameRef =
|
|
9531
|
-
const show =
|
|
10092
|
+
const [open, setOpen] = React25.useState(false);
|
|
10093
|
+
const [closing, setClosing] = React25.useState(false);
|
|
10094
|
+
const [submitted, setSubmitted] = React25.useState(false);
|
|
10095
|
+
const [submitting, setSubmitting] = React25.useState(false);
|
|
10096
|
+
const [error, setError] = React25.useState(null);
|
|
10097
|
+
const [name, setName] = React25.useState("");
|
|
10098
|
+
const [email, setEmail] = React25.useState("");
|
|
10099
|
+
const [travelDate, setTravelDate] = React25.useState("");
|
|
10100
|
+
const panelRef = React25.useRef(null);
|
|
10101
|
+
const nameRef = React25.useRef(null);
|
|
10102
|
+
const show = React25.useCallback(() => {
|
|
9532
10103
|
if (isDismissed()) return;
|
|
9533
10104
|
setOpen(true);
|
|
9534
10105
|
}, []);
|
|
9535
|
-
|
|
10106
|
+
React25.useEffect(() => {
|
|
9536
10107
|
var _a2;
|
|
9537
10108
|
if (isDismissed()) return;
|
|
9538
10109
|
if (config.trigger === "delay") {
|
|
@@ -9559,7 +10130,7 @@ function LeadCapturePopup({
|
|
|
9559
10130
|
return () => window.removeEventListener("scroll", handler);
|
|
9560
10131
|
}
|
|
9561
10132
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
9562
|
-
|
|
10133
|
+
React25.useEffect(() => {
|
|
9563
10134
|
if (open && !submitted) {
|
|
9564
10135
|
requestAnimationFrame(() => {
|
|
9565
10136
|
var _a2;
|
|
@@ -9567,7 +10138,7 @@ function LeadCapturePopup({
|
|
|
9567
10138
|
});
|
|
9568
10139
|
}
|
|
9569
10140
|
}, [open, submitted]);
|
|
9570
|
-
const close =
|
|
10141
|
+
const close = React25.useCallback(() => {
|
|
9571
10142
|
setClosing(true);
|
|
9572
10143
|
setDismissed(config.dismissDays);
|
|
9573
10144
|
setTimeout(() => {
|
|
@@ -9575,7 +10146,7 @@ function LeadCapturePopup({
|
|
|
9575
10146
|
setClosing(false);
|
|
9576
10147
|
}, 250);
|
|
9577
10148
|
}, [config.dismissDays]);
|
|
9578
|
-
|
|
10149
|
+
React25.useEffect(() => {
|
|
9579
10150
|
if (!open) return;
|
|
9580
10151
|
const handler = (e) => {
|
|
9581
10152
|
if (e.key === "Escape") close();
|
|
@@ -9583,7 +10154,7 @@ function LeadCapturePopup({
|
|
|
9583
10154
|
document.addEventListener("keydown", handler);
|
|
9584
10155
|
return () => document.removeEventListener("keydown", handler);
|
|
9585
10156
|
}, [open, close]);
|
|
9586
|
-
const onOverlayClick =
|
|
10157
|
+
const onOverlayClick = React25.useCallback(
|
|
9587
10158
|
(e) => {
|
|
9588
10159
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
9589
10160
|
close();
|
|
@@ -9844,6 +10415,7 @@ exports.FilterPanel = FilterPanel;
|
|
|
9844
10415
|
exports.FloatingInput = FloatingInput;
|
|
9845
10416
|
exports.FloatingSelect = FloatingSelect;
|
|
9846
10417
|
exports.Itinerary = Itinerary;
|
|
10418
|
+
exports.ItineraryDay = ItineraryDay;
|
|
9847
10419
|
exports.LOGO_PLANETAEXO_DATA_URI = LOGO_PLANETAEXO_DATA_URI;
|
|
9848
10420
|
exports.LeadCapturePopup = LeadCapturePopup;
|
|
9849
10421
|
exports.MenuTrip = MenuTrip;
|
|
@@ -9864,14 +10436,17 @@ exports.TERMS_ACCEPT_KEY = TERMS_ACCEPT_KEY;
|
|
|
9864
10436
|
exports.TermsSection = TermsSection;
|
|
9865
10437
|
exports.ThemeToggle = ThemeToggle;
|
|
9866
10438
|
exports.Toast = Toast;
|
|
10439
|
+
exports.TransferDetailsBlock = TransferDetailsBlock;
|
|
9867
10440
|
exports.TravellerFormInviteEmail = TravellerFormInviteEmail;
|
|
9868
10441
|
exports.TripCard = TripCard;
|
|
9869
10442
|
exports.TripHeader = TripHeader;
|
|
9870
10443
|
exports.TripPage = TripPage;
|
|
10444
|
+
exports.TrustpilotEmbed = TrustpilotEmbed;
|
|
9871
10445
|
exports.buttonVariants = buttonVariants;
|
|
9872
10446
|
exports.cn = cn;
|
|
9873
10447
|
exports.emailTokens = emailTokens;
|
|
9874
10448
|
exports.getStripeAppearance = getStripeAppearance;
|
|
10449
|
+
exports.itineraryDaySpecIcons = itineraryDaySpecIcons;
|
|
9875
10450
|
exports.stripeAppearance = stripeAppearance;
|
|
9876
10451
|
exports.wrapEmailHtml = wrapEmailHtml;
|
|
9877
10452
|
//# sourceMappingURL=index.cjs.map
|