@planetaexo/design-system 0.23.0 → 0.23.2

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