@planetaexo/design-system 0.64.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.js CHANGED
@@ -4,7 +4,7 @@ import { cva } from 'class-variance-authority';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
- import { XIcon, ChevronDownIcon, CalendarIcon, SearchIcon, ChevronRightIcon, ArrowLeftIcon, CheckCircle2Icon, MapIcon, LogOutIcon, UsersIcon, CreditCardIcon, AlertCircleIcon, MinusIcon, PlusIcon, CircleCheckIcon, SlidersHorizontalIcon, ChevronLeftIcon, HomeIcon, SailboatIcon, CarIcon, WavesIcon, FootprintsIcon, InfoIcon, ClockIcon, CheckIcon, ChevronUpIcon, MenuIcon, UserIcon, SunIcon, MoonIcon, MapPinIcon, PackageIcon, BedDoubleIcon, UtensilsIcon, CompassIcon, BackpackIcon, CherryIcon, ReceiptIcon, ArrowRightIcon, Loader2Icon, SendIcon, CheckCircleIcon, ArrowDownIcon, SparkleIcon, Share2Icon, CopyIcon, Info, MailIcon, PhoneIcon, MessageCircleIcon, UserPlusIcon, ExternalLinkIcon, PencilIcon, Trash2Icon, UserMinusIcon, AlertTriangleIcon, ZoomInIcon, StarIcon, TwitterIcon, YoutubeIcon, LinkedinIcon, InstagramIcon, FacebookIcon, LayoutGridIcon } from 'lucide-react';
7
+ import { XIcon, ChevronDownIcon, CalendarIcon, SearchIcon, ChevronRightIcon, ArrowLeftIcon, CheckCircle2Icon, MapIcon, LogOutIcon, UsersIcon, CreditCardIcon, AlertCircleIcon, MinusIcon, PlusIcon, CircleCheckIcon, SlidersHorizontalIcon, ChevronLeftIcon, HomeIcon, SailboatIcon, CarIcon, WavesIcon, FootprintsIcon, InfoIcon, ClockIcon, CheckIcon, ChevronUpIcon, MenuIcon, UserIcon, SunIcon, MoonIcon, MapPinIcon, TwitterIcon, YoutubeIcon, LinkedinIcon, InstagramIcon, FacebookIcon, ArrowRightIcon, PackageIcon, BedDoubleIcon, UtensilsIcon, CompassIcon, BackpackIcon, CherryIcon, ReceiptIcon, Loader2Icon, SendIcon, CheckCircleIcon, ArrowDownIcon, SparkleIcon, Share2Icon, CopyIcon, Info, MailIcon, PhoneIcon, MessageCircleIcon, UserPlusIcon, ExternalLinkIcon, PencilIcon, Trash2Icon, UserMinusIcon, AlertTriangleIcon, ZoomInIcon, StarIcon, LayoutGridIcon } from 'lucide-react';
8
8
  import { Separator as Separator$1 } from '@base-ui/react/separator';
9
9
  import { Dialog as Dialog$1 } from '@base-ui/react/dialog';
10
10
  import { Button as Button$1 } from '@base-ui/react/button';
@@ -617,7 +617,8 @@ function PhoneCountrySelect({
617
617
  value,
618
618
  onChange,
619
619
  className,
620
- disabled
620
+ disabled,
621
+ showDial = true
621
622
  }) {
622
623
  var _a;
623
624
  const [open, setOpen] = React32.useState(false);
@@ -666,7 +667,7 @@ function PhoneCountrySelect({
666
667
  ),
667
668
  children: [
668
669
  /* @__PURE__ */ jsx("span", { className: "text-base leading-none", children: selected.flag }),
669
- /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: selected.dial }),
670
+ showDial && /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: selected.dial }),
670
671
  /* @__PURE__ */ jsx(
671
672
  ChevronDownIcon,
672
673
  {
@@ -7909,7 +7910,8 @@ function DatePickerField({
7909
7910
  placeholder = "Select a date",
7910
7911
  disabled,
7911
7912
  fromDate,
7912
- className
7913
+ className,
7914
+ error
7913
7915
  }) {
7914
7916
  const [open, setOpen] = React32.useState(false);
7915
7917
  const containerRef = React32.useRef(null);
@@ -7923,78 +7925,91 @@ function DatePickerField({
7923
7925
  observer.observe(containerRef.current);
7924
7926
  return () => observer.disconnect();
7925
7927
  }, []);
7926
- return /* @__PURE__ */ jsx("div", { ref: containerRef, className: cn("w-full", className), children: /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
7927
- /* @__PURE__ */ jsxs(
7928
- PopoverTrigger,
7929
- {
7930
- disabled,
7931
- className: cn(
7932
- "relative flex w-full items-center rounded-lg border border-border bg-background",
7933
- "px-3 text-left text-base font-ui transition-colors h-14",
7934
- "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
7935
- "disabled:pointer-events-none disabled:opacity-50",
7936
- open && "border-primary ring-1 ring-primary"
7937
- ),
7938
- children: [
7939
- /* @__PURE__ */ jsxs(
7940
- "span",
7941
- {
7942
- className: cn(
7943
- "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
7944
- hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
7945
- ),
7946
- children: [
7947
- label,
7948
- required && /* @__PURE__ */ jsx("span", { className: "text-primary ml-0.5", children: "*" })
7949
- ]
7950
- }
7928
+ return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("w-full", className), children: [
7929
+ /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
7930
+ /* @__PURE__ */ jsxs(
7931
+ PopoverTrigger,
7932
+ {
7933
+ disabled,
7934
+ className: cn(
7935
+ "relative flex w-full items-center rounded-lg border border-border bg-background",
7936
+ "px-3 text-left text-base font-ui transition-colors h-14",
7937
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
7938
+ "disabled:pointer-events-none disabled:opacity-50",
7939
+ open && "border-primary ring-1 ring-primary",
7940
+ error && "border-destructive focus:border-destructive focus:ring-destructive"
7951
7941
  ),
7952
- /* @__PURE__ */ jsx(
7953
- "span",
7942
+ children: [
7943
+ /* @__PURE__ */ jsxs(
7944
+ "span",
7945
+ {
7946
+ className: cn(
7947
+ "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
7948
+ hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
7949
+ ),
7950
+ children: [
7951
+ label,
7952
+ required && /* @__PURE__ */ jsx("span", { className: "text-primary ml-0.5", children: "*" })
7953
+ ]
7954
+ }
7955
+ ),
7956
+ /* @__PURE__ */ jsx(
7957
+ "span",
7958
+ {
7959
+ className: cn(
7960
+ "flex-1 truncate mt-3",
7961
+ hasValue ? "text-foreground" : "invisible"
7962
+ ),
7963
+ children: hasValue ? format(value, "dd MMM yyyy") : placeholder
7964
+ }
7965
+ ),
7966
+ /* @__PURE__ */ jsx(CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
7967
+ ]
7968
+ }
7969
+ ),
7970
+ /* @__PURE__ */ jsx(
7971
+ PopoverContent,
7972
+ {
7973
+ className: "p-0",
7974
+ align: "start",
7975
+ style: calendarWidth ? { width: calendarWidth } : void 0,
7976
+ children: /* @__PURE__ */ jsx(
7977
+ Calendar,
7954
7978
  {
7955
- className: cn(
7956
- "flex-1 truncate mt-3",
7957
- hasValue ? "text-foreground" : "invisible"
7958
- ),
7959
- children: hasValue ? format(value, "dd MMM yyyy") : placeholder
7979
+ mode: "single",
7980
+ selected: value,
7981
+ onSelect: (date) => {
7982
+ onChange == null ? void 0 : onChange(date);
7983
+ setOpen(false);
7984
+ },
7985
+ fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
7986
+ className: "font-ui w-full",
7987
+ autoFocus: true
7960
7988
  }
7961
- ),
7962
- /* @__PURE__ */ jsx(CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
7963
- ]
7964
- }
7965
- ),
7966
- /* @__PURE__ */ jsx(
7967
- PopoverContent,
7968
- {
7969
- className: "p-0",
7970
- align: "start",
7971
- style: calendarWidth ? { width: calendarWidth } : void 0,
7972
- children: /* @__PURE__ */ jsx(
7973
- Calendar,
7974
- {
7975
- mode: "single",
7976
- selected: value,
7977
- onSelect: (date) => {
7978
- onChange == null ? void 0 : onChange(date);
7979
- setOpen(false);
7980
- },
7981
- fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
7982
- className: "font-ui w-full",
7983
- autoFocus: true
7984
- }
7985
- )
7986
- }
7987
- )
7988
- ] }) });
7989
+ )
7990
+ }
7991
+ )
7992
+ ] }),
7993
+ error && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: error })
7994
+ ] });
7995
+ }
7996
+ function dialFor(iso) {
7997
+ var _a, _b;
7998
+ return (_b = (_a = PHONE_COUNTRIES.find((c) => c.code === iso)) == null ? void 0 : _a.dial) != null ? _b : "";
7989
7999
  }
8000
+ var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
7990
8001
  function FormSection({
7991
8002
  title,
8003
+ required,
7992
8004
  children,
7993
8005
  className
7994
8006
  }) {
7995
8007
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-5", className), children: [
7996
8008
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
7997
- /* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: title }),
8009
+ /* @__PURE__ */ jsxs("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: [
8010
+ title,
8011
+ required && /* @__PURE__ */ jsx("span", { className: "text-primary ml-0.5", children: "*" })
8012
+ ] }),
7998
8013
  /* @__PURE__ */ jsx("div", { className: "h-px flex-1 bg-border" })
7999
8014
  ] }),
8000
8015
  children
@@ -8010,24 +8025,67 @@ var defaultInitial = {
8010
8025
  phoneCountry: "BR",
8011
8026
  lastName: "",
8012
8027
  firstName: "",
8013
- country: "France",
8028
+ country: "",
8014
8029
  phone: "",
8015
- email: ""
8030
+ email: "",
8031
+ contactVia: "Email"
8016
8032
  };
8017
8033
  function BookingForm({
8018
8034
  defaultValues,
8019
8035
  onSubmit,
8020
- submitLabel = "Send my request",
8036
+ submitLabel,
8021
8037
  loading = false,
8022
8038
  showHeader = true,
8023
- title = "Check availability for your trip",
8024
- subtitle = "Free enquiry \u2013 no commitment",
8039
+ title,
8040
+ subtitle,
8041
+ labels,
8025
8042
  className
8026
8043
  }) {
8044
+ 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;
8045
+ const L = labels != null ? labels : {};
8046
+ const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
8047
+ const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
8048
+ const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
8027
8049
  const [values, setValues] = React32.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8028
- const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8050
+ const [errors, setErrors] = React32.useState({});
8051
+ const set = (key, value) => {
8052
+ setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8053
+ setErrors(
8054
+ (prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
8055
+ );
8056
+ };
8057
+ React32.useEffect(() => {
8058
+ if (!defaultValues) return;
8059
+ setValues((prev) => {
8060
+ let changed = false;
8061
+ const next = __spreadValues({}, prev);
8062
+ Object.keys(defaultValues).forEach(
8063
+ (k) => {
8064
+ const incoming = defaultValues[k];
8065
+ if (incoming === void 0 || incoming === "") return;
8066
+ if (prev[k] === defaultInitial[k]) {
8067
+ next[k] = incoming;
8068
+ changed = true;
8069
+ }
8070
+ }
8071
+ );
8072
+ return changed ? next : prev;
8073
+ });
8074
+ }, [defaultValues]);
8075
+ const reqMsg = (_d = L.errorRequired) != null ? _d : "This field is required";
8076
+ const emailMsg = (_e = L.errorEmail) != null ? _e : "Enter a valid email address";
8029
8077
  const handleSubmit = (e) => {
8030
8078
  e.preventDefault();
8079
+ const next = {};
8080
+ if (!values.firstName.trim()) next.firstName = reqMsg;
8081
+ if (!values.lastName.trim()) next.lastName = reqMsg;
8082
+ if (!values.email.trim()) next.email = reqMsg;
8083
+ else if (!EMAIL_RE.test(values.email.trim())) next.email = emailMsg;
8084
+ if (!values.travelDate) next.travelDate = reqMsg;
8085
+ if (!values.phone.trim()) next.phone = reqMsg;
8086
+ if (!values.contactVia) next.contactVia = reqMsg;
8087
+ setErrors(next);
8088
+ if (Object.keys(next).length > 0) return;
8031
8089
  onSubmit == null ? void 0 : onSubmit(values);
8032
8090
  };
8033
8091
  return /* @__PURE__ */ jsxs(
@@ -8038,15 +8096,14 @@ function BookingForm({
8038
8096
  noValidate: true,
8039
8097
  children: [
8040
8098
  showHeader && /* @__PURE__ */ jsxs("div", { children: [
8041
- /* @__PURE__ */ jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: title }),
8042
- /* @__PURE__ */ jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitle })
8099
+ /* @__PURE__ */ jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: titleText }),
8100
+ /* @__PURE__ */ jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitleText })
8043
8101
  ] }),
8044
- /* @__PURE__ */ jsx(FormSection, { title: "Who's joining the adventure?", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8102
+ /* @__PURE__ */ jsx(FormSection, { title: (_f = L.travelersSection) != null ? _f : "Who's joining the adventure?", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8045
8103
  /* @__PURE__ */ jsx(
8046
8104
  CounterField,
8047
8105
  {
8048
- label: "Adults",
8049
- required: true,
8106
+ label: (_g = L.adults) != null ? _g : "Adults",
8050
8107
  value: values.adults,
8051
8108
  min: 1,
8052
8109
  onChange: (v) => set("adults", v)
@@ -8055,30 +8112,30 @@ function BookingForm({
8055
8112
  /* @__PURE__ */ jsx(
8056
8113
  CounterField,
8057
8114
  {
8058
- label: "Children",
8059
- sublabel: "(under 12)",
8115
+ label: (_h = L.children) != null ? _h : "Children",
8116
+ sublabel: (_i = L.childrenSublabel) != null ? _i : "(under 12)",
8060
8117
  value: values.children,
8061
8118
  min: 0,
8062
8119
  onChange: (v) => set("children", v)
8063
8120
  }
8064
8121
  )
8065
8122
  ] }) }),
8066
- /* @__PURE__ */ jsx(FormSection, { title: "Your next trip", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8123
+ /* @__PURE__ */ jsx(FormSection, { title: (_j = L.tripSection) != null ? _j : "Your next trip", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8067
8124
  /* @__PURE__ */ jsx(
8068
8125
  DatePickerField,
8069
8126
  {
8070
- label: "Travel date",
8127
+ label: (_k = L.travelDate) != null ? _k : "Travel date",
8071
8128
  required: true,
8072
8129
  value: values.travelDate,
8073
8130
  onChange: (d) => set("travelDate", d),
8074
- placeholder: "Pick a date"
8131
+ placeholder: (_l = L.pickDate) != null ? _l : "Pick a date",
8132
+ error: errors.travelDate
8075
8133
  }
8076
8134
  ),
8077
8135
  /* @__PURE__ */ jsx(
8078
8136
  FloatingInput,
8079
8137
  {
8080
- label: "Budget (per person)",
8081
- required: true,
8138
+ label: (_m = L.budget) != null ? _m : "Budget (per person)",
8082
8139
  type: "number",
8083
8140
  min: 0,
8084
8141
  value: values.budget,
@@ -8086,7 +8143,7 @@ function BookingForm({
8086
8143
  }
8087
8144
  )
8088
8145
  ] }) }),
8089
- /* @__PURE__ */ jsx(FormSection, { title: "Tell us about your trip", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
8146
+ /* @__PURE__ */ jsx(FormSection, { title: (_n = L.projectSection) != null ? _n : "Tell us about your trip", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
8090
8147
  /* @__PURE__ */ jsx(
8091
8148
  "textarea",
8092
8149
  {
@@ -8114,140 +8171,184 @@ function BookingForm({
8114
8171
  "peer-not-placeholder-shown:top-2 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
8115
8172
  ),
8116
8173
  children: [
8117
- "Your trip in a few words",
8174
+ (_o = L.projectLabel) != null ? _o : "Your trip in a few words",
8118
8175
  " ",
8119
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })
8176
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-normal", children: (_p = L.optional) != null ? _p : "(optional)" })
8120
8177
  ]
8121
8178
  }
8122
8179
  )
8123
8180
  ] }) }),
8124
- /* @__PURE__ */ jsxs(FormSection, { title: "Contact details", children: [
8181
+ /* @__PURE__ */ jsxs(FormSection, { title: (_q = L.contactSection) != null ? _q : "Contact details", children: [
8125
8182
  /* @__PURE__ */ jsx(
8126
8183
  "div",
8127
8184
  {
8128
8185
  role: "radiogroup",
8129
- "aria-label": "Title",
8186
+ "aria-label": (_r = L.titleAria) != null ? _r : "Title",
8130
8187
  className: "flex flex-wrap items-center gap-x-6 gap-y-3",
8131
- children: ["ms", "mr"].map((c) => /* @__PURE__ */ jsxs(
8132
- "label",
8133
- {
8134
- className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
8135
- children: [
8136
- /* @__PURE__ */ jsx(
8137
- "input",
8138
- {
8139
- type: "radio",
8140
- name: "civility",
8141
- value: c,
8142
- checked: values.civility === c,
8143
- onChange: () => set("civility", c),
8144
- className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
8145
- }
8146
- ),
8147
- c === "ms" ? "Ms." : "Mr."
8148
- ]
8149
- },
8150
- c
8151
- ))
8188
+ children: ["ms", "mr"].map((c) => {
8189
+ var _a2, _b2;
8190
+ return /* @__PURE__ */ jsxs(
8191
+ "label",
8192
+ {
8193
+ className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
8194
+ children: [
8195
+ /* @__PURE__ */ jsx(
8196
+ "input",
8197
+ {
8198
+ type: "radio",
8199
+ name: "civility",
8200
+ value: c,
8201
+ checked: values.civility === c,
8202
+ onChange: () => set("civility", c),
8203
+ className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
8204
+ }
8205
+ ),
8206
+ c === "ms" ? (_a2 = L.ms) != null ? _a2 : "Ms." : (_b2 = L.mr) != null ? _b2 : "Mr."
8207
+ ]
8208
+ },
8209
+ c
8210
+ );
8211
+ })
8152
8212
  }
8153
8213
  ),
8154
8214
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 min-w-0", children: [
8155
8215
  /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
8156
8216
  FloatingInput,
8157
8217
  {
8158
- label: "Last name",
8218
+ label: (_s = L.lastName) != null ? _s : "Last name",
8159
8219
  required: true,
8160
8220
  value: values.lastName,
8161
- onChange: (e) => set("lastName", e.target.value)
8221
+ onChange: (e) => set("lastName", e.target.value),
8222
+ error: errors.lastName
8162
8223
  }
8163
8224
  ) }),
8164
8225
  /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
8165
8226
  FloatingInput,
8166
8227
  {
8167
- label: "First name",
8228
+ label: (_t = L.firstName) != null ? _t : "First name",
8168
8229
  required: true,
8169
8230
  value: values.firstName,
8170
- onChange: (e) => set("firstName", e.target.value)
8231
+ onChange: (e) => set("firstName", e.target.value),
8232
+ error: errors.firstName
8171
8233
  }
8172
8234
  ) }),
8173
- /* @__PURE__ */ jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxs(
8174
- FloatingSelect,
8235
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsx(
8236
+ CountrySearchField,
8175
8237
  {
8176
- label: "Country of residence",
8177
- required: true,
8238
+ label: (_u = L.country) != null ? _u : "Country of residence",
8178
8239
  value: values.country,
8179
- onChange: (e) => set("country", e.target.value),
8180
- children: [
8181
- /* @__PURE__ */ jsx("option", { value: "", disabled: true, hidden: true }),
8182
- /* @__PURE__ */ jsx("option", { value: "France", children: "France" }),
8183
- /* @__PURE__ */ jsx("option", { value: "Belgium", children: "Belgium" }),
8184
- /* @__PURE__ */ jsx("option", { value: "Switzerland", children: "Switzerland" }),
8185
- /* @__PURE__ */ jsx("option", { value: "Canada", children: "Canada" }),
8186
- /* @__PURE__ */ jsx("option", { value: "Luxembourg", children: "Luxembourg" }),
8187
- /* @__PURE__ */ jsx("option", { value: "United Kingdom", children: "United Kingdom" }),
8188
- /* @__PURE__ */ jsx("option", { value: "United States", children: "United States" }),
8189
- /* @__PURE__ */ jsx("option", { value: "Other", children: "Other" })
8190
- ]
8240
+ onChange: (code) => set("country", code),
8241
+ countries: COUNTRIES
8191
8242
  }
8192
8243
  ) })
8193
8244
  ] }),
8194
8245
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [
8195
- /* @__PURE__ */ jsxs("div", { className: "flex w-full min-w-0", children: [
8196
- /* @__PURE__ */ jsx(
8197
- PhoneCountrySelect,
8198
- {
8199
- value: values.phoneCountry,
8200
- onChange: (code) => set("phoneCountry", code),
8201
- className: "shrink-0"
8202
- }
8203
- ),
8204
- /* @__PURE__ */ jsxs("div", { className: "relative min-w-0 flex-1", children: [
8246
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
8247
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full min-w-0", children: [
8205
8248
  /* @__PURE__ */ jsx(
8206
- "input",
8249
+ PhoneCountrySelect,
8207
8250
  {
8208
- id: "phone",
8209
- type: "tel",
8210
- placeholder: " ",
8211
- value: values.phone,
8212
- onChange: (e) => set("phone", e.target.value),
8213
- className: cn(
8214
- "peer block h-14 w-full rounded-r-lg border border-border bg-background",
8215
- "px-3 pt-5 pb-2 text-base text-foreground font-ui",
8216
- "transition-colors placeholder-transparent",
8217
- "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary"
8218
- )
8251
+ value: values.phoneCountry,
8252
+ onChange: (code) => set("phoneCountry", code),
8253
+ className: "shrink-0",
8254
+ showDial: false
8219
8255
  }
8220
8256
  ),
8221
- /* @__PURE__ */ jsxs(
8222
- "label",
8223
- {
8224
- htmlFor: "phone",
8225
- className: cn(
8226
- "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
8227
- "text-base text-muted-foreground font-ui transition-all duration-150",
8228
- "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
8229
- "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"
8230
- ),
8231
- children: [
8232
- "Phone ",
8233
- /* @__PURE__ */ jsx("span", { className: "text-primary", children: "*" })
8234
- ]
8235
- }
8236
- )
8237
- ] })
8257
+ /* @__PURE__ */ jsxs("div", { className: "relative min-w-0 flex-1", children: [
8258
+ /* @__PURE__ */ jsx(
8259
+ "input",
8260
+ {
8261
+ id: "phone",
8262
+ type: "tel",
8263
+ placeholder: " ",
8264
+ value: `${dialFor(values.phoneCountry)} ${values.phone}`,
8265
+ onChange: (e) => {
8266
+ const dial = dialFor(values.phoneCountry);
8267
+ let national = e.target.value;
8268
+ if (national.startsWith(dial)) national = national.slice(dial.length);
8269
+ national = national.replace(/^\s+/, "");
8270
+ set("phone", national);
8271
+ },
8272
+ className: cn(
8273
+ "peer block h-14 w-full rounded-r-lg border border-border bg-background",
8274
+ "px-3 pt-5 pb-2 text-base text-foreground font-ui",
8275
+ "transition-colors placeholder-transparent",
8276
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
8277
+ errors.phone && "border-destructive focus:border-destructive focus:ring-destructive"
8278
+ )
8279
+ }
8280
+ ),
8281
+ /* @__PURE__ */ jsxs(
8282
+ "label",
8283
+ {
8284
+ htmlFor: "phone",
8285
+ className: cn(
8286
+ "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
8287
+ "text-base text-muted-foreground font-ui transition-all duration-150",
8288
+ "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
8289
+ "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"
8290
+ ),
8291
+ children: [
8292
+ (_v = L.phone) != null ? _v : "Phone",
8293
+ " ",
8294
+ /* @__PURE__ */ jsx("span", { className: "text-primary", children: "*" })
8295
+ ]
8296
+ }
8297
+ )
8298
+ ] })
8299
+ ] }),
8300
+ errors.phone && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: errors.phone })
8238
8301
  ] }),
8239
8302
  /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
8240
8303
  FloatingInput,
8241
8304
  {
8242
- label: "Email",
8305
+ label: (_w = L.email) != null ? _w : "Email",
8243
8306
  required: true,
8244
8307
  type: "email",
8245
8308
  value: values.email,
8246
- onChange: (e) => set("email", e.target.value)
8309
+ onChange: (e) => set("email", e.target.value),
8310
+ error: errors.email
8247
8311
  }
8248
8312
  ) })
8249
8313
  ] })
8250
8314
  ] }),
8315
+ /* @__PURE__ */ jsxs(
8316
+ FormSection,
8317
+ {
8318
+ title: (_x = L.contactViaSection) != null ? _x : "How should we contact you?",
8319
+ required: true,
8320
+ children: [
8321
+ /* @__PURE__ */ jsx(
8322
+ "div",
8323
+ {
8324
+ role: "radiogroup",
8325
+ "aria-label": (_y = L.contactViaSection) != null ? _y : "How should we contact you?",
8326
+ className: "inline-flex flex-wrap rounded-full border border-border bg-background p-1",
8327
+ children: [
8328
+ ["WhatsApp", (_z = L.contactViaWhatsApp) != null ? _z : "WhatsApp"],
8329
+ ["Email", (_A = L.contactViaEmail) != null ? _A : "Email"],
8330
+ ["Phone", (_B = L.contactViaPhone) != null ? _B : "Phone"]
8331
+ ].map(([value, label]) => /* @__PURE__ */ jsx(
8332
+ "button",
8333
+ {
8334
+ type: "button",
8335
+ role: "radio",
8336
+ "aria-checked": values.contactVia === value,
8337
+ onClick: () => set("contactVia", value),
8338
+ className: cn(
8339
+ "whitespace-nowrap rounded-full px-5 py-2 font-heading text-[13px] font-semibold transition-colors",
8340
+ values.contactVia === value ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:text-foreground"
8341
+ ),
8342
+ children: label
8343
+ },
8344
+ value
8345
+ ))
8346
+ }
8347
+ ),
8348
+ errors.contactVia && /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive font-ui", children: errors.contactVia })
8349
+ ]
8350
+ }
8351
+ ),
8251
8352
  /* @__PURE__ */ jsx("div", { className: "flex justify-center pt-2", children: /* @__PURE__ */ jsx(
8252
8353
  "button",
8253
8354
  {
@@ -8282,8 +8383,8 @@ function BookingForm({
8282
8383
  }
8283
8384
  )
8284
8385
  ] }),
8285
- "Sending\u2026"
8286
- ] }) : submitLabel
8386
+ (_C = L.sending) != null ? _C : "Sending\u2026"
8387
+ ] }) : submitText
8287
8388
  }
8288
8389
  ) })
8289
8390
  ]
@@ -10032,56 +10133,66 @@ function AccordionItem(_a) {
10032
10133
  function AccordionTrigger(_a) {
10033
10134
  var _b = _a, {
10034
10135
  className,
10035
- children
10136
+ children,
10137
+ headingLevel
10036
10138
  } = _b, props = __objRest(_b, [
10037
10139
  "className",
10038
- "children"
10140
+ "children",
10141
+ "headingLevel"
10039
10142
  ]);
10040
10143
  const variant = React32.useContext(AccordionVariantContext);
10041
- return /* @__PURE__ */ jsx(Accordion$1.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
10042
- Accordion$1.Trigger,
10144
+ const headingRender = headingLevel === 2 ? /* @__PURE__ */ jsx("h2", {}) : headingLevel === 4 ? /* @__PURE__ */ jsx("h4", {}) : headingLevel === 5 ? /* @__PURE__ */ jsx("h5", {}) : headingLevel === 6 ? /* @__PURE__ */ jsx("h6", {}) : void 0;
10145
+ return /* @__PURE__ */ jsx(
10146
+ Accordion$1.Header,
10043
10147
  __spreadProps(__spreadValues({
10044
- "data-slot": "accordion-trigger",
10045
- className: cn(
10046
- "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
10047
- "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
10048
- variant === "default" && [
10049
- "rounded-lg border border-transparent py-2.5 text-sm font-medium",
10050
- "hover:underline focus-visible:border-ring",
10051
- "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
10052
- ],
10053
- variant === "faq" && [
10054
- "px-5 py-4 text-base font-bold",
10055
- "hover:bg-muted/30 rounded-lg"
10056
- ],
10057
- className
10058
- )
10059
- }, props), {
10060
- children: [
10061
- children,
10062
- variant === "default" && /* @__PURE__ */ jsxs(Fragment, { children: [
10063
- /* @__PURE__ */ jsx(
10064
- ChevronDownIcon,
10065
- {
10066
- "data-slot": "accordion-trigger-icon",
10067
- className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
10068
- }
10069
- ),
10070
- /* @__PURE__ */ jsx(
10071
- ChevronUpIcon,
10072
- {
10073
- "data-slot": "accordion-trigger-icon",
10074
- className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
10075
- }
10148
+ className: "flex"
10149
+ }, headingRender ? { render: headingRender } : {}), {
10150
+ children: /* @__PURE__ */ jsxs(
10151
+ Accordion$1.Trigger,
10152
+ __spreadProps(__spreadValues({
10153
+ "data-slot": "accordion-trigger",
10154
+ className: cn(
10155
+ "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
10156
+ "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
10157
+ variant === "default" && [
10158
+ "rounded-lg border border-transparent py-2.5 text-sm font-medium",
10159
+ "hover:underline focus-visible:border-ring",
10160
+ "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
10161
+ ],
10162
+ variant === "faq" && [
10163
+ "px-5 py-4 text-base font-bold",
10164
+ "hover:bg-muted/30 rounded-lg"
10165
+ ],
10166
+ className
10076
10167
  )
10077
- ] }),
10078
- variant === "faq" && /* @__PURE__ */ jsxs(Fragment, { children: [
10079
- /* @__PURE__ */ jsx(PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
10080
- /* @__PURE__ */ jsx(MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
10081
- ] })
10082
- ]
10168
+ }, props), {
10169
+ children: [
10170
+ children,
10171
+ variant === "default" && /* @__PURE__ */ jsxs(Fragment, { children: [
10172
+ /* @__PURE__ */ jsx(
10173
+ ChevronDownIcon,
10174
+ {
10175
+ "data-slot": "accordion-trigger-icon",
10176
+ className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
10177
+ }
10178
+ ),
10179
+ /* @__PURE__ */ jsx(
10180
+ ChevronUpIcon,
10181
+ {
10182
+ "data-slot": "accordion-trigger-icon",
10183
+ className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
10184
+ }
10185
+ )
10186
+ ] }),
10187
+ variant === "faq" && /* @__PURE__ */ jsxs(Fragment, { children: [
10188
+ /* @__PURE__ */ jsx(PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
10189
+ /* @__PURE__ */ jsx(MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
10190
+ ] })
10191
+ ]
10192
+ })
10193
+ )
10083
10194
  })
10084
- ) });
10195
+ );
10085
10196
  }
10086
10197
  function AccordionContent(_a) {
10087
10198
  var _b = _a, {
@@ -10306,9 +10417,10 @@ function FilterPanel({
10306
10417
  variant = "sidebar",
10307
10418
  sortOptions,
10308
10419
  sort,
10309
- onSortChange
10420
+ onSortChange,
10421
+ labels
10310
10422
  }) {
10311
- var _a, _b;
10423
+ var _a, _b, _c, _d, _e, _f, _g, _h;
10312
10424
  const resolvedGroups = React32.useMemo(() => resolveGroups(groups), [groups]);
10313
10425
  const [internalValue, setInternalValue] = React32.useState(
10314
10426
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
@@ -10446,7 +10558,7 @@ function FilterPanel({
10446
10558
  type: "button",
10447
10559
  onClick: handleClearAll,
10448
10560
  className: "text-sm font-ui font-semibold text-muted-foreground underline underline-offset-2 hover:text-foreground",
10449
- children: "Clear all"
10561
+ children: (_b = labels == null ? void 0 : labels.clearAll) != null ? _b : "Clear all"
10450
10562
  }
10451
10563
  ),
10452
10564
  /* @__PURE__ */ jsxs(
@@ -10460,9 +10572,8 @@ function FilterPanel({
10460
10572
  }
10461
10573
  ),
10462
10574
  children: [
10463
- "Show ",
10464
- totalSelected > 0 ? `(${totalSelected})` : "",
10465
- " results"
10575
+ (_c = labels == null ? void 0 : labels.showResults) != null ? _c : "Show results",
10576
+ totalSelected > 0 ? ` (${totalSelected})` : ""
10466
10577
  ]
10467
10578
  }
10468
10579
  )
@@ -10487,7 +10598,7 @@ function FilterPanel({
10487
10598
  }
10488
10599
  ),
10489
10600
  children: [
10490
- "Sort",
10601
+ (_d = labels == null ? void 0 : labels.sortLabel) != null ? _d : "Sort",
10491
10602
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" })
10492
10603
  ]
10493
10604
  }
@@ -10597,14 +10708,15 @@ function FilterPanel({
10597
10708
  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",
10598
10709
  children: [
10599
10710
  /* @__PURE__ */ jsx(XIcon, { className: "h-3 w-3" }),
10600
- "Clear all (",
10711
+ (_e = labels == null ? void 0 : labels.clearAll) != null ? _e : "Clear all",
10712
+ " (",
10601
10713
  totalSelected,
10602
10714
  ")"
10603
10715
  ]
10604
10716
  }
10605
10717
  ),
10606
10718
  sortOptions && sortOptions.length > 0 && /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
10607
- /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: "Sort by" }),
10719
+ /* @__PURE__ */ 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" }),
10608
10720
  /* @__PURE__ */ jsxs(Popover, { children: [
10609
10721
  /* @__PURE__ */ jsxs(
10610
10722
  PopoverTrigger,
@@ -10621,7 +10733,7 @@ function FilterPanel({
10621
10733
  }
10622
10734
  ),
10623
10735
  children: [
10624
- (_b = activeSort == null ? void 0 : activeSort.label) != null ? _b : "Default",
10736
+ (_g = activeSort == null ? void 0 : activeSort.label) != null ? _g : "Default",
10625
10737
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-3.5 w-3.5 text-muted-foreground" })
10626
10738
  ]
10627
10739
  }
@@ -10693,7 +10805,7 @@ function FilterPanel({
10693
10805
  {
10694
10806
  onClick: handleClearAll,
10695
10807
  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",
10696
- children: "Remove all filters"
10808
+ children: (_h = labels == null ? void 0 : labels.removeAllFilters) != null ? _h : "Remove all filters"
10697
10809
  }
10698
10810
  )
10699
10811
  ] });
@@ -10962,7 +11074,7 @@ function Picture(_a) {
10962
11074
  "onLoad",
10963
11075
  "onError"
10964
11076
  ]);
10965
- var _a2;
11077
+ var _a2, _b2;
10966
11078
  const ref = React32.useRef(null);
10967
11079
  const [visible, setVisible] = React32.useState(eager);
10968
11080
  const [loaded, setLoaded] = React32.useState(false);
@@ -10990,8 +11102,9 @@ function Picture(_a) {
10990
11102
  }, [src]);
10991
11103
  const webp = webpVariantUrl(src);
10992
11104
  const realSrc = visible ? src : PLACEHOLDER_SRC;
11105
+ const resolvedTitle = (_a2 = imgProps.title) != null ? _a2 : typeof imgProps.alt === "string" && imgProps.alt.trim() ? imgProps.alt : void 0;
10993
11106
  const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
10994
- const fetchPriorityResolved = (_a2 = imgProps.fetchPriority) != null ? _a2 : eager ? void 0 : "low";
11107
+ const fetchPriorityResolved = (_b2 = imgProps.fetchPriority) != null ? _b2 : eager ? void 0 : "low";
10995
11108
  const handleLoad = (e) => {
10996
11109
  if (visible) setLoaded(true);
10997
11110
  onLoad == null ? void 0 : onLoad(e);
@@ -11017,6 +11130,7 @@ function Picture(_a) {
11017
11130
  onLoad: handleLoad,
11018
11131
  onError: handleError
11019
11132
  }, imgProps), {
11133
+ title: resolvedTitle,
11020
11134
  fetchPriority: fetchPriorityResolved,
11021
11135
  style: mergedStyle
11022
11136
  })
@@ -11040,6 +11154,7 @@ function Picture(_a) {
11040
11154
  onLoad: handleLoad,
11041
11155
  onError: handleError
11042
11156
  }, imgProps), {
11157
+ title: resolvedTitle,
11043
11158
  fetchPriority: fetchPriorityResolved,
11044
11159
  style: mergedStyle
11045
11160
  })
@@ -11334,9 +11449,10 @@ function gridCols(total) {
11334
11449
  function Lightbox({
11335
11450
  photos,
11336
11451
  initialIndex,
11337
- onClose
11452
+ onClose,
11453
+ labels
11338
11454
  }) {
11339
- var _a;
11455
+ var _a, _b, _c, _d;
11340
11456
  const [index, setIndex] = React32.useState(initialIndex);
11341
11457
  const total = photos.length;
11342
11458
  const photo = photos[index];
@@ -11369,7 +11485,7 @@ function Lightbox({
11369
11485
  type: "button",
11370
11486
  onClick: onClose,
11371
11487
  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",
11372
- "aria-label": "Close lightbox",
11488
+ "aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
11373
11489
  children: /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5" })
11374
11490
  }
11375
11491
  ),
@@ -11382,7 +11498,7 @@ function Lightbox({
11382
11498
  prev();
11383
11499
  },
11384
11500
  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",
11385
- "aria-label": "Previous photo",
11501
+ "aria-label": (_b = labels == null ? void 0 : labels.previous) != null ? _b : "Previous photo",
11386
11502
  children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-5 w-5" })
11387
11503
  }
11388
11504
  ),
@@ -11395,7 +11511,7 @@ function Lightbox({
11395
11511
  next();
11396
11512
  },
11397
11513
  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",
11398
- "aria-label": "Next photo",
11514
+ "aria-label": (_c = labels == null ? void 0 : labels.next) != null ? _c : "Next photo",
11399
11515
  children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
11400
11516
  }
11401
11517
  ),
@@ -11403,7 +11519,8 @@ function Lightbox({
11403
11519
  Picture,
11404
11520
  {
11405
11521
  src: photo.src,
11406
- alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
11522
+ alt: (_d = photo.alt) != null ? _d : `Photo ${index + 1}`,
11523
+ title: photo.caption,
11407
11524
  className: "max-w-[calc(100%-6rem)] max-h-[calc(100vh-11rem)] object-contain rounded-lg shadow-2xl",
11408
11525
  onClick: (e) => e.stopPropagation()
11409
11526
  }
@@ -11473,6 +11590,7 @@ function PhotoTile({
11473
11590
  {
11474
11591
  src: photo.src,
11475
11592
  alt: (_b = photo.alt) != null ? _b : `Photo ${index + 1}`,
11593
+ title: photo.caption,
11476
11594
  className: "w-full h-full object-cover transition-transform duration-700 group-hover:scale-105",
11477
11595
  loading: "lazy"
11478
11596
  }
@@ -11486,8 +11604,10 @@ function PhotoTile({
11486
11604
  function ShowMoreButton({
11487
11605
  count,
11488
11606
  expanded,
11489
- onClick
11607
+ onClick,
11608
+ labels
11490
11609
  }) {
11610
+ var _a, _b;
11491
11611
  return /* @__PURE__ */ jsx("div", { className: "flex justify-center py-4", children: /* @__PURE__ */ jsx(
11492
11612
  "button",
11493
11613
  {
@@ -11501,10 +11621,11 @@ function ShowMoreButton({
11501
11621
  ),
11502
11622
  children: expanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
11503
11623
  /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
11504
- "Show less"
11624
+ (_a = labels == null ? void 0 : labels.showLess) != null ? _a : "Show less"
11505
11625
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
11506
11626
  /* @__PURE__ */ jsx(LayoutGridIcon, { className: "h-4 w-4 text-muted-foreground" }),
11507
- "See more (",
11627
+ (_b = labels == null ? void 0 : labels.seeMore) != null ? _b : "See more",
11628
+ " (",
11508
11629
  count,
11509
11630
  ")"
11510
11631
  ] })
@@ -11514,7 +11635,8 @@ function ShowMoreButton({
11514
11635
  function GridGallery({
11515
11636
  photos,
11516
11637
  initialVisible,
11517
- onOpen
11638
+ onOpen,
11639
+ labels
11518
11640
  }) {
11519
11641
  const [expanded, setExpanded] = React32.useState(false);
11520
11642
  const cols = gridCols(photos.length);
@@ -11536,7 +11658,8 @@ function GridGallery({
11536
11658
  {
11537
11659
  count: photos.length - initialVisible,
11538
11660
  expanded,
11539
- onClick: () => setExpanded((v) => !v)
11661
+ onClick: () => setExpanded((v) => !v),
11662
+ labels
11540
11663
  }
11541
11664
  )
11542
11665
  ] });
@@ -11544,7 +11667,8 @@ function GridGallery({
11544
11667
  function CompactGridGallery({
11545
11668
  photos,
11546
11669
  initialVisible,
11547
- onOpen
11670
+ onOpen,
11671
+ labels
11548
11672
  }) {
11549
11673
  const [expanded, setExpanded] = React32.useState(false);
11550
11674
  const hasMore = photos.length > initialVisible;
@@ -11565,7 +11689,8 @@ function CompactGridGallery({
11565
11689
  {
11566
11690
  count: photos.length - initialVisible,
11567
11691
  expanded,
11568
- onClick: () => setExpanded((v) => !v)
11692
+ onClick: () => setExpanded((v) => !v),
11693
+ labels
11569
11694
  }
11570
11695
  )
11571
11696
  ] });
@@ -11573,7 +11698,8 @@ function CompactGridGallery({
11573
11698
  function MasonryGallery({
11574
11699
  photos,
11575
11700
  initialVisible,
11576
- onOpen
11701
+ onOpen,
11702
+ labels
11577
11703
  }) {
11578
11704
  const [expanded, setExpanded] = React32.useState(false);
11579
11705
  const hasMore = photos.length > initialVisible;
@@ -11594,6 +11720,7 @@ function MasonryGallery({
11594
11720
  {
11595
11721
  src: p.src,
11596
11722
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
11723
+ title: p.caption,
11597
11724
  className: "w-full h-auto object-cover transition-transform duration-700 group-hover:scale-105",
11598
11725
  loading: "lazy"
11599
11726
  }
@@ -11609,7 +11736,8 @@ function MasonryGallery({
11609
11736
  {
11610
11737
  count: photos.length - initialVisible,
11611
11738
  expanded,
11612
- onClick: () => setExpanded((v) => !v)
11739
+ onClick: () => setExpanded((v) => !v),
11740
+ labels
11613
11741
  }
11614
11742
  )
11615
11743
  ] });
@@ -11633,6 +11761,7 @@ function FilmstripGallery({
11633
11761
  {
11634
11762
  src: p.src,
11635
11763
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
11764
+ title: p.caption,
11636
11765
  className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
11637
11766
  loading: "lazy"
11638
11767
  }
@@ -11646,7 +11775,8 @@ function FilmstripGallery({
11646
11775
  }
11647
11776
  function FeaturedGallery({
11648
11777
  photos,
11649
- onOpen
11778
+ onOpen,
11779
+ labels
11650
11780
  }) {
11651
11781
  const [expanded, setExpanded] = React32.useState(false);
11652
11782
  const featured = photos.slice(0, 3);
@@ -11698,6 +11828,7 @@ function FeaturedGallery({
11698
11828
  {
11699
11829
  src: p.src,
11700
11830
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 4}`,
11831
+ title: p.caption,
11701
11832
  className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
11702
11833
  loading: "lazy"
11703
11834
  }
@@ -11713,7 +11844,8 @@ function FeaturedGallery({
11713
11844
  {
11714
11845
  count: extra.length,
11715
11846
  expanded,
11716
- onClick: () => setExpanded((v) => !v)
11847
+ onClick: () => setExpanded((v) => !v),
11848
+ labels
11717
11849
  }
11718
11850
  )
11719
11851
  ] });
@@ -11781,6 +11913,7 @@ function CarouselGallery({
11781
11913
  {
11782
11914
  src: photo.src,
11783
11915
  alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
11916
+ title: photo.caption,
11784
11917
  className: "h-full w-full object-cover transition-transform duration-500 group-hover/photo:scale-[1.02]",
11785
11918
  loading: "lazy"
11786
11919
  },
@@ -11844,6 +11977,7 @@ function PhotoGallery({
11844
11977
  variant = "grid",
11845
11978
  initialVisible = 6,
11846
11979
  onPhotoClick,
11980
+ labels,
11847
11981
  className
11848
11982
  }) {
11849
11983
  const [lightboxIndex, setLightboxIndex] = React32.useState(null);
@@ -11859,7 +11993,8 @@ function PhotoGallery({
11859
11993
  {
11860
11994
  photos: normalised,
11861
11995
  initialIndex: lightboxIndex,
11862
- onClose: () => setLightboxIndex(null)
11996
+ onClose: () => setLightboxIndex(null),
11997
+ labels
11863
11998
  }
11864
11999
  );
11865
12000
  if (variant === "carousel" || variant === "fullBleed") {
@@ -11887,7 +12022,8 @@ function PhotoGallery({
11887
12022
  {
11888
12023
  photos: normalised,
11889
12024
  initialVisible,
11890
- onOpen: handleOpen
12025
+ onOpen: handleOpen,
12026
+ labels
11891
12027
  }
11892
12028
  ),
11893
12029
  variant === "gridCompact" && /* @__PURE__ */ jsx(
@@ -11895,7 +12031,8 @@ function PhotoGallery({
11895
12031
  {
11896
12032
  photos: normalised,
11897
12033
  initialVisible,
11898
- onOpen: handleOpen
12034
+ onOpen: handleOpen,
12035
+ labels
11899
12036
  }
11900
12037
  ),
11901
12038
  variant === "masonry" && /* @__PURE__ */ jsx(
@@ -11903,11 +12040,12 @@ function PhotoGallery({
11903
12040
  {
11904
12041
  photos: normalised,
11905
12042
  initialVisible,
11906
- onOpen: handleOpen
12043
+ onOpen: handleOpen,
12044
+ labels
11907
12045
  }
11908
12046
  ),
11909
12047
  variant === "filmstrip" && /* @__PURE__ */ jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
11910
- variant === "featured" && /* @__PURE__ */ jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
12048
+ variant === "featured" && /* @__PURE__ */ jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen, labels }),
11911
12049
  variant === "collage" && /* @__PURE__ */ jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
11912
12050
  variant === "collageTight" && /* @__PURE__ */ jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
11913
12051
  lightbox
@@ -12177,6 +12315,8 @@ function PricingTrip({
12177
12315
  departureTimes,
12178
12316
  onBook,
12179
12317
  bookLabel = "Check availability",
12318
+ fromLabel = "From",
12319
+ perPersonLabel = "per person",
12180
12320
  variant = "card",
12181
12321
  sharp = false,
12182
12322
  belowPrice,
@@ -12203,13 +12343,16 @@ function PricingTrip({
12203
12343
  ),
12204
12344
  /* @__PURE__ */ jsxs("div", { className: "relative flex items-center gap-3", children: [
12205
12345
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
12206
- /* @__PURE__ */ jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
12346
+ /* @__PURE__ */ jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
12207
12347
  /* @__PURE__ */ jsxs("div", { className: "flex items-end gap-1.5 flex-wrap", children: [
12208
12348
  /* @__PURE__ */ jsxs("p", { className: "text-lg font-bold text-foreground font-heading leading-none", children: [
12209
12349
  currency,
12210
12350
  " ",
12211
12351
  priceFrom,
12212
- /* @__PURE__ */ jsx("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: "/ per person" })
12352
+ /* @__PURE__ */ jsxs("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: [
12353
+ "/ ",
12354
+ perPersonLabel
12355
+ ] })
12213
12356
  ] }),
12214
12357
  (priceInfo || currencyEstimates && currencyEstimates.length > 0) && /* @__PURE__ */ jsx(
12215
12358
  "button",
@@ -12321,7 +12464,7 @@ function PricingTrip({
12321
12464
  ] }),
12322
12465
  /* @__PURE__ */ jsx("div", { className: "flex-1" }),
12323
12466
  /* @__PURE__ */ jsxs("div", { className: "shrink-0 text-right", children: [
12324
- /* @__PURE__ */ jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
12467
+ /* @__PURE__ */ jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
12325
12468
  /* @__PURE__ */ jsxs("span", { className: "text-xl font-bold text-foreground font-heading leading-none", children: [
12326
12469
  currency,
12327
12470
  " ",
@@ -12350,13 +12493,16 @@ function PricingTrip({
12350
12493
  }
12351
12494
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
12352
12495
  /* @__PURE__ */ jsxs("div", { children: [
12353
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: "From" }),
12496
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: fromLabel }),
12354
12497
  /* @__PURE__ */ jsxs("p", { className: "text-2xl font-bold text-foreground font-heading flex items-center gap-2 flex-wrap", children: [
12355
12498
  /* @__PURE__ */ jsxs("span", { children: [
12356
12499
  currency,
12357
12500
  " ",
12358
12501
  priceFrom,
12359
- /* @__PURE__ */ jsx("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: " / per person" })
12502
+ /* @__PURE__ */ jsxs("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: [
12503
+ " / ",
12504
+ perPersonLabel
12505
+ ] })
12360
12506
  ] }),
12361
12507
  priceInfo && /* @__PURE__ */ jsx(
12362
12508
  "button",
@@ -12623,8 +12769,10 @@ function SiteHeader({
12623
12769
  onSearch,
12624
12770
  onAccount,
12625
12771
  position = variant === "transparent" ? "overlay" : "fixed",
12772
+ labels,
12626
12773
  className
12627
12774
  }) {
12775
+ var _a, _b, _c, _d, _e, _f, _g;
12628
12776
  const t = VARIANT[variant];
12629
12777
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
12630
12778
  const [openMenu, setOpenMenu] = React32.useState(null);
@@ -12682,7 +12830,7 @@ function SiteHeader({
12682
12830
  {
12683
12831
  type: "button",
12684
12832
  onClick: () => setMobileOpen(true),
12685
- "aria-label": "Open menu",
12833
+ "aria-label": (_a = labels == null ? void 0 : labels.openMenu) != null ? _a : "Open menu",
12686
12834
  className: cn(
12687
12835
  "flex lg:hidden h-9 w-9 items-center justify-center rounded-full transition-colors -ml-1.5",
12688
12836
  t.mobileTrigger
@@ -12711,8 +12859,8 @@ function SiteHeader({
12711
12859
  }
12712
12860
  ),
12713
12861
  /* @__PURE__ */ jsx("nav", { className: "hidden lg:flex items-center gap-0.5 mx-auto", children: links.map((link) => {
12714
- var _a, _b;
12715
- const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
12862
+ var _a2, _b2;
12863
+ const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
12716
12864
  const isOpen = openMenu === link.label;
12717
12865
  return /* @__PURE__ */ jsxs(
12718
12866
  "div",
@@ -12724,7 +12872,7 @@ function SiteHeader({
12724
12872
  /* @__PURE__ */ jsxs(
12725
12873
  "a",
12726
12874
  {
12727
- href: (_b = link.href) != null ? _b : "#",
12875
+ href: (_b2 = link.href) != null ? _b2 : "#",
12728
12876
  onClick: hasDropdown ? (e) => e.preventDefault() : void 0,
12729
12877
  className: cn(
12730
12878
  "flex items-center gap-1 px-3.5 py-1.5 rounded-full",
@@ -12773,7 +12921,7 @@ function SiteHeader({
12773
12921
  "button",
12774
12922
  {
12775
12923
  type: "button",
12776
- "aria-label": "Language",
12924
+ "aria-label": (_b = labels == null ? void 0 : labels.language) != null ? _b : "Language",
12777
12925
  className: cn(
12778
12926
  "flex items-center gap-0.5 px-2.5 py-1.5 rounded-full",
12779
12927
  "text-sm font-ui transition-colors",
@@ -12813,7 +12961,7 @@ function SiteHeader({
12813
12961
  {
12814
12962
  type: "button",
12815
12963
  onClick: onSearch,
12816
- "aria-label": "Search",
12964
+ "aria-label": (_c = labels == null ? void 0 : labels.search) != null ? _c : "Search",
12817
12965
  className: cn(
12818
12966
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12819
12967
  t.icon
@@ -12826,7 +12974,7 @@ function SiteHeader({
12826
12974
  {
12827
12975
  type: "button",
12828
12976
  onClick: onAccount,
12829
- "aria-label": "Account",
12977
+ "aria-label": (_d = labels == null ? void 0 : labels.account) != null ? _d : "Account",
12830
12978
  className: cn(
12831
12979
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12832
12980
  t.icon
@@ -12859,7 +13007,7 @@ function SiteHeader({
12859
13007
  {
12860
13008
  type: "button",
12861
13009
  onClick: () => setMobileOpen(false),
12862
- "aria-label": "Close menu",
13010
+ "aria-label": (_e = labels == null ? void 0 : labels.closeMenu) != null ? _e : "Close menu",
12863
13011
  className: cn(
12864
13012
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12865
13013
  t.mobileTrigger
@@ -12869,8 +13017,8 @@ function SiteHeader({
12869
13017
  )
12870
13018
  ] }),
12871
13019
  /* @__PURE__ */ jsx("nav", { className: "flex-1 overflow-y-auto px-6 py-6 flex flex-col gap-1", children: links.map((link) => {
12872
- var _a, _b;
12873
- const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
13020
+ var _a2, _b2;
13021
+ const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
12874
13022
  const isExpanded = openMobileSection === link.label;
12875
13023
  return /* @__PURE__ */ jsxs("div", { children: [
12876
13024
  hasDropdown ? /* @__PURE__ */ jsxs(
@@ -12898,7 +13046,7 @@ function SiteHeader({
12898
13046
  ) : /* @__PURE__ */ jsx(
12899
13047
  "a",
12900
13048
  {
12901
- href: (_b = link.href) != null ? _b : "#",
13049
+ href: (_b2 = link.href) != null ? _b2 : "#",
12902
13050
  onClick: () => setMobileOpen(false),
12903
13051
  className: cn(
12904
13052
  "flex items-center py-4 text-xl font-ui font-black transition-colors border-b border-white/8",
@@ -12908,11 +13056,11 @@ function SiteHeader({
12908
13056
  }
12909
13057
  ),
12910
13058
  hasDropdown && isExpanded && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0 pl-4 pb-2", children: link.items.map((item) => {
12911
- var _a2;
13059
+ var _a3;
12912
13060
  return /* @__PURE__ */ jsx(
12913
13061
  "a",
12914
13062
  {
12915
- href: (_a2 = item.href) != null ? _a2 : "#",
13063
+ href: (_a3 = item.href) != null ? _a3 : "#",
12916
13064
  onClick: () => setMobileOpen(false),
12917
13065
  className: cn(
12918
13066
  "py-3 text-base font-ui font-bold transition-colors border-b",
@@ -12965,7 +13113,7 @@ function SiteHeader({
12965
13113
  onSearch == null ? void 0 : onSearch();
12966
13114
  setMobileOpen(false);
12967
13115
  },
12968
- "aria-label": "Search",
13116
+ "aria-label": (_f = labels == null ? void 0 : labels.search) != null ? _f : "Search",
12969
13117
  className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
12970
13118
  children: /* @__PURE__ */ jsx(SearchIcon, { className: "h-[18px] w-[18px]" })
12971
13119
  }
@@ -12978,7 +13126,7 @@ function SiteHeader({
12978
13126
  onAccount == null ? void 0 : onAccount();
12979
13127
  setMobileOpen(false);
12980
13128
  },
12981
- "aria-label": "Account",
13129
+ "aria-label": (_g = labels == null ? void 0 : labels.account) != null ? _g : "Account",
12982
13130
  className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
12983
13131
  children: /* @__PURE__ */ jsx(UserIcon, { className: "h-[18px] w-[18px]" })
12984
13132
  }
@@ -13128,9 +13276,11 @@ function HeartIcon({ filled = false }) {
13128
13276
  );
13129
13277
  }
13130
13278
  function TripCardEditorial(props) {
13279
+ var _a, _b, _c, _d;
13131
13280
  const {
13132
13281
  image,
13133
13282
  imageAlt = "",
13283
+ labels,
13134
13284
  title,
13135
13285
  description,
13136
13286
  nights,
@@ -13188,7 +13338,7 @@ function TripCardEditorial(props) {
13188
13338
  "button",
13189
13339
  {
13190
13340
  type: "button",
13191
- "aria-label": favorited ? "Remove from favorites" : "Add to favorites",
13341
+ "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",
13192
13342
  "aria-pressed": favorited,
13193
13343
  onClick: handleFav,
13194
13344
  className: cn(
@@ -13232,7 +13382,7 @@ function TripCardEditorial(props) {
13232
13382
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13233
13383
  nights,
13234
13384
  " ",
13235
- nights === 1 ? "night" : "nights"
13385
+ nights === 1 ? (_c = labels == null ? void 0 : labels.night) != null ? _c : "night" : (_d = labels == null ? void 0 : labels.nights) != null ? _d : "nights"
13236
13386
  ] })
13237
13387
  ] }) : /* @__PURE__ */ jsx("span", {}),
13238
13388
  price && /* @__PURE__ */ jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
@@ -13257,12 +13407,14 @@ function TripCardEditorial(props) {
13257
13407
  ] });
13258
13408
  }
13259
13409
  function TripCard(props) {
13410
+ var _a, _b;
13260
13411
  if (props.variant === "editorial") {
13261
13412
  return /* @__PURE__ */ jsx(TripCardEditorial, __spreadValues({}, props));
13262
13413
  }
13263
13414
  const {
13264
13415
  image,
13265
13416
  imageAlt = "",
13417
+ labels,
13266
13418
  status,
13267
13419
  nights,
13268
13420
  period,
@@ -13275,6 +13427,7 @@ function TripCard(props) {
13275
13427
  } = props;
13276
13428
  const s = sizeConfig[size];
13277
13429
  const statusInfo = status ? statusConfig[status] : null;
13430
+ 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;
13278
13431
  const meta = [
13279
13432
  nights ? `${nights} nights` : null,
13280
13433
  period != null ? period : null
@@ -13300,7 +13453,7 @@ function TripCard(props) {
13300
13453
  /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent" }),
13301
13454
  statusInfo && /* @__PURE__ */ jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ 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: [
13302
13455
  /* @__PURE__ */ jsx("span", { className: "text-primary", children: statusInfo.icon }),
13303
- /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusInfo.label })
13456
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusLabel })
13304
13457
  ] }) }),
13305
13458
  !statusInfo && /* @__PURE__ */ jsx("div", { className: "relative z-10" }),
13306
13459
  /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
@@ -13394,6 +13547,7 @@ function BlogCard({
13394
13547
  {
13395
13548
  src: image,
13396
13549
  alt: imageAlt,
13550
+ title: imageAlt || void 0,
13397
13551
  loading: "lazy",
13398
13552
  className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
13399
13553
  }
@@ -13747,6 +13901,8 @@ function TripHeader({
13747
13901
  breadcrumb,
13748
13902
  destination,
13749
13903
  duration,
13904
+ groupSize,
13905
+ labels,
13750
13906
  tagline,
13751
13907
  chips,
13752
13908
  belowMeta,
@@ -13754,7 +13910,7 @@ function TripHeader({
13754
13910
  uiVariant = "v1",
13755
13911
  className
13756
13912
  }) {
13757
- var _a;
13913
+ var _a, _b, _c, _d, _e, _f, _g;
13758
13914
  const [heroIndex, setHeroIndex] = React32.useState(0);
13759
13915
  const [videoReady, setVideoReady] = React32.useState(false);
13760
13916
  const videoRef = React32.useRef(null);
@@ -13772,7 +13928,7 @@ function TripHeader({
13772
13928
  const currentSrc = heroSrc(safeIndex);
13773
13929
  const showCarousel = !videoUrl && validImages.length > 1;
13774
13930
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
13775
- const hasMeta = !!(destination || duration);
13931
+ const hasMeta = !!(destination || duration || groupSize);
13776
13932
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13777
13933
  React32.useEffect(() => {
13778
13934
  if (!videoUrl) return;
@@ -13879,7 +14035,7 @@ function TripHeader({
13879
14035
  (i) => (i - 1 + validImages.length) % validImages.length
13880
14036
  ),
13881
14037
  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",
13882
- "aria-label": "Imagem anterior",
14038
+ "aria-label": (_b = labels == null ? void 0 : labels.previousImage) != null ? _b : "Previous image",
13883
14039
  children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-5 w-5" })
13884
14040
  }
13885
14041
  ),
@@ -13889,7 +14045,7 @@ function TripHeader({
13889
14045
  type: "button",
13890
14046
  onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
13891
14047
  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",
13892
- "aria-label": "Pr\xF3xima imagem",
14048
+ "aria-label": (_c = labels == null ? void 0 : labels.nextImage) != null ? _c : "Next image",
13893
14049
  children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
13894
14050
  }
13895
14051
  ),
@@ -13932,15 +14088,19 @@ function TripHeader({
13932
14088
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13933
14089
  nights,
13934
14090
  " ",
13935
- nights === 1 ? "noite" : "noites"
14091
+ nights === 1 ? (_d = labels == null ? void 0 : labels.night) != null ? _d : "night" : (_e = labels == null ? void 0 : labels.nights) != null ? _e : "nights"
13936
14092
  ] }),
13937
14093
  /* @__PURE__ */ jsx("span", { className: "text-white/40", children: "\xB7" }),
13938
14094
  /* @__PURE__ */ jsx(SunIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
13939
14095
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13940
14096
  duration.days,
13941
14097
  " ",
13942
- duration.days === 1 ? "dia" : "dias"
14098
+ duration.days === 1 ? (_f = labels == null ? void 0 : labels.day) != null ? _f : "day" : (_g = labels == null ? void 0 : labels.days) != null ? _g : "days"
13943
14099
  ] })
14100
+ ] }),
14101
+ groupSize && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-white/85", children: [
14102
+ /* @__PURE__ */ jsx(UsersIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
14103
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-ui font-semibold", children: groupSize })
13944
14104
  ] })
13945
14105
  ] }) : tagline ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm sm:text-base text-white/80 font-ui", children: tagline }) : null,
13946
14106
  chips && chips.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-3 flex flex-wrap items-center gap-1.5", children: chips.map((chip, i) => /* @__PURE__ */ jsx(Chip, { href: chip.href, children: chip.label }, i)) }),
@@ -14385,7 +14545,10 @@ function Stars({ count = 5 }) {
14385
14545
  i
14386
14546
  )) });
14387
14547
  }
14388
- function ItineraryTimeline({ steps }) {
14548
+ function ItineraryTimeline({
14549
+ steps,
14550
+ transferLabel
14551
+ }) {
14389
14552
  return /* @__PURE__ */ jsx("ol", { className: "relative flex flex-col gap-0", children: steps.map((step, i) => /* @__PURE__ */ jsxs("li", { className: "relative flex gap-4 pb-8 last:pb-0", children: [
14390
14553
  i < steps.length - 1 && /* @__PURE__ */ jsx("div", { className: "absolute left-3.5 top-7 bottom-0 w-px bg-border" }),
14391
14554
  /* @__PURE__ */ 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__ */ jsx("span", { className: "text-[10px] font-bold text-primary font-ui", children: i + 1 }) }),
@@ -14396,7 +14559,7 @@ function ItineraryTimeline({ steps }) {
14396
14559
  /* @__PURE__ */ jsx(ClockIcon, { className: "h-3 w-3 mr-1" }),
14397
14560
  step.duration
14398
14561
  ] }),
14399
- step.isTransfer && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: "Transfer" })
14562
+ step.isTransfer && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: transferLabel != null ? transferLabel : "Transfer" })
14400
14563
  ] }),
14401
14564
  /* @__PURE__ */ 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 })
14402
14565
  ] })
@@ -14413,6 +14576,7 @@ function TripPage({
14413
14576
  tagline,
14414
14577
  destination,
14415
14578
  duration,
14579
+ groupSize,
14416
14580
  images,
14417
14581
  videoUrl,
14418
14582
  breadcrumb,
@@ -14436,6 +14600,7 @@ function TripPage({
14436
14600
  whenItOperates,
14437
14601
  food,
14438
14602
  foodGallery,
14603
+ foodGalleryVariant = "gridCompact",
14439
14604
  termsAndConditions,
14440
14605
  meetingPoints,
14441
14606
  meetingPoint,
@@ -14455,7 +14620,13 @@ function TripPage({
14455
14620
  currencyEstimates,
14456
14621
  priceInfo,
14457
14622
  onBook,
14623
+ onBookingSubmit,
14624
+ bookingLoading,
14625
+ bookingDefaults,
14626
+ bookingLabels,
14458
14627
  bookLabel,
14628
+ fromLabel,
14629
+ perPersonLabel,
14459
14630
  siteHeader,
14460
14631
  uiVariant = "v1",
14461
14632
  features,
@@ -14632,6 +14803,15 @@ function TripPage({
14632
14803
  breadcrumb,
14633
14804
  destination,
14634
14805
  duration,
14806
+ groupSize,
14807
+ labels: {
14808
+ night: labels == null ? void 0 : labels.night,
14809
+ nights: labels == null ? void 0 : labels.nights,
14810
+ day: labels == null ? void 0 : labels.day,
14811
+ days: labels == null ? void 0 : labels.days,
14812
+ previousImage: labels == null ? void 0 : labels.previousImage,
14813
+ nextImage: labels == null ? void 0 : labels.nextImage
14814
+ },
14635
14815
  tagline,
14636
14816
  chips,
14637
14817
  siteHeader,
@@ -14692,7 +14872,7 @@ function TripPage({
14692
14872
  )) })
14693
14873
  ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
14694
14874
  /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
14695
- /* @__PURE__ */ jsx(ItineraryTimeline, { steps: itinerary })
14875
+ /* @__PURE__ */ jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
14696
14876
  ] }),
14697
14877
  included && included.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
14698
14878
  /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
@@ -14729,7 +14909,7 @@ function TripPage({
14729
14909
  id: "trip-section-when-it-operates",
14730
14910
  className: "scroll-mt-20 border-b border-border",
14731
14911
  children: [
14732
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14912
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14733
14913
  (sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsx(CalendarIcon, { className: "h-5 w-5 text-primary" }),
14734
14914
  (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
14735
14915
  ] }) }),
@@ -14744,7 +14924,7 @@ function TripPage({
14744
14924
  id: "trip-section-accommodation",
14745
14925
  className: "scroll-mt-20 border-b border-border",
14746
14926
  children: [
14747
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14927
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14748
14928
  (sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsx(BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
14749
14929
  (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
14750
14930
  ] }) }),
@@ -14753,6 +14933,13 @@ function TripPage({
14753
14933
  accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsx(
14754
14934
  PhotoGallery,
14755
14935
  {
14936
+ labels: {
14937
+ seeMore: labels == null ? void 0 : labels.seeMore,
14938
+ showLess: labels == null ? void 0 : labels.showLess,
14939
+ close: labels == null ? void 0 : labels.galleryClose,
14940
+ previous: labels == null ? void 0 : labels.galleryPrevious,
14941
+ next: labels == null ? void 0 : labels.galleryNext
14942
+ },
14756
14943
  photos: accommodationGallery,
14757
14944
  variant: accommodationGalleryVariant,
14758
14945
  initialVisible: 6
@@ -14769,7 +14956,7 @@ function TripPage({
14769
14956
  id: "trip-section-food",
14770
14957
  className: "scroll-mt-20 border-b border-border",
14771
14958
  children: [
14772
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14959
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14773
14960
  (sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsx(UtensilsIcon, { className: "h-5 w-5 text-primary" }),
14774
14961
  (_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
14775
14962
  ] }) }),
@@ -14778,8 +14965,15 @@ function TripPage({
14778
14965
  foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsx(
14779
14966
  PhotoGallery,
14780
14967
  {
14968
+ labels: {
14969
+ seeMore: labels == null ? void 0 : labels.seeMore,
14970
+ showLess: labels == null ? void 0 : labels.showLess,
14971
+ close: labels == null ? void 0 : labels.galleryClose,
14972
+ previous: labels == null ? void 0 : labels.galleryPrevious,
14973
+ next: labels == null ? void 0 : labels.galleryNext
14974
+ },
14781
14975
  photos: foodGallery,
14782
- variant: "gridCompact",
14976
+ variant: foodGalleryVariant,
14783
14977
  initialVisible: 6
14784
14978
  }
14785
14979
  ) })
@@ -14794,18 +14988,21 @@ function TripPage({
14794
14988
  id: "trip-section-meeting",
14795
14989
  className: "scroll-mt-20 border-b border-border",
14796
14990
  children: [
14797
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14991
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14798
14992
  (sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsx(MapPinIcon, { className: "h-5 w-5 text-primary" }),
14799
14993
  (_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
14800
14994
  ] }) }),
14801
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
14802
- /* @__PURE__ */ jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
14803
- /* @__PURE__ */ jsxs("div", { children: [
14804
- mp.type && /* @__PURE__ */ 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" }),
14805
- /* @__PURE__ */ jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
14806
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
14807
- ] })
14808
- ] }, i)) }) })
14995
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
14996
+ var _a2, _b2, _c2;
14997
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
14998
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
14999
+ /* @__PURE__ */ jsxs("div", { children: [
15000
+ mp.type && /* @__PURE__ */ 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" }),
15001
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15002
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15003
+ ] })
15004
+ ] }, i);
15005
+ }) }) })
14809
15006
  ]
14810
15007
  }
14811
15008
  ),
@@ -14816,7 +15013,7 @@ function TripPage({
14816
15013
  id: "trip-section-how-to-get-there",
14817
15014
  className: "scroll-mt-20 border-b border-border",
14818
15015
  children: [
14819
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15016
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14820
15017
  (sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsx(CompassIcon, { className: "h-5 w-5 text-primary" }),
14821
15018
  (_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
14822
15019
  ] }) }),
@@ -14831,7 +15028,7 @@ function TripPage({
14831
15028
  id: "trip-section-weather",
14832
15029
  className: "scroll-mt-20 border-b border-border",
14833
15030
  children: [
14834
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15031
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14835
15032
  (sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsx(SunIcon, { className: "h-5 w-5 text-primary" }),
14836
15033
  (_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
14837
15034
  ] }) }),
@@ -14846,7 +15043,7 @@ function TripPage({
14846
15043
  id: "trip-section-what-to-bring",
14847
15044
  className: "scroll-mt-20 border-b border-border",
14848
15045
  children: [
14849
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15046
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14850
15047
  (sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsx(BackpackIcon, { className: "h-5 w-5 text-primary" }),
14851
15048
  (_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
14852
15049
  ] }) }),
@@ -14861,7 +15058,7 @@ function TripPage({
14861
15058
  id: "trip-section-optional-extras",
14862
15059
  className: "scroll-mt-20 border-b border-border",
14863
15060
  children: [
14864
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15061
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14865
15062
  (sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsx(CherryIcon, { className: "h-5 w-5 text-primary" }),
14866
15063
  (_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
14867
15064
  ] }) }),
@@ -14876,7 +15073,7 @@ function TripPage({
14876
15073
  id: "trip-section-terms",
14877
15074
  className: "scroll-mt-20 border-b border-border",
14878
15075
  children: [
14879
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15076
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14880
15077
  (sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsx(ReceiptIcon, { className: "h-5 w-5 text-primary" }),
14881
15078
  (_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
14882
15079
  ] }) }),
@@ -14888,7 +15085,7 @@ function TripPage({
14888
15085
  }
14889
15086
  ),
14890
15087
  faqs && faqs.length > 0 && (() => {
14891
- var _a2;
15088
+ var _a2, _b2, _c2;
14892
15089
  const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
14893
15090
  const hiddenCount = faqs.length - visibleFaqs.length;
14894
15091
  return /* @__PURE__ */ jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
@@ -14910,10 +15107,11 @@ function TripPage({
14910
15107
  ),
14911
15108
  children: faqsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
14912
15109
  /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
14913
- "Show less"
15110
+ (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
14914
15111
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
14915
15112
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
14916
- "See more (",
15113
+ (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
15114
+ " (",
14917
15115
  hiddenCount,
14918
15116
  ")"
14919
15117
  ] })
@@ -14954,6 +15152,8 @@ function TripPage({
14954
15152
  departureTimes,
14955
15153
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
14956
15154
  bookLabel: bookLabel != null ? bookLabel : "Check availability",
15155
+ fromLabel,
15156
+ perPersonLabel,
14957
15157
  variant: "card",
14958
15158
  belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
14959
15159
  benefits,
@@ -14996,6 +15196,8 @@ function TripPage({
14996
15196
  departureTimes,
14997
15197
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
14998
15198
  bookLabel: bookLabel != null ? bookLabel : "Check availability",
15199
+ fromLabel,
15200
+ perPersonLabel,
14999
15201
  variant: "card",
15000
15202
  belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15001
15203
  benefits,
@@ -15008,12 +15210,27 @@ function TripPage({
15008
15210
  gallery && gallery.length > 0 && /* @__PURE__ */ jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsx(
15009
15211
  PhotoGallery,
15010
15212
  {
15213
+ labels: {
15214
+ seeMore: labels == null ? void 0 : labels.seeMore,
15215
+ showLess: labels == null ? void 0 : labels.showLess,
15216
+ close: labels == null ? void 0 : labels.galleryClose,
15217
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15218
+ next: labels == null ? void 0 : labels.galleryNext
15219
+ },
15011
15220
  photos: gallery,
15012
15221
  variant: "gridCompact",
15013
15222
  initialVisible: 8
15014
15223
  }
15015
15224
  ) }),
15016
- gallery && gallery.length > 0 && /* @__PURE__ */ jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsx(BookingForm, { onSubmit: onBook ? (values) => onBook() : void 0 }) }) }),
15225
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsx(
15226
+ BookingForm,
15227
+ {
15228
+ labels: bookingLabels,
15229
+ defaultValues: bookingDefaults,
15230
+ onSubmit: onBookingSubmit,
15231
+ loading: bookingLoading
15232
+ }
15233
+ ) }) }),
15017
15234
  /* @__PURE__ */ 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__ */ jsx(
15018
15235
  PricingTrip,
15019
15236
  {
@@ -15021,6 +15238,8 @@ function TripPage({
15021
15238
  currency,
15022
15239
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15023
15240
  bookLabel: bookLabel != null ? bookLabel : "Book now",
15241
+ fromLabel,
15242
+ perPersonLabel,
15024
15243
  variant: "compact",
15025
15244
  sharp: true,
15026
15245
  priceInfo,
@@ -15054,6 +15273,7 @@ function CategoryPage2({
15054
15273
  trustpilotMini,
15055
15274
  breadcrumb,
15056
15275
  siteHeader,
15276
+ heroRightSlot,
15057
15277
  popularTours,
15058
15278
  popularToursTitle = "More adventures calling your name",
15059
15279
  popularToursEyebrow = "Popular tours",
@@ -15064,6 +15284,7 @@ function CategoryPage2({
15064
15284
  sortOptions,
15065
15285
  defaultSort,
15066
15286
  tripsInitialCount = 15,
15287
+ tripListingSlot,
15067
15288
  trustpilot,
15068
15289
  reviewsTitle = "Don't just take our word for it",
15069
15290
  reviewsSubtitle,
@@ -15080,6 +15301,12 @@ function CategoryPage2({
15080
15301
  faqInitialCount = 5,
15081
15302
  gallery,
15082
15303
  galleryTitle,
15304
+ loadMoreLabel,
15305
+ showLessLabel,
15306
+ seeMoreLabel,
15307
+ viewAllPostsLabel,
15308
+ cardLabels,
15309
+ filterLabels,
15083
15310
  className
15084
15311
  }) {
15085
15312
  var _a;
@@ -15236,7 +15463,8 @@ function CategoryPage2({
15236
15463
  /* @__PURE__ */ jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight max-w-3xl", children: title }),
15237
15464
  intro && /* @__PURE__ */ 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 }),
15238
15465
  trustpilotMini && /* @__PURE__ */ jsx("div", { className: "mt-5 max-w-sm", children: /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) })
15239
- ] })
15466
+ ] }),
15467
+ heroRightSlot && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-5 z-20 sm:bottom-6", children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex max-w-6xl justify-end px-6 sm:px-8", children: /* @__PURE__ */ jsx("div", { className: "pointer-events-auto", children: heroRightSlot }) }) })
15240
15468
  ]
15241
15469
  }
15242
15470
  ),
@@ -15254,6 +15482,7 @@ function CategoryPage2({
15254
15482
  return /* @__PURE__ */ jsx(
15255
15483
  TripCard,
15256
15484
  __spreadProps(__spreadValues({}, cardProps), {
15485
+ labels: cardLabels,
15257
15486
  variant: "overlay",
15258
15487
  size: (_b = cardProps.size) != null ? _b : "md"
15259
15488
  }),
@@ -15263,63 +15492,68 @@ function CategoryPage2({
15263
15492
  ] }),
15264
15493
  /* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 pt-6 sm:pt-8 pb-12", children: [
15265
15494
  (tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
15266
- filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(
15267
- FilterPanel,
15268
- {
15269
- variant: "horizontal",
15270
- groups: filterGroups,
15271
- value: filterValue,
15272
- onChange: setFilterValue,
15273
- onClearAll: () => setFilterValue({}),
15274
- sortOptions,
15275
- sort,
15276
- onSortChange: setSort
15277
- }
15278
- ) }),
15279
- /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
15280
- sortedTrips.length,
15281
- " ",
15282
- sortedTrips.length === 1 ? "trip" : "trips",
15283
- " found"
15284
- ] }),
15285
- (() => {
15286
- const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
15287
- const hiddenCount = sortedTrips.length - visibleTrips.length;
15288
- return /* @__PURE__ */ jsxs(Fragment, { children: [
15289
- /* @__PURE__ */ 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) => {
15290
- const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
15291
- return /* @__PURE__ */ jsx(
15292
- TripCard,
15293
- __spreadProps(__spreadValues({}, cardProps), {
15294
- className: cn("w-full h-auto", cardProps.className)
15295
- }),
15296
- i
15297
- );
15298
- }) }),
15299
- sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsx(
15300
- "button",
15301
- {
15302
- type: "button",
15303
- onClick: () => setTripsExpanded((v) => !v),
15304
- className: cn(
15305
- "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15306
- "text-sm font-semibold text-foreground shadow-sm",
15307
- "hover:bg-muted transition-colors duration-150",
15308
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15309
- ),
15310
- children: tripsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
15311
- /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15312
- "Show less"
15313
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15314
- /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15315
- "Load more (",
15316
- hiddenCount,
15317
- ")"
15318
- ] })
15319
- }
15320
- ) })
15321
- ] });
15322
- })()
15495
+ tripListingSlot != null ? tripListingSlot : /* @__PURE__ */ jsxs(Fragment, { children: [
15496
+ filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(
15497
+ FilterPanel,
15498
+ {
15499
+ variant: "horizontal",
15500
+ labels: filterLabels,
15501
+ groups: filterGroups,
15502
+ value: filterValue,
15503
+ onChange: setFilterValue,
15504
+ onClearAll: () => setFilterValue({}),
15505
+ sortOptions,
15506
+ sort,
15507
+ onSortChange: setSort
15508
+ }
15509
+ ) }),
15510
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
15511
+ sortedTrips.length,
15512
+ " ",
15513
+ sortedTrips.length === 1 ? "trip" : "trips",
15514
+ " found"
15515
+ ] }),
15516
+ (() => {
15517
+ const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
15518
+ const hiddenCount = sortedTrips.length - visibleTrips.length;
15519
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
15520
+ /* @__PURE__ */ 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) => {
15521
+ const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
15522
+ return /* @__PURE__ */ jsx(
15523
+ TripCard,
15524
+ __spreadProps(__spreadValues({}, cardProps), {
15525
+ labels: cardLabels,
15526
+ className: cn("w-full h-auto", cardProps.className)
15527
+ }),
15528
+ i
15529
+ );
15530
+ }) }),
15531
+ sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsx(
15532
+ "button",
15533
+ {
15534
+ type: "button",
15535
+ onClick: () => setTripsExpanded((v) => !v),
15536
+ className: cn(
15537
+ "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15538
+ "text-sm font-semibold text-foreground shadow-sm",
15539
+ "hover:bg-muted transition-colors duration-150",
15540
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15541
+ ),
15542
+ children: tripsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
15543
+ /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15544
+ showLessLabel != null ? showLessLabel : "Show less"
15545
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15546
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15547
+ loadMoreLabel != null ? loadMoreLabel : "Load more",
15548
+ " (",
15549
+ hiddenCount,
15550
+ ")"
15551
+ ] })
15552
+ }
15553
+ ) })
15554
+ ] });
15555
+ })()
15556
+ ] })
15323
15557
  ] }),
15324
15558
  trustpilot && /* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12 border-t border-border", children: [
15325
15559
  /* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground font-heading mb-2", children: reviewsTitle }),
@@ -15356,7 +15590,7 @@ function CategoryPage2({
15356
15590
  href: travelGuideHref != null ? travelGuideHref : blogPostsViewAllHref,
15357
15591
  className: "inline-flex items-center gap-1.5 text-sm font-semibold text-primary hover:underline",
15358
15592
  children: [
15359
- travelGuideHref ? travelGuideLabel : "View all posts",
15593
+ travelGuideHref ? travelGuideLabel : viewAllPostsLabel != null ? viewAllPostsLabel : "View all posts",
15360
15594
  /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4" })
15361
15595
  ]
15362
15596
  }
@@ -15385,10 +15619,11 @@ function CategoryPage2({
15385
15619
  ),
15386
15620
  children: faqsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
15387
15621
  /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15388
- "Show less"
15622
+ showLessLabel != null ? showLessLabel : "Show less"
15389
15623
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15390
15624
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15391
- "See more (",
15625
+ seeMoreLabel != null ? seeMoreLabel : "See more",
15626
+ " (",
15392
15627
  hiddenCount,
15393
15628
  ")"
15394
15629
  ] })
@@ -15456,6 +15691,7 @@ function ActivityCard({
15456
15691
  {
15457
15692
  src: image,
15458
15693
  alt: imageAlt,
15694
+ title: imageAlt || void 0,
15459
15695
  className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
15460
15696
  }
15461
15697
  ),
@@ -17157,7 +17393,1402 @@ function StickyBookingCard({
17157
17393
  }
17158
17394
  );
17159
17395
  }
17396
+ var DEFAULT_TRUSTPILOT = {
17397
+ businessUnitId: "6171e6a56fc555750dd81ae7",
17398
+ templateId: "5419b732fbfb950b10de65e5",
17399
+ locale: "en-US",
17400
+ styleHeight: "24px",
17401
+ styleWidth: "100%",
17402
+ token: "d3580e48-fedc-4b14-b705-172180cf241d",
17403
+ theme: "dark",
17404
+ fallbackHref: "https://www.trustpilot.com/review/planetaexo.com",
17405
+ fallbackLabel: "Excellent"
17406
+ };
17407
+ function RatingStars({ stars = 5 }) {
17408
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", "aria-hidden": true, children: Array.from({ length: 5 }).map((_, i) => {
17409
+ const filled = i + 1 <= Math.round(stars);
17410
+ return /* @__PURE__ */ jsx(
17411
+ "span",
17412
+ {
17413
+ className: cn(
17414
+ "flex h-5 w-5 items-center justify-center rounded-[3px]",
17415
+ filled ? "bg-primary" : "bg-white/30"
17416
+ ),
17417
+ children: /* @__PURE__ */ jsx(StarIcon, { className: "h-3 w-3 fill-white text-white" })
17418
+ },
17419
+ i
17420
+ );
17421
+ }) });
17422
+ }
17423
+ function Rating({ label, stars = 5, provider, href }) {
17424
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
17425
+ label && /* @__PURE__ */ jsx("span", { className: "text-sm font-ui font-bold text-white", children: label }),
17426
+ /* @__PURE__ */ jsx(RatingStars, { stars }),
17427
+ provider && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-sm font-ui font-bold text-white", children: [
17428
+ /* @__PURE__ */ jsx(StarIcon, { className: "h-4 w-4 fill-primary text-primary" }),
17429
+ provider
17430
+ ] })
17431
+ ] });
17432
+ if (href) {
17433
+ return /* @__PURE__ */ jsx(
17434
+ "a",
17435
+ {
17436
+ href,
17437
+ target: "_blank",
17438
+ rel: "noreferrer noopener",
17439
+ "aria-label": `${label != null ? label : ""} ${stars} out of 5 \u2014 ${provider != null ? provider : "reviews"}`.trim(),
17440
+ className: "inline-flex items-center gap-2.5 transition-opacity hover:opacity-90",
17441
+ children: content
17442
+ }
17443
+ );
17444
+ }
17445
+ return /* @__PURE__ */ jsx("div", { className: "inline-flex items-center gap-2.5", children: content });
17446
+ }
17447
+ function HomeHeader({
17448
+ images,
17449
+ videoUrl,
17450
+ eyebrow,
17451
+ title,
17452
+ subtitle,
17453
+ cta,
17454
+ trustpilot,
17455
+ rating,
17456
+ pressLogos,
17457
+ pressLabel = "In the press",
17458
+ pressLabelHref,
17459
+ siteHeader,
17460
+ align = "center",
17461
+ className
17462
+ }) {
17463
+ var _a;
17464
+ const [heroIndex, setHeroIndex] = React32.useState(0);
17465
+ const [videoReady, setVideoReady] = React32.useState(false);
17466
+ const videoRef = React32.useRef(null);
17467
+ const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
17468
+ const validImages = React32.useMemo(
17469
+ () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
17470
+ [images]
17471
+ );
17472
+ const hasHeroImage = validImages.length > 0;
17473
+ const heroSrc = (i) => {
17474
+ var _a2;
17475
+ return (_a2 = validImages[i]) != null ? _a2 : "";
17476
+ };
17477
+ const safeIndex = Math.min(heroIndex, Math.max(0, validImages.length - 1));
17478
+ const currentSrc = heroSrc(safeIndex);
17479
+ const showCarousel = !videoUrl && validImages.length > 1;
17480
+ const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
17481
+ useHlsVideo(videoRef, isHls ? videoUrl : void 0);
17482
+ React32.useEffect(() => {
17483
+ if (!videoUrl) return;
17484
+ const el = videoRef.current;
17485
+ if (!el) return;
17486
+ const observer = new IntersectionObserver(
17487
+ ([entry]) => {
17488
+ if (entry.isIntersecting) {
17489
+ el.play().catch(() => {
17490
+ });
17491
+ } else {
17492
+ el.pause();
17493
+ }
17494
+ },
17495
+ { threshold: 0.1 }
17496
+ );
17497
+ observer.observe(el);
17498
+ return () => observer.disconnect();
17499
+ }, [videoUrl]);
17500
+ const isCenter = align === "center";
17501
+ return /* @__PURE__ */ jsxs(
17502
+ "section",
17503
+ {
17504
+ className: cn(
17505
+ "relative w-full overflow-hidden",
17506
+ "h-screen min-h-[640px]",
17507
+ hasHeroImage ? "bg-muted" : "bg-zinc-900",
17508
+ className
17509
+ ),
17510
+ "data-home-header-align": align,
17511
+ children: [
17512
+ !videoUrl && !hasHeroImage && /* @__PURE__ */ jsx(
17513
+ "div",
17514
+ {
17515
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950",
17516
+ "aria-hidden": true
17517
+ }
17518
+ ),
17519
+ videoUrl ? /* @__PURE__ */ jsxs(Fragment, { children: [
17520
+ hasHeroImage ? /* @__PURE__ */ jsx(
17521
+ Picture,
17522
+ {
17523
+ src: validImages[0],
17524
+ alt: "",
17525
+ "aria-hidden": true,
17526
+ fetchPriority: "high",
17527
+ eager: true,
17528
+ className: cn(
17529
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
17530
+ videoReady ? "opacity-0 pointer-events-none" : "opacity-100"
17531
+ )
17532
+ }
17533
+ ) : /* @__PURE__ */ jsx(
17534
+ "div",
17535
+ {
17536
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950 transition-opacity duration-700",
17537
+ "aria-hidden": true
17538
+ }
17539
+ ),
17540
+ /* @__PURE__ */ jsx(
17541
+ "video",
17542
+ {
17543
+ ref: videoRef,
17544
+ src: isHls ? void 0 : videoUrl,
17545
+ autoPlay: true,
17546
+ muted: true,
17547
+ loop: true,
17548
+ playsInline: true,
17549
+ preload: "auto",
17550
+ poster: hasHeroImage ? validImages[0] : void 0,
17551
+ onCanPlay: () => setVideoReady(true),
17552
+ className: cn(
17553
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
17554
+ videoReady ? "opacity-100" : "opacity-0"
17555
+ )
17556
+ }
17557
+ )
17558
+ ] }) : hasHeroImage ? /* @__PURE__ */ jsx(
17559
+ Picture,
17560
+ {
17561
+ src: currentSrc,
17562
+ alt: title,
17563
+ fetchPriority: safeIndex === 0 ? "high" : "auto",
17564
+ eager: safeIndex === 0,
17565
+ className: "absolute inset-0 h-full w-full object-cover transition-opacity duration-700"
17566
+ }
17567
+ ) : null,
17568
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/30", "aria-hidden": true }),
17569
+ /* @__PURE__ */ jsx(
17570
+ "div",
17571
+ {
17572
+ className: "absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-black/30",
17573
+ "aria-hidden": true
17574
+ }
17575
+ ),
17576
+ siteHeader && /* @__PURE__ */ jsx(
17577
+ SiteHeader,
17578
+ __spreadProps(__spreadValues({}, Array.isArray(siteHeader) ? { links: siteHeader } : typeof siteHeader === "object" ? siteHeader : {}), {
17579
+ position: "overlay"
17580
+ })
17581
+ ),
17582
+ showCarousel && /* @__PURE__ */ jsxs(Fragment, { children: [
17583
+ /* @__PURE__ */ jsx(
17584
+ "button",
17585
+ {
17586
+ type: "button",
17587
+ onClick: () => setHeroIndex(
17588
+ (i) => (i - 1 + validImages.length) % validImages.length
17589
+ ),
17590
+ 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",
17591
+ "aria-label": "Previous image",
17592
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-5 w-5" })
17593
+ }
17594
+ ),
17595
+ /* @__PURE__ */ jsx(
17596
+ "button",
17597
+ {
17598
+ type: "button",
17599
+ onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
17600
+ 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",
17601
+ "aria-label": "Next image",
17602
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
17603
+ }
17604
+ )
17605
+ ] }),
17606
+ /* @__PURE__ */ jsxs(
17607
+ "div",
17608
+ {
17609
+ className: cn(
17610
+ "absolute inset-0 z-10 flex flex-col justify-center",
17611
+ "mx-auto w-full max-w-6xl px-6 sm:px-8",
17612
+ "pt-[72px]",
17613
+ // clear the overlay header
17614
+ pressLogos && pressLogos.length > 0 ? "pb-28" : "pb-16",
17615
+ isCenter ? "items-center text-center" : "items-start text-left"
17616
+ ),
17617
+ children: [
17618
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs sm:text-sm font-ui font-bold uppercase tracking-[0.2em] text-primary-400", children: eyebrow }),
17619
+ /* @__PURE__ */ jsx(
17620
+ "h1",
17621
+ {
17622
+ className: cn(
17623
+ "font-heading font-black uppercase text-white leading-[0.95]",
17624
+ "text-5xl sm:text-6xl lg:text-7xl",
17625
+ isCenter ? "max-w-4xl" : "max-w-3xl"
17626
+ ),
17627
+ children: title
17628
+ }
17629
+ ),
17630
+ subtitle && /* @__PURE__ */ jsx(
17631
+ "p",
17632
+ {
17633
+ className: cn(
17634
+ "mt-5 text-lg sm:text-xl font-sans text-white/90",
17635
+ isCenter ? "max-w-2xl" : "max-w-xl"
17636
+ ),
17637
+ children: subtitle
17638
+ }
17639
+ ),
17640
+ cta && /* @__PURE__ */ jsx("div", { className: "mt-8", children: cta.href ? /* @__PURE__ */ jsx(
17641
+ "a",
17642
+ {
17643
+ href: cta.href,
17644
+ onClick: cta.onClick,
17645
+ className: buttonVariants({ size: "lg" }),
17646
+ children: cta.label
17647
+ }
17648
+ ) : /* @__PURE__ */ jsx(Button, { size: "lg", onClick: cta.onClick, children: cta.label }) }),
17649
+ tpConfig ? /* @__PURE__ */ jsxs(
17650
+ "div",
17651
+ {
17652
+ className: cn(
17653
+ "home-trustpilot relative mt-8",
17654
+ // Wide enough for the Micro Star to show the full "Excellent
17655
+ // ★★★★★ Trustpilot" lockup — at 260px the Trustpilot wordmark
17656
+ // was clipped.
17657
+ isCenter && "w-full max-w-[340px]"
17658
+ ),
17659
+ children: [
17660
+ /* @__PURE__ */ jsx(TrustpilotEmbed, { config: tpConfig }),
17661
+ /* @__PURE__ */ jsx(
17662
+ "a",
17663
+ {
17664
+ href: (_a = tpConfig.fallbackHref) != null ? _a : "https://www.trustpilot.com/review/planetaexo.com",
17665
+ target: "_blank",
17666
+ rel: "noopener noreferrer",
17667
+ "aria-label": "Read our reviews on Trustpilot",
17668
+ className: "absolute inset-0 z-10"
17669
+ }
17670
+ )
17671
+ ]
17672
+ }
17673
+ ) : rating ? /* @__PURE__ */ jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsx(Rating, __spreadValues({}, rating)) }) : null
17674
+ ]
17675
+ }
17676
+ ),
17677
+ pressLogos && pressLogos.length > 0 && /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0 z-10 pb-7", children: /* @__PURE__ */ 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: [
17678
+ pressLabelHref ? /* @__PURE__ */ jsx(
17679
+ "a",
17680
+ {
17681
+ href: pressLabelHref,
17682
+ target: "_blank",
17683
+ rel: "noopener noreferrer",
17684
+ className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70 transition-colors hover:text-white",
17685
+ children: pressLabel
17686
+ }
17687
+ ) : /* @__PURE__ */ jsx("span", { className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70", children: pressLabel }),
17688
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-nowrap items-center justify-center gap-x-7", children: [
17689
+ /* @__PURE__ */ jsx("span", { className: "hidden h-5 w-px bg-white/25 sm:block", "aria-hidden": true }),
17690
+ pressLogos.map((logo, i) => {
17691
+ var _a2, _b, _c, _d;
17692
+ const content = logo.src ? (
17693
+ // eslint-disable-next-line @next/next/no-img-element
17694
+ /* @__PURE__ */ jsx(
17695
+ "img",
17696
+ {
17697
+ src: logo.src,
17698
+ alt: (_b = (_a2 = logo.alt) != null ? _a2 : logo.label) != null ? _b : "Press logo",
17699
+ className: "h-12 w-12 shrink-0 select-none object-contain",
17700
+ draggable: false
17701
+ }
17702
+ )
17703
+ ) : /* @__PURE__ */ jsx("span", { className: "font-heading text-base font-bold uppercase tracking-wide", children: logo.label });
17704
+ return logo.href ? /* @__PURE__ */ jsx(
17705
+ "a",
17706
+ {
17707
+ href: logo.href,
17708
+ target: "_blank",
17709
+ rel: "noopener noreferrer",
17710
+ "aria-label": (_d = (_c = logo.alt) != null ? _c : logo.label) != null ? _d : "Press article",
17711
+ 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",
17712
+ children: content
17713
+ },
17714
+ i
17715
+ ) : /* @__PURE__ */ jsx(
17716
+ "span",
17717
+ {
17718
+ className: "shrink-0 text-white/80 [&>img]:opacity-80",
17719
+ children: content
17720
+ },
17721
+ i
17722
+ );
17723
+ })
17724
+ ] })
17725
+ ] }) })
17726
+ ]
17727
+ }
17728
+ );
17729
+ }
17730
+ var ACCENT_PILL = "bg-primary text-primary-foreground";
17731
+ var ACCENT_BUTTON = "bg-primary text-primary-foreground hover:bg-primary/90";
17732
+ var THEME = {
17733
+ dark: {
17734
+ section: "bg-neutral-950",
17735
+ heading: "text-white",
17736
+ body: "text-white/60",
17737
+ tabTrack: "bg-white/5 border-white/10",
17738
+ tabActive: ACCENT_PILL,
17739
+ tabIdle: "text-white/60 hover:text-white",
17740
+ cardRing: "focus-visible:ring-white/70 focus-visible:ring-offset-neutral-950",
17741
+ divider: "border-white/15"
17742
+ },
17743
+ light: {
17744
+ /* Explicit light colours (not mode-aware tokens) so this variant stays a
17745
+ light surface even when the app is in dark mode. */
17746
+ section: "bg-white",
17747
+ heading: "text-neutral-900",
17748
+ body: "text-neutral-500",
17749
+ tabTrack: "bg-neutral-100 border-black/10",
17750
+ tabActive: ACCENT_PILL,
17751
+ tabIdle: "text-neutral-500 hover:text-neutral-900",
17752
+ cardRing: "focus-visible:ring-neutral-900/40 focus-visible:ring-offset-white",
17753
+ divider: "border-black/10"
17754
+ }
17755
+ };
17756
+ var BENTO_SPAN = {
17757
+ featured: "col-span-2 row-span-2",
17758
+ tall: "col-span-2 sm:col-span-1 row-span-2",
17759
+ wide: "col-span-2",
17760
+ normal: "col-span-2 sm:col-span-1"
17761
+ };
17762
+ function BentoTile({
17763
+ card,
17764
+ ring
17765
+ }) {
17766
+ var _a, _b, _c;
17767
+ const isFeatured = card.size === "featured";
17768
+ const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
17769
+ card.image ? /* @__PURE__ */ jsxs(Fragment, { children: [
17770
+ /* @__PURE__ */ jsx(
17771
+ Picture,
17772
+ {
17773
+ src: card.image,
17774
+ alt: (_a = card.imageAlt) != null ? _a : card.label,
17775
+ loading: "lazy",
17776
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
17777
+ }
17778
+ ),
17779
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/85 via-black/15 to-transparent" })
17780
+ ] }) : /* @__PURE__ */ jsx(
17781
+ "div",
17782
+ {
17783
+ className: cn(
17784
+ "absolute inset-0 bg-gradient-to-br",
17785
+ (_b = card.gradient) != null ? _b : "from-primary-800 to-primary-900"
17786
+ )
17787
+ }
17788
+ ),
17789
+ card.tripCount && /* @__PURE__ */ 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 }),
17790
+ /* @__PURE__ */ jsxs("div", { className: "absolute inset-x-0 bottom-0 z-10 p-5", children: [
17791
+ /* @__PURE__ */ jsx(
17792
+ "h3",
17793
+ {
17794
+ className: cn(
17795
+ "font-heading font-bold uppercase leading-tight tracking-wide text-white",
17796
+ isFeatured ? "text-2xl sm:text-3xl" : "text-lg sm:text-xl"
17797
+ ),
17798
+ children: card.label
17799
+ }
17800
+ ),
17801
+ card.description && /* @__PURE__ */ 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 }),
17802
+ card.ctaLabel && /* @__PURE__ */ jsxs("span", { className: "mt-2 inline-flex items-center gap-1 text-sm font-ui font-bold text-primary-400", children: [
17803
+ card.ctaLabel,
17804
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17805
+ ] })
17806
+ ] })
17807
+ ] });
17808
+ const tileClass = cn(
17809
+ "group relative overflow-hidden rounded-2xl bg-muted shadow-sm",
17810
+ BENTO_SPAN[(_c = card.size) != null ? _c : "normal"]
17811
+ );
17812
+ return card.href ? /* @__PURE__ */ jsx(
17813
+ "a",
17814
+ {
17815
+ href: card.href,
17816
+ className: cn(
17817
+ tileClass,
17818
+ "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
17819
+ ring
17820
+ ),
17821
+ children: inner
17822
+ }
17823
+ ) : /* @__PURE__ */ jsx("div", { className: tileClass, children: inner });
17824
+ }
17825
+ function AdventureExplorer({
17826
+ tabs,
17827
+ eyebrow,
17828
+ heading,
17829
+ subheading,
17830
+ defaultTabId,
17831
+ viewAllLabel = "View All Adventures",
17832
+ viewAllHref,
17833
+ theme = "dark",
17834
+ layout = "carousel",
17835
+ bentoLimit,
17836
+ moreLabel = "More wild places",
17837
+ className
17838
+ }) {
17839
+ var _a, _b, _c, _d, _e;
17840
+ const [activeId, setActiveId] = React32.useState(
17841
+ defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
17842
+ );
17843
+ const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
17844
+ const t = THEME[theme];
17845
+ const ctaHref = (_d = (_c = active == null ? void 0 : active.viewAllHref) != null ? _c : viewAllHref) != null ? _d : "#";
17846
+ const showCta = viewAllLabel.length > 0;
17847
+ const hasHeading = !!(eyebrow || heading || subheading);
17848
+ const cards = (_e = active == null ? void 0 : active.cards) != null ? _e : [];
17849
+ const limited = layout === "bento" && bentoLimit != null && cards.length > bentoLimit;
17850
+ const gridCards = limited ? cards.slice(0, bentoLimit) : cards;
17851
+ const moreCards = limited ? cards.slice(bentoLimit) : [];
17852
+ const showHeadCta = showCta && !limited;
17853
+ return /* @__PURE__ */ jsx("section", { className: cn("w-full py-10 sm:py-16", t.section, className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
17854
+ hasHeading && /* @__PURE__ */ jsxs("div", { className: "mb-8 flex flex-wrap items-end justify-between gap-6", children: [
17855
+ /* @__PURE__ */ jsxs("div", { className: "max-w-2xl", children: [
17856
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
17857
+ heading && /* @__PURE__ */ jsx(
17858
+ "h2",
17859
+ {
17860
+ className: cn(
17861
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
17862
+ t.heading
17863
+ ),
17864
+ children: heading
17865
+ }
17866
+ ),
17867
+ subheading && /* @__PURE__ */ jsx("p", { className: cn("mt-3 text-base", t.body), children: subheading })
17868
+ ] }),
17869
+ showHeadCta && /* @__PURE__ */ jsxs(
17870
+ "a",
17871
+ {
17872
+ href: ctaHref,
17873
+ 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",
17874
+ children: [
17875
+ viewAllLabel,
17876
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17877
+ ]
17878
+ }
17879
+ )
17880
+ ] }),
17881
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
17882
+ /* @__PURE__ */ jsx(
17883
+ "div",
17884
+ {
17885
+ role: "tablist",
17886
+ "aria-label": "Explore categories",
17887
+ className: cn(
17888
+ "inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
17889
+ t.tabTrack
17890
+ ),
17891
+ children: tabs.map((tab) => {
17892
+ const isActive = tab.id === (active == null ? void 0 : active.id);
17893
+ return /* @__PURE__ */ jsx(
17894
+ "button",
17895
+ {
17896
+ type: "button",
17897
+ role: "tab",
17898
+ "aria-selected": isActive,
17899
+ onClick: () => setActiveId(tab.id),
17900
+ className: cn(
17901
+ "shrink-0 rounded-full px-5 py-2 text-sm font-ui font-bold transition-colors",
17902
+ isActive ? t.tabActive : t.tabIdle
17903
+ ),
17904
+ children: tab.label
17905
+ },
17906
+ tab.id
17907
+ );
17908
+ })
17909
+ }
17910
+ ),
17911
+ showCta && !hasHeading && /* @__PURE__ */ jsx(
17912
+ "a",
17913
+ {
17914
+ href: ctaHref,
17915
+ className: cn(
17916
+ "hidden shrink-0 items-center rounded-full px-6 py-2.5 text-sm font-heading font-bold transition-colors sm:inline-flex",
17917
+ ACCENT_BUTTON
17918
+ ),
17919
+ children: viewAllLabel
17920
+ }
17921
+ )
17922
+ ] }),
17923
+ layout === "bento" && /* @__PURE__ */ 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__ */ jsx(BentoTile, { card, ring: t.cardRing }, i)) }),
17924
+ limited && /* @__PURE__ */ jsxs(
17925
+ "div",
17926
+ {
17927
+ className: cn(
17928
+ "mt-7 flex flex-wrap items-center justify-between gap-x-8 gap-y-3 border-t pt-6",
17929
+ t.divider
17930
+ ),
17931
+ children: [
17932
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2", children: [
17933
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-ui font-bold uppercase tracking-[0.18em] text-primary", children: moreLabel }),
17934
+ moreCards.map((card, i) => {
17935
+ var _a2;
17936
+ return /* @__PURE__ */ jsxs(
17937
+ "a",
17938
+ {
17939
+ href: (_a2 = card.href) != null ? _a2 : "#",
17940
+ className: "group inline-flex items-baseline gap-2",
17941
+ children: [
17942
+ /* @__PURE__ */ jsx(
17943
+ "span",
17944
+ {
17945
+ className: cn(
17946
+ "font-heading text-base font-bold transition-colors group-hover:text-primary",
17947
+ t.heading
17948
+ ),
17949
+ children: card.label
17950
+ }
17951
+ ),
17952
+ card.tripCount && /* @__PURE__ */ jsx("span", { className: cn("text-sm", t.body), children: card.tripCount })
17953
+ ]
17954
+ },
17955
+ i
17956
+ );
17957
+ })
17958
+ ] }),
17959
+ showCta && /* @__PURE__ */ jsxs(
17960
+ "a",
17961
+ {
17962
+ href: ctaHref,
17963
+ 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",
17964
+ children: [
17965
+ viewAllLabel,
17966
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17967
+ ]
17968
+ }
17969
+ )
17970
+ ]
17971
+ }
17972
+ ),
17973
+ layout !== "bento" && /* @__PURE__ */ 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) => {
17974
+ var _a2, _b2;
17975
+ const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
17976
+ /* @__PURE__ */ jsx(
17977
+ Picture,
17978
+ {
17979
+ src: (_a2 = card.image) != null ? _a2 : "",
17980
+ alt: (_b2 = card.imageAlt) != null ? _b2 : card.label,
17981
+ loading: "lazy",
17982
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
17983
+ }
17984
+ ),
17985
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/15 to-transparent" }),
17986
+ /* @__PURE__ */ 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 })
17987
+ ] });
17988
+ 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";
17989
+ return card.href ? /* @__PURE__ */ jsx(
17990
+ "a",
17991
+ {
17992
+ href: card.href,
17993
+ className: cn(
17994
+ cardClass,
17995
+ "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
17996
+ t.cardRing
17997
+ ),
17998
+ children: inner
17999
+ },
18000
+ i
18001
+ ) : /* @__PURE__ */ jsx("div", { className: cardClass, children: inner }, i);
18002
+ }) }),
18003
+ showCta && /* @__PURE__ */ jsx("div", { className: "mt-6 sm:hidden", children: /* @__PURE__ */ jsx(
18004
+ "a",
18005
+ {
18006
+ href: ctaHref,
18007
+ className: cn(
18008
+ "inline-flex w-full items-center justify-center rounded-full px-6 py-3 text-sm font-heading font-bold transition-colors",
18009
+ ACCENT_BUTTON
18010
+ ),
18011
+ children: viewAllLabel
18012
+ }
18013
+ ) })
18014
+ ] }) });
18015
+ }
18016
+ var THEME2 = {
18017
+ light: {
18018
+ section: "bg-neutral-100",
18019
+ heading: "text-neutral-900",
18020
+ title: "text-neutral-800",
18021
+ body: "text-neutral-500",
18022
+ icon: "text-primary",
18023
+ card: "bg-white border-black/10 shadow-sm",
18024
+ chip: "bg-primary/10 text-primary",
18025
+ number: "text-primary"
18026
+ },
18027
+ dark: {
18028
+ section: "bg-neutral-950",
18029
+ heading: "text-white",
18030
+ title: "text-white",
18031
+ body: "text-white/60",
18032
+ icon: "text-primary-400",
18033
+ card: "bg-white/5 border-white/10",
18034
+ chip: "bg-primary-400/15 text-primary-400",
18035
+ number: "text-primary-400"
18036
+ }
18037
+ };
18038
+ var COLS = {
18039
+ 2: "sm:grid-cols-2",
18040
+ 3: "sm:grid-cols-2 lg:grid-cols-3",
18041
+ 4: "sm:grid-cols-2 lg:grid-cols-4"
18042
+ };
18043
+ function USP({
18044
+ items,
18045
+ heading,
18046
+ subheading,
18047
+ columns,
18048
+ variant = "minimal",
18049
+ theme = "light",
18050
+ className
18051
+ }) {
18052
+ const t = THEME2[theme];
18053
+ const cols = columns != null ? columns : Math.min(Math.max(items.length, 2), 4);
18054
+ const isInline = variant === "inline";
18055
+ const isCard = variant === "card";
18056
+ const isNumbered = variant === "numbered";
18057
+ const stacked = !isInline;
18058
+ return /* @__PURE__ */ jsx("section", { className: cn("w-full py-14 sm:py-20", t.section, className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18059
+ (heading || subheading) && /* @__PURE__ */ jsxs(
18060
+ "div",
18061
+ {
18062
+ className: cn(
18063
+ "mb-12 max-w-2xl",
18064
+ isNumbered ? "text-left" : "mx-auto text-center"
18065
+ ),
18066
+ children: [
18067
+ heading && /* @__PURE__ */ jsx(
18068
+ "h2",
18069
+ {
18070
+ className: cn(
18071
+ "font-heading font-bold uppercase tracking-wide",
18072
+ isNumbered ? "text-3xl sm:text-4xl lg:text-5xl" : "text-2xl sm:text-3xl",
18073
+ t.heading
18074
+ ),
18075
+ children: heading
18076
+ }
18077
+ ),
18078
+ subheading && /* @__PURE__ */ jsx("p", { className: cn("mt-3 font-sans text-base", t.body), children: subheading })
18079
+ ]
18080
+ }
18081
+ ),
18082
+ /* @__PURE__ */ jsxs(
18083
+ "div",
18084
+ {
18085
+ className: cn(
18086
+ "grid grid-cols-1 gap-x-8 gap-y-10",
18087
+ COLS[cols]
18088
+ ),
18089
+ children: [
18090
+ isNumbered && items.map((item, i) => /* @__PURE__ */ jsxs(
18091
+ "div",
18092
+ {
18093
+ className: cn(
18094
+ "flex flex-col rounded-2xl border p-6 text-left sm:p-7",
18095
+ t.card
18096
+ ),
18097
+ children: [
18098
+ /* @__PURE__ */ jsx(
18099
+ "span",
18100
+ {
18101
+ className: cn(
18102
+ "mb-4 font-sans text-xl font-semibold italic",
18103
+ t.number
18104
+ ),
18105
+ children: String(i + 1).padStart(2, "0")
18106
+ }
18107
+ ),
18108
+ /* @__PURE__ */ jsx(
18109
+ "h3",
18110
+ {
18111
+ className: cn(
18112
+ "font-heading text-lg font-bold leading-snug",
18113
+ t.heading
18114
+ ),
18115
+ children: item.title
18116
+ }
18117
+ ),
18118
+ /* @__PURE__ */ jsx("p", { className: cn("mt-2 font-sans text-base leading-relaxed", t.body), children: item.description })
18119
+ ]
18120
+ },
18121
+ i
18122
+ )),
18123
+ !isNumbered && items.map((item, i) => /* @__PURE__ */ jsxs(
18124
+ "div",
18125
+ {
18126
+ className: cn(
18127
+ isCard && cn("rounded-2xl border p-6 sm:p-7", t.card),
18128
+ stacked ? "flex flex-col items-center text-center" : "flex items-start gap-4 text-left"
18129
+ ),
18130
+ children: [
18131
+ /* @__PURE__ */ jsx(
18132
+ "span",
18133
+ {
18134
+ className: cn(
18135
+ "flex shrink-0 items-center justify-center",
18136
+ isCard ? cn("h-14 w-14 rounded-full [&>svg]:size-7", t.chip) : cn("[&>svg]:size-8", t.icon),
18137
+ stacked && "mb-4"
18138
+ ),
18139
+ children: item.icon
18140
+ }
18141
+ ),
18142
+ /* @__PURE__ */ jsxs("div", { className: isInline ? "flex-1" : "contents", children: [
18143
+ /* @__PURE__ */ jsx(
18144
+ "h3",
18145
+ {
18146
+ className: cn(
18147
+ "font-heading text-sm font-bold uppercase leading-snug tracking-wide",
18148
+ t.title,
18149
+ stacked && "mb-3"
18150
+ ),
18151
+ children: item.title
18152
+ }
18153
+ ),
18154
+ /* @__PURE__ */ jsx(
18155
+ "p",
18156
+ {
18157
+ className: cn(
18158
+ "font-sans text-base leading-relaxed",
18159
+ t.body,
18160
+ isInline && "mt-1.5"
18161
+ ),
18162
+ children: item.description
18163
+ }
18164
+ )
18165
+ ] })
18166
+ ]
18167
+ },
18168
+ i
18169
+ ))
18170
+ ]
18171
+ }
18172
+ )
18173
+ ] }) });
18174
+ }
18175
+ function RotatingSubtitle({
18176
+ phrases,
18177
+ interval,
18178
+ className
18179
+ }) {
18180
+ const [index, setIndex] = React32.useState(0);
18181
+ React32.useEffect(() => {
18182
+ var _a;
18183
+ if (phrases.length < 2) return;
18184
+ const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
18185
+ if (reduce) return;
18186
+ const id = setInterval(
18187
+ () => setIndex((i) => (i + 1) % phrases.length),
18188
+ interval
18189
+ );
18190
+ return () => clearInterval(id);
18191
+ }, [phrases.length, interval]);
18192
+ return (
18193
+ /* Grid-stacks all phrases so the box keeps the height of the tallest line
18194
+ and the crossfade has no layout shift. */
18195
+ /* @__PURE__ */ jsx("span", { className: cn("grid", className), children: phrases.map((phrase, i) => /* @__PURE__ */ jsx(
18196
+ "span",
18197
+ {
18198
+ "aria-hidden": i !== index,
18199
+ className: cn(
18200
+ "col-start-1 row-start-1 transition-opacity duration-700",
18201
+ i === index ? "opacity-100" : "opacity-0"
18202
+ ),
18203
+ children: phrase
18204
+ },
18205
+ phrase + i
18206
+ )) })
18207
+ );
18208
+ }
18209
+ function CtaBanner({
18210
+ image,
18211
+ imageAlt = "",
18212
+ title,
18213
+ subtitle,
18214
+ cta,
18215
+ rotateInterval = 3e3,
18216
+ parallax = true,
18217
+ overlayOpacity = 35,
18218
+ className
18219
+ }) {
18220
+ const phrases = React32.useMemo(
18221
+ () => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
18222
+ [subtitle]
18223
+ );
18224
+ return /* @__PURE__ */ jsxs(
18225
+ "section",
18226
+ {
18227
+ className: cn(
18228
+ "relative w-full overflow-hidden",
18229
+ "flex items-center justify-center",
18230
+ "min-h-[360px] py-24 sm:py-28 lg:py-32",
18231
+ "bg-muted",
18232
+ className
18233
+ ),
18234
+ children: [
18235
+ parallax ? (
18236
+ /* Parallax: fixed-attachment CSS background (sm+). Uses a plain div so
18237
+ `bg-fixed` works; on mobile it falls back to a normal cover image. */
18238
+ /* @__PURE__ */ jsx(
18239
+ "div",
18240
+ {
18241
+ "aria-hidden": true,
18242
+ role: imageAlt ? "img" : void 0,
18243
+ "aria-label": imageAlt || void 0,
18244
+ className: "absolute inset-0 bg-cover bg-center sm:bg-fixed",
18245
+ style: { backgroundImage: `url("${image}")` }
18246
+ }
18247
+ )
18248
+ ) : /* @__PURE__ */ jsx(
18249
+ Picture,
18250
+ {
18251
+ src: image,
18252
+ alt: imageAlt,
18253
+ eager: true,
18254
+ className: "absolute inset-0 h-full w-full object-cover"
18255
+ }
18256
+ ),
18257
+ /* @__PURE__ */ jsx(
18258
+ "div",
18259
+ {
18260
+ className: "absolute inset-0 bg-black",
18261
+ style: { opacity: overlayOpacity / 100 },
18262
+ "aria-hidden": true
18263
+ }
18264
+ ),
18265
+ /* @__PURE__ */ jsxs("div", { className: "relative z-10 mx-auto flex w-full max-w-4xl flex-col items-center px-6 text-center", children: [
18266
+ /* @__PURE__ */ 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 }),
18267
+ phrases.length > 0 && /* @__PURE__ */ 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__ */ jsx(RotatingSubtitle, { phrases, interval: rotateInterval }) : phrases[0] }),
18268
+ cta && (cta.href ? /* @__PURE__ */ jsx(
18269
+ "a",
18270
+ {
18271
+ href: cta.href,
18272
+ onClick: cta.onClick,
18273
+ 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",
18274
+ children: cta.label
18275
+ }
18276
+ ) : /* @__PURE__ */ jsx(
18277
+ "button",
18278
+ {
18279
+ type: "button",
18280
+ onClick: cta.onClick,
18281
+ 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",
18282
+ children: cta.label
18283
+ }
18284
+ ))
18285
+ ] })
18286
+ ]
18287
+ }
18288
+ );
18289
+ }
18290
+ var THEME3 = {
18291
+ light: {
18292
+ section: "bg-background",
18293
+ heading: "text-foreground",
18294
+ sub: "text-muted-foreground",
18295
+ rowTitle: "text-foreground",
18296
+ rowBorder: "border-border",
18297
+ rowArrow: "text-primary"
18298
+ },
18299
+ dark: {
18300
+ section: "bg-neutral-950",
18301
+ heading: "text-white",
18302
+ sub: "text-white/60",
18303
+ rowTitle: "text-white",
18304
+ rowBorder: "border-white/10",
18305
+ rowArrow: "text-primary-400"
18306
+ }
18307
+ };
18308
+ function BlogJournal({
18309
+ eyebrow,
18310
+ title,
18311
+ subtitle,
18312
+ link,
18313
+ feature,
18314
+ posts,
18315
+ theme = "light",
18316
+ className
18317
+ }) {
18318
+ var _a, _b, _c, _d;
18319
+ const t = THEME3[theme];
18320
+ const featRel = feature.external ? "noopener noreferrer" : void 0;
18321
+ const featTarget = feature.external ? "_blank" : void 0;
18322
+ return /* @__PURE__ */ jsx("section", { className: cn("w-full py-20 sm:py-28", t.section, className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18323
+ (title || eyebrow || link) && /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
18324
+ /* @__PURE__ */ jsxs("div", { className: "max-w-2xl", children: [
18325
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18326
+ title && /* @__PURE__ */ jsx(
18327
+ "h2",
18328
+ {
18329
+ className: cn(
18330
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18331
+ t.heading
18332
+ ),
18333
+ children: title
18334
+ }
18335
+ ),
18336
+ subtitle && /* @__PURE__ */ jsx("p", { className: cn("mt-3 text-base", t.sub), children: subtitle })
18337
+ ] }),
18338
+ link && /* @__PURE__ */ jsxs(
18339
+ "a",
18340
+ {
18341
+ href: (_a = link.href) != null ? _a : "#",
18342
+ 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",
18343
+ children: [
18344
+ link.label,
18345
+ /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18346
+ ]
18347
+ }
18348
+ )
18349
+ ] }),
18350
+ /* @__PURE__ */ jsxs("div", { className: "grid items-stretch gap-7 lg:grid-cols-[1.12fr_0.88fr]", children: [
18351
+ /* @__PURE__ */ jsxs(
18352
+ "a",
18353
+ {
18354
+ href: (_b = feature.href) != null ? _b : "#",
18355
+ target: featTarget,
18356
+ rel: featRel,
18357
+ 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]",
18358
+ children: [
18359
+ /* @__PURE__ */ jsx(
18360
+ Picture,
18361
+ {
18362
+ src: feature.image,
18363
+ alt: (_c = feature.imageAlt) != null ? _c : feature.title,
18364
+ loading: "lazy",
18365
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
18366
+ }
18367
+ ),
18368
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/25 to-transparent" }),
18369
+ /* @__PURE__ */ jsxs("div", { className: "relative p-8 sm:p-9", children: [
18370
+ feature.tag && /* @__PURE__ */ 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 }),
18371
+ feature.date && /* @__PURE__ */ jsx("span", { className: "block text-xs font-ui font-bold uppercase tracking-[0.1em] text-primary-400", children: feature.date }),
18372
+ /* @__PURE__ */ 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 }),
18373
+ feature.excerpt && /* @__PURE__ */ jsx("p", { className: "mt-3 max-w-[46ch] text-sm leading-relaxed text-white/85", children: feature.excerpt }),
18374
+ /* @__PURE__ */ jsxs("span", { className: "mt-5 inline-flex items-center gap-1.5 font-ui text-sm font-bold", children: [
18375
+ (_d = feature.ctaLabel) != null ? _d : "Read the guide",
18376
+ /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18377
+ ] })
18378
+ ] })
18379
+ ]
18380
+ }
18381
+ ),
18382
+ /* @__PURE__ */ jsx("ul", { className: "flex flex-col justify-center", children: posts.map((post, i) => {
18383
+ var _a2, _b2;
18384
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
18385
+ "a",
18386
+ {
18387
+ href: (_a2 = post.href) != null ? _a2 : "#",
18388
+ target: post.external ? "_blank" : void 0,
18389
+ rel: post.external ? "noopener noreferrer" : void 0,
18390
+ className: cn(
18391
+ "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]",
18392
+ t.rowBorder,
18393
+ i === 0 && "border-t-0 pt-0"
18394
+ ),
18395
+ children: [
18396
+ /* @__PURE__ */ jsx(
18397
+ Picture,
18398
+ {
18399
+ src: post.image,
18400
+ alt: (_b2 = post.imageAlt) != null ? _b2 : post.title,
18401
+ loading: "lazy",
18402
+ className: "h-16 w-16 rounded-xl object-cover sm:h-[78px] sm:w-[78px]"
18403
+ }
18404
+ ),
18405
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
18406
+ /* @__PURE__ */ jsxs("span", { className: "text-[11px] font-ui font-bold uppercase tracking-[0.1em] text-primary", children: [
18407
+ post.category,
18408
+ post.category && post.date && /* @__PURE__ */ jsx("span", { className: cn("ml-2 font-semibold", t.sub), children: post.date }),
18409
+ !post.category && post.date && /* @__PURE__ */ jsx("span", { className: cn("font-semibold", t.sub), children: post.date })
18410
+ ] }),
18411
+ /* @__PURE__ */ jsx(
18412
+ "h4",
18413
+ {
18414
+ className: cn(
18415
+ "mt-1.5 font-heading text-base font-bold leading-snug sm:text-lg",
18416
+ t.rowTitle
18417
+ ),
18418
+ children: post.title
18419
+ }
18420
+ )
18421
+ ] }),
18422
+ /* @__PURE__ */ jsx(
18423
+ ArrowRightIcon,
18424
+ {
18425
+ className: cn(
18426
+ "h-5 w-5 shrink-0 transition-transform group-hover:translate-x-1",
18427
+ t.rowArrow
18428
+ )
18429
+ }
18430
+ )
18431
+ ]
18432
+ }
18433
+ ) }, i);
18434
+ }) })
18435
+ ] })
18436
+ ] }) });
18437
+ }
18438
+ var SURFACE_WHITE = "bg-white";
18439
+ var SURFACE_SAND = "bg-[oklch(0.94_0.016_86)]";
18440
+ var SURFACE_PRIMARY_700 = "bg-[oklch(0.52_0.082_179)]";
18441
+ var SURFACE_PRIMARY_800 = "bg-[oklch(0.39_0.062_179)]";
18442
+ var SURFACE_PRIMARY_900 = "bg-[oklch(0.27_0.040_179)]";
18443
+ function SectionHead({
18444
+ eyebrow,
18445
+ title,
18446
+ subtitle,
18447
+ link,
18448
+ align = "between",
18449
+ theme = "light"
18450
+ }) {
18451
+ var _a;
18452
+ const isCenter = align === "center";
18453
+ return /* @__PURE__ */ jsxs(
18454
+ "div",
18455
+ {
18456
+ className: cn(
18457
+ "mb-10 flex flex-wrap items-end gap-6",
18458
+ isCenter ? "flex-col items-center text-center" : "justify-between"
18459
+ ),
18460
+ children: [
18461
+ /* @__PURE__ */ jsxs("div", { className: cn("max-w-2xl", isCenter && "mx-auto"), children: [
18462
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18463
+ /* @__PURE__ */ jsx(
18464
+ "h2",
18465
+ {
18466
+ className: cn(
18467
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18468
+ theme === "dark" ? "text-white" : "text-foreground"
18469
+ ),
18470
+ children: title
18471
+ }
18472
+ ),
18473
+ subtitle && /* @__PURE__ */ jsx(
18474
+ "p",
18475
+ {
18476
+ className: cn(
18477
+ "mt-3 text-base",
18478
+ theme === "dark" ? "text-white/70" : "text-muted-foreground"
18479
+ ),
18480
+ children: subtitle
18481
+ }
18482
+ )
18483
+ ] }),
18484
+ link && !isCenter && /* @__PURE__ */ jsxs(
18485
+ "a",
18486
+ {
18487
+ href: (_a = link.href) != null ? _a : "#",
18488
+ 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",
18489
+ children: [
18490
+ link.label,
18491
+ /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18492
+ ]
18493
+ }
18494
+ )
18495
+ ]
18496
+ }
18497
+ );
18498
+ }
18499
+ function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
18500
+ var _a;
18501
+ const railRef = React32.useRef(null);
18502
+ const scrollByCard = (dir) => {
18503
+ const rail = railRef.current;
18504
+ if (!rail) return;
18505
+ const card = rail.querySelector("[data-rail-card]");
18506
+ const amount = card ? card.offsetWidth + 22 : rail.clientWidth * 0.8;
18507
+ rail.scrollBy({ left: dir * amount, behavior: "smooth" });
18508
+ };
18509
+ return /* @__PURE__ */ jsxs("section", { className: cn(SURFACE_SAND, "py-20 sm:py-28"), children: [
18510
+ /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
18511
+ /* @__PURE__ */ jsxs("div", { className: "max-w-2xl", children: [
18512
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18513
+ /* @__PURE__ */ jsx("h2", { className: "font-heading text-3xl font-black uppercase leading-[1.05] text-foreground sm:text-4xl lg:text-5xl", children: title }),
18514
+ subtitle && /* @__PURE__ */ jsx("p", { className: "mt-3 text-base text-muted-foreground", children: subtitle })
18515
+ ] }),
18516
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
18517
+ link && /* @__PURE__ */ jsxs(
18518
+ "a",
18519
+ {
18520
+ href: (_a = link.href) != null ? _a : "#",
18521
+ 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",
18522
+ children: [
18523
+ link.label,
18524
+ /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18525
+ ]
18526
+ }
18527
+ ),
18528
+ /* @__PURE__ */ jsx(
18529
+ "button",
18530
+ {
18531
+ type: "button",
18532
+ onClick: () => scrollByCard(-1),
18533
+ "aria-label": "Previous expeditions",
18534
+ 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",
18535
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-5 w-5" })
18536
+ }
18537
+ ),
18538
+ /* @__PURE__ */ jsx(
18539
+ "button",
18540
+ {
18541
+ type: "button",
18542
+ onClick: () => scrollByCard(1),
18543
+ "aria-label": "Next expeditions",
18544
+ 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",
18545
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
18546
+ }
18547
+ )
18548
+ ] })
18549
+ ] }) }),
18550
+ /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl", children: /* @__PURE__ */ jsx(
18551
+ "div",
18552
+ {
18553
+ ref: railRef,
18554
+ 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",
18555
+ children: trips.map((trip, i) => /* @__PURE__ */ jsx(
18556
+ "div",
18557
+ {
18558
+ "data-rail-card": true,
18559
+ className: "w-[320px] shrink-0 snap-start sm:w-[340px]",
18560
+ children: /* @__PURE__ */ jsx(TripCard, __spreadValues({ variant: "editorial" }, trip))
18561
+ },
18562
+ i
18563
+ ))
18564
+ }
18565
+ ) })
18566
+ ] });
18567
+ }
18568
+ function PopularCloud({ eyebrow, title, subtitle, chips }) {
18569
+ return /* @__PURE__ */ jsx("section", { className: cn(SURFACE_WHITE, "py-20 sm:py-28"), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18570
+ /* @__PURE__ */ jsx(
18571
+ SectionHead,
18572
+ {
18573
+ eyebrow,
18574
+ title,
18575
+ subtitle,
18576
+ align: "center"
18577
+ }
18578
+ ),
18579
+ /* @__PURE__ */ jsx("div", { className: "mx-auto flex max-w-3xl flex-wrap items-center justify-center gap-3", children: chips.map((chip, i) => {
18580
+ var _a;
18581
+ return /* @__PURE__ */ jsx(
18582
+ Chip,
18583
+ {
18584
+ href: chip.href,
18585
+ variant: chip.featured ? "solid" : "outline",
18586
+ size: (_a = chip.size) != null ? _a : "md",
18587
+ className: "transition-transform hover:-translate-y-0.5",
18588
+ children: chip.label
18589
+ },
18590
+ i
18591
+ );
18592
+ }) })
18593
+ ] }) });
18594
+ }
18595
+ function StatsBand({ items }) {
18596
+ return /* @__PURE__ */ jsx("section", { className: cn(SURFACE_PRIMARY_700, "py-16 text-white sm:py-20"), children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ 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__ */ jsxs("div", { children: [
18597
+ /* @__PURE__ */ 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 }),
18598
+ /* @__PURE__ */ jsx("div", { className: "mt-3 text-sm font-medium text-white/90", children: stat.label })
18599
+ ] }, i)) }) }) });
18600
+ }
18601
+ function ReviewStars({ stars = 5 }) {
18602
+ return /* @__PURE__ */ 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__ */ jsx(
18603
+ StarIcon,
18604
+ {
18605
+ className: cn(
18606
+ "h-4 w-4",
18607
+ i + 1 <= Math.round(stars) ? "fill-amber-400 text-amber-400" : "fill-white/15 text-white/15"
18608
+ )
18609
+ },
18610
+ i
18611
+ )) });
18612
+ }
18613
+ function ReviewsBand({ eyebrow, title, subtitle, link, items, note }) {
18614
+ return /* @__PURE__ */ jsx("section", { className: cn(SURFACE_PRIMARY_900, "py-20 text-white sm:py-28"), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18615
+ /* @__PURE__ */ jsx(
18616
+ SectionHead,
18617
+ {
18618
+ eyebrow,
18619
+ title,
18620
+ subtitle,
18621
+ link,
18622
+ theme: "dark"
18623
+ }
18624
+ ),
18625
+ /* @__PURE__ */ jsx("div", { className: "grid gap-5 sm:grid-cols-2 lg:grid-cols-3", children: items.map((review, i) => /* @__PURE__ */ jsxs(
18626
+ "figure",
18627
+ {
18628
+ className: "rounded-2xl border border-white/10 bg-white/5 p-7 transition-colors hover:bg-white/10",
18629
+ children: [
18630
+ /* @__PURE__ */ jsx(ReviewStars, { stars: review.stars }),
18631
+ /* @__PURE__ */ jsxs("blockquote", { className: "font-sans text-lg italic leading-relaxed text-white/90", children: [
18632
+ "\u201C",
18633
+ review.quote,
18634
+ "\u201D"
18635
+ ] }),
18636
+ /* @__PURE__ */ jsxs("figcaption", { className: "mt-5 text-sm font-medium text-white/60", children: [
18637
+ "\u2014 ",
18638
+ review.author
18639
+ ] })
18640
+ ]
18641
+ },
18642
+ i
18643
+ )) }),
18644
+ note && /* @__PURE__ */ jsx("p", { className: "mt-8 text-center text-xs text-white/40", children: note })
18645
+ ] }) });
18646
+ }
18647
+ function NewHome({
18648
+ hero,
18649
+ explorer,
18650
+ expeditions,
18651
+ popular,
18652
+ stats,
18653
+ usp,
18654
+ reviews,
18655
+ journal,
18656
+ cta,
18657
+ footer,
18658
+ className
18659
+ }) {
18660
+ return /* @__PURE__ */ jsxs("div", { className: cn("w-full bg-background", className), children: [
18661
+ /* @__PURE__ */ jsx(HomeHeader, __spreadValues({}, hero)),
18662
+ explorer && /* @__PURE__ */ jsx(
18663
+ AdventureExplorer,
18664
+ __spreadProps(__spreadValues({}, explorer), {
18665
+ className: cn(SURFACE_WHITE, explorer.className)
18666
+ })
18667
+ ),
18668
+ expeditions && /* @__PURE__ */ jsx(ExpeditionsRail, __spreadValues({}, expeditions)),
18669
+ popular && /* @__PURE__ */ jsx(PopularCloud, __spreadValues({}, popular)),
18670
+ stats && /* @__PURE__ */ jsx(StatsBand, __spreadValues({}, stats)),
18671
+ usp && /* @__PURE__ */ jsx(USP, __spreadProps(__spreadValues({}, usp), { className: cn(SURFACE_PRIMARY_800, usp.className) })),
18672
+ reviews && /* @__PURE__ */ jsx(ReviewsBand, __spreadValues({}, reviews)),
18673
+ journal && /* @__PURE__ */ jsx(BlogJournal, __spreadProps(__spreadValues({}, journal), { className: cn(SURFACE_WHITE, journal.className) })),
18674
+ cta && /* @__PURE__ */ jsx(CtaBanner, __spreadValues({}, cta)),
18675
+ footer && /* @__PURE__ */ jsx(SiteFooter, __spreadValues({}, footer))
18676
+ ] });
18677
+ }
18678
+ var ACTIVE_PILL = "bg-primary text-white shadow-sm";
18679
+ var VARIANT3 = {
18680
+ black: {
18681
+ track: "bg-white/5 border-white/10",
18682
+ idle: "text-white/55 hover:text-white",
18683
+ ring: "focus-visible:ring-white/70"
18684
+ },
18685
+ white: {
18686
+ track: "bg-neutral-100 border-black/10",
18687
+ idle: "text-neutral-500 hover:text-neutral-900",
18688
+ ring: "focus-visible:ring-neutral-900/40"
18689
+ }
18690
+ };
18691
+ var SIZE = {
18692
+ sm: "px-4 py-1.5 text-[13px]",
18693
+ md: "px-5 py-2 text-sm"
18694
+ };
18695
+ function SegmentedControl({
18696
+ items,
18697
+ value,
18698
+ defaultValue,
18699
+ onValueChange,
18700
+ variant = "black",
18701
+ size = "md",
18702
+ fullWidth = false,
18703
+ collapse = false,
18704
+ "aria-label": ariaLabel = "Options",
18705
+ className
18706
+ }) {
18707
+ var _a;
18708
+ const isControlled = value != null;
18709
+ const [internal, setInternal] = React32.useState(
18710
+ defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
18711
+ );
18712
+ const active = isControlled ? value : internal;
18713
+ const select = (id) => {
18714
+ if (!isControlled) setInternal(id);
18715
+ onValueChange == null ? void 0 : onValueChange(id);
18716
+ };
18717
+ const onKeyDown = (e) => {
18718
+ if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return;
18719
+ e.preventDefault();
18720
+ const enabled = items.filter((i) => !i.disabled);
18721
+ const idx = enabled.findIndex((i) => i.id === active);
18722
+ if (idx === -1) return;
18723
+ const next = e.key === "ArrowRight" ? enabled[(idx + 1) % enabled.length] : enabled[(idx - 1 + enabled.length) % enabled.length];
18724
+ select(next.id);
18725
+ };
18726
+ const v = VARIANT3[variant];
18727
+ return /* @__PURE__ */ jsx(
18728
+ "div",
18729
+ {
18730
+ role: "radiogroup",
18731
+ "aria-label": ariaLabel,
18732
+ onKeyDown,
18733
+ className: cn(
18734
+ "inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
18735
+ fullWidth && "flex w-full",
18736
+ v.track,
18737
+ className
18738
+ ),
18739
+ children: items.map((item) => {
18740
+ const isActive = item.id === active;
18741
+ const Icon = item.icon;
18742
+ const showLabel = collapse === "all" ? false : collapse ? isActive : true;
18743
+ return /* @__PURE__ */ jsxs(
18744
+ "button",
18745
+ {
18746
+ type: "button",
18747
+ role: "radio",
18748
+ "aria-checked": isActive,
18749
+ "aria-label": collapse && !showLabel ? item.label : void 0,
18750
+ title: collapse && !showLabel ? item.label : void 0,
18751
+ disabled: item.disabled,
18752
+ tabIndex: isActive ? 0 : -1,
18753
+ onClick: () => select(item.id),
18754
+ className: cn(
18755
+ "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",
18756
+ showLabel && Icon ? "gap-2" : "gap-0",
18757
+ variant === "black" ? "focus-visible:ring-offset-neutral-950" : "focus-visible:ring-offset-white",
18758
+ fullWidth && "flex-1",
18759
+ SIZE[size],
18760
+ /* Icon-only segments are square-ish — drop the side padding so
18761
+ the icon centres in a circular pill. */
18762
+ collapse && !showLabel && (size === "sm" ? "!px-1.5" : "!px-2"),
18763
+ isActive ? ACTIVE_PILL : v.idle,
18764
+ v.ring
18765
+ ),
18766
+ children: [
18767
+ Icon && /* @__PURE__ */ jsx(
18768
+ Icon,
18769
+ {
18770
+ className: cn("shrink-0", size === "sm" ? "size-4" : "size-[18px]")
18771
+ }
18772
+ ),
18773
+ /* @__PURE__ */ jsx(
18774
+ "span",
18775
+ {
18776
+ className: cn(
18777
+ "overflow-hidden whitespace-nowrap transition-all duration-300 ease-out",
18778
+ showLabel ? "max-w-[12ch] opacity-100" : "max-w-0 opacity-0"
18779
+ ),
18780
+ children: item.label
18781
+ }
18782
+ )
18783
+ ]
18784
+ },
18785
+ item.id
18786
+ );
18787
+ })
18788
+ }
18789
+ );
18790
+ }
17160
18791
 
17161
- export { ActivityCard, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CancellationForm, CategoryPage2, CounterField, CountrySearchField, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, ShareWidget, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
18792
+ export { ActivityCard, AdventureExplorer, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogJournal, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CancellationForm, CategoryPage2, Chip, CounterField, CountrySearchField, CtaBanner, DEFAULT_FOOTER_BADGES, DEFAULT_FOOTER_DESTINATIONS, DEFAULT_FOOTER_LANGUAGES, DEFAULT_FOOTER_LEGAL, DEFAULT_FOOTER_PAGES, DEFAULT_FOOTER_SOCIALS, DEFAULT_FOOTER_THEMES, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, HomeHeader, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NewHome, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, SegmentedControl, ShareWidget, SiteFooter, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, USP, buttonVariants, chipVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
17162
18793
  //# sourceMappingURL=index.js.map
17163
18794
  //# sourceMappingURL=index.js.map