@planetaexo/design-system 0.22.2 → 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 +1132 -548
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +275 -18
- package/dist/index.d.ts +275 -18
- package/dist/index.js +1113 -533
- 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);
|
|
@@ -2801,8 +2827,15 @@ function AdventureSection({
|
|
|
2801
2827
|
] })
|
|
2802
2828
|
] }),
|
|
2803
2829
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col divide-y divide-border", children: adventure.travellers.map((t) => {
|
|
2804
|
-
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2;
|
|
2805
|
-
const canRemoveTraveller = adventure.travellers.length > 1;
|
|
2830
|
+
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2;
|
|
2831
|
+
const canRemoveTraveller = adventure.travellers.length > 1 || adventure.allowEmptyAdventure === true;
|
|
2832
|
+
const isRemovingLastTraveller = adventure.allowEmptyAdventure === true && adventure.travellers.length === 1;
|
|
2833
|
+
const confirmRemoveLastMessage = (_b2 = (_a2 = labels == null ? void 0 : labels.confirmRemoveLastTraveller) == null ? void 0 : _a2.message) != null ? _b2 : "The adventure will be empty. Continue?";
|
|
2834
|
+
const confirmIfLast = () => {
|
|
2835
|
+
if (!isRemovingLastTraveller) return true;
|
|
2836
|
+
if (typeof window === "undefined") return true;
|
|
2837
|
+
return window.confirm(confirmRemoveLastMessage);
|
|
2838
|
+
};
|
|
2806
2839
|
const disabledRemoveTitle = canRemoveTraveller ? void 0 : cannotRemoveLastTravellerLabel != null ? cannotRemoveLastTravellerLabel : "Cannot remove last traveller";
|
|
2807
2840
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2808
2841
|
"div",
|
|
@@ -2816,7 +2849,7 @@ function AdventureSection({
|
|
|
2816
2849
|
" ",
|
|
2817
2850
|
t.lastName
|
|
2818
2851
|
] }),
|
|
2819
|
-
t.isChild && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold font-heading rounded-full px-2 py-0.5 bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400 shrink-0", children: (
|
|
2852
|
+
t.isChild && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold font-heading rounded-full px-2 py-0.5 bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400 shrink-0", children: (_c2 = labels == null ? void 0 : labels.childBadge) != null ? _c2 : "Child" })
|
|
2820
2853
|
] }),
|
|
2821
2854
|
t.formUrl && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
2822
2855
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -2828,7 +2861,7 @@ function AdventureSection({
|
|
|
2828
2861
|
className: "flex items-center gap-1 text-xs text-primary hover:text-primary/80 transition-colors font-ui",
|
|
2829
2862
|
children: [
|
|
2830
2863
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLinkIcon, { className: "w-3 h-3" }),
|
|
2831
|
-
(
|
|
2864
|
+
(_d2 = labels == null ? void 0 : labels.openFormLink) != null ? _d2 : "Open"
|
|
2832
2865
|
]
|
|
2833
2866
|
}
|
|
2834
2867
|
),
|
|
@@ -2838,7 +2871,7 @@ function AdventureSection({
|
|
|
2838
2871
|
type: "button",
|
|
2839
2872
|
onClick: () => handleCopyUrl(t.formUrl),
|
|
2840
2873
|
className: "flex items-center text-xs text-muted-foreground hover:text-primary transition-colors font-ui",
|
|
2841
|
-
"aria-label": (
|
|
2874
|
+
"aria-label": (_e2 = labels == null ? void 0 : labels.copyFormUrlAria) != null ? _e2 : "Copy form URL",
|
|
2842
2875
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CopyIcon, { className: "w-3 h-3" })
|
|
2843
2876
|
}
|
|
2844
2877
|
)
|
|
@@ -2852,7 +2885,7 @@ function AdventureSection({
|
|
|
2852
2885
|
"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-bold font-heading uppercase tracking-wider shrink-0",
|
|
2853
2886
|
t.status === "completed" ? "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400" : "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400"
|
|
2854
2887
|
),
|
|
2855
|
-
children: t.status === "completed" ? (
|
|
2888
|
+
children: t.status === "completed" ? (_f2 = labels == null ? void 0 : labels.travellerStatusCompleted) != null ? _f2 : t.status : (_g2 = labels == null ? void 0 : labels.travellerStatusPending) != null ? _g2 : t.status
|
|
2856
2889
|
}
|
|
2857
2890
|
),
|
|
2858
2891
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [
|
|
@@ -2868,7 +2901,7 @@ function AdventureSection({
|
|
|
2868
2901
|
}
|
|
2869
2902
|
},
|
|
2870
2903
|
className: "flex h-8 w-8 sm:h-7 sm:w-7 items-center justify-center rounded-lg text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors",
|
|
2871
|
-
"aria-label": (
|
|
2904
|
+
"aria-label": (_i2 = (_h2 = labels == null ? void 0 : labels.editTravellerAria) == null ? void 0 : _h2.call(labels, t.firstName)) != null ? _i2 : `Edit ${t.firstName}`,
|
|
2872
2905
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PencilIcon, { className: "w-3.5 h-3.5" })
|
|
2873
2906
|
}
|
|
2874
2907
|
),
|
|
@@ -2878,6 +2911,7 @@ function AdventureSection({
|
|
|
2878
2911
|
type: "button",
|
|
2879
2912
|
onClick: () => {
|
|
2880
2913
|
if (!canRemoveTraveller) return;
|
|
2914
|
+
if (!confirmIfLast()) return;
|
|
2881
2915
|
if (onRemoveTraveller) {
|
|
2882
2916
|
onRemoveTraveller(adventure.id, t.id);
|
|
2883
2917
|
} else {
|
|
@@ -2891,7 +2925,7 @@ function AdventureSection({
|
|
|
2891
2925
|
"flex h-8 w-8 sm:h-7 sm:w-7 items-center justify-center rounded-lg text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors",
|
|
2892
2926
|
"disabled:opacity-40 disabled:cursor-not-allowed disabled:pointer-events-none disabled:hover:text-muted-foreground disabled:hover:bg-transparent"
|
|
2893
2927
|
),
|
|
2894
|
-
"aria-label": (
|
|
2928
|
+
"aria-label": (_k2 = (_j2 = labels == null ? void 0 : labels.deleteTravellerAria) == null ? void 0 : _j2.call(labels, t.firstName)) != null ? _k2 : `Delete ${t.firstName}`,
|
|
2895
2929
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2Icon, { className: "w-3.5 h-3.5" })
|
|
2896
2930
|
}
|
|
2897
2931
|
),
|
|
@@ -2901,6 +2935,7 @@ function AdventureSection({
|
|
|
2901
2935
|
type: "button",
|
|
2902
2936
|
onClick: () => {
|
|
2903
2937
|
if (!canRemoveTraveller) return;
|
|
2938
|
+
if (!confirmIfLast()) return;
|
|
2904
2939
|
if (onUnassignFromAdventure) {
|
|
2905
2940
|
onUnassignFromAdventure(adventure.id, t.id);
|
|
2906
2941
|
} else if (onRemoveTraveller) {
|
|
@@ -2916,7 +2951,7 @@ function AdventureSection({
|
|
|
2916
2951
|
"flex h-8 w-8 sm:h-7 sm:w-7 items-center justify-center rounded-lg text-muted-foreground hover:text-amber-500 hover:bg-amber-500/10 transition-colors",
|
|
2917
2952
|
"disabled:opacity-40 disabled:cursor-not-allowed disabled:pointer-events-none disabled:hover:text-muted-foreground disabled:hover:bg-transparent"
|
|
2918
2953
|
),
|
|
2919
|
-
"aria-label": (
|
|
2954
|
+
"aria-label": (_m2 = (_l2 = labels == null ? void 0 : labels.removeFromAdventureAria) == null ? void 0 : _l2.call(labels, t.firstName)) != null ? _m2 : `Remove ${t.firstName} from adventure`,
|
|
2920
2955
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserMinusIcon, { className: "w-3.5 h-3.5" })
|
|
2921
2956
|
}
|
|
2922
2957
|
)
|
|
@@ -3102,8 +3137,8 @@ function AddTravellerDialog({
|
|
|
3102
3137
|
errorMessage
|
|
3103
3138
|
}) {
|
|
3104
3139
|
var _a, _b, _c, _d, _e;
|
|
3105
|
-
const [form, setForm] =
|
|
3106
|
-
|
|
3140
|
+
const [form, setForm] = React25__namespace.useState(() => createInitialAddFormData(config));
|
|
3141
|
+
React25__namespace.useEffect(() => {
|
|
3107
3142
|
if (open) {
|
|
3108
3143
|
setForm(createInitialAddFormData(config));
|
|
3109
3144
|
}
|
|
@@ -3163,7 +3198,7 @@ function EditTravellerDialog({
|
|
|
3163
3198
|
errorMessage
|
|
3164
3199
|
}) {
|
|
3165
3200
|
var _a, _b, _c, _d, _e;
|
|
3166
|
-
const [form, setForm] =
|
|
3201
|
+
const [form, setForm] = React25__namespace.useState(() => ({
|
|
3167
3202
|
firstName: "",
|
|
3168
3203
|
lastName: "",
|
|
3169
3204
|
email: "",
|
|
@@ -3172,7 +3207,7 @@ function EditTravellerDialog({
|
|
|
3172
3207
|
birthDate: "",
|
|
3173
3208
|
personType: "ADULT"
|
|
3174
3209
|
}));
|
|
3175
|
-
|
|
3210
|
+
React25__namespace.useEffect(() => {
|
|
3176
3211
|
var _a2, _b2, _c2, _d2, _e2, _f;
|
|
3177
3212
|
if (open && traveller) {
|
|
3178
3213
|
setForm({
|
|
@@ -3452,38 +3487,38 @@ function BookingDetails({
|
|
|
3452
3487
|
const hasSubmitAddTraveller = !!onSubmitAddTraveller;
|
|
3453
3488
|
const hasSubmitEditTraveller = !!onSubmitEditTraveller;
|
|
3454
3489
|
const hasConfirmRemoveTraveller = !!onConfirmRemoveTraveller;
|
|
3455
|
-
const [addModalState, setAddModalState] =
|
|
3490
|
+
const [addModalState, setAddModalState] = React25__namespace.useState({
|
|
3456
3491
|
open: false,
|
|
3457
3492
|
adventureId: null
|
|
3458
3493
|
});
|
|
3459
|
-
const [editModalState, setEditModalState] =
|
|
3460
|
-
const [deleteModalState, setDeleteModalState] =
|
|
3461
|
-
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) => {
|
|
3462
3497
|
setAddModalState({ open: true, adventureId });
|
|
3463
3498
|
}, []);
|
|
3464
|
-
const handleRequestOpenEditModal =
|
|
3499
|
+
const handleRequestOpenEditModal = React25__namespace.useCallback(
|
|
3465
3500
|
(adventureId, traveller) => {
|
|
3466
3501
|
setEditModalState({ open: true, adventureId, traveller });
|
|
3467
3502
|
},
|
|
3468
3503
|
[]
|
|
3469
3504
|
);
|
|
3470
|
-
const handleRequestOpenDeleteModal =
|
|
3505
|
+
const handleRequestOpenDeleteModal = React25__namespace.useCallback(
|
|
3471
3506
|
(adventureId, traveller) => {
|
|
3472
3507
|
setDeleteModalState({ open: true, adventureId, traveller });
|
|
3473
3508
|
},
|
|
3474
3509
|
[]
|
|
3475
3510
|
);
|
|
3476
|
-
const closeAddModal =
|
|
3511
|
+
const closeAddModal = React25__namespace.useCallback(() => {
|
|
3477
3512
|
setAddModalState({ open: false, adventureId: null });
|
|
3478
3513
|
}, []);
|
|
3479
|
-
const closeEditModal =
|
|
3514
|
+
const closeEditModal = React25__namespace.useCallback(() => {
|
|
3480
3515
|
setEditModalState({ open: false, adventureId: null, traveller: null });
|
|
3481
3516
|
}, []);
|
|
3482
|
-
const closeDeleteModal =
|
|
3517
|
+
const closeDeleteModal = React25__namespace.useCallback(() => {
|
|
3483
3518
|
setDeleteModalState({ open: false, adventureId: null, traveller: null });
|
|
3484
3519
|
}, []);
|
|
3485
|
-
const submitInFlightRef =
|
|
3486
|
-
const handleAddSubmit =
|
|
3520
|
+
const submitInFlightRef = React25__namespace.useRef(false);
|
|
3521
|
+
const handleAddSubmit = React25__namespace.useCallback(
|
|
3487
3522
|
async (adventureId, data) => {
|
|
3488
3523
|
if (!onSubmitAddTraveller) return;
|
|
3489
3524
|
if (submitInFlightRef.current) return;
|
|
@@ -3498,7 +3533,7 @@ function BookingDetails({
|
|
|
3498
3533
|
},
|
|
3499
3534
|
[onSubmitAddTraveller, closeAddModal]
|
|
3500
3535
|
);
|
|
3501
|
-
const handleEditSubmit =
|
|
3536
|
+
const handleEditSubmit = React25__namespace.useCallback(
|
|
3502
3537
|
async (adventureId, travellerId, data) => {
|
|
3503
3538
|
if (!onSubmitEditTraveller) return;
|
|
3504
3539
|
if (submitInFlightRef.current) return;
|
|
@@ -3513,7 +3548,7 @@ function BookingDetails({
|
|
|
3513
3548
|
},
|
|
3514
3549
|
[onSubmitEditTraveller, closeEditModal]
|
|
3515
3550
|
);
|
|
3516
|
-
const handleDeleteConfirm =
|
|
3551
|
+
const handleDeleteConfirm = React25__namespace.useCallback(
|
|
3517
3552
|
async (adventureId, travellerId) => {
|
|
3518
3553
|
if (!onConfirmRemoveTraveller) return;
|
|
3519
3554
|
if (submitInFlightRef.current) return;
|
|
@@ -4243,7 +4278,7 @@ function BookingConfirmationEmail({
|
|
|
4243
4278
|
}, children: i + 1 }) }),
|
|
4244
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 }) })
|
|
4245
4280
|
] }) }) }, i)) }),
|
|
4246
|
-
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: [
|
|
4247
4282
|
idx === 0 ? /* @__PURE__ */ jsxRuntime.jsx("strong", { children: line }) : line,
|
|
4248
4283
|
idx < arr.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
|
|
4249
4284
|
] }, idx)) })
|
|
@@ -4696,11 +4731,11 @@ function DatePickerField({
|
|
|
4696
4731
|
fromDate,
|
|
4697
4732
|
className
|
|
4698
4733
|
}) {
|
|
4699
|
-
const [open, setOpen] =
|
|
4700
|
-
const containerRef =
|
|
4701
|
-
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();
|
|
4702
4737
|
const hasValue = !!value;
|
|
4703
|
-
|
|
4738
|
+
React25__namespace.useEffect(() => {
|
|
4704
4739
|
if (!containerRef.current) return;
|
|
4705
4740
|
const observer = new ResizeObserver(([entry]) => {
|
|
4706
4741
|
setCalendarWidth(entry.contentRect.width);
|
|
@@ -4809,7 +4844,7 @@ function BookingForm({
|
|
|
4809
4844
|
subtitle = "Free enquiry \u2013 no commitment",
|
|
4810
4845
|
className
|
|
4811
4846
|
}) {
|
|
4812
|
-
const [values, setValues] =
|
|
4847
|
+
const [values, setValues] = React25__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
|
|
4813
4848
|
const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
|
|
4814
4849
|
const handleSubmit = (e) => {
|
|
4815
4850
|
e.preventDefault();
|
|
@@ -5346,11 +5381,11 @@ function FloatingTextarea({
|
|
|
5346
5381
|
}
|
|
5347
5382
|
function SelectField({ field, value, onChange, error, disabled }) {
|
|
5348
5383
|
var _a, _b, _c;
|
|
5349
|
-
const [open, setOpen] =
|
|
5350
|
-
const containerRef =
|
|
5384
|
+
const [open, setOpen] = React25__namespace.useState(false);
|
|
5385
|
+
const containerRef = React25__namespace.useRef(null);
|
|
5351
5386
|
const options = (_a = field.options) != null ? _a : [];
|
|
5352
5387
|
const selectedOpt = (_b = options.find((o) => o.value === value)) != null ? _b : null;
|
|
5353
|
-
|
|
5388
|
+
React25__namespace.useEffect(() => {
|
|
5354
5389
|
if (!open) return;
|
|
5355
5390
|
const handleOutside = (e) => {
|
|
5356
5391
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -5739,11 +5774,11 @@ function RegistrationForm({
|
|
|
5739
5774
|
readOnly = false
|
|
5740
5775
|
}) {
|
|
5741
5776
|
var _a;
|
|
5742
|
-
const L =
|
|
5777
|
+
const L = React25__namespace.useMemo(
|
|
5743
5778
|
() => __spreadValues(__spreadValues({}, DEFAULT_LABELS4), labels != null ? labels : {}),
|
|
5744
5779
|
[labels]
|
|
5745
5780
|
);
|
|
5746
|
-
const sortedFields =
|
|
5781
|
+
const sortedFields = React25__namespace.useMemo(
|
|
5747
5782
|
() => [...fields].sort((a, b) => {
|
|
5748
5783
|
var _a2, _b;
|
|
5749
5784
|
return ((_a2 = a.order) != null ? _a2 : 0) - ((_b = b.order) != null ? _b : 0);
|
|
@@ -5751,7 +5786,7 @@ function RegistrationForm({
|
|
|
5751
5786
|
[fields]
|
|
5752
5787
|
);
|
|
5753
5788
|
const isControlled = values !== void 0;
|
|
5754
|
-
const [internal, setInternal] =
|
|
5789
|
+
const [internal, setInternal] = React25__namespace.useState(
|
|
5755
5790
|
() => initializeValues(
|
|
5756
5791
|
sortedFields,
|
|
5757
5792
|
defaultValues != null ? defaultValues : {},
|
|
@@ -5759,9 +5794,9 @@ function RegistrationForm({
|
|
|
5759
5794
|
includeTerms
|
|
5760
5795
|
)
|
|
5761
5796
|
);
|
|
5762
|
-
const [submitAttempted, setSubmitAttempted] =
|
|
5763
|
-
const [validationErrors, setValidationErrors] =
|
|
5764
|
-
|
|
5797
|
+
const [submitAttempted, setSubmitAttempted] = React25__namespace.useState(false);
|
|
5798
|
+
const [validationErrors, setValidationErrors] = React25__namespace.useState({});
|
|
5799
|
+
React25__namespace.useEffect(() => {
|
|
5765
5800
|
if (isControlled) return;
|
|
5766
5801
|
setInternal((prev) => {
|
|
5767
5802
|
const next = initializeValues(
|
|
@@ -5818,7 +5853,7 @@ function RegistrationForm({
|
|
|
5818
5853
|
const termsError = submitAttempted && termsEnabled && !termsAccepted;
|
|
5819
5854
|
const firstErrorFieldId = Object.keys(fieldErrors)[0];
|
|
5820
5855
|
const scrollTargetId = firstErrorFieldId ? `rf-${firstErrorFieldId}` : termsError ? "rf-terms" : null;
|
|
5821
|
-
|
|
5856
|
+
React25__namespace.useEffect(() => {
|
|
5822
5857
|
if (!submitAttempted || !scrollTargetId) return;
|
|
5823
5858
|
const timer = setTimeout(() => {
|
|
5824
5859
|
const elem = document.getElementById(scrollTargetId);
|
|
@@ -6280,10 +6315,10 @@ var OTPCodeInput = ({
|
|
|
6280
6315
|
id,
|
|
6281
6316
|
required
|
|
6282
6317
|
}) => {
|
|
6283
|
-
const baseId = id != null ? id :
|
|
6284
|
-
const inputRef =
|
|
6285
|
-
const [focused, setFocused] =
|
|
6286
|
-
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(() => {
|
|
6287
6322
|
const arr = value.split("").slice(0, length);
|
|
6288
6323
|
while (arr.length < length) arr.push("");
|
|
6289
6324
|
return arr;
|
|
@@ -6399,7 +6434,7 @@ function Checkbox(_a) {
|
|
|
6399
6434
|
})
|
|
6400
6435
|
);
|
|
6401
6436
|
}
|
|
6402
|
-
var AccordionVariantContext =
|
|
6437
|
+
var AccordionVariantContext = React25__namespace.createContext("default");
|
|
6403
6438
|
function Accordion(_a) {
|
|
6404
6439
|
var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
|
|
6405
6440
|
return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -6417,7 +6452,7 @@ function Accordion(_a) {
|
|
|
6417
6452
|
}
|
|
6418
6453
|
function AccordionItem(_a) {
|
|
6419
6454
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
6420
|
-
const variant =
|
|
6455
|
+
const variant = React25__namespace.useContext(AccordionVariantContext);
|
|
6421
6456
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6422
6457
|
accordion.Accordion.Item,
|
|
6423
6458
|
__spreadValues({
|
|
@@ -6438,7 +6473,7 @@ function AccordionTrigger(_a) {
|
|
|
6438
6473
|
"className",
|
|
6439
6474
|
"children"
|
|
6440
6475
|
]);
|
|
6441
|
-
const variant =
|
|
6476
|
+
const variant = React25__namespace.useContext(AccordionVariantContext);
|
|
6442
6477
|
return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6443
6478
|
accordion.Accordion.Trigger,
|
|
6444
6479
|
__spreadProps(__spreadValues({
|
|
@@ -6492,7 +6527,7 @@ function AccordionContent(_a) {
|
|
|
6492
6527
|
"className",
|
|
6493
6528
|
"children"
|
|
6494
6529
|
]);
|
|
6495
|
-
const variant =
|
|
6530
|
+
const variant = React25__namespace.useContext(AccordionVariantContext);
|
|
6496
6531
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6497
6532
|
accordion.Accordion.Panel,
|
|
6498
6533
|
__spreadProps(__spreadValues({
|
|
@@ -6524,7 +6559,7 @@ function FilterPanel({
|
|
|
6524
6559
|
title = "Filters",
|
|
6525
6560
|
className
|
|
6526
6561
|
}) {
|
|
6527
|
-
const [internalValue, setInternalValue] =
|
|
6562
|
+
const [internalValue, setInternalValue] = React25__namespace.useState(
|
|
6528
6563
|
() => Object.fromEntries(groups.map((g) => [g.id, []]))
|
|
6529
6564
|
);
|
|
6530
6565
|
const selected = value != null ? value : internalValue;
|
|
@@ -6620,6 +6655,76 @@ function FilterPanel({
|
|
|
6620
6655
|
)
|
|
6621
6656
|
] });
|
|
6622
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
|
+
}
|
|
6623
6728
|
function ItineraryDayCard({
|
|
6624
6729
|
stop,
|
|
6625
6730
|
onOpen
|
|
@@ -6686,11 +6791,11 @@ function ItineraryModal({
|
|
|
6686
6791
|
onNext
|
|
6687
6792
|
}) {
|
|
6688
6793
|
var _a, _b, _c;
|
|
6689
|
-
const [imgIndex, setImgIndex] =
|
|
6794
|
+
const [imgIndex, setImgIndex] = React25__namespace.useState(0);
|
|
6690
6795
|
const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
|
|
6691
6796
|
const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
|
|
6692
6797
|
const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
|
|
6693
|
-
|
|
6798
|
+
React25__namespace.useEffect(() => {
|
|
6694
6799
|
setImgIndex(0);
|
|
6695
6800
|
}, [stop == null ? void 0 : stop.dayNumber]);
|
|
6696
6801
|
if (!stop) return null;
|
|
@@ -6817,8 +6922,8 @@ function ItineraryModal({
|
|
|
6817
6922
|
) });
|
|
6818
6923
|
}
|
|
6819
6924
|
function Itinerary({ title, subtitle, stops, className }) {
|
|
6820
|
-
const [activeIndex, setActiveIndex] =
|
|
6821
|
-
const scrollRef =
|
|
6925
|
+
const [activeIndex, setActiveIndex] = React25__namespace.useState(null);
|
|
6926
|
+
const scrollRef = React25__namespace.useRef(null);
|
|
6822
6927
|
const activeStop = activeIndex !== null ? stops[activeIndex] : null;
|
|
6823
6928
|
const scrollBy = (dir) => {
|
|
6824
6929
|
if (!scrollRef.current) return;
|
|
@@ -6896,147 +7001,6 @@ function Itinerary({ title, subtitle, stops, className }) {
|
|
|
6896
7001
|
)
|
|
6897
7002
|
] });
|
|
6898
7003
|
}
|
|
6899
|
-
function MenuTrip({
|
|
6900
|
-
sections,
|
|
6901
|
-
activeSection,
|
|
6902
|
-
onSelect,
|
|
6903
|
-
variant = "pill",
|
|
6904
|
-
bold = true,
|
|
6905
|
-
className
|
|
6906
|
-
}) {
|
|
6907
|
-
const scrollRef = React23__namespace.useRef(null);
|
|
6908
|
-
React23__namespace.useEffect(() => {
|
|
6909
|
-
if (!scrollRef.current || !activeSection) return;
|
|
6910
|
-
const container = scrollRef.current;
|
|
6911
|
-
const btn = container.querySelector(
|
|
6912
|
-
`[data-section="${activeSection}"]`
|
|
6913
|
-
);
|
|
6914
|
-
if (!btn) return;
|
|
6915
|
-
const btnLeft = btn.offsetLeft;
|
|
6916
|
-
const btnRight = btnLeft + btn.offsetWidth;
|
|
6917
|
-
const cLeft = container.scrollLeft;
|
|
6918
|
-
const cRight = cLeft + container.offsetWidth;
|
|
6919
|
-
if (btnLeft < cLeft) {
|
|
6920
|
-
container.scrollTo({ left: btnLeft - 16, behavior: "smooth" });
|
|
6921
|
-
} else if (btnRight > cRight) {
|
|
6922
|
-
container.scrollTo({ left: btnRight - container.offsetWidth + 16, behavior: "smooth" });
|
|
6923
|
-
}
|
|
6924
|
-
}, [activeSection]);
|
|
6925
|
-
if (variant === "underline") {
|
|
6926
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6927
|
-
"div",
|
|
6928
|
-
{
|
|
6929
|
-
ref: scrollRef,
|
|
6930
|
-
className: cn(
|
|
6931
|
-
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
6932
|
-
"border-b border-border",
|
|
6933
|
-
className
|
|
6934
|
-
),
|
|
6935
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-end gap-0", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
6936
|
-
"button",
|
|
6937
|
-
{
|
|
6938
|
-
"data-section": s.id,
|
|
6939
|
-
type: "button",
|
|
6940
|
-
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
6941
|
-
className: cn(
|
|
6942
|
-
"relative px-4 py-2.5 text-sm font-ui whitespace-nowrap transition-colors duration-150",
|
|
6943
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
|
|
6944
|
-
"after:absolute after:inset-x-0 after:bottom-0 after:h-0.5 after:rounded-full after:transition-all",
|
|
6945
|
-
bold ? "font-semibold" : "font-normal",
|
|
6946
|
-
activeSection === s.id ? "text-foreground after:bg-primary" : "text-muted-foreground hover:text-foreground after:bg-transparent"
|
|
6947
|
-
),
|
|
6948
|
-
children: s.label
|
|
6949
|
-
},
|
|
6950
|
-
s.id
|
|
6951
|
-
)) })
|
|
6952
|
-
}
|
|
6953
|
-
);
|
|
6954
|
-
}
|
|
6955
|
-
if (variant === "outlined") {
|
|
6956
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6957
|
-
"div",
|
|
6958
|
-
{
|
|
6959
|
-
ref: scrollRef,
|
|
6960
|
-
className: cn(
|
|
6961
|
-
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
6962
|
-
className
|
|
6963
|
-
),
|
|
6964
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-2", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
6965
|
-
"button",
|
|
6966
|
-
{
|
|
6967
|
-
"data-section": s.id,
|
|
6968
|
-
type: "button",
|
|
6969
|
-
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
6970
|
-
className: cn(
|
|
6971
|
-
"rounded-full border px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
6972
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
6973
|
-
bold ? "font-semibold" : "font-normal",
|
|
6974
|
-
activeSection === s.id ? "border-foreground bg-foreground text-background" : "border-border bg-background text-muted-foreground hover:border-foreground/50 hover:text-foreground"
|
|
6975
|
-
),
|
|
6976
|
-
children: s.label
|
|
6977
|
-
},
|
|
6978
|
-
s.id
|
|
6979
|
-
)) })
|
|
6980
|
-
}
|
|
6981
|
-
);
|
|
6982
|
-
}
|
|
6983
|
-
if (variant === "floating") {
|
|
6984
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6985
|
-
"div",
|
|
6986
|
-
{
|
|
6987
|
-
ref: scrollRef,
|
|
6988
|
-
className: cn(
|
|
6989
|
-
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
6990
|
-
"py-1 px-0.5",
|
|
6991
|
-
/* padding so shadow isn't clipped by overflow */
|
|
6992
|
-
className
|
|
6993
|
-
),
|
|
6994
|
-
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(
|
|
6995
|
-
"button",
|
|
6996
|
-
{
|
|
6997
|
-
"data-section": s.id,
|
|
6998
|
-
type: "button",
|
|
6999
|
-
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
7000
|
-
className: cn(
|
|
7001
|
-
"rounded-full px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
7002
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7003
|
-
bold ? "font-semibold" : "font-normal",
|
|
7004
|
-
activeSection === s.id ? "bg-foreground text-background shadow-sm" : "text-foreground/60 hover:text-foreground hover:bg-muted/60"
|
|
7005
|
-
),
|
|
7006
|
-
children: s.label
|
|
7007
|
-
},
|
|
7008
|
-
s.id
|
|
7009
|
-
)) })
|
|
7010
|
-
}
|
|
7011
|
-
);
|
|
7012
|
-
}
|
|
7013
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7014
|
-
"div",
|
|
7015
|
-
{
|
|
7016
|
-
ref: scrollRef,
|
|
7017
|
-
className: cn(
|
|
7018
|
-
"overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
|
|
7019
|
-
className
|
|
7020
|
-
),
|
|
7021
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-1 p-1", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7022
|
-
"button",
|
|
7023
|
-
{
|
|
7024
|
-
"data-section": s.id,
|
|
7025
|
-
type: "button",
|
|
7026
|
-
onClick: () => onSelect == null ? void 0 : onSelect(s.id),
|
|
7027
|
-
className: cn(
|
|
7028
|
-
"rounded-full px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
|
|
7029
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7030
|
-
bold ? "font-semibold" : "font-normal",
|
|
7031
|
-
activeSection === s.id ? "bg-foreground text-background shadow-sm" : "bg-white text-foreground/70 hover:text-foreground shadow-sm"
|
|
7032
|
-
),
|
|
7033
|
-
children: s.label
|
|
7034
|
-
},
|
|
7035
|
-
s.id
|
|
7036
|
-
)) })
|
|
7037
|
-
}
|
|
7038
|
-
);
|
|
7039
|
-
}
|
|
7040
7004
|
function normalise(p) {
|
|
7041
7005
|
return typeof p === "string" ? { src: p } : p;
|
|
7042
7006
|
}
|
|
@@ -7051,18 +7015,18 @@ function Lightbox({
|
|
|
7051
7015
|
onClose
|
|
7052
7016
|
}) {
|
|
7053
7017
|
var _a;
|
|
7054
|
-
const [index, setIndex] =
|
|
7018
|
+
const [index, setIndex] = React25__namespace.useState(initialIndex);
|
|
7055
7019
|
const total = photos.length;
|
|
7056
7020
|
const photo = photos[index];
|
|
7057
|
-
const prev =
|
|
7021
|
+
const prev = React25__namespace.useCallback(
|
|
7058
7022
|
() => setIndex((i) => (i - 1 + total) % total),
|
|
7059
7023
|
[total]
|
|
7060
7024
|
);
|
|
7061
|
-
const next =
|
|
7025
|
+
const next = React25__namespace.useCallback(
|
|
7062
7026
|
() => setIndex((i) => (i + 1) % total),
|
|
7063
7027
|
[total]
|
|
7064
7028
|
);
|
|
7065
|
-
|
|
7029
|
+
React25__namespace.useEffect(() => {
|
|
7066
7030
|
const onKey = (e) => {
|
|
7067
7031
|
if (e.key === "Escape") onClose();
|
|
7068
7032
|
if (e.key === "ArrowLeft") prev();
|
|
@@ -7136,55 +7100,27 @@ function Lightbox({
|
|
|
7136
7100
|
]
|
|
7137
7101
|
}
|
|
7138
7102
|
),
|
|
7139
|
-
total > 1 && /* @__PURE__ */ jsxRuntime.
|
|
7103
|
+
total > 1 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7140
7104
|
"div",
|
|
7141
7105
|
{
|
|
7142
|
-
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",
|
|
7143
7107
|
onClick: (e) => e.stopPropagation(),
|
|
7144
|
-
children:
|
|
7145
|
-
|
|
7146
|
-
|
|
7147
|
-
|
|
7148
|
-
|
|
7149
|
-
|
|
7150
|
-
|
|
7151
|
-
prev();
|
|
7152
|
-
},
|
|
7153
|
-
className: "flex h-9 w-9 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",
|
|
7154
|
-
"aria-label": "Previous photo",
|
|
7155
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-4 w-4" })
|
|
7156
|
-
}
|
|
7157
|
-
),
|
|
7158
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5", children: photos.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7159
|
-
"button",
|
|
7160
|
-
{
|
|
7161
|
-
type: "button",
|
|
7162
|
-
onClick: (e) => {
|
|
7163
|
-
e.stopPropagation();
|
|
7164
|
-
setIndex(i);
|
|
7165
|
-
},
|
|
7166
|
-
"aria-label": `Go to photo ${i + 1}`,
|
|
7167
|
-
className: cn(
|
|
7168
|
-
"h-1.5 rounded-full transition-all duration-300 focus-visible:outline-none",
|
|
7169
|
-
i === index ? "w-6 bg-primary" : "w-1.5 bg-white/40 hover:bg-white/70"
|
|
7170
|
-
)
|
|
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);
|
|
7171
7115
|
},
|
|
7172
|
-
i
|
|
7173
|
-
|
|
7174
|
-
|
|
7175
|
-
|
|
7176
|
-
|
|
7177
|
-
|
|
7178
|
-
|
|
7179
|
-
|
|
7180
|
-
next();
|
|
7181
|
-
},
|
|
7182
|
-
className: "flex h-9 w-9 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",
|
|
7183
|
-
"aria-label": "Next photo",
|
|
7184
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-4 w-4" })
|
|
7185
|
-
}
|
|
7186
|
-
)
|
|
7187
|
-
]
|
|
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
|
+
)) })
|
|
7188
7124
|
}
|
|
7189
7125
|
)
|
|
7190
7126
|
]
|
|
@@ -7256,7 +7192,7 @@ function GridGallery({
|
|
|
7256
7192
|
initialVisible,
|
|
7257
7193
|
onOpen
|
|
7258
7194
|
}) {
|
|
7259
|
-
const [expanded, setExpanded] =
|
|
7195
|
+
const [expanded, setExpanded] = React25__namespace.useState(false);
|
|
7260
7196
|
const cols = gridCols(photos.length);
|
|
7261
7197
|
const hasMore = photos.length > initialVisible;
|
|
7262
7198
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
@@ -7286,7 +7222,7 @@ function MasonryGallery({
|
|
|
7286
7222
|
initialVisible,
|
|
7287
7223
|
onOpen
|
|
7288
7224
|
}) {
|
|
7289
|
-
const [expanded, setExpanded] =
|
|
7225
|
+
const [expanded, setExpanded] = React25__namespace.useState(false);
|
|
7290
7226
|
const hasMore = photos.length > initialVisible;
|
|
7291
7227
|
const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
|
|
7292
7228
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -7359,7 +7295,7 @@ function FeaturedGallery({
|
|
|
7359
7295
|
photos,
|
|
7360
7296
|
onOpen
|
|
7361
7297
|
}) {
|
|
7362
|
-
const [expanded, setExpanded] =
|
|
7298
|
+
const [expanded, setExpanded] = React25__namespace.useState(false);
|
|
7363
7299
|
const featured = photos.slice(0, 3);
|
|
7364
7300
|
const extra = photos.slice(3);
|
|
7365
7301
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -7429,66 +7365,386 @@ function FeaturedGallery({
|
|
|
7429
7365
|
)
|
|
7430
7366
|
] });
|
|
7431
7367
|
}
|
|
7432
|
-
function
|
|
7368
|
+
function CarouselGallery({
|
|
7433
7369
|
photos,
|
|
7434
|
-
|
|
7435
|
-
|
|
7436
|
-
|
|
7370
|
+
index,
|
|
7371
|
+
onIndexChange,
|
|
7372
|
+
onOpen,
|
|
7437
7373
|
className
|
|
7438
7374
|
}) {
|
|
7439
|
-
|
|
7440
|
-
const
|
|
7441
|
-
const
|
|
7442
|
-
|
|
7443
|
-
|
|
7444
|
-
|
|
7445
|
-
|
|
7446
|
-
|
|
7447
|
-
|
|
7448
|
-
|
|
7449
|
-
|
|
7450
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
7492
7748
|
);
|
|
7493
7749
|
function Badge(_a) {
|
|
7494
7750
|
var _b = _a, {
|
|
@@ -7520,34 +7776,124 @@ function PricingTrip({
|
|
|
7520
7776
|
currency = "CHF",
|
|
7521
7777
|
season,
|
|
7522
7778
|
departureTimes,
|
|
7523
|
-
pricingOptions,
|
|
7524
7779
|
onBook,
|
|
7525
7780
|
bookLabel = "Check availability",
|
|
7526
7781
|
variant = "card",
|
|
7782
|
+
sharp = false,
|
|
7783
|
+
belowPrice,
|
|
7784
|
+
benefits,
|
|
7785
|
+
currencyEstimates,
|
|
7786
|
+
priceInfo,
|
|
7527
7787
|
className
|
|
7528
7788
|
}) {
|
|
7529
|
-
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);
|
|
7530
7792
|
if (variant === "compact") {
|
|
7531
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex
|
|
7532
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
7533
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7534
|
-
|
|
7535
|
-
|
|
7536
|
-
|
|
7537
|
-
|
|
7538
|
-
|
|
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
|
+
)
|
|
7539
7842
|
] }),
|
|
7540
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7541
|
-
"
|
|
7843
|
+
showPriceInfo && (priceInfo || currencyEstimates && currencyEstimates.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7844
|
+
"div",
|
|
7542
7845
|
{
|
|
7543
|
-
type: "button",
|
|
7544
|
-
onClick: onBook,
|
|
7545
7846
|
className: cn(
|
|
7546
|
-
"
|
|
7547
|
-
"
|
|
7548
|
-
"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"
|
|
7549
7849
|
),
|
|
7550
|
-
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
|
+
]
|
|
7551
7897
|
}
|
|
7552
7898
|
)
|
|
7553
7899
|
] });
|
|
@@ -7557,7 +7903,8 @@ function PricingTrip({
|
|
|
7557
7903
|
"div",
|
|
7558
7904
|
{
|
|
7559
7905
|
className: cn(
|
|
7560
|
-
"flex items-center gap-4
|
|
7906
|
+
"flex items-center gap-4 border border-border bg-card px-5 py-3 shadow-sm",
|
|
7907
|
+
rOuter,
|
|
7561
7908
|
className
|
|
7562
7909
|
),
|
|
7563
7910
|
children: [
|
|
@@ -7601,67 +7948,103 @@ function PricingTrip({
|
|
|
7601
7948
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
|
|
7602
7949
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
7603
7950
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: "From" }),
|
|
7604
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-
|
|
7605
|
-
|
|
7606
|
-
|
|
7607
|
-
|
|
7608
|
-
|
|
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
|
+
)
|
|
7609
7982
|
] })
|
|
7610
7983
|
] }),
|
|
7611
|
-
|
|
7612
|
-
|
|
7613
|
-
|
|
7614
|
-
|
|
7615
|
-
|
|
7616
|
-
|
|
7617
|
-
|
|
7618
|
-
|
|
7619
|
-
|
|
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: [
|
|
7620
8009
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7621
8010
|
"button",
|
|
7622
8011
|
{
|
|
7623
8012
|
type: "button",
|
|
7624
|
-
onClick: () =>
|
|
8013
|
+
onClick: () => setShowEstimates((v) => !v),
|
|
7625
8014
|
className: "flex items-center gap-1 text-xs text-primary font-ui text-left hover:underline underline-offset-2",
|
|
7626
|
-
children:
|
|
7627
|
-
"
|
|
8015
|
+
children: showEstimates ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
8016
|
+
"Hide estimates in other currencies ",
|
|
7628
8017
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-3 w-3" })
|
|
7629
8018
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7630
|
-
"Show
|
|
8019
|
+
"Show estimates in other currencies ",
|
|
7631
8020
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-3 w-3" })
|
|
7632
8021
|
] })
|
|
7633
8022
|
}
|
|
7634
8023
|
),
|
|
7635
|
-
|
|
7636
|
-
|
|
7637
|
-
|
|
7638
|
-
|
|
7639
|
-
|
|
7640
|
-
|
|
7641
|
-
|
|
7642
|
-
|
|
7643
|
-
|
|
7644
|
-
|
|
7645
|
-
|
|
7646
|
-
|
|
7647
|
-
|
|
7648
|
-
opt.originalPrice
|
|
7649
|
-
] }),
|
|
7650
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-bold text-foreground font-ui", children: [
|
|
7651
|
-
currency,
|
|
7652
|
-
" ",
|
|
7653
|
-
opt.price,
|
|
7654
|
-
opt.unit && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-normal text-muted-foreground", children: [
|
|
7655
|
-
" ",
|
|
7656
|
-
"/ ",
|
|
7657
|
-
opt.unit
|
|
7658
|
-
] })
|
|
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
|
|
7659
8037
|
] })
|
|
7660
|
-
]
|
|
7661
|
-
|
|
7662
|
-
|
|
7663
|
-
|
|
7664
|
-
|
|
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
|
+
] })
|
|
7665
8048
|
] }),
|
|
7666
8049
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7667
8050
|
"button",
|
|
@@ -7849,14 +8232,14 @@ function SiteHeader({
|
|
|
7849
8232
|
className
|
|
7850
8233
|
}) {
|
|
7851
8234
|
const t = VARIANT[variant];
|
|
7852
|
-
const [openMenu, setOpenMenu] =
|
|
7853
|
-
const [langOpen, setLangOpen] =
|
|
7854
|
-
const [mobileOpen, setMobileOpen] =
|
|
7855
|
-
const [openMobileSection, setOpenMobileSection] =
|
|
7856
|
-
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);
|
|
7857
8240
|
const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
|
|
7858
|
-
const menuCloseTimer =
|
|
7859
|
-
const langCloseTimer =
|
|
8241
|
+
const menuCloseTimer = React25__namespace.useRef(void 0);
|
|
8242
|
+
const langCloseTimer = React25__namespace.useRef(void 0);
|
|
7860
8243
|
const handleMenuEnter = (label) => {
|
|
7861
8244
|
clearTimeout(menuCloseTimer.current);
|
|
7862
8245
|
setOpenMenu(label);
|
|
@@ -7877,7 +8260,7 @@ function SiteHeader({
|
|
|
7877
8260
|
setOpenMenu(null);
|
|
7878
8261
|
setLangOpen(false);
|
|
7879
8262
|
};
|
|
7880
|
-
|
|
8263
|
+
React25__namespace.useEffect(() => () => {
|
|
7881
8264
|
clearTimeout(menuCloseTimer.current);
|
|
7882
8265
|
clearTimeout(langCloseTimer.current);
|
|
7883
8266
|
}, []);
|
|
@@ -8142,7 +8525,7 @@ function SiteHeader({
|
|
|
8142
8525
|
), children: [
|
|
8143
8526
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
|
|
8144
8527
|
const isActive = lang.code === activeLang;
|
|
8145
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8528
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React25__namespace.Fragment, { children: [
|
|
8146
8529
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
|
|
8147
8530
|
"text-xs select-none",
|
|
8148
8531
|
variant === "white" ? "text-border" : "text-white/15"
|
|
@@ -8204,8 +8587,8 @@ function SiteHeader({
|
|
|
8204
8587
|
);
|
|
8205
8588
|
}
|
|
8206
8589
|
function ThemeToggle({ className }) {
|
|
8207
|
-
const [dark, setDark] =
|
|
8208
|
-
|
|
8590
|
+
const [dark, setDark] = React25__namespace.useState(false);
|
|
8591
|
+
React25__namespace.useEffect(() => {
|
|
8209
8592
|
const saved = localStorage.getItem("theme");
|
|
8210
8593
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
8211
8594
|
const isDark = saved === "dark" || !saved && prefersDark;
|
|
@@ -8356,7 +8739,7 @@ function TripCard({
|
|
|
8356
8739
|
);
|
|
8357
8740
|
}
|
|
8358
8741
|
function useHlsVideo(videoRef, src) {
|
|
8359
|
-
|
|
8742
|
+
React25__namespace.useEffect(() => {
|
|
8360
8743
|
if (!src || !videoRef.current) return;
|
|
8361
8744
|
const video = videoRef.current;
|
|
8362
8745
|
if (!src.includes(".m3u8")) return;
|
|
@@ -8393,16 +8776,17 @@ function TripHeader({
|
|
|
8393
8776
|
destination,
|
|
8394
8777
|
duration,
|
|
8395
8778
|
tagline,
|
|
8779
|
+
belowMeta,
|
|
8396
8780
|
siteHeader,
|
|
8397
8781
|
uiVariant = "v1",
|
|
8398
8782
|
className
|
|
8399
8783
|
}) {
|
|
8400
8784
|
var _a;
|
|
8401
|
-
const [heroIndex, setHeroIndex] =
|
|
8402
|
-
const [videoReady, setVideoReady] =
|
|
8403
|
-
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);
|
|
8404
8788
|
const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
|
|
8405
|
-
const validImages =
|
|
8789
|
+
const validImages = React25__namespace.useMemo(
|
|
8406
8790
|
() => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
|
|
8407
8791
|
[images]
|
|
8408
8792
|
);
|
|
@@ -8417,7 +8801,7 @@ function TripHeader({
|
|
|
8417
8801
|
const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
|
|
8418
8802
|
const hasMeta = !!(destination || duration);
|
|
8419
8803
|
useHlsVideo(videoRef, isHls ? videoUrl : void 0);
|
|
8420
|
-
|
|
8804
|
+
React25__namespace.useEffect(() => {
|
|
8421
8805
|
if (!videoUrl) return;
|
|
8422
8806
|
const el = videoRef.current;
|
|
8423
8807
|
if (!el) return;
|
|
@@ -8559,7 +8943,7 @@ function TripHeader({
|
|
|
8559
8943
|
siteHeader ? "-mt-44" : "-mt-36"
|
|
8560
8944
|
),
|
|
8561
8945
|
children: [
|
|
8562
|
-
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: [
|
|
8563
8947
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
|
|
8564
8948
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
|
|
8565
8949
|
] }, i)) }),
|
|
@@ -8584,7 +8968,8 @@ function TripHeader({
|
|
|
8584
8968
|
duration.days === 1 ? "dia" : "dias"
|
|
8585
8969
|
] })
|
|
8586
8970
|
] })
|
|
8587
|
-
] }) : 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 })
|
|
8588
8973
|
]
|
|
8589
8974
|
}
|
|
8590
8975
|
) })
|
|
@@ -8617,12 +9002,12 @@ function ItineraryTimeline({ steps }) {
|
|
|
8617
9002
|
] }),
|
|
8618
9003
|
step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: "Transfer" })
|
|
8619
9004
|
] }),
|
|
8620
|
-
/* @__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 })
|
|
8621
9006
|
] })
|
|
8622
9007
|
] }, i)) });
|
|
8623
9008
|
}
|
|
8624
9009
|
function Checklist({ items, icon }) {
|
|
8625
|
-
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: [
|
|
8626
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" }) }),
|
|
8627
9012
|
item
|
|
8628
9013
|
] }, i)) });
|
|
@@ -8637,21 +9022,36 @@ function TripPage({
|
|
|
8637
9022
|
breadcrumb,
|
|
8638
9023
|
highlights,
|
|
8639
9024
|
infoGroups,
|
|
9025
|
+
keyInfo,
|
|
8640
9026
|
recommendedFor,
|
|
8641
9027
|
overview,
|
|
9028
|
+
overviewHighlights,
|
|
8642
9029
|
itinerary,
|
|
9030
|
+
itineraryDays,
|
|
8643
9031
|
gallery,
|
|
8644
9032
|
included,
|
|
9033
|
+
notIncluded,
|
|
8645
9034
|
whatToBring,
|
|
8646
9035
|
weather,
|
|
9036
|
+
optionalExtras,
|
|
9037
|
+
accommodation,
|
|
9038
|
+
food,
|
|
9039
|
+
termsAndConditions,
|
|
8647
9040
|
meetingPoints,
|
|
9041
|
+
meetingPoint,
|
|
8648
9042
|
faqs,
|
|
9043
|
+
sectionIcons,
|
|
8649
9044
|
reviews,
|
|
9045
|
+
trustpilot,
|
|
9046
|
+
trustpilotMini,
|
|
9047
|
+
trustpilotHero,
|
|
8650
9048
|
priceFrom,
|
|
8651
9049
|
currency = "CHF",
|
|
8652
9050
|
season,
|
|
8653
9051
|
departureTimes,
|
|
8654
|
-
|
|
9052
|
+
benefits,
|
|
9053
|
+
currencyEstimates,
|
|
9054
|
+
priceInfo,
|
|
8655
9055
|
onBook,
|
|
8656
9056
|
bookLabel,
|
|
8657
9057
|
siteHeader,
|
|
@@ -8659,34 +9059,51 @@ function TripPage({
|
|
|
8659
9059
|
features,
|
|
8660
9060
|
className
|
|
8661
9061
|
}) {
|
|
8662
|
-
const [activeSection, setActiveSection] =
|
|
8663
|
-
const [
|
|
8664
|
-
const
|
|
8665
|
-
|
|
8666
|
-
|
|
8667
|
-
|
|
8668
|
-
|
|
8669
|
-
|
|
8670
|
-
|
|
8671
|
-
|
|
8672
|
-
|
|
8673
|
-
|
|
8674
|
-
|
|
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(
|
|
8675
9089
|
() => [
|
|
8676
|
-
{ id: "
|
|
8677
|
-
{
|
|
8678
|
-
|
|
8679
|
-
|
|
8680
|
-
|
|
8681
|
-
|
|
8682
|
-
{ 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 },
|
|
8683
9100
|
{ id: "faq", label: "FAQ", show: !!(faqs == null ? void 0 : faqs.length) },
|
|
8684
|
-
{ id: "
|
|
9101
|
+
{ id: "reviews", label: "Reviews", show: !!(trustpilot || (reviews == null ? void 0 : reviews.length)) }
|
|
8685
9102
|
].filter((s) => s.show),
|
|
8686
9103
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
8687
9104
|
[]
|
|
8688
9105
|
);
|
|
8689
|
-
|
|
9106
|
+
React25__namespace.useEffect(() => {
|
|
8690
9107
|
const sentinel = navSentinelRef.current;
|
|
8691
9108
|
if (!sentinel) return;
|
|
8692
9109
|
const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -8694,7 +9111,7 @@ function TripPage({
|
|
|
8694
9111
|
update();
|
|
8695
9112
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
8696
9113
|
}, []);
|
|
8697
|
-
|
|
9114
|
+
React25__namespace.useEffect(() => {
|
|
8698
9115
|
const sentinel = sentinelRef.current;
|
|
8699
9116
|
if (!sentinel) return;
|
|
8700
9117
|
const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
|
|
@@ -8702,7 +9119,7 @@ function TripPage({
|
|
|
8702
9119
|
update();
|
|
8703
9120
|
return () => document.removeEventListener("scroll", update, { capture: true });
|
|
8704
9121
|
}, []);
|
|
8705
|
-
|
|
9122
|
+
React25__namespace.useEffect(() => {
|
|
8706
9123
|
const measure = () => {
|
|
8707
9124
|
if (!sidebarPlaceholderRef.current) return;
|
|
8708
9125
|
const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
|
|
@@ -8712,7 +9129,7 @@ function TripPage({
|
|
|
8712
9129
|
window.addEventListener("resize", measure);
|
|
8713
9130
|
return () => window.removeEventListener("resize", measure);
|
|
8714
9131
|
}, [isFloating]);
|
|
8715
|
-
|
|
9132
|
+
React25__namespace.useEffect(() => {
|
|
8716
9133
|
const check = () => {
|
|
8717
9134
|
var _a;
|
|
8718
9135
|
const target = (_a = galleryRef.current) != null ? _a : pricingBarRef.current;
|
|
@@ -8723,7 +9140,7 @@ function TripPage({
|
|
|
8723
9140
|
check();
|
|
8724
9141
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
8725
9142
|
}, []);
|
|
8726
|
-
|
|
9143
|
+
React25__namespace.useEffect(() => {
|
|
8727
9144
|
const check = () => {
|
|
8728
9145
|
if (!pricingBarRef.current) return;
|
|
8729
9146
|
setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
|
|
@@ -8732,7 +9149,7 @@ function TripPage({
|
|
|
8732
9149
|
check();
|
|
8733
9150
|
return () => document.removeEventListener("scroll", check, { capture: true });
|
|
8734
9151
|
}, []);
|
|
8735
|
-
|
|
9152
|
+
React25__namespace.useEffect(() => {
|
|
8736
9153
|
if (sections.length === 0) return;
|
|
8737
9154
|
setActiveSection(sections[0].id);
|
|
8738
9155
|
const update = () => {
|
|
@@ -8767,20 +9184,28 @@ function TripPage({
|
|
|
8767
9184
|
}
|
|
8768
9185
|
};
|
|
8769
9186
|
const scrollToSection = (id) => {
|
|
8770
|
-
|
|
8771
|
-
|
|
8772
|
-
|
|
8773
|
-
|
|
8774
|
-
|
|
8775
|
-
|
|
8776
|
-
|
|
8777
|
-
|
|
8778
|
-
|
|
8779
|
-
|
|
8780
|
-
scrollEl
|
|
8781
|
-
|
|
8782
|
-
|
|
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;
|
|
8783
9207
|
}
|
|
9208
|
+
performScroll();
|
|
8784
9209
|
};
|
|
8785
9210
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8786
9211
|
"div",
|
|
@@ -8800,10 +9225,11 @@ function TripPage({
|
|
|
8800
9225
|
duration,
|
|
8801
9226
|
tagline,
|
|
8802
9227
|
siteHeader,
|
|
8803
|
-
uiVariant
|
|
9228
|
+
uiVariant,
|
|
9229
|
+
belowMeta: trustpilotHero ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotHero }) : void 0
|
|
8804
9230
|
}
|
|
8805
9231
|
),
|
|
8806
|
-
/* @__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: [
|
|
8807
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: [
|
|
8808
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 }),
|
|
8809
9235
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
|
|
@@ -8813,7 +9239,7 @@ function TripPage({
|
|
|
8813
9239
|
"div",
|
|
8814
9240
|
{
|
|
8815
9241
|
className: cn(
|
|
8816
|
-
"
|
|
9242
|
+
"pt-8 pb-2 flex justify-center transition-opacity duration-150",
|
|
8817
9243
|
navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
|
|
8818
9244
|
),
|
|
8819
9245
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -8830,67 +9256,208 @@ function TripPage({
|
|
|
8830
9256
|
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
|
|
8831
9257
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
|
|
8832
9258
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
|
|
8833
|
-
|
|
8834
|
-
/* @__PURE__ */ jsxRuntime.
|
|
8835
|
-
|
|
8836
|
-
|
|
8837
|
-
|
|
8838
|
-
|
|
8839
|
-
|
|
8840
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8841
|
-
|
|
8842
|
-
] }, i)) })
|
|
8843
|
-
|
|
8844
|
-
overview && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
|
|
8845
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-4", children: "Overview" }),
|
|
8846
|
-
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: [
|
|
8847
9270
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
|
|
8848
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-
|
|
9271
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground font-ui", children: [
|
|
8849
9272
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: "Recommended for: " }),
|
|
8850
9273
|
recommendedFor
|
|
8851
9274
|
] })
|
|
8852
|
-
] })
|
|
8853
|
-
/* @__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
|
+
] })
|
|
8854
9276
|
] }),
|
|
8855
|
-
|
|
8856
|
-
/* @__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
|
+
] }),
|
|
8857
9294
|
/* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary })
|
|
8858
9295
|
] }),
|
|
8859
9296
|
included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
|
|
8860
9297
|
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
8861
|
-
/* @__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" }),
|
|
8862
9299
|
"Included"
|
|
8863
9300
|
] }),
|
|
8864
9301
|
/* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: included })
|
|
8865
9302
|
] }),
|
|
8866
|
-
|
|
8867
|
-
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
8868
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
|
|
8869
|
-
"What to bring"
|
|
8870
|
-
] }),
|
|
8871
|
-
/* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-4 w-4" }) })
|
|
8872
|
-
] }),
|
|
8873
|
-
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: [
|
|
8874
9304
|
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
|
|
8875
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.
|
|
8876
|
-
"
|
|
9305
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5 text-muted-foreground" }),
|
|
9306
|
+
"Not included"
|
|
8877
9307
|
] }),
|
|
8878
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8879
|
-
|
|
8880
|
-
|
|
8881
|
-
|
|
8882
|
-
|
|
8883
|
-
|
|
8884
|
-
|
|
8885
|
-
/* @__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: [
|
|
8886
|
-
/* @__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" }) }),
|
|
8887
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
8888
|
-
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" }),
|
|
8889
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
|
|
8890
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
|
|
8891
|
-
] })
|
|
8892
|
-
] }, 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
|
+
)
|
|
8893
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
|
+
),
|
|
8894
9461
|
faqs && faqs.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
|
|
8895
9462
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: "FAQ" }),
|
|
8896
9463
|
/* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: faqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
|
|
@@ -8898,14 +9465,18 @@ function TripPage({
|
|
|
8898
9465
|
/* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
|
|
8899
9466
|
] }, i)) })
|
|
8900
9467
|
] }),
|
|
8901
|
-
|
|
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: [
|
|
8902
9473
|
/* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
|
|
8903
9474
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: "What our guests think" }),
|
|
8904
9475
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
|
|
8905
9476
|
var _a;
|
|
8906
9477
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
|
|
8907
9478
|
/* @__PURE__ */ jsxRuntime.jsx(Stars, { count: (_a = r.rating) != null ? _a : 5 }),
|
|
8908
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-
|
|
9479
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base text-foreground leading-relaxed line-clamp-4", children: [
|
|
8909
9480
|
"\u201C",
|
|
8910
9481
|
r.text,
|
|
8911
9482
|
"\u201D"
|
|
@@ -8925,10 +9496,13 @@ function TripPage({
|
|
|
8925
9496
|
currency,
|
|
8926
9497
|
season,
|
|
8927
9498
|
departureTimes,
|
|
8928
|
-
pricingOptions,
|
|
8929
9499
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
8930
9500
|
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
8931
|
-
variant: "card"
|
|
9501
|
+
variant: "card",
|
|
9502
|
+
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
9503
|
+
benefits,
|
|
9504
|
+
currencyEstimates,
|
|
9505
|
+
priceInfo
|
|
8932
9506
|
}
|
|
8933
9507
|
) }) })
|
|
8934
9508
|
] })
|
|
@@ -8941,7 +9515,7 @@ function TripPage({
|
|
|
8941
9515
|
"fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
|
|
8942
9516
|
navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
|
|
8943
9517
|
),
|
|
8944
|
-
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(
|
|
8945
9519
|
MenuTrip,
|
|
8946
9520
|
{
|
|
8947
9521
|
sections,
|
|
@@ -8964,10 +9538,13 @@ function TripPage({
|
|
|
8964
9538
|
currency,
|
|
8965
9539
|
season,
|
|
8966
9540
|
departureTimes,
|
|
8967
|
-
pricingOptions,
|
|
8968
9541
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
8969
9542
|
bookLabel: bookLabel != null ? bookLabel : "Check availability",
|
|
8970
|
-
variant: "card"
|
|
9543
|
+
variant: "card",
|
|
9544
|
+
belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
|
|
9545
|
+
benefits,
|
|
9546
|
+
currencyEstimates,
|
|
9547
|
+
priceInfo
|
|
8971
9548
|
}
|
|
8972
9549
|
) })
|
|
8973
9550
|
}
|
|
@@ -8980,7 +9557,7 @@ function TripPage({
|
|
|
8980
9557
|
initialVisible: 6
|
|
8981
9558
|
}
|
|
8982
9559
|
) }),
|
|
8983
|
-
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 }) }) }),
|
|
8984
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(
|
|
8985
9562
|
PricingTrip,
|
|
8986
9563
|
{
|
|
@@ -8988,7 +9565,10 @@ function TripPage({
|
|
|
8988
9565
|
currency,
|
|
8989
9566
|
onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
|
|
8990
9567
|
bookLabel: bookLabel != null ? bookLabel : "Book now",
|
|
8991
|
-
variant: "compact"
|
|
9568
|
+
variant: "compact",
|
|
9569
|
+
sharp: true,
|
|
9570
|
+
priceInfo,
|
|
9571
|
+
currencyEstimates
|
|
8992
9572
|
}
|
|
8993
9573
|
) }),
|
|
8994
9574
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" })
|
|
@@ -9097,12 +9677,12 @@ function Toast({
|
|
|
9097
9677
|
duration = 6e3,
|
|
9098
9678
|
className
|
|
9099
9679
|
}) {
|
|
9100
|
-
const [mounted, setMounted] =
|
|
9101
|
-
const [visible, setVisible] =
|
|
9102
|
-
|
|
9680
|
+
const [mounted, setMounted] = React25__namespace.useState(false);
|
|
9681
|
+
const [visible, setVisible] = React25__namespace.useState(true);
|
|
9682
|
+
React25__namespace.useEffect(() => {
|
|
9103
9683
|
setMounted(true);
|
|
9104
9684
|
}, []);
|
|
9105
|
-
|
|
9685
|
+
React25__namespace.useEffect(() => {
|
|
9106
9686
|
if (duration === 0) return;
|
|
9107
9687
|
const t = setTimeout(() => {
|
|
9108
9688
|
setVisible(false);
|
|
@@ -9509,21 +10089,21 @@ function LeadCapturePopup({
|
|
|
9509
10089
|
}) {
|
|
9510
10090
|
var _a;
|
|
9511
10091
|
const config = __spreadValues(__spreadValues({}, DEFAULTS), _config);
|
|
9512
|
-
const [open, setOpen] =
|
|
9513
|
-
const [closing, setClosing] =
|
|
9514
|
-
const [submitted, setSubmitted] =
|
|
9515
|
-
const [submitting, setSubmitting] =
|
|
9516
|
-
const [error, setError] =
|
|
9517
|
-
const [name, setName] =
|
|
9518
|
-
const [email, setEmail] =
|
|
9519
|
-
const [travelDate, setTravelDate] =
|
|
9520
|
-
const panelRef =
|
|
9521
|
-
const nameRef =
|
|
9522
|
-
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(() => {
|
|
9523
10103
|
if (isDismissed()) return;
|
|
9524
10104
|
setOpen(true);
|
|
9525
10105
|
}, []);
|
|
9526
|
-
|
|
10106
|
+
React25.useEffect(() => {
|
|
9527
10107
|
var _a2;
|
|
9528
10108
|
if (isDismissed()) return;
|
|
9529
10109
|
if (config.trigger === "delay") {
|
|
@@ -9550,7 +10130,7 @@ function LeadCapturePopup({
|
|
|
9550
10130
|
return () => window.removeEventListener("scroll", handler);
|
|
9551
10131
|
}
|
|
9552
10132
|
}, [config.trigger, config.delaySeconds, config.scrollPercent, show]);
|
|
9553
|
-
|
|
10133
|
+
React25.useEffect(() => {
|
|
9554
10134
|
if (open && !submitted) {
|
|
9555
10135
|
requestAnimationFrame(() => {
|
|
9556
10136
|
var _a2;
|
|
@@ -9558,7 +10138,7 @@ function LeadCapturePopup({
|
|
|
9558
10138
|
});
|
|
9559
10139
|
}
|
|
9560
10140
|
}, [open, submitted]);
|
|
9561
|
-
const close =
|
|
10141
|
+
const close = React25.useCallback(() => {
|
|
9562
10142
|
setClosing(true);
|
|
9563
10143
|
setDismissed(config.dismissDays);
|
|
9564
10144
|
setTimeout(() => {
|
|
@@ -9566,7 +10146,7 @@ function LeadCapturePopup({
|
|
|
9566
10146
|
setClosing(false);
|
|
9567
10147
|
}, 250);
|
|
9568
10148
|
}, [config.dismissDays]);
|
|
9569
|
-
|
|
10149
|
+
React25.useEffect(() => {
|
|
9570
10150
|
if (!open) return;
|
|
9571
10151
|
const handler = (e) => {
|
|
9572
10152
|
if (e.key === "Escape") close();
|
|
@@ -9574,7 +10154,7 @@ function LeadCapturePopup({
|
|
|
9574
10154
|
document.addEventListener("keydown", handler);
|
|
9575
10155
|
return () => document.removeEventListener("keydown", handler);
|
|
9576
10156
|
}, [open, close]);
|
|
9577
|
-
const onOverlayClick =
|
|
10157
|
+
const onOverlayClick = React25.useCallback(
|
|
9578
10158
|
(e) => {
|
|
9579
10159
|
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
9580
10160
|
close();
|
|
@@ -9835,6 +10415,7 @@ exports.FilterPanel = FilterPanel;
|
|
|
9835
10415
|
exports.FloatingInput = FloatingInput;
|
|
9836
10416
|
exports.FloatingSelect = FloatingSelect;
|
|
9837
10417
|
exports.Itinerary = Itinerary;
|
|
10418
|
+
exports.ItineraryDay = ItineraryDay;
|
|
9838
10419
|
exports.LOGO_PLANETAEXO_DATA_URI = LOGO_PLANETAEXO_DATA_URI;
|
|
9839
10420
|
exports.LeadCapturePopup = LeadCapturePopup;
|
|
9840
10421
|
exports.MenuTrip = MenuTrip;
|
|
@@ -9855,14 +10436,17 @@ exports.TERMS_ACCEPT_KEY = TERMS_ACCEPT_KEY;
|
|
|
9855
10436
|
exports.TermsSection = TermsSection;
|
|
9856
10437
|
exports.ThemeToggle = ThemeToggle;
|
|
9857
10438
|
exports.Toast = Toast;
|
|
10439
|
+
exports.TransferDetailsBlock = TransferDetailsBlock;
|
|
9858
10440
|
exports.TravellerFormInviteEmail = TravellerFormInviteEmail;
|
|
9859
10441
|
exports.TripCard = TripCard;
|
|
9860
10442
|
exports.TripHeader = TripHeader;
|
|
9861
10443
|
exports.TripPage = TripPage;
|
|
10444
|
+
exports.TrustpilotEmbed = TrustpilotEmbed;
|
|
9862
10445
|
exports.buttonVariants = buttonVariants;
|
|
9863
10446
|
exports.cn = cn;
|
|
9864
10447
|
exports.emailTokens = emailTokens;
|
|
9865
10448
|
exports.getStripeAppearance = getStripeAppearance;
|
|
10449
|
+
exports.itineraryDaySpecIcons = itineraryDaySpecIcons;
|
|
9866
10450
|
exports.stripeAppearance = stripeAppearance;
|
|
9867
10451
|
exports.wrapEmailHtml = wrapEmailHtml;
|
|
9868
10452
|
//# sourceMappingURL=index.cjs.map
|