@planetaexo/design-system 0.63.0 → 0.65.0

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