@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.cjs CHANGED
@@ -638,7 +638,8 @@ function PhoneCountrySelect({
638
638
  value,
639
639
  onChange,
640
640
  className,
641
- disabled
641
+ disabled,
642
+ showDial = true
642
643
  }) {
643
644
  var _a;
644
645
  const [open, setOpen] = React32__namespace.useState(false);
@@ -687,7 +688,7 @@ function PhoneCountrySelect({
687
688
  ),
688
689
  children: [
689
690
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-base leading-none", children: selected.flag }),
690
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: selected.dial }),
691
+ showDial && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: selected.dial }),
691
692
  /* @__PURE__ */ jsxRuntime.jsx(
692
693
  lucideReact.ChevronDownIcon,
693
694
  {
@@ -7930,7 +7931,8 @@ function DatePickerField({
7930
7931
  placeholder = "Select a date",
7931
7932
  disabled,
7932
7933
  fromDate,
7933
- className
7934
+ className,
7935
+ error
7934
7936
  }) {
7935
7937
  const [open, setOpen] = React32__namespace.useState(false);
7936
7938
  const containerRef = React32__namespace.useRef(null);
@@ -7944,78 +7946,91 @@ function DatePickerField({
7944
7946
  observer.observe(containerRef.current);
7945
7947
  return () => observer.disconnect();
7946
7948
  }, []);
7947
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className: cn("w-full", className), children: /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
7948
- /* @__PURE__ */ jsxRuntime.jsxs(
7949
- PopoverTrigger,
7950
- {
7951
- disabled,
7952
- className: cn(
7953
- "relative flex w-full items-center rounded-lg border border-border bg-background",
7954
- "px-3 text-left text-base font-ui transition-colors h-14",
7955
- "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
7956
- "disabled:pointer-events-none disabled:opacity-50",
7957
- open && "border-primary ring-1 ring-primary"
7958
- ),
7959
- children: [
7960
- /* @__PURE__ */ jsxRuntime.jsxs(
7961
- "span",
7962
- {
7963
- className: cn(
7964
- "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
7965
- hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
7966
- ),
7967
- children: [
7968
- label,
7969
- required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
7970
- ]
7971
- }
7949
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: cn("w-full", className), children: [
7950
+ /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
7951
+ /* @__PURE__ */ jsxRuntime.jsxs(
7952
+ PopoverTrigger,
7953
+ {
7954
+ disabled,
7955
+ className: cn(
7956
+ "relative flex w-full items-center rounded-lg border border-border bg-background",
7957
+ "px-3 text-left text-base font-ui transition-colors h-14",
7958
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
7959
+ "disabled:pointer-events-none disabled:opacity-50",
7960
+ open && "border-primary ring-1 ring-primary",
7961
+ error && "border-destructive focus:border-destructive focus:ring-destructive"
7972
7962
  ),
7973
- /* @__PURE__ */ jsxRuntime.jsx(
7974
- "span",
7963
+ children: [
7964
+ /* @__PURE__ */ jsxRuntime.jsxs(
7965
+ "span",
7966
+ {
7967
+ className: cn(
7968
+ "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
7969
+ hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
7970
+ ),
7971
+ children: [
7972
+ label,
7973
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
7974
+ ]
7975
+ }
7976
+ ),
7977
+ /* @__PURE__ */ jsxRuntime.jsx(
7978
+ "span",
7979
+ {
7980
+ className: cn(
7981
+ "flex-1 truncate mt-3",
7982
+ hasValue ? "text-foreground" : "invisible"
7983
+ ),
7984
+ children: hasValue ? dateFns.format(value, "dd MMM yyyy") : placeholder
7985
+ }
7986
+ ),
7987
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
7988
+ ]
7989
+ }
7990
+ ),
7991
+ /* @__PURE__ */ jsxRuntime.jsx(
7992
+ PopoverContent,
7993
+ {
7994
+ className: "p-0",
7995
+ align: "start",
7996
+ style: calendarWidth ? { width: calendarWidth } : void 0,
7997
+ children: /* @__PURE__ */ jsxRuntime.jsx(
7998
+ Calendar,
7975
7999
  {
7976
- className: cn(
7977
- "flex-1 truncate mt-3",
7978
- hasValue ? "text-foreground" : "invisible"
7979
- ),
7980
- children: hasValue ? dateFns.format(value, "dd MMM yyyy") : placeholder
8000
+ mode: "single",
8001
+ selected: value,
8002
+ onSelect: (date) => {
8003
+ onChange == null ? void 0 : onChange(date);
8004
+ setOpen(false);
8005
+ },
8006
+ fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
8007
+ className: "font-ui w-full",
8008
+ autoFocus: true
7981
8009
  }
7982
- ),
7983
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
7984
- ]
7985
- }
7986
- ),
7987
- /* @__PURE__ */ jsxRuntime.jsx(
7988
- PopoverContent,
7989
- {
7990
- className: "p-0",
7991
- align: "start",
7992
- style: calendarWidth ? { width: calendarWidth } : void 0,
7993
- children: /* @__PURE__ */ jsxRuntime.jsx(
7994
- Calendar,
7995
- {
7996
- mode: "single",
7997
- selected: value,
7998
- onSelect: (date) => {
7999
- onChange == null ? void 0 : onChange(date);
8000
- setOpen(false);
8001
- },
8002
- fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
8003
- className: "font-ui w-full",
8004
- autoFocus: true
8005
- }
8006
- )
8007
- }
8008
- )
8009
- ] }) });
8010
+ )
8011
+ }
8012
+ )
8013
+ ] }),
8014
+ error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: error })
8015
+ ] });
8016
+ }
8017
+ function dialFor(iso) {
8018
+ var _a, _b;
8019
+ return (_b = (_a = PHONE_COUNTRIES.find((c) => c.code === iso)) == null ? void 0 : _a.dial) != null ? _b : "";
8010
8020
  }
8021
+ var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
8011
8022
  function FormSection({
8012
8023
  title,
8024
+ required,
8013
8025
  children,
8014
8026
  className
8015
8027
  }) {
8016
8028
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-5", className), children: [
8017
8029
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
8018
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: title }),
8030
+ /* @__PURE__ */ jsxRuntime.jsxs("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: [
8031
+ title,
8032
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
8033
+ ] }),
8019
8034
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px flex-1 bg-border" })
8020
8035
  ] }),
8021
8036
  children
@@ -8031,24 +8046,67 @@ var defaultInitial = {
8031
8046
  phoneCountry: "BR",
8032
8047
  lastName: "",
8033
8048
  firstName: "",
8034
- country: "France",
8049
+ country: "",
8035
8050
  phone: "",
8036
- email: ""
8051
+ email: "",
8052
+ contactVia: "Email"
8037
8053
  };
8038
8054
  function BookingForm({
8039
8055
  defaultValues,
8040
8056
  onSubmit,
8041
- submitLabel = "Send my request",
8057
+ submitLabel,
8042
8058
  loading = false,
8043
8059
  showHeader = true,
8044
- title = "Check availability for your trip",
8045
- subtitle = "Free enquiry \u2013 no commitment",
8060
+ title,
8061
+ subtitle,
8062
+ labels,
8046
8063
  className
8047
8064
  }) {
8065
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C;
8066
+ const L = labels != null ? labels : {};
8067
+ const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
8068
+ const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
8069
+ const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
8048
8070
  const [values, setValues] = React32__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8049
- const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8071
+ const [errors, setErrors] = React32__namespace.useState({});
8072
+ const set = (key, value) => {
8073
+ setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8074
+ setErrors(
8075
+ (prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
8076
+ );
8077
+ };
8078
+ React32__namespace.useEffect(() => {
8079
+ if (!defaultValues) return;
8080
+ setValues((prev) => {
8081
+ let changed = false;
8082
+ const next = __spreadValues({}, prev);
8083
+ Object.keys(defaultValues).forEach(
8084
+ (k) => {
8085
+ const incoming = defaultValues[k];
8086
+ if (incoming === void 0 || incoming === "") return;
8087
+ if (prev[k] === defaultInitial[k]) {
8088
+ next[k] = incoming;
8089
+ changed = true;
8090
+ }
8091
+ }
8092
+ );
8093
+ return changed ? next : prev;
8094
+ });
8095
+ }, [defaultValues]);
8096
+ const reqMsg = (_d = L.errorRequired) != null ? _d : "This field is required";
8097
+ const emailMsg = (_e = L.errorEmail) != null ? _e : "Enter a valid email address";
8050
8098
  const handleSubmit = (e) => {
8051
8099
  e.preventDefault();
8100
+ const next = {};
8101
+ if (!values.firstName.trim()) next.firstName = reqMsg;
8102
+ if (!values.lastName.trim()) next.lastName = reqMsg;
8103
+ if (!values.email.trim()) next.email = reqMsg;
8104
+ else if (!EMAIL_RE.test(values.email.trim())) next.email = emailMsg;
8105
+ if (!values.travelDate) next.travelDate = reqMsg;
8106
+ if (!values.phone.trim()) next.phone = reqMsg;
8107
+ if (!values.contactVia) next.contactVia = reqMsg;
8108
+ setErrors(next);
8109
+ if (Object.keys(next).length > 0) return;
8052
8110
  onSubmit == null ? void 0 : onSubmit(values);
8053
8111
  };
8054
8112
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -8059,15 +8117,14 @@ function BookingForm({
8059
8117
  noValidate: true,
8060
8118
  children: [
8061
8119
  showHeader && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8062
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: title }),
8063
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitle })
8120
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: titleText }),
8121
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitleText })
8064
8122
  ] }),
8065
- /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Who's joining the adventure?", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8123
+ /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_f = L.travelersSection) != null ? _f : "Who's joining the adventure?", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8066
8124
  /* @__PURE__ */ jsxRuntime.jsx(
8067
8125
  CounterField,
8068
8126
  {
8069
- label: "Adults",
8070
- required: true,
8127
+ label: (_g = L.adults) != null ? _g : "Adults",
8071
8128
  value: values.adults,
8072
8129
  min: 1,
8073
8130
  onChange: (v) => set("adults", v)
@@ -8076,30 +8133,30 @@ function BookingForm({
8076
8133
  /* @__PURE__ */ jsxRuntime.jsx(
8077
8134
  CounterField,
8078
8135
  {
8079
- label: "Children",
8080
- sublabel: "(under 12)",
8136
+ label: (_h = L.children) != null ? _h : "Children",
8137
+ sublabel: (_i = L.childrenSublabel) != null ? _i : "(under 12)",
8081
8138
  value: values.children,
8082
8139
  min: 0,
8083
8140
  onChange: (v) => set("children", v)
8084
8141
  }
8085
8142
  )
8086
8143
  ] }) }),
8087
- /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Your next trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8144
+ /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_j = L.tripSection) != null ? _j : "Your next trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8088
8145
  /* @__PURE__ */ jsxRuntime.jsx(
8089
8146
  DatePickerField,
8090
8147
  {
8091
- label: "Travel date",
8148
+ label: (_k = L.travelDate) != null ? _k : "Travel date",
8092
8149
  required: true,
8093
8150
  value: values.travelDate,
8094
8151
  onChange: (d) => set("travelDate", d),
8095
- placeholder: "Pick a date"
8152
+ placeholder: (_l = L.pickDate) != null ? _l : "Pick a date",
8153
+ error: errors.travelDate
8096
8154
  }
8097
8155
  ),
8098
8156
  /* @__PURE__ */ jsxRuntime.jsx(
8099
8157
  FloatingInput,
8100
8158
  {
8101
- label: "Budget (per person)",
8102
- required: true,
8159
+ label: (_m = L.budget) != null ? _m : "Budget (per person)",
8103
8160
  type: "number",
8104
8161
  min: 0,
8105
8162
  value: values.budget,
@@ -8107,7 +8164,7 @@ function BookingForm({
8107
8164
  }
8108
8165
  )
8109
8166
  ] }) }),
8110
- /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Tell us about your trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
8167
+ /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_n = L.projectSection) != null ? _n : "Tell us about your trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
8111
8168
  /* @__PURE__ */ jsxRuntime.jsx(
8112
8169
  "textarea",
8113
8170
  {
@@ -8135,140 +8192,184 @@ function BookingForm({
8135
8192
  "peer-not-placeholder-shown:top-2 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
8136
8193
  ),
8137
8194
  children: [
8138
- "Your trip in a few words",
8195
+ (_o = L.projectLabel) != null ? _o : "Your trip in a few words",
8139
8196
  " ",
8140
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })
8197
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground font-normal", children: (_p = L.optional) != null ? _p : "(optional)" })
8141
8198
  ]
8142
8199
  }
8143
8200
  )
8144
8201
  ] }) }),
8145
- /* @__PURE__ */ jsxRuntime.jsxs(FormSection, { title: "Contact details", children: [
8202
+ /* @__PURE__ */ jsxRuntime.jsxs(FormSection, { title: (_q = L.contactSection) != null ? _q : "Contact details", children: [
8146
8203
  /* @__PURE__ */ jsxRuntime.jsx(
8147
8204
  "div",
8148
8205
  {
8149
8206
  role: "radiogroup",
8150
- "aria-label": "Title",
8207
+ "aria-label": (_r = L.titleAria) != null ? _r : "Title",
8151
8208
  className: "flex flex-wrap items-center gap-x-6 gap-y-3",
8152
- children: ["ms", "mr"].map((c) => /* @__PURE__ */ jsxRuntime.jsxs(
8153
- "label",
8154
- {
8155
- className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
8156
- children: [
8157
- /* @__PURE__ */ jsxRuntime.jsx(
8158
- "input",
8159
- {
8160
- type: "radio",
8161
- name: "civility",
8162
- value: c,
8163
- checked: values.civility === c,
8164
- onChange: () => set("civility", c),
8165
- className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
8166
- }
8167
- ),
8168
- c === "ms" ? "Ms." : "Mr."
8169
- ]
8170
- },
8171
- c
8172
- ))
8209
+ children: ["ms", "mr"].map((c) => {
8210
+ var _a2, _b2;
8211
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8212
+ "label",
8213
+ {
8214
+ className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
8215
+ children: [
8216
+ /* @__PURE__ */ jsxRuntime.jsx(
8217
+ "input",
8218
+ {
8219
+ type: "radio",
8220
+ name: "civility",
8221
+ value: c,
8222
+ checked: values.civility === c,
8223
+ onChange: () => set("civility", c),
8224
+ className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
8225
+ }
8226
+ ),
8227
+ c === "ms" ? (_a2 = L.ms) != null ? _a2 : "Ms." : (_b2 = L.mr) != null ? _b2 : "Mr."
8228
+ ]
8229
+ },
8230
+ c
8231
+ );
8232
+ })
8173
8233
  }
8174
8234
  ),
8175
8235
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 min-w-0", children: [
8176
8236
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
8177
8237
  FloatingInput,
8178
8238
  {
8179
- label: "Last name",
8239
+ label: (_s = L.lastName) != null ? _s : "Last name",
8180
8240
  required: true,
8181
8241
  value: values.lastName,
8182
- onChange: (e) => set("lastName", e.target.value)
8242
+ onChange: (e) => set("lastName", e.target.value),
8243
+ error: errors.lastName
8183
8244
  }
8184
8245
  ) }),
8185
8246
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
8186
8247
  FloatingInput,
8187
8248
  {
8188
- label: "First name",
8249
+ label: (_t = L.firstName) != null ? _t : "First name",
8189
8250
  required: true,
8190
8251
  value: values.firstName,
8191
- onChange: (e) => set("firstName", e.target.value)
8252
+ onChange: (e) => set("firstName", e.target.value),
8253
+ error: errors.firstName
8192
8254
  }
8193
8255
  ) }),
8194
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxRuntime.jsxs(
8195
- FloatingSelect,
8256
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxRuntime.jsx(
8257
+ CountrySearchField,
8196
8258
  {
8197
- label: "Country of residence",
8198
- required: true,
8259
+ label: (_u = L.country) != null ? _u : "Country of residence",
8199
8260
  value: values.country,
8200
- onChange: (e) => set("country", e.target.value),
8201
- children: [
8202
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, hidden: true }),
8203
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "France", children: "France" }),
8204
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Belgium", children: "Belgium" }),
8205
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Switzerland", children: "Switzerland" }),
8206
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Canada", children: "Canada" }),
8207
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Luxembourg", children: "Luxembourg" }),
8208
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "United Kingdom", children: "United Kingdom" }),
8209
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "United States", children: "United States" }),
8210
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Other", children: "Other" })
8211
- ]
8261
+ onChange: (code) => set("country", code),
8262
+ countries: COUNTRIES
8212
8263
  }
8213
8264
  ) })
8214
8265
  ] }),
8215
8266
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [
8216
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full min-w-0", children: [
8217
- /* @__PURE__ */ jsxRuntime.jsx(
8218
- PhoneCountrySelect,
8219
- {
8220
- value: values.phoneCountry,
8221
- onChange: (code) => set("phoneCountry", code),
8222
- className: "shrink-0"
8223
- }
8224
- ),
8225
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-w-0 flex-1", children: [
8267
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
8268
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full min-w-0", children: [
8226
8269
  /* @__PURE__ */ jsxRuntime.jsx(
8227
- "input",
8270
+ PhoneCountrySelect,
8228
8271
  {
8229
- id: "phone",
8230
- type: "tel",
8231
- placeholder: " ",
8232
- value: values.phone,
8233
- onChange: (e) => set("phone", e.target.value),
8234
- className: cn(
8235
- "peer block h-14 w-full rounded-r-lg border border-border bg-background",
8236
- "px-3 pt-5 pb-2 text-base text-foreground font-ui",
8237
- "transition-colors placeholder-transparent",
8238
- "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary"
8239
- )
8272
+ value: values.phoneCountry,
8273
+ onChange: (code) => set("phoneCountry", code),
8274
+ className: "shrink-0",
8275
+ showDial: false
8240
8276
  }
8241
8277
  ),
8242
- /* @__PURE__ */ jsxRuntime.jsxs(
8243
- "label",
8244
- {
8245
- htmlFor: "phone",
8246
- className: cn(
8247
- "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
8248
- "text-base text-muted-foreground font-ui transition-all duration-150",
8249
- "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
8250
- "peer-not-placeholder-shown:top-3 peer-not-placeholder-shown:translate-y-0 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
8251
- ),
8252
- children: [
8253
- "Phone ",
8254
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: "*" })
8255
- ]
8256
- }
8257
- )
8258
- ] })
8278
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-w-0 flex-1", children: [
8279
+ /* @__PURE__ */ jsxRuntime.jsx(
8280
+ "input",
8281
+ {
8282
+ id: "phone",
8283
+ type: "tel",
8284
+ placeholder: " ",
8285
+ value: `${dialFor(values.phoneCountry)} ${values.phone}`,
8286
+ onChange: (e) => {
8287
+ const dial = dialFor(values.phoneCountry);
8288
+ let national = e.target.value;
8289
+ if (national.startsWith(dial)) national = national.slice(dial.length);
8290
+ national = national.replace(/^\s+/, "");
8291
+ set("phone", national);
8292
+ },
8293
+ className: cn(
8294
+ "peer block h-14 w-full rounded-r-lg border border-border bg-background",
8295
+ "px-3 pt-5 pb-2 text-base text-foreground font-ui",
8296
+ "transition-colors placeholder-transparent",
8297
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
8298
+ errors.phone && "border-destructive focus:border-destructive focus:ring-destructive"
8299
+ )
8300
+ }
8301
+ ),
8302
+ /* @__PURE__ */ jsxRuntime.jsxs(
8303
+ "label",
8304
+ {
8305
+ htmlFor: "phone",
8306
+ className: cn(
8307
+ "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
8308
+ "text-base text-muted-foreground font-ui transition-all duration-150",
8309
+ "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
8310
+ "peer-not-placeholder-shown:top-3 peer-not-placeholder-shown:translate-y-0 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
8311
+ ),
8312
+ children: [
8313
+ (_v = L.phone) != null ? _v : "Phone",
8314
+ " ",
8315
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: "*" })
8316
+ ]
8317
+ }
8318
+ )
8319
+ ] })
8320
+ ] }),
8321
+ errors.phone && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: errors.phone })
8259
8322
  ] }),
8260
8323
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
8261
8324
  FloatingInput,
8262
8325
  {
8263
- label: "Email",
8326
+ label: (_w = L.email) != null ? _w : "Email",
8264
8327
  required: true,
8265
8328
  type: "email",
8266
8329
  value: values.email,
8267
- onChange: (e) => set("email", e.target.value)
8330
+ onChange: (e) => set("email", e.target.value),
8331
+ error: errors.email
8268
8332
  }
8269
8333
  ) })
8270
8334
  ] })
8271
8335
  ] }),
8336
+ /* @__PURE__ */ jsxRuntime.jsxs(
8337
+ FormSection,
8338
+ {
8339
+ title: (_x = L.contactViaSection) != null ? _x : "How should we contact you?",
8340
+ required: true,
8341
+ children: [
8342
+ /* @__PURE__ */ jsxRuntime.jsx(
8343
+ "div",
8344
+ {
8345
+ role: "radiogroup",
8346
+ "aria-label": (_y = L.contactViaSection) != null ? _y : "How should we contact you?",
8347
+ className: "inline-flex flex-wrap rounded-full border border-border bg-background p-1",
8348
+ children: [
8349
+ ["WhatsApp", (_z = L.contactViaWhatsApp) != null ? _z : "WhatsApp"],
8350
+ ["Email", (_A = L.contactViaEmail) != null ? _A : "Email"],
8351
+ ["Phone", (_B = L.contactViaPhone) != null ? _B : "Phone"]
8352
+ ].map(([value, label]) => /* @__PURE__ */ jsxRuntime.jsx(
8353
+ "button",
8354
+ {
8355
+ type: "button",
8356
+ role: "radio",
8357
+ "aria-checked": values.contactVia === value,
8358
+ onClick: () => set("contactVia", value),
8359
+ className: cn(
8360
+ "whitespace-nowrap rounded-full px-5 py-2 font-heading text-[13px] font-semibold transition-colors",
8361
+ values.contactVia === value ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:text-foreground"
8362
+ ),
8363
+ children: label
8364
+ },
8365
+ value
8366
+ ))
8367
+ }
8368
+ ),
8369
+ errors.contactVia && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-destructive font-ui", children: errors.contactVia })
8370
+ ]
8371
+ }
8372
+ ),
8272
8373
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center pt-2", children: /* @__PURE__ */ jsxRuntime.jsx(
8273
8374
  "button",
8274
8375
  {
@@ -8303,8 +8404,8 @@ function BookingForm({
8303
8404
  }
8304
8405
  )
8305
8406
  ] }),
8306
- "Sending\u2026"
8307
- ] }) : submitLabel
8407
+ (_C = L.sending) != null ? _C : "Sending\u2026"
8408
+ ] }) : submitText
8308
8409
  }
8309
8410
  ) })
8310
8411
  ]
@@ -10053,56 +10154,66 @@ function AccordionItem(_a) {
10053
10154
  function AccordionTrigger(_a) {
10054
10155
  var _b = _a, {
10055
10156
  className,
10056
- children
10157
+ children,
10158
+ headingLevel
10057
10159
  } = _b, props = __objRest(_b, [
10058
10160
  "className",
10059
- "children"
10161
+ "children",
10162
+ "headingLevel"
10060
10163
  ]);
10061
10164
  const variant = React32__namespace.useContext(AccordionVariantContext);
10062
- return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
10063
- accordion.Accordion.Trigger,
10165
+ const headingRender = headingLevel === 2 ? /* @__PURE__ */ jsxRuntime.jsx("h2", {}) : headingLevel === 4 ? /* @__PURE__ */ jsxRuntime.jsx("h4", {}) : headingLevel === 5 ? /* @__PURE__ */ jsxRuntime.jsx("h5", {}) : headingLevel === 6 ? /* @__PURE__ */ jsxRuntime.jsx("h6", {}) : void 0;
10166
+ return /* @__PURE__ */ jsxRuntime.jsx(
10167
+ accordion.Accordion.Header,
10064
10168
  __spreadProps(__spreadValues({
10065
- "data-slot": "accordion-trigger",
10066
- className: cn(
10067
- "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
10068
- "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
10069
- variant === "default" && [
10070
- "rounded-lg border border-transparent py-2.5 text-sm font-medium",
10071
- "hover:underline focus-visible:border-ring",
10072
- "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
10073
- ],
10074
- variant === "faq" && [
10075
- "px-5 py-4 text-base font-bold",
10076
- "hover:bg-muted/30 rounded-lg"
10077
- ],
10078
- className
10079
- )
10080
- }, props), {
10081
- children: [
10082
- children,
10083
- variant === "default" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10084
- /* @__PURE__ */ jsxRuntime.jsx(
10085
- lucideReact.ChevronDownIcon,
10086
- {
10087
- "data-slot": "accordion-trigger-icon",
10088
- className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
10089
- }
10090
- ),
10091
- /* @__PURE__ */ jsxRuntime.jsx(
10092
- lucideReact.ChevronUpIcon,
10093
- {
10094
- "data-slot": "accordion-trigger-icon",
10095
- className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
10096
- }
10169
+ className: "flex"
10170
+ }, headingRender ? { render: headingRender } : {}), {
10171
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
10172
+ accordion.Accordion.Trigger,
10173
+ __spreadProps(__spreadValues({
10174
+ "data-slot": "accordion-trigger",
10175
+ className: cn(
10176
+ "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
10177
+ "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
10178
+ variant === "default" && [
10179
+ "rounded-lg border border-transparent py-2.5 text-sm font-medium",
10180
+ "hover:underline focus-visible:border-ring",
10181
+ "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
10182
+ ],
10183
+ variant === "faq" && [
10184
+ "px-5 py-4 text-base font-bold",
10185
+ "hover:bg-muted/30 rounded-lg"
10186
+ ],
10187
+ className
10097
10188
  )
10098
- ] }),
10099
- variant === "faq" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10100
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
10101
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
10102
- ] })
10103
- ]
10189
+ }, props), {
10190
+ children: [
10191
+ children,
10192
+ variant === "default" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10193
+ /* @__PURE__ */ jsxRuntime.jsx(
10194
+ lucideReact.ChevronDownIcon,
10195
+ {
10196
+ "data-slot": "accordion-trigger-icon",
10197
+ className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
10198
+ }
10199
+ ),
10200
+ /* @__PURE__ */ jsxRuntime.jsx(
10201
+ lucideReact.ChevronUpIcon,
10202
+ {
10203
+ "data-slot": "accordion-trigger-icon",
10204
+ className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
10205
+ }
10206
+ )
10207
+ ] }),
10208
+ variant === "faq" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10209
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
10210
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
10211
+ ] })
10212
+ ]
10213
+ })
10214
+ )
10104
10215
  })
10105
- ) });
10216
+ );
10106
10217
  }
10107
10218
  function AccordionContent(_a) {
10108
10219
  var _b = _a, {
@@ -10327,9 +10438,10 @@ function FilterPanel({
10327
10438
  variant = "sidebar",
10328
10439
  sortOptions,
10329
10440
  sort,
10330
- onSortChange
10441
+ onSortChange,
10442
+ labels
10331
10443
  }) {
10332
- var _a, _b;
10444
+ var _a, _b, _c, _d, _e, _f, _g, _h;
10333
10445
  const resolvedGroups = React32__namespace.useMemo(() => resolveGroups(groups), [groups]);
10334
10446
  const [internalValue, setInternalValue] = React32__namespace.useState(
10335
10447
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
@@ -10467,7 +10579,7 @@ function FilterPanel({
10467
10579
  type: "button",
10468
10580
  onClick: handleClearAll,
10469
10581
  className: "text-sm font-ui font-semibold text-muted-foreground underline underline-offset-2 hover:text-foreground",
10470
- children: "Clear all"
10582
+ children: (_b = labels == null ? void 0 : labels.clearAll) != null ? _b : "Clear all"
10471
10583
  }
10472
10584
  ),
10473
10585
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -10481,9 +10593,8 @@ function FilterPanel({
10481
10593
  }
10482
10594
  ),
10483
10595
  children: [
10484
- "Show ",
10485
- totalSelected > 0 ? `(${totalSelected})` : "",
10486
- " results"
10596
+ (_c = labels == null ? void 0 : labels.showResults) != null ? _c : "Show results",
10597
+ totalSelected > 0 ? ` (${totalSelected})` : ""
10487
10598
  ]
10488
10599
  }
10489
10600
  )
@@ -10508,7 +10619,7 @@ function FilterPanel({
10508
10619
  }
10509
10620
  ),
10510
10621
  children: [
10511
- "Sort",
10622
+ (_d = labels == null ? void 0 : labels.sortLabel) != null ? _d : "Sort",
10512
10623
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" })
10513
10624
  ]
10514
10625
  }
@@ -10618,14 +10729,15 @@ function FilterPanel({
10618
10729
  className: "inline-flex items-center gap-1 rounded-full px-3 py-1.5 text-xs font-ui font-semibold text-muted-foreground hover:text-foreground transition-colors",
10619
10730
  children: [
10620
10731
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-3 w-3" }),
10621
- "Clear all (",
10732
+ (_e = labels == null ? void 0 : labels.clearAll) != null ? _e : "Clear all",
10733
+ " (",
10622
10734
  totalSelected,
10623
10735
  ")"
10624
10736
  ]
10625
10737
  }
10626
10738
  ),
10627
10739
  sortOptions && sortOptions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
10628
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: "Sort by" }),
10740
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: (_f = labels == null ? void 0 : labels.sortByLabel) != null ? _f : "Sort by" }),
10629
10741
  /* @__PURE__ */ jsxRuntime.jsxs(Popover, { children: [
10630
10742
  /* @__PURE__ */ jsxRuntime.jsxs(
10631
10743
  PopoverTrigger,
@@ -10642,7 +10754,7 @@ function FilterPanel({
10642
10754
  }
10643
10755
  ),
10644
10756
  children: [
10645
- (_b = activeSort == null ? void 0 : activeSort.label) != null ? _b : "Default",
10757
+ (_g = activeSort == null ? void 0 : activeSort.label) != null ? _g : "Default",
10646
10758
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-3.5 w-3.5 text-muted-foreground" })
10647
10759
  ]
10648
10760
  }
@@ -10714,7 +10826,7 @@ function FilterPanel({
10714
10826
  {
10715
10827
  onClick: handleClearAll,
10716
10828
  className: "self-start text-sm text-muted-foreground underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring font-ui",
10717
- children: "Remove all filters"
10829
+ children: (_h = labels == null ? void 0 : labels.removeAllFilters) != null ? _h : "Remove all filters"
10718
10830
  }
10719
10831
  )
10720
10832
  ] });
@@ -10983,7 +11095,7 @@ function Picture(_a) {
10983
11095
  "onLoad",
10984
11096
  "onError"
10985
11097
  ]);
10986
- var _a2;
11098
+ var _a2, _b2;
10987
11099
  const ref = React32__namespace.useRef(null);
10988
11100
  const [visible, setVisible] = React32__namespace.useState(eager);
10989
11101
  const [loaded, setLoaded] = React32__namespace.useState(false);
@@ -11011,8 +11123,9 @@ function Picture(_a) {
11011
11123
  }, [src]);
11012
11124
  const webp = webpVariantUrl(src);
11013
11125
  const realSrc = visible ? src : PLACEHOLDER_SRC;
11126
+ const resolvedTitle = (_a2 = imgProps.title) != null ? _a2 : typeof imgProps.alt === "string" && imgProps.alt.trim() ? imgProps.alt : void 0;
11014
11127
  const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
11015
- const fetchPriorityResolved = (_a2 = imgProps.fetchPriority) != null ? _a2 : eager ? void 0 : "low";
11128
+ const fetchPriorityResolved = (_b2 = imgProps.fetchPriority) != null ? _b2 : eager ? void 0 : "low";
11016
11129
  const handleLoad = (e) => {
11017
11130
  if (visible) setLoaded(true);
11018
11131
  onLoad == null ? void 0 : onLoad(e);
@@ -11038,6 +11151,7 @@ function Picture(_a) {
11038
11151
  onLoad: handleLoad,
11039
11152
  onError: handleError
11040
11153
  }, imgProps), {
11154
+ title: resolvedTitle,
11041
11155
  fetchPriority: fetchPriorityResolved,
11042
11156
  style: mergedStyle
11043
11157
  })
@@ -11061,6 +11175,7 @@ function Picture(_a) {
11061
11175
  onLoad: handleLoad,
11062
11176
  onError: handleError
11063
11177
  }, imgProps), {
11178
+ title: resolvedTitle,
11064
11179
  fetchPriority: fetchPriorityResolved,
11065
11180
  style: mergedStyle
11066
11181
  })
@@ -11355,9 +11470,10 @@ function gridCols(total) {
11355
11470
  function Lightbox({
11356
11471
  photos,
11357
11472
  initialIndex,
11358
- onClose
11473
+ onClose,
11474
+ labels
11359
11475
  }) {
11360
- var _a;
11476
+ var _a, _b, _c, _d;
11361
11477
  const [index, setIndex] = React32__namespace.useState(initialIndex);
11362
11478
  const total = photos.length;
11363
11479
  const photo = photos[index];
@@ -11390,7 +11506,7 @@ function Lightbox({
11390
11506
  type: "button",
11391
11507
  onClick: onClose,
11392
11508
  className: "absolute top-5 right-5 flex h-10 w-10 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors z-10",
11393
- "aria-label": "Close lightbox",
11509
+ "aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
11394
11510
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5" })
11395
11511
  }
11396
11512
  ),
@@ -11403,7 +11519,7 @@ function Lightbox({
11403
11519
  prev();
11404
11520
  },
11405
11521
  className: "absolute left-4 top-1/2 -translate-y-1/2 flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/25 transition-colors z-10",
11406
- "aria-label": "Previous photo",
11522
+ "aria-label": (_b = labels == null ? void 0 : labels.previous) != null ? _b : "Previous photo",
11407
11523
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
11408
11524
  }
11409
11525
  ),
@@ -11416,7 +11532,7 @@ function Lightbox({
11416
11532
  next();
11417
11533
  },
11418
11534
  className: "absolute right-4 top-1/2 -translate-y-1/2 flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/25 transition-colors z-10",
11419
- "aria-label": "Next photo",
11535
+ "aria-label": (_c = labels == null ? void 0 : labels.next) != null ? _c : "Next photo",
11420
11536
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
11421
11537
  }
11422
11538
  ),
@@ -11424,7 +11540,8 @@ function Lightbox({
11424
11540
  Picture,
11425
11541
  {
11426
11542
  src: photo.src,
11427
- alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
11543
+ alt: (_d = photo.alt) != null ? _d : `Photo ${index + 1}`,
11544
+ title: photo.caption,
11428
11545
  className: "max-w-[calc(100%-6rem)] max-h-[calc(100vh-11rem)] object-contain rounded-lg shadow-2xl",
11429
11546
  onClick: (e) => e.stopPropagation()
11430
11547
  }
@@ -11494,6 +11611,7 @@ function PhotoTile({
11494
11611
  {
11495
11612
  src: photo.src,
11496
11613
  alt: (_b = photo.alt) != null ? _b : `Photo ${index + 1}`,
11614
+ title: photo.caption,
11497
11615
  className: "w-full h-full object-cover transition-transform duration-700 group-hover:scale-105",
11498
11616
  loading: "lazy"
11499
11617
  }
@@ -11507,8 +11625,10 @@ function PhotoTile({
11507
11625
  function ShowMoreButton({
11508
11626
  count,
11509
11627
  expanded,
11510
- onClick
11628
+ onClick,
11629
+ labels
11511
11630
  }) {
11631
+ var _a, _b;
11512
11632
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
11513
11633
  "button",
11514
11634
  {
@@ -11522,10 +11642,11 @@ function ShowMoreButton({
11522
11642
  ),
11523
11643
  children: expanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11524
11644
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
11525
- "Show less"
11645
+ (_a = labels == null ? void 0 : labels.showLess) != null ? _a : "Show less"
11526
11646
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11527
11647
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LayoutGridIcon, { className: "h-4 w-4 text-muted-foreground" }),
11528
- "See more (",
11648
+ (_b = labels == null ? void 0 : labels.seeMore) != null ? _b : "See more",
11649
+ " (",
11529
11650
  count,
11530
11651
  ")"
11531
11652
  ] })
@@ -11535,7 +11656,8 @@ function ShowMoreButton({
11535
11656
  function GridGallery({
11536
11657
  photos,
11537
11658
  initialVisible,
11538
- onOpen
11659
+ onOpen,
11660
+ labels
11539
11661
  }) {
11540
11662
  const [expanded, setExpanded] = React32__namespace.useState(false);
11541
11663
  const cols = gridCols(photos.length);
@@ -11557,7 +11679,8 @@ function GridGallery({
11557
11679
  {
11558
11680
  count: photos.length - initialVisible,
11559
11681
  expanded,
11560
- onClick: () => setExpanded((v) => !v)
11682
+ onClick: () => setExpanded((v) => !v),
11683
+ labels
11561
11684
  }
11562
11685
  )
11563
11686
  ] });
@@ -11565,7 +11688,8 @@ function GridGallery({
11565
11688
  function CompactGridGallery({
11566
11689
  photos,
11567
11690
  initialVisible,
11568
- onOpen
11691
+ onOpen,
11692
+ labels
11569
11693
  }) {
11570
11694
  const [expanded, setExpanded] = React32__namespace.useState(false);
11571
11695
  const hasMore = photos.length > initialVisible;
@@ -11586,7 +11710,8 @@ function CompactGridGallery({
11586
11710
  {
11587
11711
  count: photos.length - initialVisible,
11588
11712
  expanded,
11589
- onClick: () => setExpanded((v) => !v)
11713
+ onClick: () => setExpanded((v) => !v),
11714
+ labels
11590
11715
  }
11591
11716
  )
11592
11717
  ] });
@@ -11594,7 +11719,8 @@ function CompactGridGallery({
11594
11719
  function MasonryGallery({
11595
11720
  photos,
11596
11721
  initialVisible,
11597
- onOpen
11722
+ onOpen,
11723
+ labels
11598
11724
  }) {
11599
11725
  const [expanded, setExpanded] = React32__namespace.useState(false);
11600
11726
  const hasMore = photos.length > initialVisible;
@@ -11615,6 +11741,7 @@ function MasonryGallery({
11615
11741
  {
11616
11742
  src: p.src,
11617
11743
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
11744
+ title: p.caption,
11618
11745
  className: "w-full h-auto object-cover transition-transform duration-700 group-hover:scale-105",
11619
11746
  loading: "lazy"
11620
11747
  }
@@ -11630,7 +11757,8 @@ function MasonryGallery({
11630
11757
  {
11631
11758
  count: photos.length - initialVisible,
11632
11759
  expanded,
11633
- onClick: () => setExpanded((v) => !v)
11760
+ onClick: () => setExpanded((v) => !v),
11761
+ labels
11634
11762
  }
11635
11763
  )
11636
11764
  ] });
@@ -11654,6 +11782,7 @@ function FilmstripGallery({
11654
11782
  {
11655
11783
  src: p.src,
11656
11784
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
11785
+ title: p.caption,
11657
11786
  className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
11658
11787
  loading: "lazy"
11659
11788
  }
@@ -11667,7 +11796,8 @@ function FilmstripGallery({
11667
11796
  }
11668
11797
  function FeaturedGallery({
11669
11798
  photos,
11670
- onOpen
11799
+ onOpen,
11800
+ labels
11671
11801
  }) {
11672
11802
  const [expanded, setExpanded] = React32__namespace.useState(false);
11673
11803
  const featured = photos.slice(0, 3);
@@ -11719,6 +11849,7 @@ function FeaturedGallery({
11719
11849
  {
11720
11850
  src: p.src,
11721
11851
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 4}`,
11852
+ title: p.caption,
11722
11853
  className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
11723
11854
  loading: "lazy"
11724
11855
  }
@@ -11734,7 +11865,8 @@ function FeaturedGallery({
11734
11865
  {
11735
11866
  count: extra.length,
11736
11867
  expanded,
11737
- onClick: () => setExpanded((v) => !v)
11868
+ onClick: () => setExpanded((v) => !v),
11869
+ labels
11738
11870
  }
11739
11871
  )
11740
11872
  ] });
@@ -11802,6 +11934,7 @@ function CarouselGallery({
11802
11934
  {
11803
11935
  src: photo.src,
11804
11936
  alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
11937
+ title: photo.caption,
11805
11938
  className: "h-full w-full object-cover transition-transform duration-500 group-hover/photo:scale-[1.02]",
11806
11939
  loading: "lazy"
11807
11940
  },
@@ -11865,6 +11998,7 @@ function PhotoGallery({
11865
11998
  variant = "grid",
11866
11999
  initialVisible = 6,
11867
12000
  onPhotoClick,
12001
+ labels,
11868
12002
  className
11869
12003
  }) {
11870
12004
  const [lightboxIndex, setLightboxIndex] = React32__namespace.useState(null);
@@ -11880,7 +12014,8 @@ function PhotoGallery({
11880
12014
  {
11881
12015
  photos: normalised,
11882
12016
  initialIndex: lightboxIndex,
11883
- onClose: () => setLightboxIndex(null)
12017
+ onClose: () => setLightboxIndex(null),
12018
+ labels
11884
12019
  }
11885
12020
  );
11886
12021
  if (variant === "carousel" || variant === "fullBleed") {
@@ -11908,7 +12043,8 @@ function PhotoGallery({
11908
12043
  {
11909
12044
  photos: normalised,
11910
12045
  initialVisible,
11911
- onOpen: handleOpen
12046
+ onOpen: handleOpen,
12047
+ labels
11912
12048
  }
11913
12049
  ),
11914
12050
  variant === "gridCompact" && /* @__PURE__ */ jsxRuntime.jsx(
@@ -11916,7 +12052,8 @@ function PhotoGallery({
11916
12052
  {
11917
12053
  photos: normalised,
11918
12054
  initialVisible,
11919
- onOpen: handleOpen
12055
+ onOpen: handleOpen,
12056
+ labels
11920
12057
  }
11921
12058
  ),
11922
12059
  variant === "masonry" && /* @__PURE__ */ jsxRuntime.jsx(
@@ -11924,11 +12061,12 @@ function PhotoGallery({
11924
12061
  {
11925
12062
  photos: normalised,
11926
12063
  initialVisible,
11927
- onOpen: handleOpen
12064
+ onOpen: handleOpen,
12065
+ labels
11928
12066
  }
11929
12067
  ),
11930
12068
  variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
11931
- variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
12069
+ variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen, labels }),
11932
12070
  variant === "collage" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
11933
12071
  variant === "collageTight" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
11934
12072
  lightbox
@@ -12198,6 +12336,8 @@ function PricingTrip({
12198
12336
  departureTimes,
12199
12337
  onBook,
12200
12338
  bookLabel = "Check availability",
12339
+ fromLabel = "From",
12340
+ perPersonLabel = "per person",
12201
12341
  variant = "card",
12202
12342
  sharp = false,
12203
12343
  belowPrice,
@@ -12224,13 +12364,16 @@ function PricingTrip({
12224
12364
  ),
12225
12365
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center gap-3", children: [
12226
12366
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
12227
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
12367
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
12228
12368
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-1.5 flex-wrap", children: [
12229
12369
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg font-bold text-foreground font-heading leading-none", children: [
12230
12370
  currency,
12231
12371
  " ",
12232
12372
  priceFrom,
12233
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: "/ per person" })
12373
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: [
12374
+ "/ ",
12375
+ perPersonLabel
12376
+ ] })
12234
12377
  ] }),
12235
12378
  (priceInfo || currencyEstimates && currencyEstimates.length > 0) && /* @__PURE__ */ jsxRuntime.jsx(
12236
12379
  "button",
@@ -12342,7 +12485,7 @@ function PricingTrip({
12342
12485
  ] }),
12343
12486
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
12344
12487
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "shrink-0 text-right", children: [
12345
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
12488
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
12346
12489
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xl font-bold text-foreground font-heading leading-none", children: [
12347
12490
  currency,
12348
12491
  " ",
@@ -12371,13 +12514,16 @@ function PricingTrip({
12371
12514
  }
12372
12515
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
12373
12516
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12374
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: "From" }),
12517
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: fromLabel }),
12375
12518
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-2xl font-bold text-foreground font-heading flex items-center gap-2 flex-wrap", children: [
12376
12519
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
12377
12520
  currency,
12378
12521
  " ",
12379
12522
  priceFrom,
12380
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: " / per person" })
12523
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: [
12524
+ " / ",
12525
+ perPersonLabel
12526
+ ] })
12381
12527
  ] }),
12382
12528
  priceInfo && /* @__PURE__ */ jsxRuntime.jsx(
12383
12529
  "button",
@@ -12644,8 +12790,10 @@ function SiteHeader({
12644
12790
  onSearch,
12645
12791
  onAccount,
12646
12792
  position = variant === "transparent" ? "overlay" : "fixed",
12793
+ labels,
12647
12794
  className
12648
12795
  }) {
12796
+ var _a, _b, _c, _d, _e, _f, _g;
12649
12797
  const t = VARIANT[variant];
12650
12798
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
12651
12799
  const [openMenu, setOpenMenu] = React32__namespace.useState(null);
@@ -12703,7 +12851,7 @@ function SiteHeader({
12703
12851
  {
12704
12852
  type: "button",
12705
12853
  onClick: () => setMobileOpen(true),
12706
- "aria-label": "Open menu",
12854
+ "aria-label": (_a = labels == null ? void 0 : labels.openMenu) != null ? _a : "Open menu",
12707
12855
  className: cn(
12708
12856
  "flex lg:hidden h-9 w-9 items-center justify-center rounded-full transition-colors -ml-1.5",
12709
12857
  t.mobileTrigger
@@ -12732,8 +12880,8 @@ function SiteHeader({
12732
12880
  }
12733
12881
  ),
12734
12882
  /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "hidden lg:flex items-center gap-0.5 mx-auto", children: links.map((link) => {
12735
- var _a, _b;
12736
- const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
12883
+ var _a2, _b2;
12884
+ const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
12737
12885
  const isOpen = openMenu === link.label;
12738
12886
  return /* @__PURE__ */ jsxRuntime.jsxs(
12739
12887
  "div",
@@ -12745,7 +12893,7 @@ function SiteHeader({
12745
12893
  /* @__PURE__ */ jsxRuntime.jsxs(
12746
12894
  "a",
12747
12895
  {
12748
- href: (_b = link.href) != null ? _b : "#",
12896
+ href: (_b2 = link.href) != null ? _b2 : "#",
12749
12897
  onClick: hasDropdown ? (e) => e.preventDefault() : void 0,
12750
12898
  className: cn(
12751
12899
  "flex items-center gap-1 px-3.5 py-1.5 rounded-full",
@@ -12794,7 +12942,7 @@ function SiteHeader({
12794
12942
  "button",
12795
12943
  {
12796
12944
  type: "button",
12797
- "aria-label": "Language",
12945
+ "aria-label": (_b = labels == null ? void 0 : labels.language) != null ? _b : "Language",
12798
12946
  className: cn(
12799
12947
  "flex items-center gap-0.5 px-2.5 py-1.5 rounded-full",
12800
12948
  "text-sm font-ui transition-colors",
@@ -12834,7 +12982,7 @@ function SiteHeader({
12834
12982
  {
12835
12983
  type: "button",
12836
12984
  onClick: onSearch,
12837
- "aria-label": "Search",
12985
+ "aria-label": (_c = labels == null ? void 0 : labels.search) != null ? _c : "Search",
12838
12986
  className: cn(
12839
12987
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12840
12988
  t.icon
@@ -12847,7 +12995,7 @@ function SiteHeader({
12847
12995
  {
12848
12996
  type: "button",
12849
12997
  onClick: onAccount,
12850
- "aria-label": "Account",
12998
+ "aria-label": (_d = labels == null ? void 0 : labels.account) != null ? _d : "Account",
12851
12999
  className: cn(
12852
13000
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12853
13001
  t.icon
@@ -12880,7 +13028,7 @@ function SiteHeader({
12880
13028
  {
12881
13029
  type: "button",
12882
13030
  onClick: () => setMobileOpen(false),
12883
- "aria-label": "Close menu",
13031
+ "aria-label": (_e = labels == null ? void 0 : labels.closeMenu) != null ? _e : "Close menu",
12884
13032
  className: cn(
12885
13033
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12886
13034
  t.mobileTrigger
@@ -12890,8 +13038,8 @@ function SiteHeader({
12890
13038
  )
12891
13039
  ] }),
12892
13040
  /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "flex-1 overflow-y-auto px-6 py-6 flex flex-col gap-1", children: links.map((link) => {
12893
- var _a, _b;
12894
- const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
13041
+ var _a2, _b2;
13042
+ const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
12895
13043
  const isExpanded = openMobileSection === link.label;
12896
13044
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12897
13045
  hasDropdown ? /* @__PURE__ */ jsxRuntime.jsxs(
@@ -12919,7 +13067,7 @@ function SiteHeader({
12919
13067
  ) : /* @__PURE__ */ jsxRuntime.jsx(
12920
13068
  "a",
12921
13069
  {
12922
- href: (_b = link.href) != null ? _b : "#",
13070
+ href: (_b2 = link.href) != null ? _b2 : "#",
12923
13071
  onClick: () => setMobileOpen(false),
12924
13072
  className: cn(
12925
13073
  "flex items-center py-4 text-xl font-ui font-black transition-colors border-b border-white/8",
@@ -12929,11 +13077,11 @@ function SiteHeader({
12929
13077
  }
12930
13078
  ),
12931
13079
  hasDropdown && isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0 pl-4 pb-2", children: link.items.map((item) => {
12932
- var _a2;
13080
+ var _a3;
12933
13081
  return /* @__PURE__ */ jsxRuntime.jsx(
12934
13082
  "a",
12935
13083
  {
12936
- href: (_a2 = item.href) != null ? _a2 : "#",
13084
+ href: (_a3 = item.href) != null ? _a3 : "#",
12937
13085
  onClick: () => setMobileOpen(false),
12938
13086
  className: cn(
12939
13087
  "py-3 text-base font-ui font-bold transition-colors border-b",
@@ -12986,7 +13134,7 @@ function SiteHeader({
12986
13134
  onSearch == null ? void 0 : onSearch();
12987
13135
  setMobileOpen(false);
12988
13136
  },
12989
- "aria-label": "Search",
13137
+ "aria-label": (_f = labels == null ? void 0 : labels.search) != null ? _f : "Search",
12990
13138
  className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
12991
13139
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "h-[18px] w-[18px]" })
12992
13140
  }
@@ -12999,7 +13147,7 @@ function SiteHeader({
12999
13147
  onAccount == null ? void 0 : onAccount();
13000
13148
  setMobileOpen(false);
13001
13149
  },
13002
- "aria-label": "Account",
13150
+ "aria-label": (_g = labels == null ? void 0 : labels.account) != null ? _g : "Account",
13003
13151
  className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
13004
13152
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserIcon, { className: "h-[18px] w-[18px]" })
13005
13153
  }
@@ -13149,9 +13297,11 @@ function HeartIcon({ filled = false }) {
13149
13297
  );
13150
13298
  }
13151
13299
  function TripCardEditorial(props) {
13300
+ var _a, _b, _c, _d;
13152
13301
  const {
13153
13302
  image,
13154
13303
  imageAlt = "",
13304
+ labels,
13155
13305
  title,
13156
13306
  description,
13157
13307
  nights,
@@ -13209,7 +13359,7 @@ function TripCardEditorial(props) {
13209
13359
  "button",
13210
13360
  {
13211
13361
  type: "button",
13212
- "aria-label": favorited ? "Remove from favorites" : "Add to favorites",
13362
+ "aria-label": favorited ? (_a = labels == null ? void 0 : labels.removeFromFavorites) != null ? _a : "Remove from favorites" : (_b = labels == null ? void 0 : labels.addToFavorites) != null ? _b : "Add to favorites",
13213
13363
  "aria-pressed": favorited,
13214
13364
  onClick: handleFav,
13215
13365
  className: cn(
@@ -13253,7 +13403,7 @@ function TripCardEditorial(props) {
13253
13403
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13254
13404
  nights,
13255
13405
  " ",
13256
- nights === 1 ? "night" : "nights"
13406
+ nights === 1 ? (_c = labels == null ? void 0 : labels.night) != null ? _c : "night" : (_d = labels == null ? void 0 : labels.nights) != null ? _d : "nights"
13257
13407
  ] })
13258
13408
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
13259
13409
  price && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
@@ -13278,12 +13428,14 @@ function TripCardEditorial(props) {
13278
13428
  ] });
13279
13429
  }
13280
13430
  function TripCard(props) {
13431
+ var _a, _b;
13281
13432
  if (props.variant === "editorial") {
13282
13433
  return /* @__PURE__ */ jsxRuntime.jsx(TripCardEditorial, __spreadValues({}, props));
13283
13434
  }
13284
13435
  const {
13285
13436
  image,
13286
13437
  imageAlt = "",
13438
+ labels,
13287
13439
  status,
13288
13440
  nights,
13289
13441
  period,
@@ -13296,6 +13448,7 @@ function TripCard(props) {
13296
13448
  } = props;
13297
13449
  const s = sizeConfig[size];
13298
13450
  const statusInfo = status ? statusConfig[status] : null;
13451
+ const statusLabel = statusInfo ? status === "sold-out" ? (_a = labels == null ? void 0 : labels.soldOut) != null ? _a : statusInfo.label : status === "trending" ? (_b = labels == null ? void 0 : labels.trending) != null ? _b : statusInfo.label : statusInfo.label : null;
13299
13452
  const meta = [
13300
13453
  nights ? `${nights} nights` : null,
13301
13454
  period != null ? period : null
@@ -13321,7 +13474,7 @@ function TripCard(props) {
13321
13474
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent" }),
13322
13475
  statusInfo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-1.5 rounded-xl bg-card/90 px-3 py-1.5 backdrop-blur-sm shadow-sm", children: [
13323
13476
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: statusInfo.icon }),
13324
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusInfo.label })
13477
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusLabel })
13325
13478
  ] }) }),
13326
13479
  !statusInfo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10" }),
13327
13480
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
@@ -13415,6 +13568,7 @@ function BlogCard({
13415
13568
  {
13416
13569
  src: image,
13417
13570
  alt: imageAlt,
13571
+ title: imageAlt || void 0,
13418
13572
  loading: "lazy",
13419
13573
  className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
13420
13574
  }
@@ -13768,6 +13922,8 @@ function TripHeader({
13768
13922
  breadcrumb,
13769
13923
  destination,
13770
13924
  duration,
13925
+ groupSize,
13926
+ labels,
13771
13927
  tagline,
13772
13928
  chips,
13773
13929
  belowMeta,
@@ -13775,7 +13931,7 @@ function TripHeader({
13775
13931
  uiVariant = "v1",
13776
13932
  className
13777
13933
  }) {
13778
- var _a;
13934
+ var _a, _b, _c, _d, _e, _f, _g;
13779
13935
  const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
13780
13936
  const [videoReady, setVideoReady] = React32__namespace.useState(false);
13781
13937
  const videoRef = React32__namespace.useRef(null);
@@ -13793,7 +13949,7 @@ function TripHeader({
13793
13949
  const currentSrc = heroSrc(safeIndex);
13794
13950
  const showCarousel = !videoUrl && validImages.length > 1;
13795
13951
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
13796
- const hasMeta = !!(destination || duration);
13952
+ const hasMeta = !!(destination || duration || groupSize);
13797
13953
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13798
13954
  React32__namespace.useEffect(() => {
13799
13955
  if (!videoUrl) return;
@@ -13900,7 +14056,7 @@ function TripHeader({
13900
14056
  (i) => (i - 1 + validImages.length) % validImages.length
13901
14057
  ),
13902
14058
  className: "absolute left-4 top-1/2 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
13903
- "aria-label": "Imagem anterior",
14059
+ "aria-label": (_b = labels == null ? void 0 : labels.previousImage) != null ? _b : "Previous image",
13904
14060
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
13905
14061
  }
13906
14062
  ),
@@ -13910,7 +14066,7 @@ function TripHeader({
13910
14066
  type: "button",
13911
14067
  onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
13912
14068
  className: "absolute right-4 top-1/2 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
13913
- "aria-label": "Pr\xF3xima imagem",
14069
+ "aria-label": (_c = labels == null ? void 0 : labels.nextImage) != null ? _c : "Next image",
13914
14070
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
13915
14071
  }
13916
14072
  ),
@@ -13953,15 +14109,19 @@ function TripHeader({
13953
14109
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13954
14110
  nights,
13955
14111
  " ",
13956
- nights === 1 ? "noite" : "noites"
14112
+ nights === 1 ? (_d = labels == null ? void 0 : labels.night) != null ? _d : "night" : (_e = labels == null ? void 0 : labels.nights) != null ? _e : "nights"
13957
14113
  ] }),
13958
14114
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white/40", children: "\xB7" }),
13959
14115
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
13960
14116
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13961
14117
  duration.days,
13962
14118
  " ",
13963
- duration.days === 1 ? "dia" : "dias"
14119
+ duration.days === 1 ? (_f = labels == null ? void 0 : labels.day) != null ? _f : "day" : (_g = labels == null ? void 0 : labels.days) != null ? _g : "days"
13964
14120
  ] })
14121
+ ] }),
14122
+ groupSize && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-white/85", children: [
14123
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
14124
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: groupSize })
13965
14125
  ] })
13966
14126
  ] }) : tagline ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm sm:text-base text-white/80 font-ui", children: tagline }) : null,
13967
14127
  chips && chips.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex flex-wrap items-center gap-1.5", children: chips.map((chip, i) => /* @__PURE__ */ jsxRuntime.jsx(Chip, { href: chip.href, children: chip.label }, i)) }),
@@ -14406,7 +14566,10 @@ function Stars({ count = 5 }) {
14406
14566
  i
14407
14567
  )) });
14408
14568
  }
14409
- function ItineraryTimeline({ steps }) {
14569
+ function ItineraryTimeline({
14570
+ steps,
14571
+ transferLabel
14572
+ }) {
14410
14573
  return /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "relative flex flex-col gap-0", children: steps.map((step, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "relative flex gap-4 pb-8 last:pb-0", children: [
14411
14574
  i < steps.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-3.5 top-7 bottom-0 w-px bg-border" }),
14412
14575
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 mt-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-full border-2 border-primary bg-background", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-bold text-primary font-ui", children: i + 1 }) }),
@@ -14417,7 +14580,7 @@ function ItineraryTimeline({ steps }) {
14417
14580
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-3 w-3 mr-1" }),
14418
14581
  step.duration
14419
14582
  ] }),
14420
- step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: "Transfer" })
14583
+ step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: transferLabel != null ? transferLabel : "Transfer" })
14421
14584
  ] }),
14422
14585
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-muted-foreground leading-relaxed [&_p:not(:last-child)]:mb-2 [&_strong]:text-foreground [&_strong]:font-semibold", children: step.description })
14423
14586
  ] })
@@ -14434,6 +14597,7 @@ function TripPage({
14434
14597
  tagline,
14435
14598
  destination,
14436
14599
  duration,
14600
+ groupSize,
14437
14601
  images,
14438
14602
  videoUrl,
14439
14603
  breadcrumb,
@@ -14457,6 +14621,7 @@ function TripPage({
14457
14621
  whenItOperates,
14458
14622
  food,
14459
14623
  foodGallery,
14624
+ foodGalleryVariant = "gridCompact",
14460
14625
  termsAndConditions,
14461
14626
  meetingPoints,
14462
14627
  meetingPoint,
@@ -14476,7 +14641,13 @@ function TripPage({
14476
14641
  currencyEstimates,
14477
14642
  priceInfo,
14478
14643
  onBook,
14644
+ onBookingSubmit,
14645
+ bookingLoading,
14646
+ bookingDefaults,
14647
+ bookingLabels,
14479
14648
  bookLabel,
14649
+ fromLabel,
14650
+ perPersonLabel,
14480
14651
  siteHeader,
14481
14652
  uiVariant = "v1",
14482
14653
  features,
@@ -14653,6 +14824,15 @@ function TripPage({
14653
14824
  breadcrumb,
14654
14825
  destination,
14655
14826
  duration,
14827
+ groupSize,
14828
+ labels: {
14829
+ night: labels == null ? void 0 : labels.night,
14830
+ nights: labels == null ? void 0 : labels.nights,
14831
+ day: labels == null ? void 0 : labels.day,
14832
+ days: labels == null ? void 0 : labels.days,
14833
+ previousImage: labels == null ? void 0 : labels.previousImage,
14834
+ nextImage: labels == null ? void 0 : labels.nextImage
14835
+ },
14656
14836
  tagline,
14657
14837
  chips,
14658
14838
  siteHeader,
@@ -14713,7 +14893,7 @@ function TripPage({
14713
14893
  )) })
14714
14894
  ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
14715
14895
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
14716
- /* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary })
14896
+ /* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
14717
14897
  ] }),
14718
14898
  included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
14719
14899
  /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
@@ -14750,7 +14930,7 @@ function TripPage({
14750
14930
  id: "trip-section-when-it-operates",
14751
14931
  className: "scroll-mt-20 border-b border-border",
14752
14932
  children: [
14753
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14933
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14754
14934
  (sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-5 w-5 text-primary" }),
14755
14935
  (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
14756
14936
  ] }) }),
@@ -14765,7 +14945,7 @@ function TripPage({
14765
14945
  id: "trip-section-accommodation",
14766
14946
  className: "scroll-mt-20 border-b border-border",
14767
14947
  children: [
14768
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14948
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14769
14949
  (sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
14770
14950
  (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
14771
14951
  ] }) }),
@@ -14774,6 +14954,13 @@ function TripPage({
14774
14954
  accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
14775
14955
  PhotoGallery,
14776
14956
  {
14957
+ labels: {
14958
+ seeMore: labels == null ? void 0 : labels.seeMore,
14959
+ showLess: labels == null ? void 0 : labels.showLess,
14960
+ close: labels == null ? void 0 : labels.galleryClose,
14961
+ previous: labels == null ? void 0 : labels.galleryPrevious,
14962
+ next: labels == null ? void 0 : labels.galleryNext
14963
+ },
14777
14964
  photos: accommodationGallery,
14778
14965
  variant: accommodationGalleryVariant,
14779
14966
  initialVisible: 6
@@ -14790,7 +14977,7 @@ function TripPage({
14790
14977
  id: "trip-section-food",
14791
14978
  className: "scroll-mt-20 border-b border-border",
14792
14979
  children: [
14793
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14980
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14794
14981
  (sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UtensilsIcon, { className: "h-5 w-5 text-primary" }),
14795
14982
  (_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
14796
14983
  ] }) }),
@@ -14799,8 +14986,15 @@ function TripPage({
14799
14986
  foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
14800
14987
  PhotoGallery,
14801
14988
  {
14989
+ labels: {
14990
+ seeMore: labels == null ? void 0 : labels.seeMore,
14991
+ showLess: labels == null ? void 0 : labels.showLess,
14992
+ close: labels == null ? void 0 : labels.galleryClose,
14993
+ previous: labels == null ? void 0 : labels.galleryPrevious,
14994
+ next: labels == null ? void 0 : labels.galleryNext
14995
+ },
14802
14996
  photos: foodGallery,
14803
- variant: "gridCompact",
14997
+ variant: foodGalleryVariant,
14804
14998
  initialVisible: 6
14805
14999
  }
14806
15000
  ) })
@@ -14815,18 +15009,21 @@ function TripPage({
14815
15009
  id: "trip-section-meeting",
14816
15010
  className: "scroll-mt-20 border-b border-border",
14817
15011
  children: [
14818
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15012
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14819
15013
  (sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-5 w-5 text-primary" }),
14820
15014
  (_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
14821
15015
  ] }) }),
14822
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
14823
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
14824
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
14825
- mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? "Activity location" : mp.type === "alternative" ? "Alternative meeting point" : "Meeting point" }),
14826
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
14827
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
14828
- ] })
14829
- ] }, i)) }) })
15016
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
15017
+ var _a2, _b2, _c2;
15018
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15019
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
15020
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
15021
+ mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? (_a2 = labels == null ? void 0 : labels.meetingPointActivity) != null ? _a2 : "Activity location" : mp.type === "alternative" ? (_b2 = labels == null ? void 0 : labels.meetingPointAlternative) != null ? _b2 : "Alternative meeting point" : (_c2 = labels == null ? void 0 : labels.meetingPoint) != null ? _c2 : "Meeting point" }),
15022
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15023
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15024
+ ] })
15025
+ ] }, i);
15026
+ }) }) })
14830
15027
  ]
14831
15028
  }
14832
15029
  ),
@@ -14837,7 +15034,7 @@ function TripPage({
14837
15034
  id: "trip-section-how-to-get-there",
14838
15035
  className: "scroll-mt-20 border-b border-border",
14839
15036
  children: [
14840
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15037
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14841
15038
  (sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CompassIcon, { className: "h-5 w-5 text-primary" }),
14842
15039
  (_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
14843
15040
  ] }) }),
@@ -14852,7 +15049,7 @@ function TripPage({
14852
15049
  id: "trip-section-weather",
14853
15050
  className: "scroll-mt-20 border-b border-border",
14854
15051
  children: [
14855
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15052
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14856
15053
  (sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-5 w-5 text-primary" }),
14857
15054
  (_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
14858
15055
  ] }) }),
@@ -14867,7 +15064,7 @@ function TripPage({
14867
15064
  id: "trip-section-what-to-bring",
14868
15065
  className: "scroll-mt-20 border-b border-border",
14869
15066
  children: [
14870
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15067
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14871
15068
  (sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BackpackIcon, { className: "h-5 w-5 text-primary" }),
14872
15069
  (_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
14873
15070
  ] }) }),
@@ -14882,7 +15079,7 @@ function TripPage({
14882
15079
  id: "trip-section-optional-extras",
14883
15080
  className: "scroll-mt-20 border-b border-border",
14884
15081
  children: [
14885
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15082
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14886
15083
  (sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CherryIcon, { className: "h-5 w-5 text-primary" }),
14887
15084
  (_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
14888
15085
  ] }) }),
@@ -14897,7 +15094,7 @@ function TripPage({
14897
15094
  id: "trip-section-terms",
14898
15095
  className: "scroll-mt-20 border-b border-border",
14899
15096
  children: [
14900
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15097
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14901
15098
  (sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ReceiptIcon, { className: "h-5 w-5 text-primary" }),
14902
15099
  (_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
14903
15100
  ] }) }),
@@ -14909,7 +15106,7 @@ function TripPage({
14909
15106
  }
14910
15107
  ),
14911
15108
  faqs && faqs.length > 0 && (() => {
14912
- var _a2;
15109
+ var _a2, _b2, _c2;
14913
15110
  const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
14914
15111
  const hiddenCount = faqs.length - visibleFaqs.length;
14915
15112
  return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
@@ -14931,10 +15128,11 @@ function TripPage({
14931
15128
  ),
14932
15129
  children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14933
15130
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
14934
- "Show less"
15131
+ (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
14935
15132
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14936
15133
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
14937
- "See more (",
15134
+ (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
15135
+ " (",
14938
15136
  hiddenCount,
14939
15137
  ")"
14940
15138
  ] })
@@ -14975,6 +15173,8 @@ function TripPage({
14975
15173
  departureTimes,
14976
15174
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
14977
15175
  bookLabel: bookLabel != null ? bookLabel : "Check availability",
15176
+ fromLabel,
15177
+ perPersonLabel,
14978
15178
  variant: "card",
14979
15179
  belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
14980
15180
  benefits,
@@ -15017,6 +15217,8 @@ function TripPage({
15017
15217
  departureTimes,
15018
15218
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15019
15219
  bookLabel: bookLabel != null ? bookLabel : "Check availability",
15220
+ fromLabel,
15221
+ perPersonLabel,
15020
15222
  variant: "card",
15021
15223
  belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15022
15224
  benefits,
@@ -15029,12 +15231,27 @@ function TripPage({
15029
15231
  gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsxRuntime.jsx(
15030
15232
  PhotoGallery,
15031
15233
  {
15234
+ labels: {
15235
+ seeMore: labels == null ? void 0 : labels.seeMore,
15236
+ showLess: labels == null ? void 0 : labels.showLess,
15237
+ close: labels == null ? void 0 : labels.galleryClose,
15238
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15239
+ next: labels == null ? void 0 : labels.galleryNext
15240
+ },
15032
15241
  photos: gallery,
15033
15242
  variant: "gridCompact",
15034
15243
  initialVisible: 8
15035
15244
  }
15036
15245
  ) }),
15037
- gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(BookingForm, { onSubmit: onBook ? (values) => onBook() : void 0 }) }) }),
15246
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
15247
+ BookingForm,
15248
+ {
15249
+ labels: bookingLabels,
15250
+ defaultValues: bookingDefaults,
15251
+ onSubmit: onBookingSubmit,
15252
+ loading: bookingLoading
15253
+ }
15254
+ ) }) }),
15038
15255
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed bottom-0 inset-x-0 z-30 lg:hidden border-t border-border bg-background/95 backdrop-blur-sm px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
15039
15256
  PricingTrip,
15040
15257
  {
@@ -15042,6 +15259,8 @@ function TripPage({
15042
15259
  currency,
15043
15260
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15044
15261
  bookLabel: bookLabel != null ? bookLabel : "Book now",
15262
+ fromLabel,
15263
+ perPersonLabel,
15045
15264
  variant: "compact",
15046
15265
  sharp: true,
15047
15266
  priceInfo,
@@ -15075,6 +15294,7 @@ function CategoryPage2({
15075
15294
  trustpilotMini,
15076
15295
  breadcrumb,
15077
15296
  siteHeader,
15297
+ heroRightSlot,
15078
15298
  popularTours,
15079
15299
  popularToursTitle = "More adventures calling your name",
15080
15300
  popularToursEyebrow = "Popular tours",
@@ -15085,6 +15305,7 @@ function CategoryPage2({
15085
15305
  sortOptions,
15086
15306
  defaultSort,
15087
15307
  tripsInitialCount = 15,
15308
+ tripListingSlot,
15088
15309
  trustpilot,
15089
15310
  reviewsTitle = "Don't just take our word for it",
15090
15311
  reviewsSubtitle,
@@ -15101,6 +15322,12 @@ function CategoryPage2({
15101
15322
  faqInitialCount = 5,
15102
15323
  gallery,
15103
15324
  galleryTitle,
15325
+ loadMoreLabel,
15326
+ showLessLabel,
15327
+ seeMoreLabel,
15328
+ viewAllPostsLabel,
15329
+ cardLabels,
15330
+ filterLabels,
15104
15331
  className
15105
15332
  }) {
15106
15333
  var _a;
@@ -15257,7 +15484,8 @@ function CategoryPage2({
15257
15484
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight max-w-3xl", children: title }),
15258
15485
  intro && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 text-base sm:text-lg text-white/90 leading-relaxed max-w-2xl [&_strong]:font-semibold [&_a]:underline", children: intro }),
15259
15486
  trustpilotMini && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 max-w-sm", children: /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) })
15260
- ] })
15487
+ ] }),
15488
+ heroRightSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-5 z-20 sm:bottom-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex max-w-6xl justify-end px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-auto", children: heroRightSlot }) }) })
15261
15489
  ]
15262
15490
  }
15263
15491
  ),
@@ -15275,6 +15503,7 @@ function CategoryPage2({
15275
15503
  return /* @__PURE__ */ jsxRuntime.jsx(
15276
15504
  TripCard,
15277
15505
  __spreadProps(__spreadValues({}, cardProps), {
15506
+ labels: cardLabels,
15278
15507
  variant: "overlay",
15279
15508
  size: (_b = cardProps.size) != null ? _b : "md"
15280
15509
  }),
@@ -15284,63 +15513,68 @@ function CategoryPage2({
15284
15513
  ] }),
15285
15514
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 pt-6 sm:pt-8 pb-12", children: [
15286
15515
  (tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsxRuntime.jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
15287
- filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsxRuntime.jsx(
15288
- FilterPanel,
15289
- {
15290
- variant: "horizontal",
15291
- groups: filterGroups,
15292
- value: filterValue,
15293
- onChange: setFilterValue,
15294
- onClearAll: () => setFilterValue({}),
15295
- sortOptions,
15296
- sort,
15297
- onSortChange: setSort
15298
- }
15299
- ) }),
15300
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
15301
- sortedTrips.length,
15302
- " ",
15303
- sortedTrips.length === 1 ? "trip" : "trips",
15304
- " found"
15305
- ] }),
15306
- (() => {
15307
- const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
15308
- const hiddenCount = sortedTrips.length - visibleTrips.length;
15309
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15310
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-6 gap-y-8 lg:gap-x-[35px] lg:gap-y-[38px]", children: visibleTrips.map((trip, i) => {
15311
- const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
15312
- return /* @__PURE__ */ jsxRuntime.jsx(
15313
- TripCard,
15314
- __spreadProps(__spreadValues({}, cardProps), {
15315
- className: cn("w-full h-auto", cardProps.className)
15316
- }),
15317
- i
15318
- );
15319
- }) }),
15320
- sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
15321
- "button",
15322
- {
15323
- type: "button",
15324
- onClick: () => setTripsExpanded((v) => !v),
15325
- className: cn(
15326
- "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15327
- "text-sm font-semibold text-foreground shadow-sm",
15328
- "hover:bg-muted transition-colors duration-150",
15329
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15330
- ),
15331
- children: tripsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15332
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15333
- "Show less"
15334
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15335
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15336
- "Load more (",
15337
- hiddenCount,
15338
- ")"
15339
- ] })
15340
- }
15341
- ) })
15342
- ] });
15343
- })()
15516
+ tripListingSlot != null ? tripListingSlot : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15517
+ filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsxRuntime.jsx(
15518
+ FilterPanel,
15519
+ {
15520
+ variant: "horizontal",
15521
+ labels: filterLabels,
15522
+ groups: filterGroups,
15523
+ value: filterValue,
15524
+ onChange: setFilterValue,
15525
+ onClearAll: () => setFilterValue({}),
15526
+ sortOptions,
15527
+ sort,
15528
+ onSortChange: setSort
15529
+ }
15530
+ ) }),
15531
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
15532
+ sortedTrips.length,
15533
+ " ",
15534
+ sortedTrips.length === 1 ? "trip" : "trips",
15535
+ " found"
15536
+ ] }),
15537
+ (() => {
15538
+ const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
15539
+ const hiddenCount = sortedTrips.length - visibleTrips.length;
15540
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15541
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-6 gap-y-8 lg:gap-x-[35px] lg:gap-y-[38px]", children: visibleTrips.map((trip, i) => {
15542
+ const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
15543
+ return /* @__PURE__ */ jsxRuntime.jsx(
15544
+ TripCard,
15545
+ __spreadProps(__spreadValues({}, cardProps), {
15546
+ labels: cardLabels,
15547
+ className: cn("w-full h-auto", cardProps.className)
15548
+ }),
15549
+ i
15550
+ );
15551
+ }) }),
15552
+ sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
15553
+ "button",
15554
+ {
15555
+ type: "button",
15556
+ onClick: () => setTripsExpanded((v) => !v),
15557
+ className: cn(
15558
+ "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15559
+ "text-sm font-semibold text-foreground shadow-sm",
15560
+ "hover:bg-muted transition-colors duration-150",
15561
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15562
+ ),
15563
+ children: tripsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15564
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15565
+ showLessLabel != null ? showLessLabel : "Show less"
15566
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15567
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15568
+ loadMoreLabel != null ? loadMoreLabel : "Load more",
15569
+ " (",
15570
+ hiddenCount,
15571
+ ")"
15572
+ ] })
15573
+ }
15574
+ ) })
15575
+ ] });
15576
+ })()
15577
+ ] })
15344
15578
  ] }),
15345
15579
  trustpilot && /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12 border-t border-border", children: [
15346
15580
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground font-heading mb-2", children: reviewsTitle }),
@@ -15377,7 +15611,7 @@ function CategoryPage2({
15377
15611
  href: travelGuideHref != null ? travelGuideHref : blogPostsViewAllHref,
15378
15612
  className: "inline-flex items-center gap-1.5 text-sm font-semibold text-primary hover:underline",
15379
15613
  children: [
15380
- travelGuideHref ? travelGuideLabel : "View all posts",
15614
+ travelGuideHref ? travelGuideLabel : viewAllPostsLabel != null ? viewAllPostsLabel : "View all posts",
15381
15615
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4" })
15382
15616
  ]
15383
15617
  }
@@ -15406,10 +15640,11 @@ function CategoryPage2({
15406
15640
  ),
15407
15641
  children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15408
15642
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15409
- "Show less"
15643
+ showLessLabel != null ? showLessLabel : "Show less"
15410
15644
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15411
15645
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15412
- "See more (",
15646
+ seeMoreLabel != null ? seeMoreLabel : "See more",
15647
+ " (",
15413
15648
  hiddenCount,
15414
15649
  ")"
15415
15650
  ] })
@@ -15477,6 +15712,7 @@ function ActivityCard({
15477
15712
  {
15478
15713
  src: image,
15479
15714
  alt: imageAlt,
15715
+ title: imageAlt || void 0,
15480
15716
  className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
15481
15717
  }
15482
15718
  ),
@@ -17178,13 +17414,1410 @@ function StickyBookingCard({
17178
17414
  }
17179
17415
  );
17180
17416
  }
17417
+ var DEFAULT_TRUSTPILOT = {
17418
+ businessUnitId: "6171e6a56fc555750dd81ae7",
17419
+ templateId: "5419b732fbfb950b10de65e5",
17420
+ locale: "en-US",
17421
+ styleHeight: "24px",
17422
+ styleWidth: "100%",
17423
+ token: "d3580e48-fedc-4b14-b705-172180cf241d",
17424
+ theme: "dark",
17425
+ fallbackHref: "https://www.trustpilot.com/review/planetaexo.com",
17426
+ fallbackLabel: "Excellent"
17427
+ };
17428
+ function RatingStars({ stars = 5 }) {
17429
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", "aria-hidden": true, children: Array.from({ length: 5 }).map((_, i) => {
17430
+ const filled = i + 1 <= Math.round(stars);
17431
+ return /* @__PURE__ */ jsxRuntime.jsx(
17432
+ "span",
17433
+ {
17434
+ className: cn(
17435
+ "flex h-5 w-5 items-center justify-center rounded-[3px]",
17436
+ filled ? "bg-primary" : "bg-white/30"
17437
+ ),
17438
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.StarIcon, { className: "h-3 w-3 fill-white text-white" })
17439
+ },
17440
+ i
17441
+ );
17442
+ }) });
17443
+ }
17444
+ function Rating({ label, stars = 5, provider, href }) {
17445
+ const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17446
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-bold text-white", children: label }),
17447
+ /* @__PURE__ */ jsxRuntime.jsx(RatingStars, { stars }),
17448
+ provider && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1 text-sm font-ui font-bold text-white", children: [
17449
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.StarIcon, { className: "h-4 w-4 fill-primary text-primary" }),
17450
+ provider
17451
+ ] })
17452
+ ] });
17453
+ if (href) {
17454
+ return /* @__PURE__ */ jsxRuntime.jsx(
17455
+ "a",
17456
+ {
17457
+ href,
17458
+ target: "_blank",
17459
+ rel: "noreferrer noopener",
17460
+ "aria-label": `${label != null ? label : ""} ${stars} out of 5 \u2014 ${provider != null ? provider : "reviews"}`.trim(),
17461
+ className: "inline-flex items-center gap-2.5 transition-opacity hover:opacity-90",
17462
+ children: content
17463
+ }
17464
+ );
17465
+ }
17466
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex items-center gap-2.5", children: content });
17467
+ }
17468
+ function HomeHeader({
17469
+ images,
17470
+ videoUrl,
17471
+ eyebrow,
17472
+ title,
17473
+ subtitle,
17474
+ cta,
17475
+ trustpilot,
17476
+ rating,
17477
+ pressLogos,
17478
+ pressLabel = "In the press",
17479
+ pressLabelHref,
17480
+ siteHeader,
17481
+ align = "center",
17482
+ className
17483
+ }) {
17484
+ var _a;
17485
+ const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
17486
+ const [videoReady, setVideoReady] = React32__namespace.useState(false);
17487
+ const videoRef = React32__namespace.useRef(null);
17488
+ const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
17489
+ const validImages = React32__namespace.useMemo(
17490
+ () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
17491
+ [images]
17492
+ );
17493
+ const hasHeroImage = validImages.length > 0;
17494
+ const heroSrc = (i) => {
17495
+ var _a2;
17496
+ return (_a2 = validImages[i]) != null ? _a2 : "";
17497
+ };
17498
+ const safeIndex = Math.min(heroIndex, Math.max(0, validImages.length - 1));
17499
+ const currentSrc = heroSrc(safeIndex);
17500
+ const showCarousel = !videoUrl && validImages.length > 1;
17501
+ const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
17502
+ useHlsVideo(videoRef, isHls ? videoUrl : void 0);
17503
+ React32__namespace.useEffect(() => {
17504
+ if (!videoUrl) return;
17505
+ const el = videoRef.current;
17506
+ if (!el) return;
17507
+ const observer = new IntersectionObserver(
17508
+ ([entry]) => {
17509
+ if (entry.isIntersecting) {
17510
+ el.play().catch(() => {
17511
+ });
17512
+ } else {
17513
+ el.pause();
17514
+ }
17515
+ },
17516
+ { threshold: 0.1 }
17517
+ );
17518
+ observer.observe(el);
17519
+ return () => observer.disconnect();
17520
+ }, [videoUrl]);
17521
+ const isCenter = align === "center";
17522
+ return /* @__PURE__ */ jsxRuntime.jsxs(
17523
+ "section",
17524
+ {
17525
+ className: cn(
17526
+ "relative w-full overflow-hidden",
17527
+ "h-screen min-h-[640px]",
17528
+ hasHeroImage ? "bg-muted" : "bg-zinc-900",
17529
+ className
17530
+ ),
17531
+ "data-home-header-align": align,
17532
+ children: [
17533
+ !videoUrl && !hasHeroImage && /* @__PURE__ */ jsxRuntime.jsx(
17534
+ "div",
17535
+ {
17536
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950",
17537
+ "aria-hidden": true
17538
+ }
17539
+ ),
17540
+ videoUrl ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17541
+ hasHeroImage ? /* @__PURE__ */ jsxRuntime.jsx(
17542
+ Picture,
17543
+ {
17544
+ src: validImages[0],
17545
+ alt: "",
17546
+ "aria-hidden": true,
17547
+ fetchPriority: "high",
17548
+ eager: true,
17549
+ className: cn(
17550
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
17551
+ videoReady ? "opacity-0 pointer-events-none" : "opacity-100"
17552
+ )
17553
+ }
17554
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
17555
+ "div",
17556
+ {
17557
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950 transition-opacity duration-700",
17558
+ "aria-hidden": true
17559
+ }
17560
+ ),
17561
+ /* @__PURE__ */ jsxRuntime.jsx(
17562
+ "video",
17563
+ {
17564
+ ref: videoRef,
17565
+ src: isHls ? void 0 : videoUrl,
17566
+ autoPlay: true,
17567
+ muted: true,
17568
+ loop: true,
17569
+ playsInline: true,
17570
+ preload: "auto",
17571
+ poster: hasHeroImage ? validImages[0] : void 0,
17572
+ onCanPlay: () => setVideoReady(true),
17573
+ className: cn(
17574
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
17575
+ videoReady ? "opacity-100" : "opacity-0"
17576
+ )
17577
+ }
17578
+ )
17579
+ ] }) : hasHeroImage ? /* @__PURE__ */ jsxRuntime.jsx(
17580
+ Picture,
17581
+ {
17582
+ src: currentSrc,
17583
+ alt: title,
17584
+ fetchPriority: safeIndex === 0 ? "high" : "auto",
17585
+ eager: safeIndex === 0,
17586
+ className: "absolute inset-0 h-full w-full object-cover transition-opacity duration-700"
17587
+ }
17588
+ ) : null,
17589
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/30", "aria-hidden": true }),
17590
+ /* @__PURE__ */ jsxRuntime.jsx(
17591
+ "div",
17592
+ {
17593
+ className: "absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-black/30",
17594
+ "aria-hidden": true
17595
+ }
17596
+ ),
17597
+ siteHeader && /* @__PURE__ */ jsxRuntime.jsx(
17598
+ SiteHeader,
17599
+ __spreadProps(__spreadValues({}, Array.isArray(siteHeader) ? { links: siteHeader } : typeof siteHeader === "object" ? siteHeader : {}), {
17600
+ position: "overlay"
17601
+ })
17602
+ ),
17603
+ showCarousel && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17604
+ /* @__PURE__ */ jsxRuntime.jsx(
17605
+ "button",
17606
+ {
17607
+ type: "button",
17608
+ onClick: () => setHeroIndex(
17609
+ (i) => (i - 1 + validImages.length) % validImages.length
17610
+ ),
17611
+ className: "absolute left-4 top-1/2 z-20 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
17612
+ "aria-label": "Previous image",
17613
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
17614
+ }
17615
+ ),
17616
+ /* @__PURE__ */ jsxRuntime.jsx(
17617
+ "button",
17618
+ {
17619
+ type: "button",
17620
+ onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
17621
+ className: "absolute right-4 top-1/2 z-20 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
17622
+ "aria-label": "Next image",
17623
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
17624
+ }
17625
+ )
17626
+ ] }),
17627
+ /* @__PURE__ */ jsxRuntime.jsxs(
17628
+ "div",
17629
+ {
17630
+ className: cn(
17631
+ "absolute inset-0 z-10 flex flex-col justify-center",
17632
+ "mx-auto w-full max-w-6xl px-6 sm:px-8",
17633
+ "pt-[72px]",
17634
+ // clear the overlay header
17635
+ pressLogos && pressLogos.length > 0 ? "pb-28" : "pb-16",
17636
+ isCenter ? "items-center text-center" : "items-start text-left"
17637
+ ),
17638
+ children: [
17639
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs sm:text-sm font-ui font-bold uppercase tracking-[0.2em] text-primary-400", children: eyebrow }),
17640
+ /* @__PURE__ */ jsxRuntime.jsx(
17641
+ "h1",
17642
+ {
17643
+ className: cn(
17644
+ "font-heading font-black uppercase text-white leading-[0.95]",
17645
+ "text-5xl sm:text-6xl lg:text-7xl",
17646
+ isCenter ? "max-w-4xl" : "max-w-3xl"
17647
+ ),
17648
+ children: title
17649
+ }
17650
+ ),
17651
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx(
17652
+ "p",
17653
+ {
17654
+ className: cn(
17655
+ "mt-5 text-lg sm:text-xl font-sans text-white/90",
17656
+ isCenter ? "max-w-2xl" : "max-w-xl"
17657
+ ),
17658
+ children: subtitle
17659
+ }
17660
+ ),
17661
+ cta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: cta.href ? /* @__PURE__ */ jsxRuntime.jsx(
17662
+ "a",
17663
+ {
17664
+ href: cta.href,
17665
+ onClick: cta.onClick,
17666
+ className: buttonVariants({ size: "lg" }),
17667
+ children: cta.label
17668
+ }
17669
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "lg", onClick: cta.onClick, children: cta.label }) }),
17670
+ tpConfig ? /* @__PURE__ */ jsxRuntime.jsxs(
17671
+ "div",
17672
+ {
17673
+ className: cn(
17674
+ "home-trustpilot relative mt-8",
17675
+ // Wide enough for the Micro Star to show the full "Excellent
17676
+ // ★★★★★ Trustpilot" lockup — at 260px the Trustpilot wordmark
17677
+ // was clipped.
17678
+ isCenter && "w-full max-w-[340px]"
17679
+ ),
17680
+ children: [
17681
+ /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: tpConfig }),
17682
+ /* @__PURE__ */ jsxRuntime.jsx(
17683
+ "a",
17684
+ {
17685
+ href: (_a = tpConfig.fallbackHref) != null ? _a : "https://www.trustpilot.com/review/planetaexo.com",
17686
+ target: "_blank",
17687
+ rel: "noopener noreferrer",
17688
+ "aria-label": "Read our reviews on Trustpilot",
17689
+ className: "absolute inset-0 z-10"
17690
+ }
17691
+ )
17692
+ ]
17693
+ }
17694
+ ) : rating ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsxRuntime.jsx(Rating, __spreadValues({}, rating)) }) : null
17695
+ ]
17696
+ }
17697
+ ),
17698
+ pressLogos && pressLogos.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0 z-10 pb-7", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto flex w-full max-w-6xl flex-wrap items-center justify-center gap-x-7 gap-y-3 px-6 sm:px-8", children: [
17699
+ pressLabelHref ? /* @__PURE__ */ jsxRuntime.jsx(
17700
+ "a",
17701
+ {
17702
+ href: pressLabelHref,
17703
+ target: "_blank",
17704
+ rel: "noopener noreferrer",
17705
+ className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70 transition-colors hover:text-white",
17706
+ children: pressLabel
17707
+ }
17708
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70", children: pressLabel }),
17709
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-nowrap items-center justify-center gap-x-7", children: [
17710
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden h-5 w-px bg-white/25 sm:block", "aria-hidden": true }),
17711
+ pressLogos.map((logo, i) => {
17712
+ var _a2, _b, _c, _d;
17713
+ const content = logo.src ? (
17714
+ // eslint-disable-next-line @next/next/no-img-element
17715
+ /* @__PURE__ */ jsxRuntime.jsx(
17716
+ "img",
17717
+ {
17718
+ src: logo.src,
17719
+ alt: (_b = (_a2 = logo.alt) != null ? _a2 : logo.label) != null ? _b : "Press logo",
17720
+ className: "h-12 w-12 shrink-0 select-none object-contain",
17721
+ draggable: false
17722
+ }
17723
+ )
17724
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-heading text-base font-bold uppercase tracking-wide", children: logo.label });
17725
+ return logo.href ? /* @__PURE__ */ jsxRuntime.jsx(
17726
+ "a",
17727
+ {
17728
+ href: logo.href,
17729
+ target: "_blank",
17730
+ rel: "noopener noreferrer",
17731
+ "aria-label": (_d = (_c = logo.alt) != null ? _c : logo.label) != null ? _d : "Press article",
17732
+ className: "shrink-0 text-white/80 opacity-100 transition-opacity hover:opacity-100 hover:text-white focus-visible:opacity-100 [&>img]:opacity-80 [&>img]:hover:opacity-100 [&>img]:transition-opacity",
17733
+ children: content
17734
+ },
17735
+ i
17736
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
17737
+ "span",
17738
+ {
17739
+ className: "shrink-0 text-white/80 [&>img]:opacity-80",
17740
+ children: content
17741
+ },
17742
+ i
17743
+ );
17744
+ })
17745
+ ] })
17746
+ ] }) })
17747
+ ]
17748
+ }
17749
+ );
17750
+ }
17751
+ var ACCENT_PILL = "bg-primary text-primary-foreground";
17752
+ var ACCENT_BUTTON = "bg-primary text-primary-foreground hover:bg-primary/90";
17753
+ var THEME = {
17754
+ dark: {
17755
+ section: "bg-neutral-950",
17756
+ heading: "text-white",
17757
+ body: "text-white/60",
17758
+ tabTrack: "bg-white/5 border-white/10",
17759
+ tabActive: ACCENT_PILL,
17760
+ tabIdle: "text-white/60 hover:text-white",
17761
+ cardRing: "focus-visible:ring-white/70 focus-visible:ring-offset-neutral-950",
17762
+ divider: "border-white/15"
17763
+ },
17764
+ light: {
17765
+ /* Explicit light colours (not mode-aware tokens) so this variant stays a
17766
+ light surface even when the app is in dark mode. */
17767
+ section: "bg-white",
17768
+ heading: "text-neutral-900",
17769
+ body: "text-neutral-500",
17770
+ tabTrack: "bg-neutral-100 border-black/10",
17771
+ tabActive: ACCENT_PILL,
17772
+ tabIdle: "text-neutral-500 hover:text-neutral-900",
17773
+ cardRing: "focus-visible:ring-neutral-900/40 focus-visible:ring-offset-white",
17774
+ divider: "border-black/10"
17775
+ }
17776
+ };
17777
+ var BENTO_SPAN = {
17778
+ featured: "col-span-2 row-span-2",
17779
+ tall: "col-span-2 sm:col-span-1 row-span-2",
17780
+ wide: "col-span-2",
17781
+ normal: "col-span-2 sm:col-span-1"
17782
+ };
17783
+ function BentoTile({
17784
+ card,
17785
+ ring
17786
+ }) {
17787
+ var _a, _b, _c;
17788
+ const isFeatured = card.size === "featured";
17789
+ const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17790
+ card.image ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17791
+ /* @__PURE__ */ jsxRuntime.jsx(
17792
+ Picture,
17793
+ {
17794
+ src: card.image,
17795
+ alt: (_a = card.imageAlt) != null ? _a : card.label,
17796
+ loading: "lazy",
17797
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
17798
+ }
17799
+ ),
17800
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/85 via-black/15 to-transparent" })
17801
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(
17802
+ "div",
17803
+ {
17804
+ className: cn(
17805
+ "absolute inset-0 bg-gradient-to-br",
17806
+ (_b = card.gradient) != null ? _b : "from-primary-800 to-primary-900"
17807
+ )
17808
+ }
17809
+ ),
17810
+ card.tripCount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute right-3 top-3 z-10 rounded-full bg-white/90 px-2.5 py-1 text-[11px] font-ui font-bold uppercase tracking-wide text-neutral-900", children: card.tripCount }),
17811
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-x-0 bottom-0 z-10 p-5", children: [
17812
+ /* @__PURE__ */ jsxRuntime.jsx(
17813
+ "h3",
17814
+ {
17815
+ className: cn(
17816
+ "font-heading font-bold uppercase leading-tight tracking-wide text-white",
17817
+ isFeatured ? "text-2xl sm:text-3xl" : "text-lg sm:text-xl"
17818
+ ),
17819
+ children: card.label
17820
+ }
17821
+ ),
17822
+ card.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 max-h-0 overflow-hidden text-sm leading-snug text-white/85 opacity-0 transition-all duration-300 group-hover:mt-2 group-hover:max-h-32 group-hover:opacity-100", children: card.description }),
17823
+ card.ctaLabel && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-2 inline-flex items-center gap-1 text-sm font-ui font-bold text-primary-400", children: [
17824
+ card.ctaLabel,
17825
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17826
+ ] })
17827
+ ] })
17828
+ ] });
17829
+ const tileClass = cn(
17830
+ "group relative overflow-hidden rounded-2xl bg-muted shadow-sm",
17831
+ BENTO_SPAN[(_c = card.size) != null ? _c : "normal"]
17832
+ );
17833
+ return card.href ? /* @__PURE__ */ jsxRuntime.jsx(
17834
+ "a",
17835
+ {
17836
+ href: card.href,
17837
+ className: cn(
17838
+ tileClass,
17839
+ "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
17840
+ ring
17841
+ ),
17842
+ children: inner
17843
+ }
17844
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: tileClass, children: inner });
17845
+ }
17846
+ function AdventureExplorer({
17847
+ tabs,
17848
+ eyebrow,
17849
+ heading,
17850
+ subheading,
17851
+ defaultTabId,
17852
+ viewAllLabel = "View All Adventures",
17853
+ viewAllHref,
17854
+ theme = "dark",
17855
+ layout = "carousel",
17856
+ bentoLimit,
17857
+ moreLabel = "More wild places",
17858
+ className
17859
+ }) {
17860
+ var _a, _b, _c, _d, _e;
17861
+ const [activeId, setActiveId] = React32__namespace.useState(
17862
+ defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
17863
+ );
17864
+ const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
17865
+ const t = THEME[theme];
17866
+ const ctaHref = (_d = (_c = active == null ? void 0 : active.viewAllHref) != null ? _c : viewAllHref) != null ? _d : "#";
17867
+ const showCta = viewAllLabel.length > 0;
17868
+ const hasHeading = !!(eyebrow || heading || subheading);
17869
+ const cards = (_e = active == null ? void 0 : active.cards) != null ? _e : [];
17870
+ const limited = layout === "bento" && bentoLimit != null && cards.length > bentoLimit;
17871
+ const gridCards = limited ? cards.slice(0, bentoLimit) : cards;
17872
+ const moreCards = limited ? cards.slice(bentoLimit) : [];
17873
+ const showHeadCta = showCta && !limited;
17874
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-10 sm:py-16", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
17875
+ hasHeading && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8 flex flex-wrap items-end justify-between gap-6", children: [
17876
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
17877
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
17878
+ heading && /* @__PURE__ */ jsxRuntime.jsx(
17879
+ "h2",
17880
+ {
17881
+ className: cn(
17882
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
17883
+ t.heading
17884
+ ),
17885
+ children: heading
17886
+ }
17887
+ ),
17888
+ subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 text-base", t.body), children: subheading })
17889
+ ] }),
17890
+ showHeadCta && /* @__PURE__ */ jsxRuntime.jsxs(
17891
+ "a",
17892
+ {
17893
+ href: ctaHref,
17894
+ className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
17895
+ children: [
17896
+ viewAllLabel,
17897
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17898
+ ]
17899
+ }
17900
+ )
17901
+ ] }),
17902
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
17903
+ /* @__PURE__ */ jsxRuntime.jsx(
17904
+ "div",
17905
+ {
17906
+ role: "tablist",
17907
+ "aria-label": "Explore categories",
17908
+ className: cn(
17909
+ "inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
17910
+ t.tabTrack
17911
+ ),
17912
+ children: tabs.map((tab) => {
17913
+ const isActive = tab.id === (active == null ? void 0 : active.id);
17914
+ return /* @__PURE__ */ jsxRuntime.jsx(
17915
+ "button",
17916
+ {
17917
+ type: "button",
17918
+ role: "tab",
17919
+ "aria-selected": isActive,
17920
+ onClick: () => setActiveId(tab.id),
17921
+ className: cn(
17922
+ "shrink-0 rounded-full px-5 py-2 text-sm font-ui font-bold transition-colors",
17923
+ isActive ? t.tabActive : t.tabIdle
17924
+ ),
17925
+ children: tab.label
17926
+ },
17927
+ tab.id
17928
+ );
17929
+ })
17930
+ }
17931
+ ),
17932
+ showCta && !hasHeading && /* @__PURE__ */ jsxRuntime.jsx(
17933
+ "a",
17934
+ {
17935
+ href: ctaHref,
17936
+ className: cn(
17937
+ "hidden shrink-0 items-center rounded-full px-6 py-2.5 text-sm font-heading font-bold transition-colors sm:inline-flex",
17938
+ ACCENT_BUTTON
17939
+ ),
17940
+ children: viewAllLabel
17941
+ }
17942
+ )
17943
+ ] }),
17944
+ layout === "bento" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 grid auto-rows-[170px] grid-cols-2 gap-4 sm:mt-8 sm:auto-rows-[200px] lg:grid-cols-4", children: gridCards.map((card, i) => /* @__PURE__ */ jsxRuntime.jsx(BentoTile, { card, ring: t.cardRing }, i)) }),
17945
+ limited && /* @__PURE__ */ jsxRuntime.jsxs(
17946
+ "div",
17947
+ {
17948
+ className: cn(
17949
+ "mt-7 flex flex-wrap items-center justify-between gap-x-8 gap-y-3 border-t pt-6",
17950
+ t.divider
17951
+ ),
17952
+ children: [
17953
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2", children: [
17954
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-ui font-bold uppercase tracking-[0.18em] text-primary", children: moreLabel }),
17955
+ moreCards.map((card, i) => {
17956
+ var _a2;
17957
+ return /* @__PURE__ */ jsxRuntime.jsxs(
17958
+ "a",
17959
+ {
17960
+ href: (_a2 = card.href) != null ? _a2 : "#",
17961
+ className: "group inline-flex items-baseline gap-2",
17962
+ children: [
17963
+ /* @__PURE__ */ jsxRuntime.jsx(
17964
+ "span",
17965
+ {
17966
+ className: cn(
17967
+ "font-heading text-base font-bold transition-colors group-hover:text-primary",
17968
+ t.heading
17969
+ ),
17970
+ children: card.label
17971
+ }
17972
+ ),
17973
+ card.tripCount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-sm", t.body), children: card.tripCount })
17974
+ ]
17975
+ },
17976
+ i
17977
+ );
17978
+ })
17979
+ ] }),
17980
+ showCta && /* @__PURE__ */ jsxRuntime.jsxs(
17981
+ "a",
17982
+ {
17983
+ href: ctaHref,
17984
+ className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
17985
+ children: [
17986
+ viewAllLabel,
17987
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17988
+ ]
17989
+ }
17990
+ )
17991
+ ]
17992
+ }
17993
+ ),
17994
+ layout !== "bento" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "-mx-6 mt-6 flex gap-3 overflow-x-auto px-6 pb-2 snap-x snap-mandatory scroll-px-6 scroll-smooth scrollbar-none sm:mx-0 sm:mt-8 sm:gap-4 sm:px-0 sm:scroll-px-0", children: active == null ? void 0 : active.cards.map((card, i) => {
17995
+ var _a2, _b2;
17996
+ const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17997
+ /* @__PURE__ */ jsxRuntime.jsx(
17998
+ Picture,
17999
+ {
18000
+ src: (_a2 = card.image) != null ? _a2 : "",
18001
+ alt: (_b2 = card.imageAlt) != null ? _b2 : card.label,
18002
+ loading: "lazy",
18003
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
18004
+ }
18005
+ ),
18006
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/15 to-transparent" }),
18007
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-x-0 bottom-0 p-4 font-heading text-sm font-bold uppercase leading-tight tracking-wide text-white", children: card.label })
18008
+ ] });
18009
+ const cardClass = "group relative aspect-[9/16] w-40 shrink-0 snap-start overflow-hidden rounded-2xl bg-muted sm:w-44 lg:w-48";
18010
+ return card.href ? /* @__PURE__ */ jsxRuntime.jsx(
18011
+ "a",
18012
+ {
18013
+ href: card.href,
18014
+ className: cn(
18015
+ cardClass,
18016
+ "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
18017
+ t.cardRing
18018
+ ),
18019
+ children: inner
18020
+ },
18021
+ i
18022
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cardClass, children: inner }, i);
18023
+ }) }),
18024
+ showCta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 sm:hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
18025
+ "a",
18026
+ {
18027
+ href: ctaHref,
18028
+ className: cn(
18029
+ "inline-flex w-full items-center justify-center rounded-full px-6 py-3 text-sm font-heading font-bold transition-colors",
18030
+ ACCENT_BUTTON
18031
+ ),
18032
+ children: viewAllLabel
18033
+ }
18034
+ ) })
18035
+ ] }) });
18036
+ }
18037
+ var THEME2 = {
18038
+ light: {
18039
+ section: "bg-neutral-100",
18040
+ heading: "text-neutral-900",
18041
+ title: "text-neutral-800",
18042
+ body: "text-neutral-500",
18043
+ icon: "text-primary",
18044
+ card: "bg-white border-black/10 shadow-sm",
18045
+ chip: "bg-primary/10 text-primary",
18046
+ number: "text-primary"
18047
+ },
18048
+ dark: {
18049
+ section: "bg-neutral-950",
18050
+ heading: "text-white",
18051
+ title: "text-white",
18052
+ body: "text-white/60",
18053
+ icon: "text-primary-400",
18054
+ card: "bg-white/5 border-white/10",
18055
+ chip: "bg-primary-400/15 text-primary-400",
18056
+ number: "text-primary-400"
18057
+ }
18058
+ };
18059
+ var COLS = {
18060
+ 2: "sm:grid-cols-2",
18061
+ 3: "sm:grid-cols-2 lg:grid-cols-3",
18062
+ 4: "sm:grid-cols-2 lg:grid-cols-4"
18063
+ };
18064
+ function USP({
18065
+ items,
18066
+ heading,
18067
+ subheading,
18068
+ columns,
18069
+ variant = "minimal",
18070
+ theme = "light",
18071
+ className
18072
+ }) {
18073
+ const t = THEME2[theme];
18074
+ const cols = columns != null ? columns : Math.min(Math.max(items.length, 2), 4);
18075
+ const isInline = variant === "inline";
18076
+ const isCard = variant === "card";
18077
+ const isNumbered = variant === "numbered";
18078
+ const stacked = !isInline;
18079
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-14 sm:py-20", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18080
+ (heading || subheading) && /* @__PURE__ */ jsxRuntime.jsxs(
18081
+ "div",
18082
+ {
18083
+ className: cn(
18084
+ "mb-12 max-w-2xl",
18085
+ isNumbered ? "text-left" : "mx-auto text-center"
18086
+ ),
18087
+ children: [
18088
+ heading && /* @__PURE__ */ jsxRuntime.jsx(
18089
+ "h2",
18090
+ {
18091
+ className: cn(
18092
+ "font-heading font-bold uppercase tracking-wide",
18093
+ isNumbered ? "text-3xl sm:text-4xl lg:text-5xl" : "text-2xl sm:text-3xl",
18094
+ t.heading
18095
+ ),
18096
+ children: heading
18097
+ }
18098
+ ),
18099
+ subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 font-sans text-base", t.body), children: subheading })
18100
+ ]
18101
+ }
18102
+ ),
18103
+ /* @__PURE__ */ jsxRuntime.jsxs(
18104
+ "div",
18105
+ {
18106
+ className: cn(
18107
+ "grid grid-cols-1 gap-x-8 gap-y-10",
18108
+ COLS[cols]
18109
+ ),
18110
+ children: [
18111
+ isNumbered && items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
18112
+ "div",
18113
+ {
18114
+ className: cn(
18115
+ "flex flex-col rounded-2xl border p-6 text-left sm:p-7",
18116
+ t.card
18117
+ ),
18118
+ children: [
18119
+ /* @__PURE__ */ jsxRuntime.jsx(
18120
+ "span",
18121
+ {
18122
+ className: cn(
18123
+ "mb-4 font-sans text-xl font-semibold italic",
18124
+ t.number
18125
+ ),
18126
+ children: String(i + 1).padStart(2, "0")
18127
+ }
18128
+ ),
18129
+ /* @__PURE__ */ jsxRuntime.jsx(
18130
+ "h3",
18131
+ {
18132
+ className: cn(
18133
+ "font-heading text-lg font-bold leading-snug",
18134
+ t.heading
18135
+ ),
18136
+ children: item.title
18137
+ }
18138
+ ),
18139
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-2 font-sans text-base leading-relaxed", t.body), children: item.description })
18140
+ ]
18141
+ },
18142
+ i
18143
+ )),
18144
+ !isNumbered && items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
18145
+ "div",
18146
+ {
18147
+ className: cn(
18148
+ isCard && cn("rounded-2xl border p-6 sm:p-7", t.card),
18149
+ stacked ? "flex flex-col items-center text-center" : "flex items-start gap-4 text-left"
18150
+ ),
18151
+ children: [
18152
+ /* @__PURE__ */ jsxRuntime.jsx(
18153
+ "span",
18154
+ {
18155
+ className: cn(
18156
+ "flex shrink-0 items-center justify-center",
18157
+ isCard ? cn("h-14 w-14 rounded-full [&>svg]:size-7", t.chip) : cn("[&>svg]:size-8", t.icon),
18158
+ stacked && "mb-4"
18159
+ ),
18160
+ children: item.icon
18161
+ }
18162
+ ),
18163
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: isInline ? "flex-1" : "contents", children: [
18164
+ /* @__PURE__ */ jsxRuntime.jsx(
18165
+ "h3",
18166
+ {
18167
+ className: cn(
18168
+ "font-heading text-sm font-bold uppercase leading-snug tracking-wide",
18169
+ t.title,
18170
+ stacked && "mb-3"
18171
+ ),
18172
+ children: item.title
18173
+ }
18174
+ ),
18175
+ /* @__PURE__ */ jsxRuntime.jsx(
18176
+ "p",
18177
+ {
18178
+ className: cn(
18179
+ "font-sans text-base leading-relaxed",
18180
+ t.body,
18181
+ isInline && "mt-1.5"
18182
+ ),
18183
+ children: item.description
18184
+ }
18185
+ )
18186
+ ] })
18187
+ ]
18188
+ },
18189
+ i
18190
+ ))
18191
+ ]
18192
+ }
18193
+ )
18194
+ ] }) });
18195
+ }
18196
+ function RotatingSubtitle({
18197
+ phrases,
18198
+ interval,
18199
+ className
18200
+ }) {
18201
+ const [index, setIndex] = React32__namespace.useState(0);
18202
+ React32__namespace.useEffect(() => {
18203
+ var _a;
18204
+ if (phrases.length < 2) return;
18205
+ const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
18206
+ if (reduce) return;
18207
+ const id = setInterval(
18208
+ () => setIndex((i) => (i + 1) % phrases.length),
18209
+ interval
18210
+ );
18211
+ return () => clearInterval(id);
18212
+ }, [phrases.length, interval]);
18213
+ return (
18214
+ /* Grid-stacks all phrases so the box keeps the height of the tallest line
18215
+ and the crossfade has no layout shift. */
18216
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("grid", className), children: phrases.map((phrase, i) => /* @__PURE__ */ jsxRuntime.jsx(
18217
+ "span",
18218
+ {
18219
+ "aria-hidden": i !== index,
18220
+ className: cn(
18221
+ "col-start-1 row-start-1 transition-opacity duration-700",
18222
+ i === index ? "opacity-100" : "opacity-0"
18223
+ ),
18224
+ children: phrase
18225
+ },
18226
+ phrase + i
18227
+ )) })
18228
+ );
18229
+ }
18230
+ function CtaBanner({
18231
+ image,
18232
+ imageAlt = "",
18233
+ title,
18234
+ subtitle,
18235
+ cta,
18236
+ rotateInterval = 3e3,
18237
+ parallax = true,
18238
+ overlayOpacity = 35,
18239
+ className
18240
+ }) {
18241
+ const phrases = React32__namespace.useMemo(
18242
+ () => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
18243
+ [subtitle]
18244
+ );
18245
+ return /* @__PURE__ */ jsxRuntime.jsxs(
18246
+ "section",
18247
+ {
18248
+ className: cn(
18249
+ "relative w-full overflow-hidden",
18250
+ "flex items-center justify-center",
18251
+ "min-h-[360px] py-24 sm:py-28 lg:py-32",
18252
+ "bg-muted",
18253
+ className
18254
+ ),
18255
+ children: [
18256
+ parallax ? (
18257
+ /* Parallax: fixed-attachment CSS background (sm+). Uses a plain div so
18258
+ `bg-fixed` works; on mobile it falls back to a normal cover image. */
18259
+ /* @__PURE__ */ jsxRuntime.jsx(
18260
+ "div",
18261
+ {
18262
+ "aria-hidden": true,
18263
+ role: imageAlt ? "img" : void 0,
18264
+ "aria-label": imageAlt || void 0,
18265
+ className: "absolute inset-0 bg-cover bg-center sm:bg-fixed",
18266
+ style: { backgroundImage: `url("${image}")` }
18267
+ }
18268
+ )
18269
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
18270
+ Picture,
18271
+ {
18272
+ src: image,
18273
+ alt: imageAlt,
18274
+ eager: true,
18275
+ className: "absolute inset-0 h-full w-full object-cover"
18276
+ }
18277
+ ),
18278
+ /* @__PURE__ */ jsxRuntime.jsx(
18279
+ "div",
18280
+ {
18281
+ className: "absolute inset-0 bg-black",
18282
+ style: { opacity: overlayOpacity / 100 },
18283
+ "aria-hidden": true
18284
+ }
18285
+ ),
18286
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 mx-auto flex w-full max-w-4xl flex-col items-center px-6 text-center", children: [
18287
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-heading text-4xl font-black uppercase leading-none tracking-tight text-white sm:text-5xl lg:text-[3.25rem]", children: title }),
18288
+ phrases.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 font-sans text-xl font-semibold text-white sm:text-2xl lg:text-[1.7rem]", children: phrases.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx(RotatingSubtitle, { phrases, interval: rotateInterval }) : phrases[0] }),
18289
+ cta && (cta.href ? /* @__PURE__ */ jsxRuntime.jsx(
18290
+ "a",
18291
+ {
18292
+ href: cta.href,
18293
+ onClick: cta.onClick,
18294
+ className: "mt-8 inline-block border-b border-white/70 pb-1.5 font-ui text-xs font-light uppercase tracking-[0.2em] text-white transition-colors hover:border-white hover:text-white/80",
18295
+ children: cta.label
18296
+ }
18297
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
18298
+ "button",
18299
+ {
18300
+ type: "button",
18301
+ onClick: cta.onClick,
18302
+ className: "mt-8 inline-block border-b border-white/70 pb-1.5 font-ui text-xs font-light uppercase tracking-[0.2em] text-white transition-colors hover:border-white hover:text-white/80",
18303
+ children: cta.label
18304
+ }
18305
+ ))
18306
+ ] })
18307
+ ]
18308
+ }
18309
+ );
18310
+ }
18311
+ var THEME3 = {
18312
+ light: {
18313
+ section: "bg-background",
18314
+ heading: "text-foreground",
18315
+ sub: "text-muted-foreground",
18316
+ rowTitle: "text-foreground",
18317
+ rowBorder: "border-border",
18318
+ rowArrow: "text-primary"
18319
+ },
18320
+ dark: {
18321
+ section: "bg-neutral-950",
18322
+ heading: "text-white",
18323
+ sub: "text-white/60",
18324
+ rowTitle: "text-white",
18325
+ rowBorder: "border-white/10",
18326
+ rowArrow: "text-primary-400"
18327
+ }
18328
+ };
18329
+ function BlogJournal({
18330
+ eyebrow,
18331
+ title,
18332
+ subtitle,
18333
+ link,
18334
+ feature,
18335
+ posts,
18336
+ theme = "light",
18337
+ className
18338
+ }) {
18339
+ var _a, _b, _c, _d;
18340
+ const t = THEME3[theme];
18341
+ const featRel = feature.external ? "noopener noreferrer" : void 0;
18342
+ const featTarget = feature.external ? "_blank" : void 0;
18343
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-20 sm:py-28", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18344
+ (title || eyebrow || link) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
18345
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
18346
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18347
+ title && /* @__PURE__ */ jsxRuntime.jsx(
18348
+ "h2",
18349
+ {
18350
+ className: cn(
18351
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18352
+ t.heading
18353
+ ),
18354
+ children: title
18355
+ }
18356
+ ),
18357
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 text-base", t.sub), children: subtitle })
18358
+ ] }),
18359
+ link && /* @__PURE__ */ jsxRuntime.jsxs(
18360
+ "a",
18361
+ {
18362
+ href: (_a = link.href) != null ? _a : "#",
18363
+ className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
18364
+ children: [
18365
+ link.label,
18366
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18367
+ ]
18368
+ }
18369
+ )
18370
+ ] }),
18371
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid items-stretch gap-7 lg:grid-cols-[1.12fr_0.88fr]", children: [
18372
+ /* @__PURE__ */ jsxRuntime.jsxs(
18373
+ "a",
18374
+ {
18375
+ href: (_b = feature.href) != null ? _b : "#",
18376
+ target: featTarget,
18377
+ rel: featRel,
18378
+ className: "group relative flex min-h-[420px] items-end overflow-hidden rounded-2xl text-white shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 lg:min-h-[480px]",
18379
+ children: [
18380
+ /* @__PURE__ */ jsxRuntime.jsx(
18381
+ Picture,
18382
+ {
18383
+ src: feature.image,
18384
+ alt: (_c = feature.imageAlt) != null ? _c : feature.title,
18385
+ loading: "lazy",
18386
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
18387
+ }
18388
+ ),
18389
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/25 to-transparent" }),
18390
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative p-8 sm:p-9", children: [
18391
+ feature.tag && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-3.5 inline-block rounded-full bg-primary px-3 py-1 text-[11px] font-ui font-bold uppercase tracking-[0.12em] text-primary-foreground", children: feature.tag }),
18392
+ feature.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs font-ui font-bold uppercase tracking-[0.1em] text-primary-400", children: feature.date }),
18393
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mt-2.5 max-w-[20ch] font-heading text-2xl font-bold leading-[1.08] sm:text-3xl lg:text-4xl", children: feature.title }),
18394
+ feature.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-3 max-w-[46ch] text-sm leading-relaxed text-white/85", children: feature.excerpt }),
18395
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-5 inline-flex items-center gap-1.5 font-ui text-sm font-bold", children: [
18396
+ (_d = feature.ctaLabel) != null ? _d : "Read the guide",
18397
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18398
+ ] })
18399
+ ] })
18400
+ ]
18401
+ }
18402
+ ),
18403
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col justify-center", children: posts.map((post, i) => {
18404
+ var _a2, _b2;
18405
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
18406
+ "a",
18407
+ {
18408
+ href: (_a2 = post.href) != null ? _a2 : "#",
18409
+ target: post.external ? "_blank" : void 0,
18410
+ rel: post.external ? "noopener noreferrer" : void 0,
18411
+ className: cn(
18412
+ "group grid grid-cols-[64px_1fr_auto] items-center gap-4 border-t py-5 transition-[padding] duration-300 hover:pl-3 sm:grid-cols-[78px_1fr_auto]",
18413
+ t.rowBorder,
18414
+ i === 0 && "border-t-0 pt-0"
18415
+ ),
18416
+ children: [
18417
+ /* @__PURE__ */ jsxRuntime.jsx(
18418
+ Picture,
18419
+ {
18420
+ src: post.image,
18421
+ alt: (_b2 = post.imageAlt) != null ? _b2 : post.title,
18422
+ loading: "lazy",
18423
+ className: "h-16 w-16 rounded-xl object-cover sm:h-[78px] sm:w-[78px]"
18424
+ }
18425
+ ),
18426
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
18427
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] font-ui font-bold uppercase tracking-[0.1em] text-primary", children: [
18428
+ post.category,
18429
+ post.category && post.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("ml-2 font-semibold", t.sub), children: post.date }),
18430
+ !post.category && post.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-semibold", t.sub), children: post.date })
18431
+ ] }),
18432
+ /* @__PURE__ */ jsxRuntime.jsx(
18433
+ "h4",
18434
+ {
18435
+ className: cn(
18436
+ "mt-1.5 font-heading text-base font-bold leading-snug sm:text-lg",
18437
+ t.rowTitle
18438
+ ),
18439
+ children: post.title
18440
+ }
18441
+ )
18442
+ ] }),
18443
+ /* @__PURE__ */ jsxRuntime.jsx(
18444
+ lucideReact.ArrowRightIcon,
18445
+ {
18446
+ className: cn(
18447
+ "h-5 w-5 shrink-0 transition-transform group-hover:translate-x-1",
18448
+ t.rowArrow
18449
+ )
18450
+ }
18451
+ )
18452
+ ]
18453
+ }
18454
+ ) }, i);
18455
+ }) })
18456
+ ] })
18457
+ ] }) });
18458
+ }
18459
+ var SURFACE_WHITE = "bg-white";
18460
+ var SURFACE_SAND = "bg-[oklch(0.94_0.016_86)]";
18461
+ var SURFACE_PRIMARY_700 = "bg-[oklch(0.52_0.082_179)]";
18462
+ var SURFACE_PRIMARY_800 = "bg-[oklch(0.39_0.062_179)]";
18463
+ var SURFACE_PRIMARY_900 = "bg-[oklch(0.27_0.040_179)]";
18464
+ function SectionHead({
18465
+ eyebrow,
18466
+ title,
18467
+ subtitle,
18468
+ link,
18469
+ align = "between",
18470
+ theme = "light"
18471
+ }) {
18472
+ var _a;
18473
+ const isCenter = align === "center";
18474
+ return /* @__PURE__ */ jsxRuntime.jsxs(
18475
+ "div",
18476
+ {
18477
+ className: cn(
18478
+ "mb-10 flex flex-wrap items-end gap-6",
18479
+ isCenter ? "flex-col items-center text-center" : "justify-between"
18480
+ ),
18481
+ children: [
18482
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("max-w-2xl", isCenter && "mx-auto"), children: [
18483
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18484
+ /* @__PURE__ */ jsxRuntime.jsx(
18485
+ "h2",
18486
+ {
18487
+ className: cn(
18488
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18489
+ theme === "dark" ? "text-white" : "text-foreground"
18490
+ ),
18491
+ children: title
18492
+ }
18493
+ ),
18494
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx(
18495
+ "p",
18496
+ {
18497
+ className: cn(
18498
+ "mt-3 text-base",
18499
+ theme === "dark" ? "text-white/70" : "text-muted-foreground"
18500
+ ),
18501
+ children: subtitle
18502
+ }
18503
+ )
18504
+ ] }),
18505
+ link && !isCenter && /* @__PURE__ */ jsxRuntime.jsxs(
18506
+ "a",
18507
+ {
18508
+ href: (_a = link.href) != null ? _a : "#",
18509
+ className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
18510
+ children: [
18511
+ link.label,
18512
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18513
+ ]
18514
+ }
18515
+ )
18516
+ ]
18517
+ }
18518
+ );
18519
+ }
18520
+ function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
18521
+ var _a;
18522
+ const railRef = React32__namespace.useRef(null);
18523
+ const scrollByCard = (dir) => {
18524
+ const rail = railRef.current;
18525
+ if (!rail) return;
18526
+ const card = rail.querySelector("[data-rail-card]");
18527
+ const amount = card ? card.offsetWidth + 22 : rail.clientWidth * 0.8;
18528
+ rail.scrollBy({ left: dir * amount, behavior: "smooth" });
18529
+ };
18530
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: cn(SURFACE_SAND, "py-20 sm:py-28"), children: [
18531
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
18532
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
18533
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18534
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-heading text-3xl font-black uppercase leading-[1.05] text-foreground sm:text-4xl lg:text-5xl", children: title }),
18535
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-3 text-base text-muted-foreground", children: subtitle })
18536
+ ] }),
18537
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
18538
+ link && /* @__PURE__ */ jsxRuntime.jsxs(
18539
+ "a",
18540
+ {
18541
+ href: (_a = link.href) != null ? _a : "#",
18542
+ className: "group mr-2 hidden items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800 sm:inline-flex",
18543
+ children: [
18544
+ link.label,
18545
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18546
+ ]
18547
+ }
18548
+ ),
18549
+ /* @__PURE__ */ jsxRuntime.jsx(
18550
+ "button",
18551
+ {
18552
+ type: "button",
18553
+ onClick: () => scrollByCard(-1),
18554
+ "aria-label": "Previous expeditions",
18555
+ className: "flex h-11 w-11 items-center justify-center rounded-full border border-border bg-background text-foreground transition-colors hover:border-primary hover:bg-primary hover:text-primary-foreground",
18556
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
18557
+ }
18558
+ ),
18559
+ /* @__PURE__ */ jsxRuntime.jsx(
18560
+ "button",
18561
+ {
18562
+ type: "button",
18563
+ onClick: () => scrollByCard(1),
18564
+ "aria-label": "Next expeditions",
18565
+ className: "flex h-11 w-11 items-center justify-center rounded-full border border-border bg-background text-foreground transition-colors hover:border-primary hover:bg-primary hover:text-primary-foreground",
18566
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
18567
+ }
18568
+ )
18569
+ ] })
18570
+ ] }) }),
18571
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl", children: /* @__PURE__ */ jsxRuntime.jsx(
18572
+ "div",
18573
+ {
18574
+ ref: railRef,
18575
+ className: "flex snap-x snap-mandatory gap-[22px] overflow-x-auto scroll-pl-6 px-6 pb-4 [scrollbar-width:none] sm:scroll-pl-8 sm:px-8 [&::-webkit-scrollbar]:hidden",
18576
+ children: trips.map((trip, i) => /* @__PURE__ */ jsxRuntime.jsx(
18577
+ "div",
18578
+ {
18579
+ "data-rail-card": true,
18580
+ className: "w-[320px] shrink-0 snap-start sm:w-[340px]",
18581
+ children: /* @__PURE__ */ jsxRuntime.jsx(TripCard, __spreadValues({ variant: "editorial" }, trip))
18582
+ },
18583
+ i
18584
+ ))
18585
+ }
18586
+ ) })
18587
+ ] });
18588
+ }
18589
+ function PopularCloud({ eyebrow, title, subtitle, chips }) {
18590
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_WHITE, "py-20 sm:py-28"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18591
+ /* @__PURE__ */ jsxRuntime.jsx(
18592
+ SectionHead,
18593
+ {
18594
+ eyebrow,
18595
+ title,
18596
+ subtitle,
18597
+ align: "center"
18598
+ }
18599
+ ),
18600
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex max-w-3xl flex-wrap items-center justify-center gap-3", children: chips.map((chip, i) => {
18601
+ var _a;
18602
+ return /* @__PURE__ */ jsxRuntime.jsx(
18603
+ Chip,
18604
+ {
18605
+ href: chip.href,
18606
+ variant: chip.featured ? "solid" : "outline",
18607
+ size: (_a = chip.size) != null ? _a : "md",
18608
+ className: "transition-transform hover:-translate-y-0.5",
18609
+ children: chip.label
18610
+ },
18611
+ i
18612
+ );
18613
+ }) })
18614
+ ] }) });
18615
+ }
18616
+ function StatsBand({ items }) {
18617
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_PRIMARY_700, "py-16 text-white sm:py-20"), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-x-6 gap-y-10 text-center lg:grid-cols-4", children: items.map((stat, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
18618
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-heading text-4xl font-black leading-none text-[oklch(0.94_0.05_179)] sm:text-5xl lg:text-6xl", children: stat.value }),
18619
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 text-sm font-medium text-white/90", children: stat.label })
18620
+ ] }, i)) }) }) });
18621
+ }
18622
+ function ReviewStars({ stars = 5 }) {
18623
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 flex items-center gap-0.5", "aria-label": `${stars} out of 5 stars`, children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
18624
+ lucideReact.StarIcon,
18625
+ {
18626
+ className: cn(
18627
+ "h-4 w-4",
18628
+ i + 1 <= Math.round(stars) ? "fill-amber-400 text-amber-400" : "fill-white/15 text-white/15"
18629
+ )
18630
+ },
18631
+ i
18632
+ )) });
18633
+ }
18634
+ function ReviewsBand({ eyebrow, title, subtitle, link, items, note }) {
18635
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_PRIMARY_900, "py-20 text-white sm:py-28"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18636
+ /* @__PURE__ */ jsxRuntime.jsx(
18637
+ SectionHead,
18638
+ {
18639
+ eyebrow,
18640
+ title,
18641
+ subtitle,
18642
+ link,
18643
+ theme: "dark"
18644
+ }
18645
+ ),
18646
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid gap-5 sm:grid-cols-2 lg:grid-cols-3", children: items.map((review, i) => /* @__PURE__ */ jsxRuntime.jsxs(
18647
+ "figure",
18648
+ {
18649
+ className: "rounded-2xl border border-white/10 bg-white/5 p-7 transition-colors hover:bg-white/10",
18650
+ children: [
18651
+ /* @__PURE__ */ jsxRuntime.jsx(ReviewStars, { stars: review.stars }),
18652
+ /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "font-sans text-lg italic leading-relaxed text-white/90", children: [
18653
+ "\u201C",
18654
+ review.quote,
18655
+ "\u201D"
18656
+ ] }),
18657
+ /* @__PURE__ */ jsxRuntime.jsxs("figcaption", { className: "mt-5 text-sm font-medium text-white/60", children: [
18658
+ "\u2014 ",
18659
+ review.author
18660
+ ] })
18661
+ ]
18662
+ },
18663
+ i
18664
+ )) }),
18665
+ note && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-8 text-center text-xs text-white/40", children: note })
18666
+ ] }) });
18667
+ }
18668
+ function NewHome({
18669
+ hero,
18670
+ explorer,
18671
+ expeditions,
18672
+ popular,
18673
+ stats,
18674
+ usp,
18675
+ reviews,
18676
+ journal,
18677
+ cta,
18678
+ footer,
18679
+ className
18680
+ }) {
18681
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full bg-background", className), children: [
18682
+ /* @__PURE__ */ jsxRuntime.jsx(HomeHeader, __spreadValues({}, hero)),
18683
+ explorer && /* @__PURE__ */ jsxRuntime.jsx(
18684
+ AdventureExplorer,
18685
+ __spreadProps(__spreadValues({}, explorer), {
18686
+ className: cn(SURFACE_WHITE, explorer.className)
18687
+ })
18688
+ ),
18689
+ expeditions && /* @__PURE__ */ jsxRuntime.jsx(ExpeditionsRail, __spreadValues({}, expeditions)),
18690
+ popular && /* @__PURE__ */ jsxRuntime.jsx(PopularCloud, __spreadValues({}, popular)),
18691
+ stats && /* @__PURE__ */ jsxRuntime.jsx(StatsBand, __spreadValues({}, stats)),
18692
+ usp && /* @__PURE__ */ jsxRuntime.jsx(USP, __spreadProps(__spreadValues({}, usp), { className: cn(SURFACE_PRIMARY_800, usp.className) })),
18693
+ reviews && /* @__PURE__ */ jsxRuntime.jsx(ReviewsBand, __spreadValues({}, reviews)),
18694
+ journal && /* @__PURE__ */ jsxRuntime.jsx(BlogJournal, __spreadProps(__spreadValues({}, journal), { className: cn(SURFACE_WHITE, journal.className) })),
18695
+ cta && /* @__PURE__ */ jsxRuntime.jsx(CtaBanner, __spreadValues({}, cta)),
18696
+ footer && /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, __spreadValues({}, footer))
18697
+ ] });
18698
+ }
18699
+ var ACTIVE_PILL = "bg-primary text-white shadow-sm";
18700
+ var VARIANT3 = {
18701
+ black: {
18702
+ track: "bg-white/5 border-white/10",
18703
+ idle: "text-white/55 hover:text-white",
18704
+ ring: "focus-visible:ring-white/70"
18705
+ },
18706
+ white: {
18707
+ track: "bg-neutral-100 border-black/10",
18708
+ idle: "text-neutral-500 hover:text-neutral-900",
18709
+ ring: "focus-visible:ring-neutral-900/40"
18710
+ }
18711
+ };
18712
+ var SIZE = {
18713
+ sm: "px-4 py-1.5 text-[13px]",
18714
+ md: "px-5 py-2 text-sm"
18715
+ };
18716
+ function SegmentedControl({
18717
+ items,
18718
+ value,
18719
+ defaultValue,
18720
+ onValueChange,
18721
+ variant = "black",
18722
+ size = "md",
18723
+ fullWidth = false,
18724
+ collapse = false,
18725
+ "aria-label": ariaLabel = "Options",
18726
+ className
18727
+ }) {
18728
+ var _a;
18729
+ const isControlled = value != null;
18730
+ const [internal, setInternal] = React32__namespace.useState(
18731
+ defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
18732
+ );
18733
+ const active = isControlled ? value : internal;
18734
+ const select = (id) => {
18735
+ if (!isControlled) setInternal(id);
18736
+ onValueChange == null ? void 0 : onValueChange(id);
18737
+ };
18738
+ const onKeyDown = (e) => {
18739
+ if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return;
18740
+ e.preventDefault();
18741
+ const enabled = items.filter((i) => !i.disabled);
18742
+ const idx = enabled.findIndex((i) => i.id === active);
18743
+ if (idx === -1) return;
18744
+ const next = e.key === "ArrowRight" ? enabled[(idx + 1) % enabled.length] : enabled[(idx - 1 + enabled.length) % enabled.length];
18745
+ select(next.id);
18746
+ };
18747
+ const v = VARIANT3[variant];
18748
+ return /* @__PURE__ */ jsxRuntime.jsx(
18749
+ "div",
18750
+ {
18751
+ role: "radiogroup",
18752
+ "aria-label": ariaLabel,
18753
+ onKeyDown,
18754
+ className: cn(
18755
+ "inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
18756
+ fullWidth && "flex w-full",
18757
+ v.track,
18758
+ className
18759
+ ),
18760
+ children: items.map((item) => {
18761
+ const isActive = item.id === active;
18762
+ const Icon = item.icon;
18763
+ const showLabel = collapse === "all" ? false : collapse ? isActive : true;
18764
+ return /* @__PURE__ */ jsxRuntime.jsxs(
18765
+ "button",
18766
+ {
18767
+ type: "button",
18768
+ role: "radio",
18769
+ "aria-checked": isActive,
18770
+ "aria-label": collapse && !showLabel ? item.label : void 0,
18771
+ title: collapse && !showLabel ? item.label : void 0,
18772
+ disabled: item.disabled,
18773
+ tabIndex: isActive ? 0 : -1,
18774
+ onClick: () => select(item.id),
18775
+ className: cn(
18776
+ "inline-flex shrink-0 items-center justify-center rounded-full font-ui font-bold transition-all duration-300 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-40",
18777
+ showLabel && Icon ? "gap-2" : "gap-0",
18778
+ variant === "black" ? "focus-visible:ring-offset-neutral-950" : "focus-visible:ring-offset-white",
18779
+ fullWidth && "flex-1",
18780
+ SIZE[size],
18781
+ /* Icon-only segments are square-ish — drop the side padding so
18782
+ the icon centres in a circular pill. */
18783
+ collapse && !showLabel && (size === "sm" ? "!px-1.5" : "!px-2"),
18784
+ isActive ? ACTIVE_PILL : v.idle,
18785
+ v.ring
18786
+ ),
18787
+ children: [
18788
+ Icon && /* @__PURE__ */ jsxRuntime.jsx(
18789
+ Icon,
18790
+ {
18791
+ className: cn("shrink-0", size === "sm" ? "size-4" : "size-[18px]")
18792
+ }
18793
+ ),
18794
+ /* @__PURE__ */ jsxRuntime.jsx(
18795
+ "span",
18796
+ {
18797
+ className: cn(
18798
+ "overflow-hidden whitespace-nowrap transition-all duration-300 ease-out",
18799
+ showLabel ? "max-w-[12ch] opacity-100" : "max-w-0 opacity-0"
18800
+ ),
18801
+ children: item.label
18802
+ }
18803
+ )
18804
+ ]
18805
+ },
18806
+ item.id
18807
+ );
18808
+ })
18809
+ }
18810
+ );
18811
+ }
17181
18812
 
17182
18813
  exports.ActivityCard = ActivityCard;
18814
+ exports.AdventureExplorer = AdventureExplorer;
17183
18815
  exports.AgentContactCard = AgentContactCard;
17184
18816
  exports.Alert = Alert;
17185
18817
  exports.AskExo = AskExo;
17186
18818
  exports.BirthDateField = BirthDateField;
17187
18819
  exports.BlogCard = BlogCard;
18820
+ exports.BlogJournal = BlogJournal;
17188
18821
  exports.BlogPost = BlogPost;
17189
18822
  exports.BookingAdventureCard = BookingAdventureCard;
17190
18823
  exports.BookingCancellationEmail = BookingCancellationEmail;
@@ -17200,8 +18833,17 @@ exports.Button = Button;
17200
18833
  exports.COUNTRIES = COUNTRIES;
17201
18834
  exports.CancellationForm = CancellationForm;
17202
18835
  exports.CategoryPage2 = CategoryPage2;
18836
+ exports.Chip = Chip;
17203
18837
  exports.CounterField = CounterField;
17204
18838
  exports.CountrySearchField = CountrySearchField;
18839
+ exports.CtaBanner = CtaBanner;
18840
+ exports.DEFAULT_FOOTER_BADGES = DEFAULT_FOOTER_BADGES;
18841
+ exports.DEFAULT_FOOTER_DESTINATIONS = DEFAULT_FOOTER_DESTINATIONS;
18842
+ exports.DEFAULT_FOOTER_LANGUAGES = DEFAULT_FOOTER_LANGUAGES;
18843
+ exports.DEFAULT_FOOTER_LEGAL = DEFAULT_FOOTER_LEGAL;
18844
+ exports.DEFAULT_FOOTER_PAGES = DEFAULT_FOOTER_PAGES;
18845
+ exports.DEFAULT_FOOTER_SOCIALS = DEFAULT_FOOTER_SOCIALS;
18846
+ exports.DEFAULT_FOOTER_THEMES = DEFAULT_FOOTER_THEMES;
17205
18847
  exports.DEFAULT_HEADER_LINKS = DEFAULT_HEADER_LINKS;
17206
18848
  exports.DEFAULT_LANGUAGES = DEFAULT_LANGUAGES;
17207
18849
  exports.DEPARTURE_STATUS_MAP = STATUS_MAP;
@@ -17219,11 +18861,13 @@ exports.FloatingInput = FloatingInput;
17219
18861
  exports.FloatingSelect = FloatingSelect;
17220
18862
  exports.GroupProgressBar = GroupProgressBar;
17221
18863
  exports.GroupStatusBanner = GroupStatusBanner;
18864
+ exports.HomeHeader = HomeHeader;
17222
18865
  exports.Itinerary = Itinerary;
17223
18866
  exports.ItineraryDay = ItineraryDay;
17224
18867
  exports.LOGO_PLANETAEXO_DATA_URI = LOGO_PLANETAEXO_DATA_URI;
17225
18868
  exports.LeadCapturePopup = LeadCapturePopup;
17226
18869
  exports.MenuTrip = MenuTrip;
18870
+ exports.NewHome = NewHome;
17227
18871
  exports.NotificationEmail = NotificationEmail;
17228
18872
  exports.OTPCodeInput = OTPCodeInput;
17229
18873
  exports.Offer = Offer;
@@ -17249,7 +18893,9 @@ exports.RegistrationProgressBar = RegistrationProgressBar;
17249
18893
  exports.RegistrationReminderEmail = RegistrationReminderEmail;
17250
18894
  exports.RegistrationReminderIndividualEmail = RegistrationReminderIndividualEmail;
17251
18895
  exports.RegistrationSuccessCard = RegistrationSuccessCard;
18896
+ exports.SegmentedControl = SegmentedControl;
17252
18897
  exports.ShareWidget = ShareWidget;
18898
+ exports.SiteFooter = SiteFooter;
17253
18899
  exports.SiteHeader = SiteHeader;
17254
18900
  exports.StatusBadge = StatusBadge2;
17255
18901
  exports.StickyBookingCard = StickyBookingCard;
@@ -17263,7 +18909,9 @@ exports.TripCard = TripCard;
17263
18909
  exports.TripHeader = TripHeader;
17264
18910
  exports.TripPage = TripPage;
17265
18911
  exports.TrustpilotEmbed = TrustpilotEmbed;
18912
+ exports.USP = USP;
17266
18913
  exports.buttonVariants = buttonVariants;
18914
+ exports.chipVariants = chipVariants;
17267
18915
  exports.cn = cn;
17268
18916
  exports.emailTokens = emailTokens;
17269
18917
  exports.formatCpf = formatCpf;