@planetaexo/design-system 0.2.13 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var React4 = require('react');
3
+ var React18 = require('react');
4
4
  var dateFns = require('date-fns');
5
5
  var lucideReact = require('lucide-react');
6
6
  var clsx = require('clsx');
@@ -11,6 +11,11 @@ var dialog = require('@base-ui/react/dialog');
11
11
  var button = require('@base-ui/react/button');
12
12
  var classVarianceAuthority = require('class-variance-authority');
13
13
  var reactDayPicker = require('react-day-picker');
14
+ var popover = require('@base-ui/react/popover');
15
+ var checkbox = require('@base-ui/react/checkbox');
16
+ var accordion = require('@base-ui/react/accordion');
17
+ var mergeProps = require('@base-ui/react/merge-props');
18
+ var useRender = require('@base-ui/react/use-render');
14
19
 
15
20
  function _interopNamespace(e) {
16
21
  if (e && e.__esModule) return e;
@@ -30,7 +35,7 @@ function _interopNamespace(e) {
30
35
  return Object.freeze(n);
31
36
  }
32
37
 
33
- var React4__namespace = /*#__PURE__*/_interopNamespace(React4);
38
+ var React18__namespace = /*#__PURE__*/_interopNamespace(React18);
34
39
 
35
40
  var __defProp = Object.defineProperty;
36
41
  var __defProps = Object.defineProperties;
@@ -231,6 +236,23 @@ function DialogTitle(_a) {
231
236
  }, props)
232
237
  );
233
238
  }
239
+ function DialogDescription(_a) {
240
+ var _b = _a, {
241
+ className
242
+ } = _b, props = __objRest(_b, [
243
+ "className"
244
+ ]);
245
+ return /* @__PURE__ */ jsxRuntime.jsx(
246
+ dialog.Dialog.Description,
247
+ __spreadValues({
248
+ "data-slot": "dialog-description",
249
+ className: cn(
250
+ "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
251
+ className
252
+ )
253
+ }, props)
254
+ );
255
+ }
234
256
  function Calendar(_a) {
235
257
  var _b = _a, {
236
258
  className,
@@ -399,8 +421,8 @@ function CalendarDayButton(_a) {
399
421
  "locale"
400
422
  ]);
401
423
  const defaultClassNames = reactDayPicker.getDefaultClassNames();
402
- const ref = React4__namespace.useRef(null);
403
- React4__namespace.useEffect(() => {
424
+ const ref = React18__namespace.useRef(null);
425
+ React18__namespace.useEffect(() => {
404
426
  var _a2;
405
427
  if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
406
428
  }, [modifiers.focused]);
@@ -422,10 +444,10 @@ function CalendarDayButton(_a) {
422
444
  }, props)
423
445
  );
424
446
  }
425
- var FloatingInput = React4__namespace.forwardRef(
447
+ var FloatingInput = React18__namespace.forwardRef(
426
448
  (_a, ref) => {
427
449
  var _b = _a, { label, error, id, className, required } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required"]);
428
- const inputId = id != null ? id : React4__namespace.useId();
450
+ const inputId = id != null ? id : React18__namespace.useId();
429
451
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
430
452
  /* @__PURE__ */ jsxRuntime.jsx(
431
453
  "input",
@@ -465,10 +487,10 @@ var FloatingInput = React4__namespace.forwardRef(
465
487
  }
466
488
  );
467
489
  FloatingInput.displayName = "FloatingInput";
468
- var FloatingSelect = React4__namespace.forwardRef(
490
+ var FloatingSelect = React18__namespace.forwardRef(
469
491
  (_a, ref) => {
470
492
  var _b = _a, { label, error, id, className, required, children } = _b, props = __objRest(_b, ["label", "error", "id", "className", "required", "children"]);
471
- const inputId = id != null ? id : React4__namespace.useId();
493
+ const inputId = id != null ? id : React18__namespace.useId();
472
494
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", className), children: [
473
495
  /* @__PURE__ */ jsxRuntime.jsx(
474
496
  "select",
@@ -729,11 +751,11 @@ function PhoneCountrySelect({
729
751
  className
730
752
  }) {
731
753
  var _a;
732
- const [open, setOpen] = React4__namespace.useState(false);
733
- const containerRef = React4__namespace.useRef(null);
734
- const listRef = React4__namespace.useRef(null);
754
+ const [open, setOpen] = React18__namespace.useState(false);
755
+ const containerRef = React18__namespace.useRef(null);
756
+ const listRef = React18__namespace.useRef(null);
735
757
  const selected = (_a = PHONE_COUNTRIES.find((c) => c.code === value)) != null ? _a : PHONE_COUNTRIES[0];
736
- React4__namespace.useEffect(() => {
758
+ React18__namespace.useEffect(() => {
737
759
  if (!open) return;
738
760
  const handler = (e) => {
739
761
  var _a2;
@@ -744,7 +766,7 @@ function PhoneCountrySelect({
744
766
  document.addEventListener("mousedown", handler);
745
767
  return () => document.removeEventListener("mousedown", handler);
746
768
  }, [open]);
747
- React4__namespace.useEffect(() => {
769
+ React18__namespace.useEffect(() => {
748
770
  if (!open || !listRef.current) return;
749
771
  const activeEl = listRef.current.querySelector("[data-selected=true]");
750
772
  activeEl == null ? void 0 : activeEl.scrollIntoView({ block: "nearest" });
@@ -840,9 +862,214 @@ function PhoneCountrySelect({
840
862
  )
841
863
  ] });
842
864
  }
865
+ var COUNTRIES = [
866
+ { code: "AF", name: "Afghanistan" },
867
+ { code: "AL", name: "Albania" },
868
+ { code: "DZ", name: "Algeria" },
869
+ { code: "AO", name: "Angola" },
870
+ { code: "AR", name: "Argentina" },
871
+ { code: "AM", name: "Armenia" },
872
+ { code: "AU", name: "Australia" },
873
+ { code: "AT", name: "Austria" },
874
+ { code: "AZ", name: "Azerbaijan" },
875
+ { code: "BE", name: "Belgium" },
876
+ { code: "BO", name: "Bolivia" },
877
+ { code: "BA", name: "Bosnia" },
878
+ { code: "BR", name: "Brazil" },
879
+ { code: "BG", name: "Bulgaria" },
880
+ { code: "KH", name: "Cambodia" },
881
+ { code: "CA", name: "Canada" },
882
+ { code: "CL", name: "Chile" },
883
+ { code: "CN", name: "China" },
884
+ { code: "CO", name: "Colombia" },
885
+ { code: "CR", name: "Costa Rica" },
886
+ { code: "HR", name: "Croatia" },
887
+ { code: "CU", name: "Cuba" },
888
+ { code: "CZ", name: "Czech Republic" },
889
+ { code: "DK", name: "Denmark" },
890
+ { code: "DO", name: "Dominican Republic" },
891
+ { code: "EC", name: "Ecuador" },
892
+ { code: "EG", name: "Egypt" },
893
+ { code: "SV", name: "El Salvador" },
894
+ { code: "ET", name: "Ethiopia" },
895
+ { code: "FI", name: "Finland" },
896
+ { code: "FR", name: "France" },
897
+ { code: "GE", name: "Georgia" },
898
+ { code: "DE", name: "Germany" },
899
+ { code: "GH", name: "Ghana" },
900
+ { code: "GR", name: "Greece" },
901
+ { code: "GT", name: "Guatemala" },
902
+ { code: "HN", name: "Honduras" },
903
+ { code: "HK", name: "Hong Kong" },
904
+ { code: "HU", name: "Hungary" },
905
+ { code: "IS", name: "Iceland" },
906
+ { code: "IN", name: "India" },
907
+ { code: "ID", name: "Indonesia" },
908
+ { code: "IR", name: "Iran" },
909
+ { code: "IQ", name: "Iraq" },
910
+ { code: "IE", name: "Ireland" },
911
+ { code: "IL", name: "Israel" },
912
+ { code: "IT", name: "Italy" },
913
+ { code: "JM", name: "Jamaica" },
914
+ { code: "JP", name: "Japan" },
915
+ { code: "JO", name: "Jordan" },
916
+ { code: "KZ", name: "Kazakhstan" },
917
+ { code: "KE", name: "Kenya" },
918
+ { code: "KW", name: "Kuwait" },
919
+ { code: "LB", name: "Lebanon" },
920
+ { code: "LY", name: "Libya" },
921
+ { code: "MY", name: "Malaysia" },
922
+ { code: "MX", name: "Mexico" },
923
+ { code: "MA", name: "Morocco" },
924
+ { code: "MZ", name: "Mozambique" },
925
+ { code: "NP", name: "Nepal" },
926
+ { code: "NL", name: "Netherlands" },
927
+ { code: "NZ", name: "New Zealand" },
928
+ { code: "NI", name: "Nicaragua" },
929
+ { code: "NG", name: "Nigeria" },
930
+ { code: "NO", name: "Norway" },
931
+ { code: "PK", name: "Pakistan" },
932
+ { code: "PA", name: "Panama" },
933
+ { code: "PY", name: "Paraguay" },
934
+ { code: "PE", name: "Peru" },
935
+ { code: "PH", name: "Philippines" },
936
+ { code: "PL", name: "Poland" },
937
+ { code: "PT", name: "Portugal" },
938
+ { code: "QA", name: "Qatar" },
939
+ { code: "RO", name: "Romania" },
940
+ { code: "RU", name: "Russia" },
941
+ { code: "SA", name: "Saudi Arabia" },
942
+ { code: "SN", name: "Senegal" },
943
+ { code: "RS", name: "Serbia" },
944
+ { code: "SG", name: "Singapore" },
945
+ { code: "ZA", name: "South Africa" },
946
+ { code: "KR", name: "South Korea" },
947
+ { code: "ES", name: "Spain" },
948
+ { code: "LK", name: "Sri Lanka" },
949
+ { code: "SE", name: "Sweden" },
950
+ { code: "CH", name: "Switzerland" },
951
+ { code: "TW", name: "Taiwan" },
952
+ { code: "TZ", name: "Tanzania" },
953
+ { code: "TH", name: "Thailand" },
954
+ { code: "TN", name: "Tunisia" },
955
+ { code: "TR", name: "Turkey" },
956
+ { code: "UA", name: "Ukraine" },
957
+ { code: "AE", name: "United Arab Emirates" },
958
+ { code: "GB", name: "United Kingdom" },
959
+ { code: "US", name: "United States" },
960
+ { code: "UY", name: "Uruguay" },
961
+ { code: "UZ", name: "Uzbekistan" },
962
+ { code: "VE", name: "Venezuela" },
963
+ { code: "VN", name: "Vietnam" },
964
+ { code: "YE", name: "Yemen" },
965
+ { code: "ZW", name: "Zimbabwe" }
966
+ ];
967
+ function CountrySearchField({
968
+ value,
969
+ onChange,
970
+ required,
971
+ label = "Country",
972
+ countries,
973
+ placeholder = "Search country\u2026",
974
+ className
975
+ }) {
976
+ var _a;
977
+ const list = countries != null ? countries : COUNTRIES;
978
+ const [query, setQuery] = React18__namespace.useState("");
979
+ const [open, setOpen] = React18__namespace.useState(false);
980
+ const containerRef = React18__namespace.useRef(null);
981
+ const searchRef = React18__namespace.useRef(null);
982
+ const selected = list.find((c) => c.code === value);
983
+ const isFloated = open || !!selected;
984
+ const filtered = query.trim() ? list.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : list;
985
+ React18__namespace.useEffect(() => {
986
+ if (!open) return;
987
+ const handler = (e) => {
988
+ var _a2;
989
+ if (!((_a2 = containerRef.current) == null ? void 0 : _a2.contains(e.target))) {
990
+ setOpen(false);
991
+ setQuery("");
992
+ }
993
+ };
994
+ document.addEventListener("mousedown", handler);
995
+ return () => document.removeEventListener("mousedown", handler);
996
+ }, [open]);
997
+ const handleOpen = () => {
998
+ setOpen(true);
999
+ setQuery("");
1000
+ setTimeout(() => {
1001
+ var _a2;
1002
+ return (_a2 = searchRef.current) == null ? void 0 : _a2.focus();
1003
+ }, 0);
1004
+ };
1005
+ const handleSelect = (code) => {
1006
+ onChange(code);
1007
+ setOpen(false);
1008
+ setQuery("");
1009
+ };
1010
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: cn("relative w-full", className), children: [
1011
+ /* @__PURE__ */ jsxRuntime.jsxs(
1012
+ "button",
1013
+ {
1014
+ type: "button",
1015
+ onClick: handleOpen,
1016
+ className: cn(
1017
+ "relative flex w-full items-center rounded-lg border border-border bg-background h-14 px-3 text-left transition-colors",
1018
+ open && "border-primary ring-1 ring-primary"
1019
+ ),
1020
+ children: [
1021
+ /* @__PURE__ */ jsxRuntime.jsxs(
1022
+ "span",
1023
+ {
1024
+ className: cn(
1025
+ "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
1026
+ isFloated ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
1027
+ ),
1028
+ children: [
1029
+ label,
1030
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
1031
+ ]
1032
+ }
1033
+ ),
1034
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("flex-1 pt-3 text-base font-ui truncate", selected ? "text-foreground" : "invisible"), children: (_a = selected == null ? void 0 : selected.name) != null ? _a : "\u2014" }),
1035
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: cn("h-4 w-4 shrink-0 text-muted-foreground transition-transform", open && "rotate-180") })
1036
+ ]
1037
+ }
1038
+ ),
1039
+ open && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute top-[calc(100%+4px)] left-0 right-0 z-50 rounded-xl border border-border bg-background shadow-lg overflow-hidden", children: [
1040
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-border", children: [
1041
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }),
1042
+ /* @__PURE__ */ jsxRuntime.jsx(
1043
+ "input",
1044
+ {
1045
+ ref: searchRef,
1046
+ type: "text",
1047
+ value: query,
1048
+ onChange: (e) => setQuery(e.target.value),
1049
+ placeholder,
1050
+ className: "flex-1 bg-transparent text-sm font-ui text-foreground placeholder:text-muted-foreground focus:outline-none"
1051
+ }
1052
+ )
1053
+ ] }),
1054
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-52 overflow-y-auto py-1", children: filtered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 py-2 text-sm font-ui text-muted-foreground", children: "No countries found" }) : filtered.map((c) => /* @__PURE__ */ jsxRuntime.jsx(
1055
+ "button",
1056
+ {
1057
+ type: "button",
1058
+ onClick: () => handleSelect(c.code),
1059
+ className: cn(
1060
+ "flex w-full items-center px-3 py-2 text-sm font-ui text-left transition-colors hover:bg-muted",
1061
+ c.code === value && "bg-primary/10 text-primary font-semibold"
1062
+ ),
1063
+ children: c.name
1064
+ },
1065
+ c.code
1066
+ )) })
1067
+ ] })
1068
+ ] });
1069
+ }
843
1070
  function AdventureCard({ adventure }) {
844
1071
  var _a, _b, _c;
845
- const [checked, setChecked] = React4__namespace.useState(
1072
+ const [checked, setChecked] = React18__namespace.useState(
846
1073
  new Set((_b = (_a = adventure.optionals) == null ? void 0 : _a.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _b : [])
847
1074
  );
848
1075
  const toggleOptional = (id) => setChecked((prev) => {
@@ -1132,220 +1359,20 @@ function OfferSummarySection({
1132
1359
  )
1133
1360
  ] });
1134
1361
  }
1135
- var COUNTRIES = [
1136
- { code: "AF", name: "Afghanistan" },
1137
- { code: "AL", name: "Albania" },
1138
- { code: "DZ", name: "Algeria" },
1139
- { code: "AO", name: "Angola" },
1140
- { code: "AR", name: "Argentina" },
1141
- { code: "AM", name: "Armenia" },
1142
- { code: "AU", name: "Australia" },
1143
- { code: "AT", name: "Austria" },
1144
- { code: "AZ", name: "Azerbaijan" },
1145
- { code: "BE", name: "Belgium" },
1146
- { code: "BO", name: "Bolivia" },
1147
- { code: "BA", name: "Bosnia" },
1148
- { code: "BR", name: "Brazil" },
1149
- { code: "BG", name: "Bulgaria" },
1150
- { code: "KH", name: "Cambodia" },
1151
- { code: "CA", name: "Canada" },
1152
- { code: "CL", name: "Chile" },
1153
- { code: "CN", name: "China" },
1154
- { code: "CO", name: "Colombia" },
1155
- { code: "CR", name: "Costa Rica" },
1156
- { code: "HR", name: "Croatia" },
1157
- { code: "CU", name: "Cuba" },
1158
- { code: "CZ", name: "Czech Republic" },
1159
- { code: "DK", name: "Denmark" },
1160
- { code: "DO", name: "Dominican Republic" },
1161
- { code: "EC", name: "Ecuador" },
1162
- { code: "EG", name: "Egypt" },
1163
- { code: "SV", name: "El Salvador" },
1164
- { code: "ET", name: "Ethiopia" },
1165
- { code: "FI", name: "Finland" },
1166
- { code: "FR", name: "France" },
1167
- { code: "GE", name: "Georgia" },
1168
- { code: "DE", name: "Germany" },
1169
- { code: "GH", name: "Ghana" },
1170
- { code: "GR", name: "Greece" },
1171
- { code: "GT", name: "Guatemala" },
1172
- { code: "HN", name: "Honduras" },
1173
- { code: "HK", name: "Hong Kong" },
1174
- { code: "HU", name: "Hungary" },
1175
- { code: "IS", name: "Iceland" },
1176
- { code: "IN", name: "India" },
1177
- { code: "ID", name: "Indonesia" },
1178
- { code: "IR", name: "Iran" },
1179
- { code: "IQ", name: "Iraq" },
1180
- { code: "IE", name: "Ireland" },
1181
- { code: "IL", name: "Israel" },
1182
- { code: "IT", name: "Italy" },
1183
- { code: "JM", name: "Jamaica" },
1184
- { code: "JP", name: "Japan" },
1185
- { code: "JO", name: "Jordan" },
1186
- { code: "KZ", name: "Kazakhstan" },
1187
- { code: "KE", name: "Kenya" },
1188
- { code: "KW", name: "Kuwait" },
1189
- { code: "LB", name: "Lebanon" },
1190
- { code: "LY", name: "Libya" },
1191
- { code: "MY", name: "Malaysia" },
1192
- { code: "MX", name: "Mexico" },
1193
- { code: "MA", name: "Morocco" },
1194
- { code: "MZ", name: "Mozambique" },
1195
- { code: "NP", name: "Nepal" },
1196
- { code: "NL", name: "Netherlands" },
1197
- { code: "NZ", name: "New Zealand" },
1198
- { code: "NI", name: "Nicaragua" },
1199
- { code: "NG", name: "Nigeria" },
1200
- { code: "NO", name: "Norway" },
1201
- { code: "PK", name: "Pakistan" },
1202
- { code: "PA", name: "Panama" },
1203
- { code: "PY", name: "Paraguay" },
1204
- { code: "PE", name: "Peru" },
1205
- { code: "PH", name: "Philippines" },
1206
- { code: "PL", name: "Poland" },
1207
- { code: "PT", name: "Portugal" },
1208
- { code: "QA", name: "Qatar" },
1209
- { code: "RO", name: "Romania" },
1210
- { code: "RU", name: "Russia" },
1211
- { code: "SA", name: "Saudi Arabia" },
1212
- { code: "SN", name: "Senegal" },
1213
- { code: "RS", name: "Serbia" },
1214
- { code: "SG", name: "Singapore" },
1215
- { code: "ZA", name: "South Africa" },
1216
- { code: "KR", name: "South Korea" },
1217
- { code: "ES", name: "Spain" },
1218
- { code: "LK", name: "Sri Lanka" },
1219
- { code: "SE", name: "Sweden" },
1220
- { code: "CH", name: "Switzerland" },
1221
- { code: "TW", name: "Taiwan" },
1222
- { code: "TZ", name: "Tanzania" },
1223
- { code: "TH", name: "Thailand" },
1224
- { code: "TN", name: "Tunisia" },
1225
- { code: "TR", name: "Turkey" },
1226
- { code: "UA", name: "Ukraine" },
1227
- { code: "AE", name: "United Arab Emirates" },
1228
- { code: "GB", name: "United Kingdom" },
1229
- { code: "US", name: "United States" },
1230
- { code: "UY", name: "Uruguay" },
1231
- { code: "UZ", name: "Uzbekistan" },
1232
- { code: "VE", name: "Venezuela" },
1233
- { code: "VN", name: "Vietnam" },
1234
- { code: "YE", name: "Yemen" },
1235
- { code: "ZW", name: "Zimbabwe" }
1236
- ];
1237
- function CountrySearchField({
1238
- value,
1239
- onChange,
1240
- required
1241
- }) {
1242
- var _a;
1243
- const [query, setQuery] = React4__namespace.useState("");
1244
- const [open, setOpen] = React4__namespace.useState(false);
1245
- const containerRef = React4__namespace.useRef(null);
1246
- const searchRef = React4__namespace.useRef(null);
1247
- const selected = COUNTRIES.find((c) => c.code === value);
1248
- const isFloated = open || !!selected;
1249
- const filtered = query.trim() ? COUNTRIES.filter((c) => c.name.toLowerCase().includes(query.toLowerCase())) : COUNTRIES;
1250
- React4__namespace.useEffect(() => {
1251
- if (!open) return;
1252
- const handler = (e) => {
1253
- var _a2;
1254
- if (!((_a2 = containerRef.current) == null ? void 0 : _a2.contains(e.target))) {
1255
- setOpen(false);
1256
- setQuery("");
1257
- }
1258
- };
1259
- document.addEventListener("mousedown", handler);
1260
- return () => document.removeEventListener("mousedown", handler);
1261
- }, [open]);
1262
- const handleOpen = () => {
1263
- setOpen(true);
1264
- setQuery("");
1265
- setTimeout(() => {
1266
- var _a2;
1267
- return (_a2 = searchRef.current) == null ? void 0 : _a2.focus();
1268
- }, 0);
1269
- };
1270
- const handleSelect = (code) => {
1271
- onChange(code);
1272
- setOpen(false);
1273
- setQuery("");
1274
- };
1275
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: "relative w-full", children: [
1276
- /* @__PURE__ */ jsxRuntime.jsxs(
1277
- "button",
1278
- {
1279
- type: "button",
1280
- onClick: handleOpen,
1281
- className: cn(
1282
- "relative flex w-full items-center rounded-lg border border-border bg-background h-14 px-3 text-left transition-colors",
1283
- open && "border-primary ring-1 ring-primary"
1284
- ),
1285
- children: [
1286
- /* @__PURE__ */ jsxRuntime.jsxs(
1287
- "span",
1288
- {
1289
- className: cn(
1290
- "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
1291
- isFloated ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
1292
- ),
1293
- children: [
1294
- "Country",
1295
- required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
1296
- ]
1297
- }
1298
- ),
1299
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("flex-1 pt-3 text-base font-ui truncate", selected ? "text-foreground" : "invisible"), children: (_a = selected == null ? void 0 : selected.name) != null ? _a : "\u2014" }),
1300
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: cn("h-4 w-4 shrink-0 text-muted-foreground transition-transform", open && "rotate-180") })
1301
- ]
1302
- }
1303
- ),
1304
- open && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute top-[calc(100%+4px)] left-0 right-0 z-50 rounded-xl border border-border bg-background shadow-lg overflow-hidden", children: [
1305
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-border", children: [
1306
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }),
1307
- /* @__PURE__ */ jsxRuntime.jsx(
1308
- "input",
1309
- {
1310
- ref: searchRef,
1311
- type: "text",
1312
- value: query,
1313
- onChange: (e) => setQuery(e.target.value),
1314
- placeholder: "Search country\u2026",
1315
- className: "flex-1 bg-transparent text-sm font-ui text-foreground placeholder:text-muted-foreground focus:outline-none"
1316
- }
1317
- )
1318
- ] }),
1319
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-52 overflow-y-auto py-1", children: filtered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 py-2 text-sm font-ui text-muted-foreground", children: "No countries found" }) : filtered.map((c) => /* @__PURE__ */ jsxRuntime.jsx(
1320
- "button",
1321
- {
1322
- type: "button",
1323
- onClick: () => handleSelect(c.code),
1324
- className: cn(
1325
- "flex w-full items-center px-3 py-2 text-sm font-ui text-left transition-colors hover:bg-muted",
1326
- c.code === value && "bg-primary/10 text-primary font-semibold"
1327
- ),
1328
- children: c.name
1329
- },
1330
- c.code
1331
- )) })
1332
- ] })
1333
- ] });
1334
- }
1335
1362
  function BirthDateField({
1336
1363
  label,
1337
1364
  required,
1338
1365
  value,
1339
1366
  onChange
1340
1367
  }) {
1341
- const [open, setOpen] = React4__namespace.useState(false);
1342
- const [text, setText] = React4__namespace.useState(value ? dateFns.format(value, "dd/MM/yyyy") : "");
1343
- const containerRef = React4__namespace.useRef(null);
1344
- const inputId = React4__namespace.useId();
1345
- React4__namespace.useEffect(() => {
1368
+ const [open, setOpen] = React18__namespace.useState(false);
1369
+ const [text, setText] = React18__namespace.useState(value ? dateFns.format(value, "dd/MM/yyyy") : "");
1370
+ const containerRef = React18__namespace.useRef(null);
1371
+ const inputId = React18__namespace.useId();
1372
+ React18__namespace.useEffect(() => {
1346
1373
  setText(value ? dateFns.format(value, "dd/MM/yyyy") : "");
1347
1374
  }, [value]);
1348
- React4__namespace.useEffect(() => {
1375
+ React18__namespace.useEffect(() => {
1349
1376
  if (!open) return;
1350
1377
  const handler = (e) => {
1351
1378
  var _a;
@@ -1446,9 +1473,9 @@ function BookingWizard({
1446
1473
  depositInfo,
1447
1474
  onCancel
1448
1475
  }) {
1449
- const [step, setStep] = React4__namespace.useState("responsible");
1450
- const [error, setError] = React4__namespace.useState(null);
1451
- const [responsible, setResponsible] = React4__namespace.useState({
1476
+ const [step, setStep] = React18__namespace.useState("responsible");
1477
+ const [error, setError] = React18__namespace.useState(null);
1478
+ const [responsible, setResponsible] = React18__namespace.useState({
1452
1479
  firstName: "",
1453
1480
  lastName: "",
1454
1481
  email: "",
@@ -1467,7 +1494,7 @@ function BookingWizard({
1467
1494
  return s + ((_b = (_a = a.slots) == null ? void 0 : _a.children) != null ? _b : 0);
1468
1495
  }, 0);
1469
1496
  const totalPax = totalAdults + totalChildren;
1470
- const [travellers, setTravellers] = React4__namespace.useState(
1497
+ const [travellers, setTravellers] = React18__namespace.useState(
1471
1498
  Array.from({ length: Math.max(totalPax, 1) }, () => ({
1472
1499
  firstName: "",
1473
1500
  lastName: "",
@@ -1475,10 +1502,10 @@ function BookingWizard({
1475
1502
  email: ""
1476
1503
  }))
1477
1504
  );
1478
- const [payAmount, setPayAmount] = React4__namespace.useState("full");
1479
- const [payMethod, setPayMethod] = React4__namespace.useState("stripe");
1480
- const [termsAccepted, setTermsAccepted] = React4__namespace.useState(false);
1481
- const [termsModalOpen, setTermsModalOpen] = React4__namespace.useState(false);
1505
+ const [payAmount, setPayAmount] = React18__namespace.useState("full");
1506
+ const [payMethod, setPayMethod] = React18__namespace.useState("stripe");
1507
+ const [termsAccepted, setTermsAccepted] = React18__namespace.useState(false);
1508
+ const [termsModalOpen, setTermsModalOpen] = React18__namespace.useState(false);
1482
1509
  const setR = (k, v) => setResponsible((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
1483
1510
  const setT = (i, k, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { [k]: v }) : t));
1484
1511
  const setTDob = (i, v) => setTravellers((prev) => prev.map((t, idx) => idx === i ? __spreadProps(__spreadValues({}, t), { dateOfBirth: v }) : t));
@@ -1550,7 +1577,7 @@ function BookingWizard({
1550
1577
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
1551
1578
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border px-5 py-4 bg-muted/20", children: [
1552
1579
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading mb-2", children: "Booking details" }),
1553
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: WIZARD_STEPS.map((s, i) => /* @__PURE__ */ jsxRuntime.jsxs(React4__namespace.Fragment, { children: [
1580
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: WIZARD_STEPS.map((s, i) => /* @__PURE__ */ jsxRuntime.jsxs(React18__namespace.Fragment, { children: [
1554
1581
  /* @__PURE__ */ jsxRuntime.jsx(
1555
1582
  "span",
1556
1583
  {
@@ -1828,7 +1855,7 @@ function Offer({
1828
1855
  continueDisabled,
1829
1856
  className
1830
1857
  }) {
1831
- const [showBooking, setShowBooking] = React4__namespace.useState(false);
1858
+ const [showBooking, setShowBooking] = React18__namespace.useState(false);
1832
1859
  const handleBook = () => {
1833
1860
  if (!externalBookingFlow) setShowBooking(true);
1834
1861
  onContinue == null ? void 0 : onContinue();
@@ -1949,9 +1976,9 @@ function AdventureSection({
1949
1976
  onAddSuggestedTraveller
1950
1977
  }) {
1951
1978
  var _a, _b, _c;
1952
- const [detailsOpen, setDetailsOpen] = React4__namespace.useState(false);
1953
- const [addModalOpen, setAddModalOpen] = React4__namespace.useState(false);
1954
- const [newTraveller, setNewTraveller] = React4__namespace.useState({
1979
+ const [detailsOpen, setDetailsOpen] = React18__namespace.useState(false);
1980
+ const [addModalOpen, setAddModalOpen] = React18__namespace.useState(false);
1981
+ const [newTraveller, setNewTraveller] = React18__namespace.useState({
1955
1982
  firstName: "",
1956
1983
  lastName: "",
1957
1984
  passport: "",
@@ -2628,96 +2655,9 @@ function BookingDetails({
2628
2655
  );
2629
2656
  }
2630
2657
  var DEFAULT_LOGO = "/logo-planetaexo.png";
2631
- function BookingConfirmationEmail({
2632
- recipientName,
2633
- addTravellersUrl,
2634
- logoUrl = DEFAULT_LOGO,
2635
- bookingNumber,
2636
- activity,
2637
- adventure,
2638
- startingDate,
2639
- numberOfPeople,
2640
- host,
2641
- className
2642
- }) {
2643
- const AddTravellersCta = addTravellersUrl ? /* @__PURE__ */ jsxRuntime.jsx(
2644
- "a",
2645
- {
2646
- href: addTravellersUrl,
2647
- className: "inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-bold text-primary-foreground font-heading hover:bg-primary-800 transition-colors no-underline",
2648
- children: "Add travellers to your booking"
2649
- }
2650
- ) : /* @__PURE__ */ jsxRuntime.jsx(
2651
- "span",
2652
- {
2653
- className: "inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-bold text-primary-foreground font-heading",
2654
- role: "presentation",
2655
- children: "Add travellers to your booking"
2656
- }
2657
- );
2658
- return /* @__PURE__ */ jsxRuntime.jsxs(
2659
- "div",
2660
- {
2661
- className: cn(
2662
- "max-w-xl mx-auto bg-white text-foreground font-sans text-base leading-relaxed",
2663
- className
2664
- ),
2665
- children: [
2666
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 mb-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
2667
- "img",
2668
- {
2669
- src: logoUrl,
2670
- alt: "PlanetaEXO",
2671
- className: "h-[70px] w-auto object-contain"
2672
- }
2673
- ) }),
2674
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mb-4", children: [
2675
- "Hi ",
2676
- recipientName,
2677
- ","
2678
- ] }),
2679
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "Thank you for booking your adventure with PlanetaEXO \u2014 we're really looking forward to your adventure." }),
2680
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "To move forward, the first step is to add all travellers included in your booking. Once you do this, each person \u2014 including you \u2014 will receive an email with a link to complete their individual registration." }),
2681
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-8", children: AddTravellersCta }),
2682
- /* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mb-8" }),
2683
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4 font-heading font-bold text-foreground", children: "\u{1F4DD} Here's a quick summary of your booking:" }),
2684
- /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full text-sm mb-8", children: /* @__PURE__ */ jsxRuntime.jsxs("tbody", { className: "divide-y divide-border", children: [
2685
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2686
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Booking Number:" }),
2687
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: bookingNumber })
2688
- ] }),
2689
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2690
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Activity:" }),
2691
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: activity })
2692
- ] }),
2693
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2694
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Adventure:" }),
2695
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: adventure })
2696
- ] }),
2697
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2698
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Starting Date:" }),
2699
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: startingDate })
2700
- ] }),
2701
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2702
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Number of People:" }),
2703
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: numberOfPeople })
2704
- ] }),
2705
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2706
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Host:" }),
2707
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: host })
2708
- ] })
2709
- ] }) }),
2710
- /* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mb-8" }),
2711
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "After adding everyone, you will also receive your own registration email, just like the other travellers. Please make sure everyone completes this step so we can organise everything properly." }),
2712
- /* @__PURE__ */ jsxRuntime.jsx("p", { children: "If you have any questions, just reply to this email \u2014 happy to help." })
2713
- ]
2714
- }
2715
- );
2716
- }
2717
- var DEFAULT_LOGO2 = "/logo-planetaexo.png";
2718
2658
  function BookingConfirmation({
2719
2659
  recipientName,
2720
- logoUrl = DEFAULT_LOGO2,
2660
+ logoUrl = DEFAULT_LOGO,
2721
2661
  bookingReference,
2722
2662
  adventures,
2723
2663
  summaryLineItems,
@@ -3044,14 +2984,3323 @@ function BookingConfirmation({
3044
2984
  }
3045
2985
  );
3046
2986
  }
2987
+ var DEFAULT_LOGO2 = "/logo-planetaexo.png";
2988
+ function BookingConfirmationEmail({
2989
+ recipientName,
2990
+ addTravellersUrl,
2991
+ logoUrl = DEFAULT_LOGO2,
2992
+ bookingNumber,
2993
+ activity,
2994
+ adventure,
2995
+ startingDate,
2996
+ numberOfPeople,
2997
+ host,
2998
+ className
2999
+ }) {
3000
+ const AddTravellersCta = addTravellersUrl ? /* @__PURE__ */ jsxRuntime.jsx(
3001
+ "a",
3002
+ {
3003
+ href: addTravellersUrl,
3004
+ className: "inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-bold text-primary-foreground font-heading hover:bg-primary-800 transition-colors no-underline",
3005
+ children: "Add travellers to your booking"
3006
+ }
3007
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
3008
+ "span",
3009
+ {
3010
+ className: "inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-bold text-primary-foreground font-heading",
3011
+ role: "presentation",
3012
+ children: "Add travellers to your booking"
3013
+ }
3014
+ );
3015
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3016
+ "div",
3017
+ {
3018
+ className: cn(
3019
+ "max-w-xl mx-auto bg-white text-foreground font-sans text-base leading-relaxed",
3020
+ className
3021
+ ),
3022
+ children: [
3023
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 mb-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
3024
+ "img",
3025
+ {
3026
+ src: logoUrl,
3027
+ alt: "PlanetaEXO",
3028
+ className: "h-[70px] w-auto object-contain"
3029
+ }
3030
+ ) }),
3031
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mb-4", children: [
3032
+ "Hi ",
3033
+ recipientName,
3034
+ ","
3035
+ ] }),
3036
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "Thank you for booking your adventure with PlanetaEXO \u2014 we're really looking forward to your adventure." }),
3037
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "To move forward, the first step is to add all travellers included in your booking. Once you do this, each person \u2014 including you \u2014 will receive an email with a link to complete their individual registration." }),
3038
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-8", children: AddTravellersCta }),
3039
+ /* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mb-8" }),
3040
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4 font-heading font-bold text-foreground", children: "\u{1F4DD} Here's a quick summary of your booking:" }),
3041
+ /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full text-sm mb-8", children: /* @__PURE__ */ jsxRuntime.jsxs("tbody", { className: "divide-y divide-border", children: [
3042
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
3043
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Booking Number:" }),
3044
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: bookingNumber })
3045
+ ] }),
3046
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
3047
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Activity:" }),
3048
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: activity })
3049
+ ] }),
3050
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
3051
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Adventure:" }),
3052
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: adventure })
3053
+ ] }),
3054
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
3055
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Starting Date:" }),
3056
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: startingDate })
3057
+ ] }),
3058
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
3059
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Number of People:" }),
3060
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: numberOfPeople })
3061
+ ] }),
3062
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
3063
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Host:" }),
3064
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: host })
3065
+ ] })
3066
+ ] }) }),
3067
+ /* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mb-8" }),
3068
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "After adding everyone, you will also receive your own registration email, just like the other travellers. Please make sure everyone completes this step so we can organise everything properly." }),
3069
+ /* @__PURE__ */ jsxRuntime.jsx("p", { children: "If you have any questions, just reply to this email \u2014 happy to help." })
3070
+ ]
3071
+ }
3072
+ );
3073
+ }
3074
+ function CounterField({
3075
+ label,
3076
+ sublabel,
3077
+ required,
3078
+ value,
3079
+ min = 0,
3080
+ max = 99,
3081
+ onChange,
3082
+ className
3083
+ }) {
3084
+ const decrement = () => {
3085
+ if (value > min) onChange(value - 1);
3086
+ };
3087
+ const increment = () => {
3088
+ if (value < max) onChange(value + 1);
3089
+ };
3090
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
3091
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-sm font-ui text-foreground", children: [
3092
+ label,
3093
+ sublabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground font-normal ml-1", children: sublabel }),
3094
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
3095
+ ] }),
3096
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between rounded-lg border border-border bg-background px-4 py-3 h-14", children: [
3097
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl font-semibold text-foreground tabular-nums w-8 font-ui", children: value }),
3098
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3099
+ /* @__PURE__ */ jsxRuntime.jsx(
3100
+ "button",
3101
+ {
3102
+ type: "button",
3103
+ onClick: decrement,
3104
+ disabled: value <= min,
3105
+ "aria-label": `Diminuir ${label}`,
3106
+ className: cn(
3107
+ "inline-flex h-8 w-8 items-center justify-center rounded-full border border-border",
3108
+ "text-foreground transition-colors",
3109
+ "hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
3110
+ "disabled:pointer-events-none disabled:opacity-30"
3111
+ ),
3112
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MinusIcon, { className: "h-3.5 w-3.5" })
3113
+ }
3114
+ ),
3115
+ /* @__PURE__ */ jsxRuntime.jsx(
3116
+ "button",
3117
+ {
3118
+ type: "button",
3119
+ onClick: increment,
3120
+ disabled: value >= max,
3121
+ "aria-label": `Aumentar ${label}`,
3122
+ className: cn(
3123
+ "inline-flex h-8 w-8 items-center justify-center rounded-full border border-border",
3124
+ "text-foreground transition-colors",
3125
+ "hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
3126
+ "disabled:pointer-events-none disabled:opacity-30"
3127
+ ),
3128
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "h-3.5 w-3.5" })
3129
+ }
3130
+ )
3131
+ ] })
3132
+ ] })
3133
+ ] });
3134
+ }
3135
+ function Popover(_a) {
3136
+ var props = __objRest(_a, []);
3137
+ return /* @__PURE__ */ jsxRuntime.jsx(popover.Popover.Root, __spreadValues({ "data-slot": "popover" }, props));
3138
+ }
3139
+ function PopoverTrigger(_a) {
3140
+ var props = __objRest(_a, []);
3141
+ return /* @__PURE__ */ jsxRuntime.jsx(popover.Popover.Trigger, __spreadValues({ "data-slot": "popover-trigger" }, props));
3142
+ }
3143
+ function PopoverContent(_a) {
3144
+ var _b = _a, {
3145
+ className,
3146
+ align = "center",
3147
+ alignOffset = 0,
3148
+ side = "bottom",
3149
+ sideOffset = 4
3150
+ } = _b, props = __objRest(_b, [
3151
+ "className",
3152
+ "align",
3153
+ "alignOffset",
3154
+ "side",
3155
+ "sideOffset"
3156
+ ]);
3157
+ return /* @__PURE__ */ jsxRuntime.jsx(popover.Popover.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
3158
+ popover.Popover.Positioner,
3159
+ {
3160
+ align,
3161
+ alignOffset,
3162
+ side,
3163
+ sideOffset,
3164
+ className: "isolate z-50",
3165
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3166
+ popover.Popover.Popup,
3167
+ __spreadValues({
3168
+ "data-slot": "popover-content",
3169
+ className: cn(
3170
+ "z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
3171
+ className
3172
+ )
3173
+ }, props)
3174
+ )
3175
+ }
3176
+ ) });
3177
+ }
3178
+ function DatePickerField({
3179
+ label,
3180
+ required,
3181
+ value,
3182
+ onChange,
3183
+ placeholder = "Select a date",
3184
+ disabled,
3185
+ fromDate,
3186
+ className
3187
+ }) {
3188
+ const [open, setOpen] = React18__namespace.useState(false);
3189
+ const containerRef = React18__namespace.useRef(null);
3190
+ const [calendarWidth, setCalendarWidth] = React18__namespace.useState();
3191
+ const hasValue = !!value;
3192
+ React18__namespace.useEffect(() => {
3193
+ if (!containerRef.current) return;
3194
+ const observer = new ResizeObserver(([entry]) => {
3195
+ setCalendarWidth(entry.contentRect.width);
3196
+ });
3197
+ observer.observe(containerRef.current);
3198
+ return () => observer.disconnect();
3199
+ }, []);
3200
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className: cn("w-full", className), children: /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
3201
+ /* @__PURE__ */ jsxRuntime.jsxs(
3202
+ PopoverTrigger,
3203
+ {
3204
+ disabled,
3205
+ className: cn(
3206
+ "relative flex w-full items-center rounded-lg border border-border bg-background",
3207
+ "px-3 text-left text-base font-ui transition-colors h-14",
3208
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
3209
+ "disabled:pointer-events-none disabled:opacity-50",
3210
+ open && "border-primary ring-1 ring-primary"
3211
+ ),
3212
+ children: [
3213
+ /* @__PURE__ */ jsxRuntime.jsxs(
3214
+ "span",
3215
+ {
3216
+ className: cn(
3217
+ "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
3218
+ hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
3219
+ ),
3220
+ children: [
3221
+ label,
3222
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
3223
+ ]
3224
+ }
3225
+ ),
3226
+ /* @__PURE__ */ jsxRuntime.jsx(
3227
+ "span",
3228
+ {
3229
+ className: cn(
3230
+ "flex-1 truncate mt-3",
3231
+ hasValue ? "text-foreground" : "invisible"
3232
+ ),
3233
+ children: hasValue ? dateFns.format(value, "dd MMM yyyy") : placeholder
3234
+ }
3235
+ ),
3236
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
3237
+ ]
3238
+ }
3239
+ ),
3240
+ /* @__PURE__ */ jsxRuntime.jsx(
3241
+ PopoverContent,
3242
+ {
3243
+ className: "p-0",
3244
+ align: "start",
3245
+ style: calendarWidth ? { width: calendarWidth } : void 0,
3246
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3247
+ Calendar,
3248
+ {
3249
+ mode: "single",
3250
+ selected: value,
3251
+ onSelect: (date) => {
3252
+ onChange == null ? void 0 : onChange(date);
3253
+ setOpen(false);
3254
+ },
3255
+ fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
3256
+ className: "font-ui w-full",
3257
+ autoFocus: true
3258
+ }
3259
+ )
3260
+ }
3261
+ )
3262
+ ] }) });
3263
+ }
3264
+ function FormSection({
3265
+ title,
3266
+ children,
3267
+ className
3268
+ }) {
3269
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-5", className), children: [
3270
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
3271
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: title }),
3272
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px flex-1 bg-border" })
3273
+ ] }),
3274
+ children
3275
+ ] });
3276
+ }
3277
+ var defaultInitial = {
3278
+ adults: 2,
3279
+ children: 0,
3280
+ travelDate: void 0,
3281
+ budget: "",
3282
+ project: "",
3283
+ civility: "",
3284
+ phoneCountry: "BR",
3285
+ lastName: "",
3286
+ firstName: "",
3287
+ country: "France",
3288
+ phone: "",
3289
+ email: ""
3290
+ };
3291
+ function BookingForm({
3292
+ defaultValues,
3293
+ onSubmit,
3294
+ submitLabel = "Send my request",
3295
+ loading = false,
3296
+ showHeader = true,
3297
+ title = "Check availability for your trip",
3298
+ subtitle = "Free enquiry \u2013 no commitment",
3299
+ className
3300
+ }) {
3301
+ const [values, setValues] = React18__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
3302
+ const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
3303
+ const handleSubmit = (e) => {
3304
+ e.preventDefault();
3305
+ onSubmit == null ? void 0 : onSubmit(values);
3306
+ };
3307
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3308
+ "form",
3309
+ {
3310
+ onSubmit: handleSubmit,
3311
+ className: cn("flex flex-col gap-10", className),
3312
+ noValidate: true,
3313
+ children: [
3314
+ showHeader && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
3315
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: title }),
3316
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitle })
3317
+ ] }),
3318
+ /* @__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: [
3319
+ /* @__PURE__ */ jsxRuntime.jsx(
3320
+ CounterField,
3321
+ {
3322
+ label: "Adults",
3323
+ required: true,
3324
+ value: values.adults,
3325
+ min: 1,
3326
+ onChange: (v) => set("adults", v)
3327
+ }
3328
+ ),
3329
+ /* @__PURE__ */ jsxRuntime.jsx(
3330
+ CounterField,
3331
+ {
3332
+ label: "Children",
3333
+ sublabel: "(under 12)",
3334
+ value: values.children,
3335
+ min: 0,
3336
+ onChange: (v) => set("children", v)
3337
+ }
3338
+ )
3339
+ ] }) }),
3340
+ /* @__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: [
3341
+ /* @__PURE__ */ jsxRuntime.jsx(
3342
+ DatePickerField,
3343
+ {
3344
+ label: "Travel date",
3345
+ required: true,
3346
+ value: values.travelDate,
3347
+ onChange: (d) => set("travelDate", d),
3348
+ placeholder: "Pick a date"
3349
+ }
3350
+ ),
3351
+ /* @__PURE__ */ jsxRuntime.jsx(
3352
+ FloatingInput,
3353
+ {
3354
+ label: "Budget (per person)",
3355
+ required: true,
3356
+ type: "number",
3357
+ min: 0,
3358
+ value: values.budget,
3359
+ onChange: (e) => set("budget", e.target.value)
3360
+ }
3361
+ )
3362
+ ] }) }),
3363
+ /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Tell us about your trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
3364
+ /* @__PURE__ */ jsxRuntime.jsx(
3365
+ "textarea",
3366
+ {
3367
+ id: "project",
3368
+ placeholder: " ",
3369
+ rows: 5,
3370
+ value: values.project,
3371
+ onChange: (e) => set("project", e.target.value),
3372
+ className: cn(
3373
+ "peer block w-full resize-none rounded-lg border border-border bg-background",
3374
+ "px-3 pt-6 pb-3 text-base text-foreground font-ui",
3375
+ "transition-colors placeholder-transparent",
3376
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary"
3377
+ )
3378
+ }
3379
+ ),
3380
+ /* @__PURE__ */ jsxRuntime.jsxs(
3381
+ "label",
3382
+ {
3383
+ htmlFor: "project",
3384
+ className: cn(
3385
+ "pointer-events-none absolute left-3 top-4",
3386
+ "text-base text-muted-foreground font-ui transition-all duration-150",
3387
+ "peer-focus:top-2 peer-focus:text-xs peer-focus:text-primary",
3388
+ "peer-not-placeholder-shown:top-2 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
3389
+ ),
3390
+ children: [
3391
+ "Your trip in a few words",
3392
+ " ",
3393
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })
3394
+ ]
3395
+ }
3396
+ )
3397
+ ] }) }),
3398
+ /* @__PURE__ */ jsxRuntime.jsxs(FormSection, { title: "Contact details", children: [
3399
+ /* @__PURE__ */ jsxRuntime.jsx(
3400
+ "div",
3401
+ {
3402
+ role: "radiogroup",
3403
+ "aria-label": "Title",
3404
+ className: "flex flex-wrap items-center gap-x-6 gap-y-3",
3405
+ children: ["ms", "mr"].map((c) => /* @__PURE__ */ jsxRuntime.jsxs(
3406
+ "label",
3407
+ {
3408
+ className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
3409
+ children: [
3410
+ /* @__PURE__ */ jsxRuntime.jsx(
3411
+ "input",
3412
+ {
3413
+ type: "radio",
3414
+ name: "civility",
3415
+ value: c,
3416
+ checked: values.civility === c,
3417
+ onChange: () => set("civility", c),
3418
+ className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
3419
+ }
3420
+ ),
3421
+ c === "ms" ? "Ms." : "Mr."
3422
+ ]
3423
+ },
3424
+ c
3425
+ ))
3426
+ }
3427
+ ),
3428
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 min-w-0", children: [
3429
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
3430
+ FloatingInput,
3431
+ {
3432
+ label: "Last name",
3433
+ required: true,
3434
+ value: values.lastName,
3435
+ onChange: (e) => set("lastName", e.target.value)
3436
+ }
3437
+ ) }),
3438
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
3439
+ FloatingInput,
3440
+ {
3441
+ label: "First name",
3442
+ required: true,
3443
+ value: values.firstName,
3444
+ onChange: (e) => set("firstName", e.target.value)
3445
+ }
3446
+ ) }),
3447
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxRuntime.jsxs(
3448
+ FloatingSelect,
3449
+ {
3450
+ label: "Country of residence",
3451
+ required: true,
3452
+ value: values.country,
3453
+ onChange: (e) => set("country", e.target.value),
3454
+ children: [
3455
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, hidden: true }),
3456
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "France", children: "France" }),
3457
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Belgium", children: "Belgium" }),
3458
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Switzerland", children: "Switzerland" }),
3459
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Canada", children: "Canada" }),
3460
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Luxembourg", children: "Luxembourg" }),
3461
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "United Kingdom", children: "United Kingdom" }),
3462
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "United States", children: "United States" }),
3463
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Other", children: "Other" })
3464
+ ]
3465
+ }
3466
+ ) })
3467
+ ] }),
3468
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [
3469
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full min-w-0", children: [
3470
+ /* @__PURE__ */ jsxRuntime.jsx(
3471
+ PhoneCountrySelect,
3472
+ {
3473
+ value: values.phoneCountry,
3474
+ onChange: (code) => set("phoneCountry", code),
3475
+ className: "shrink-0"
3476
+ }
3477
+ ),
3478
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-w-0 flex-1", children: [
3479
+ /* @__PURE__ */ jsxRuntime.jsx(
3480
+ "input",
3481
+ {
3482
+ id: "phone",
3483
+ type: "tel",
3484
+ placeholder: " ",
3485
+ value: values.phone,
3486
+ onChange: (e) => set("phone", e.target.value),
3487
+ className: cn(
3488
+ "peer block h-14 w-full rounded-r-lg border border-border bg-background",
3489
+ "px-3 pt-5 pb-2 text-base text-foreground font-ui",
3490
+ "transition-colors placeholder-transparent",
3491
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary"
3492
+ )
3493
+ }
3494
+ ),
3495
+ /* @__PURE__ */ jsxRuntime.jsxs(
3496
+ "label",
3497
+ {
3498
+ htmlFor: "phone",
3499
+ className: cn(
3500
+ "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
3501
+ "text-base text-muted-foreground font-ui transition-all duration-150",
3502
+ "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
3503
+ "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"
3504
+ ),
3505
+ children: [
3506
+ "Phone ",
3507
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: "*" })
3508
+ ]
3509
+ }
3510
+ )
3511
+ ] })
3512
+ ] }),
3513
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
3514
+ FloatingInput,
3515
+ {
3516
+ label: "Email",
3517
+ required: true,
3518
+ type: "email",
3519
+ value: values.email,
3520
+ onChange: (e) => set("email", e.target.value)
3521
+ }
3522
+ ) })
3523
+ ] })
3524
+ ] }),
3525
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center pt-2", children: /* @__PURE__ */ jsxRuntime.jsx(
3526
+ "button",
3527
+ {
3528
+ type: "submit",
3529
+ disabled: loading,
3530
+ className: cn(
3531
+ "inline-flex items-center justify-center gap-2 rounded-full px-10 py-3.5",
3532
+ "bg-primary text-primary-foreground font-ui font-semibold text-sm",
3533
+ "transition-colors hover:bg-primary/90 focus-visible:outline-none",
3534
+ "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
3535
+ "disabled:pointer-events-none disabled:opacity-60"
3536
+ ),
3537
+ children: loading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3538
+ /* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "h-4 w-4 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
3539
+ /* @__PURE__ */ jsxRuntime.jsx(
3540
+ "circle",
3541
+ {
3542
+ className: "opacity-25",
3543
+ cx: "12",
3544
+ cy: "12",
3545
+ r: "10",
3546
+ stroke: "currentColor",
3547
+ strokeWidth: "4"
3548
+ }
3549
+ ),
3550
+ /* @__PURE__ */ jsxRuntime.jsx(
3551
+ "path",
3552
+ {
3553
+ className: "opacity-75",
3554
+ fill: "currentColor",
3555
+ d: "M4 12a8 8 0 018-8v4l3-3-3-3v4a8 8 0 00-8 8h4z"
3556
+ }
3557
+ )
3558
+ ] }),
3559
+ "Sending\u2026"
3560
+ ] }) : submitLabel
3561
+ }
3562
+ ) })
3563
+ ]
3564
+ }
3565
+ );
3566
+ }
3567
+ function Checkbox(_a) {
3568
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
3569
+ return /* @__PURE__ */ jsxRuntime.jsx(
3570
+ checkbox.Checkbox.Root,
3571
+ __spreadProps(__spreadValues({
3572
+ "data-slot": "checkbox",
3573
+ className: cn(
3574
+ "peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
3575
+ className
3576
+ )
3577
+ }, props), {
3578
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3579
+ checkbox.Checkbox.Indicator,
3580
+ {
3581
+ "data-slot": "checkbox-indicator",
3582
+ className: "grid place-content-center text-current transition-none [&>svg]:size-3.5",
3583
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3584
+ lucideReact.CheckIcon,
3585
+ {}
3586
+ )
3587
+ }
3588
+ )
3589
+ })
3590
+ );
3591
+ }
3592
+ var AccordionVariantContext = React18__namespace.createContext("default");
3593
+ function Accordion(_a) {
3594
+ var _b = _a, { className, variant = "default" } = _b, props = __objRest(_b, ["className", "variant"]);
3595
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(
3596
+ accordion.Accordion.Root,
3597
+ __spreadValues({
3598
+ "data-slot": "accordion",
3599
+ "data-variant": variant,
3600
+ className: cn(
3601
+ "flex w-full flex-col",
3602
+ variant === "faq" && "gap-3",
3603
+ className
3604
+ )
3605
+ }, props)
3606
+ ) });
3607
+ }
3608
+ function AccordionItem(_a) {
3609
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
3610
+ const variant = React18__namespace.useContext(AccordionVariantContext);
3611
+ return /* @__PURE__ */ jsxRuntime.jsx(
3612
+ accordion.Accordion.Item,
3613
+ __spreadValues({
3614
+ "data-slot": "accordion-item",
3615
+ className: cn(
3616
+ variant === "default" && "not-last:border-b",
3617
+ variant === "faq" && "rounded-lg border border-border bg-card",
3618
+ className
3619
+ )
3620
+ }, props)
3621
+ );
3622
+ }
3623
+ function AccordionTrigger(_a) {
3624
+ var _b = _a, {
3625
+ className,
3626
+ children
3627
+ } = _b, props = __objRest(_b, [
3628
+ "className",
3629
+ "children"
3630
+ ]);
3631
+ const variant = React18__namespace.useContext(AccordionVariantContext);
3632
+ return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
3633
+ accordion.Accordion.Trigger,
3634
+ __spreadProps(__spreadValues({
3635
+ "data-slot": "accordion-trigger",
3636
+ className: cn(
3637
+ "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
3638
+ "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
3639
+ variant === "default" && [
3640
+ "rounded-lg border border-transparent py-2.5 text-sm font-medium",
3641
+ "hover:underline focus-visible:border-ring",
3642
+ "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
3643
+ ],
3644
+ variant === "faq" && [
3645
+ "px-5 py-4 text-base font-bold",
3646
+ "hover:bg-muted/30 rounded-lg"
3647
+ ],
3648
+ className
3649
+ )
3650
+ }, props), {
3651
+ children: [
3652
+ children,
3653
+ variant === "default" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3654
+ /* @__PURE__ */ jsxRuntime.jsx(
3655
+ lucideReact.ChevronDownIcon,
3656
+ {
3657
+ "data-slot": "accordion-trigger-icon",
3658
+ className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
3659
+ }
3660
+ ),
3661
+ /* @__PURE__ */ jsxRuntime.jsx(
3662
+ lucideReact.ChevronUpIcon,
3663
+ {
3664
+ "data-slot": "accordion-trigger-icon",
3665
+ className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
3666
+ }
3667
+ )
3668
+ ] }),
3669
+ variant === "faq" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3670
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
3671
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
3672
+ ] })
3673
+ ]
3674
+ })
3675
+ ) });
3676
+ }
3677
+ function AccordionContent(_a) {
3678
+ var _b = _a, {
3679
+ className,
3680
+ children
3681
+ } = _b, props = __objRest(_b, [
3682
+ "className",
3683
+ "children"
3684
+ ]);
3685
+ const variant = React18__namespace.useContext(AccordionVariantContext);
3686
+ return /* @__PURE__ */ jsxRuntime.jsx(
3687
+ accordion.Accordion.Panel,
3688
+ __spreadProps(__spreadValues({
3689
+ "data-slot": "accordion-content",
3690
+ className: "overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up"
3691
+ }, props), {
3692
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3693
+ "div",
3694
+ {
3695
+ className: cn(
3696
+ "h-(--accordion-panel-height) pt-0 data-ending-style:h-0 data-starting-style:h-0",
3697
+ "[&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
3698
+ variant === "default" && "pb-2.5",
3699
+ variant === "faq" && "px-5 pb-5 text-base text-muted-foreground leading-relaxed",
3700
+ className
3701
+ ),
3702
+ children
3703
+ }
3704
+ )
3705
+ })
3706
+ );
3707
+ }
3708
+ function FilterPanel({
3709
+ groups,
3710
+ value,
3711
+ onChange,
3712
+ onClearAll,
3713
+ alwaysShowClear = false,
3714
+ title = "Filters",
3715
+ className
3716
+ }) {
3717
+ const [internalValue, setInternalValue] = React18__namespace.useState(
3718
+ () => Object.fromEntries(groups.map((g) => [g.id, []]))
3719
+ );
3720
+ const selected = value != null ? value : internalValue;
3721
+ const handleToggle = (groupId, itemId) => {
3722
+ var _a;
3723
+ const current = (_a = selected[groupId]) != null ? _a : [];
3724
+ const next = current.includes(itemId) ? current.filter((id) => id !== itemId) : [...current, itemId];
3725
+ const nextValue = __spreadProps(__spreadValues({}, selected), { [groupId]: next });
3726
+ if (onChange) {
3727
+ onChange(nextValue);
3728
+ } else {
3729
+ setInternalValue(nextValue);
3730
+ }
3731
+ };
3732
+ const handleClearAll = () => {
3733
+ const cleared = Object.fromEntries(groups.map((g) => [g.id, []]));
3734
+ if (onChange) {
3735
+ onChange(cleared);
3736
+ } else {
3737
+ setInternalValue(cleared);
3738
+ }
3739
+ onClearAll == null ? void 0 : onClearAll();
3740
+ };
3741
+ const totalSelected = Object.values(selected).flat().length;
3742
+ const showClear = alwaysShowClear || totalSelected > 0;
3743
+ const defaultOpenValues = groups.filter((g) => g.defaultOpen).map((g) => g.id);
3744
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
3745
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
3746
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-ui", children: title }),
3747
+ totalSelected > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 w-5 items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-foreground", children: totalSelected })
3748
+ ] }),
3749
+ /* @__PURE__ */ jsxRuntime.jsx(
3750
+ Accordion,
3751
+ {
3752
+ defaultValue: defaultOpenValues,
3753
+ className: "flex flex-col gap-2",
3754
+ children: groups.map((group) => {
3755
+ var _a;
3756
+ const groupSelected = (_a = selected[group.id]) != null ? _a : [];
3757
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3758
+ AccordionItem,
3759
+ {
3760
+ value: group.id,
3761
+ className: "border-0 border-b border-border last:border-b-0",
3762
+ children: [
3763
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "px-0 py-3.5 hover:no-underline transition-colors", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2.5", children: [
3764
+ group.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary shrink-0", children: group.icon }),
3765
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold text-foreground font-ui", children: group.label }),
3766
+ groupSelected.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold text-primary-foreground", children: groupSelected.length })
3767
+ ] }) }),
3768
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "px-4 pb-3 pt-1", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-0.5", children: group.items.map((item) => {
3769
+ const checked = groupSelected.includes(item.id);
3770
+ const checkboxId = `filter-${group.id}-${item.id}`;
3771
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
3772
+ "label",
3773
+ {
3774
+ htmlFor: checkboxId,
3775
+ className: "flex cursor-pointer items-center gap-3 rounded-md px-1 py-2 transition-colors hover:bg-muted/50",
3776
+ children: [
3777
+ /* @__PURE__ */ jsxRuntime.jsx(
3778
+ Checkbox,
3779
+ {
3780
+ id: checkboxId,
3781
+ checked,
3782
+ onCheckedChange: () => handleToggle(group.id, item.id),
3783
+ className: "shrink-0"
3784
+ }
3785
+ ),
3786
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 text-sm text-foreground font-ui", children: item.label }),
3787
+ item.count !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-medium text-primary font-ui", children: [
3788
+ "(",
3789
+ item.count,
3790
+ ")"
3791
+ ] })
3792
+ ]
3793
+ }
3794
+ ) }, item.id);
3795
+ }) }) })
3796
+ ]
3797
+ },
3798
+ group.id
3799
+ );
3800
+ })
3801
+ }
3802
+ ),
3803
+ showClear && /* @__PURE__ */ jsxRuntime.jsx(
3804
+ "button",
3805
+ {
3806
+ onClick: handleClearAll,
3807
+ 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",
3808
+ children: "Remove all filters"
3809
+ }
3810
+ )
3811
+ ] });
3812
+ }
3813
+ function ItineraryDayCard({
3814
+ stop,
3815
+ onOpen
3816
+ }) {
3817
+ const hasDescription = !!stop.description;
3818
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3819
+ "div",
3820
+ {
3821
+ onClick: onOpen,
3822
+ className: "group relative flex-none w-56 sm:w-64 h-80 rounded-2xl overflow-hidden cursor-pointer shadow-sm hover:shadow-lg transition-shadow duration-300",
3823
+ children: [
3824
+ /* @__PURE__ */ jsxRuntime.jsx(
3825
+ "img",
3826
+ {
3827
+ src: stop.coverImage,
3828
+ alt: stop.title,
3829
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
3830
+ }
3831
+ ),
3832
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-3 right-3 z-10 rounded-md bg-primary px-2 py-1", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-semibold text-primary-foreground font-ui", children: [
3833
+ "Day ",
3834
+ stop.dayNumber
3835
+ ] }) }),
3836
+ /* @__PURE__ */ jsxRuntime.jsxs(
3837
+ "div",
3838
+ {
3839
+ className: cn(
3840
+ "absolute inset-x-0 bottom-0 z-10 bg-gradient-to-t from-black/70 via-black/20 to-transparent p-4 transition-opacity duration-300",
3841
+ hasDescription && "group-hover:opacity-0"
3842
+ ),
3843
+ children: [
3844
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-white leading-tight font-heading", children: stop.title }),
3845
+ stop.location && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-0.5 flex items-center gap-1 text-xs text-white/80 font-ui", children: [
3846
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-3 w-3 shrink-0" }),
3847
+ stop.location
3848
+ ] }),
3849
+ stop.route && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-1 flex items-center gap-1.5 text-xs text-white/80 font-ui", children: [
3850
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarIcon, { className: "h-3 w-3 shrink-0" }),
3851
+ stop.route.distance,
3852
+ " \xB7 ",
3853
+ stop.route.duration
3854
+ ] })
3855
+ ]
3856
+ }
3857
+ ),
3858
+ hasDescription && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-x-0 bottom-0 z-20 bg-background translate-y-full group-hover:translate-y-0 transition-transform duration-300 ease-out p-4", children: [
3859
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-bold text-foreground font-heading leading-tight", children: stop.title }),
3860
+ stop.location && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-0.5 flex items-center gap-1 text-xs text-muted-foreground font-ui", children: [
3861
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-3 w-3 shrink-0 text-primary" }),
3862
+ stop.location
3863
+ ] }),
3864
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 line-clamp-3 text-xs text-foreground/80 leading-relaxed [&_p]:inline [&_strong]:font-semibold", children: stop.description }),
3865
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-2 inline-block text-xs font-semibold text-primary font-ui", children: "Read more \u2192" })
3866
+ ] })
3867
+ ]
3868
+ }
3869
+ );
3870
+ }
3871
+ function ItineraryModal({
3872
+ stop,
3873
+ allStops,
3874
+ onClose,
3875
+ onPrev,
3876
+ onNext
3877
+ }) {
3878
+ var _a, _b, _c;
3879
+ const [imgIndex, setImgIndex] = React18__namespace.useState(0);
3880
+ const images = stop ? [stop.coverImage, ...(_a = stop.images) != null ? _a : []] : [];
3881
+ const isFirst = (stop == null ? void 0 : stop.dayNumber) === ((_b = allStops[0]) == null ? void 0 : _b.dayNumber);
3882
+ const isLast = (stop == null ? void 0 : stop.dayNumber) === ((_c = allStops[allStops.length - 1]) == null ? void 0 : _c.dayNumber);
3883
+ React18__namespace.useEffect(() => {
3884
+ setImgIndex(0);
3885
+ }, [stop == null ? void 0 : stop.dayNumber]);
3886
+ if (!stop) return null;
3887
+ return /* @__PURE__ */ jsxRuntime.jsx(Dialog, { open: !!stop, onOpenChange: (open) => !open && onClose(), children: /* @__PURE__ */ jsxRuntime.jsxs(
3888
+ DialogContent,
3889
+ {
3890
+ className: cn(
3891
+ /* Override shadcn defaults: remove padding, gap, grid, max-w-sm */
3892
+ "p-0 gap-0 sm:max-w-2xl max-w-[calc(100%-2rem)] overflow-hidden rounded-2xl",
3893
+ /* Outer flex column: [header+body] / [footer] */
3894
+ "flex flex-col"
3895
+ ),
3896
+ children: [
3897
+ /* @__PURE__ */ jsxRuntime.jsxs(DialogTitle, { className: "sr-only", children: [
3898
+ stop.title,
3899
+ " \u2014 Day ",
3900
+ stop.dayNumber
3901
+ ] }),
3902
+ /* @__PURE__ */ jsxRuntime.jsxs(DialogDescription, { className: "sr-only", children: [
3903
+ "Itinerary details for Day ",
3904
+ stop.dayNumber
3905
+ ] }),
3906
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col sm:flex-row flex-1 min-h-0", children: [
3907
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col flex-1 p-6 sm:p-8 overflow-y-auto max-h-[50vh] sm:max-h-[70vh]", children: [
3908
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading leading-tight", children: stop.title }),
3909
+ stop.location && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-1.5 flex items-center gap-1.5 text-sm text-muted-foreground font-ui", children: [
3910
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 shrink-0 text-primary" }),
3911
+ stop.location
3912
+ ] }),
3913
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-4 text-sm font-bold text-foreground font-heading", children: [
3914
+ "Day ",
3915
+ stop.dayNumber
3916
+ ] }),
3917
+ stop.description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 text-sm text-foreground/80 leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline [&_a]:underline-offset-2", children: stop.description }),
3918
+ stop.route && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center gap-2 text-sm text-muted-foreground font-ui", children: [
3919
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarIcon, { className: "h-4 w-4 shrink-0 text-primary" }),
3920
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
3921
+ stop.route.distance,
3922
+ " \xB7 ",
3923
+ stop.route.duration
3924
+ ] })
3925
+ ] })
3926
+ ] }),
3927
+ images.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative sm:w-72 sm:shrink-0 h-52 sm:h-auto bg-muted overflow-hidden", children: [
3928
+ /* @__PURE__ */ jsxRuntime.jsx(
3929
+ "img",
3930
+ {
3931
+ src: images[imgIndex],
3932
+ alt: `${stop.title} ${imgIndex + 1}`,
3933
+ className: "h-full w-full object-cover"
3934
+ },
3935
+ imgIndex
3936
+ ),
3937
+ images.length > 1 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3938
+ /* @__PURE__ */ jsxRuntime.jsx(
3939
+ "button",
3940
+ {
3941
+ type: "button",
3942
+ onClick: () => setImgIndex((i) => (i - 1 + images.length) % images.length),
3943
+ className: "absolute left-2 top-1/2 -translate-y-1/2 flex h-8 w-8 items-center justify-center rounded-full bg-background/80 shadow hover:bg-background transition-colors",
3944
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-4 w-4" })
3945
+ }
3946
+ ),
3947
+ /* @__PURE__ */ jsxRuntime.jsx(
3948
+ "button",
3949
+ {
3950
+ type: "button",
3951
+ onClick: () => setImgIndex((i) => (i + 1) % images.length),
3952
+ className: "absolute right-2 top-1/2 -translate-y-1/2 flex h-8 w-8 items-center justify-center rounded-full bg-background/80 shadow hover:bg-background transition-colors",
3953
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-4 w-4" })
3954
+ }
3955
+ ),
3956
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-3 inset-x-0 flex justify-center gap-1.5", children: images.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
3957
+ "button",
3958
+ {
3959
+ type: "button",
3960
+ onClick: () => setImgIndex(i),
3961
+ className: cn(
3962
+ "h-1.5 rounded-full transition-all",
3963
+ i === imgIndex ? "w-4 bg-white" : "w-1.5 bg-white/50"
3964
+ )
3965
+ },
3966
+ i
3967
+ )) })
3968
+ ] })
3969
+ ] })
3970
+ ] }),
3971
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between border-t border-border px-6 py-3 bg-background shrink-0", children: [
3972
+ /* @__PURE__ */ jsxRuntime.jsxs(
3973
+ "button",
3974
+ {
3975
+ type: "button",
3976
+ onClick: onPrev,
3977
+ disabled: isFirst,
3978
+ className: cn(
3979
+ "flex items-center gap-1.5 text-sm font-ui transition-colors",
3980
+ isFirst ? "text-muted-foreground/40 pointer-events-none" : "text-foreground hover:text-primary"
3981
+ ),
3982
+ children: [
3983
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full border border-current", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-3.5 w-3.5" }) }),
3984
+ "Last day"
3985
+ ]
3986
+ }
3987
+ ),
3988
+ /* @__PURE__ */ jsxRuntime.jsxs(
3989
+ "button",
3990
+ {
3991
+ type: "button",
3992
+ onClick: onNext,
3993
+ disabled: isLast,
3994
+ className: cn(
3995
+ "flex items-center gap-1.5 text-sm font-ui transition-colors",
3996
+ isLast ? "text-muted-foreground/40 pointer-events-none" : "text-foreground hover:text-primary"
3997
+ ),
3998
+ children: [
3999
+ "Next day",
4000
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full border border-current", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3.5 w-3.5" }) })
4001
+ ]
4002
+ }
4003
+ )
4004
+ ] })
4005
+ ]
4006
+ }
4007
+ ) });
4008
+ }
4009
+ function Itinerary({ title, subtitle, stops, className }) {
4010
+ const [activeIndex, setActiveIndex] = React18__namespace.useState(null);
4011
+ const scrollRef = React18__namespace.useRef(null);
4012
+ const activeStop = activeIndex !== null ? stops[activeIndex] : null;
4013
+ const scrollBy = (dir) => {
4014
+ if (!scrollRef.current) return;
4015
+ const amount = 280;
4016
+ scrollRef.current.scrollBy({
4017
+ left: dir === "right" ? amount : -amount,
4018
+ behavior: "smooth"
4019
+ });
4020
+ };
4021
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", className), children: [
4022
+ (title || subtitle) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6 text-center px-4", children: [
4023
+ title && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground font-heading", children: title }),
4024
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-muted-foreground max-w-md mx-auto leading-relaxed", children: subtitle })
4025
+ ] }),
4026
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative group/strip", children: [
4027
+ /* @__PURE__ */ jsxRuntime.jsx(
4028
+ "button",
4029
+ {
4030
+ type: "button",
4031
+ onClick: () => scrollBy("left"),
4032
+ "aria-label": "Scroll left",
4033
+ className: cn(
4034
+ "absolute left-0 top-1/2 -translate-y-1/2 z-20",
4035
+ "-translate-x-1/2 sm:-translate-x-5",
4036
+ "flex h-9 w-9 items-center justify-center rounded-full",
4037
+ "bg-background border border-border shadow-md",
4038
+ "transition-opacity hover:bg-muted",
4039
+ "opacity-0 group-hover/strip:opacity-100"
4040
+ ),
4041
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-4 w-4 text-foreground" })
4042
+ }
4043
+ ),
4044
+ /* @__PURE__ */ jsxRuntime.jsx(
4045
+ "button",
4046
+ {
4047
+ type: "button",
4048
+ onClick: () => scrollBy("right"),
4049
+ "aria-label": "Scroll right",
4050
+ className: cn(
4051
+ "absolute right-0 top-1/2 -translate-y-1/2 z-20",
4052
+ "translate-x-1/2 sm:translate-x-5",
4053
+ "flex h-9 w-9 items-center justify-center rounded-full",
4054
+ "bg-background border border-border shadow-md",
4055
+ "transition-opacity hover:bg-muted",
4056
+ "opacity-0 group-hover/strip:opacity-100"
4057
+ ),
4058
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-4 w-4 text-foreground" })
4059
+ }
4060
+ ),
4061
+ /* @__PURE__ */ jsxRuntime.jsx(
4062
+ "div",
4063
+ {
4064
+ ref: scrollRef,
4065
+ className: cn(
4066
+ "flex gap-3 sm:gap-4 overflow-x-auto pb-4",
4067
+ "snap-x snap-mandatory scroll-smooth",
4068
+ "[&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
4069
+ "px-4 sm:px-2"
4070
+ ),
4071
+ children: stops.map((stop, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "snap-start shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(ItineraryDayCard, { stop, onOpen: () => setActiveIndex(i) }) }, stop.dayNumber))
4072
+ }
4073
+ )
4074
+ ] }),
4075
+ /* @__PURE__ */ jsxRuntime.jsx(
4076
+ ItineraryModal,
4077
+ {
4078
+ stop: activeStop,
4079
+ allStops: stops,
4080
+ onClose: () => setActiveIndex(null),
4081
+ onPrev: () => setActiveIndex((i) => i !== null ? Math.max(0, i - 1) : 0),
4082
+ onNext: () => setActiveIndex(
4083
+ (i) => i !== null ? Math.min(stops.length - 1, i + 1) : 0
4084
+ )
4085
+ }
4086
+ )
4087
+ ] });
4088
+ }
4089
+ function MenuTrip({
4090
+ sections,
4091
+ activeSection,
4092
+ onSelect,
4093
+ variant = "pill",
4094
+ bold = true,
4095
+ className
4096
+ }) {
4097
+ const scrollRef = React18__namespace.useRef(null);
4098
+ React18__namespace.useEffect(() => {
4099
+ if (!scrollRef.current || !activeSection) return;
4100
+ const container = scrollRef.current;
4101
+ const btn = container.querySelector(
4102
+ `[data-section="${activeSection}"]`
4103
+ );
4104
+ if (!btn) return;
4105
+ const btnLeft = btn.offsetLeft;
4106
+ const btnRight = btnLeft + btn.offsetWidth;
4107
+ const cLeft = container.scrollLeft;
4108
+ const cRight = cLeft + container.offsetWidth;
4109
+ if (btnLeft < cLeft) {
4110
+ container.scrollTo({ left: btnLeft - 16, behavior: "smooth" });
4111
+ } else if (btnRight > cRight) {
4112
+ container.scrollTo({ left: btnRight - container.offsetWidth + 16, behavior: "smooth" });
4113
+ }
4114
+ }, [activeSection]);
4115
+ if (variant === "underline") {
4116
+ return /* @__PURE__ */ jsxRuntime.jsx(
4117
+ "div",
4118
+ {
4119
+ ref: scrollRef,
4120
+ className: cn(
4121
+ "overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
4122
+ "border-b border-border",
4123
+ className
4124
+ ),
4125
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-end gap-0", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
4126
+ "button",
4127
+ {
4128
+ "data-section": s.id,
4129
+ type: "button",
4130
+ onClick: () => onSelect == null ? void 0 : onSelect(s.id),
4131
+ className: cn(
4132
+ "relative px-4 py-2.5 text-sm font-ui whitespace-nowrap transition-colors duration-150",
4133
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
4134
+ "after:absolute after:inset-x-0 after:bottom-0 after:h-0.5 after:rounded-full after:transition-all",
4135
+ bold ? "font-semibold" : "font-normal",
4136
+ activeSection === s.id ? "text-foreground after:bg-primary" : "text-muted-foreground hover:text-foreground after:bg-transparent"
4137
+ ),
4138
+ children: s.label
4139
+ },
4140
+ s.id
4141
+ )) })
4142
+ }
4143
+ );
4144
+ }
4145
+ if (variant === "outlined") {
4146
+ return /* @__PURE__ */ jsxRuntime.jsx(
4147
+ "div",
4148
+ {
4149
+ ref: scrollRef,
4150
+ className: cn(
4151
+ "overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
4152
+ className
4153
+ ),
4154
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-2", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
4155
+ "button",
4156
+ {
4157
+ "data-section": s.id,
4158
+ type: "button",
4159
+ onClick: () => onSelect == null ? void 0 : onSelect(s.id),
4160
+ className: cn(
4161
+ "rounded-full border px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
4162
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4163
+ bold ? "font-semibold" : "font-normal",
4164
+ activeSection === s.id ? "border-foreground bg-foreground text-background" : "border-border bg-background text-muted-foreground hover:border-foreground/50 hover:text-foreground"
4165
+ ),
4166
+ children: s.label
4167
+ },
4168
+ s.id
4169
+ )) })
4170
+ }
4171
+ );
4172
+ }
4173
+ if (variant === "floating") {
4174
+ return /* @__PURE__ */ jsxRuntime.jsx(
4175
+ "div",
4176
+ {
4177
+ ref: scrollRef,
4178
+ className: cn(
4179
+ "overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
4180
+ "py-1 px-0.5",
4181
+ /* padding so shadow isn't clipped by overflow */
4182
+ className
4183
+ ),
4184
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-0.5 rounded-full border border-border/40 bg-background/90 backdrop-blur-md shadow-sm px-1.5 py-1.5", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
4185
+ "button",
4186
+ {
4187
+ "data-section": s.id,
4188
+ type: "button",
4189
+ onClick: () => onSelect == null ? void 0 : onSelect(s.id),
4190
+ className: cn(
4191
+ "rounded-full px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
4192
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4193
+ bold ? "font-semibold" : "font-normal",
4194
+ activeSection === s.id ? "bg-foreground text-background shadow-sm" : "text-foreground/60 hover:text-foreground hover:bg-muted/60"
4195
+ ),
4196
+ children: s.label
4197
+ },
4198
+ s.id
4199
+ )) })
4200
+ }
4201
+ );
4202
+ }
4203
+ return /* @__PURE__ */ jsxRuntime.jsx(
4204
+ "div",
4205
+ {
4206
+ ref: scrollRef,
4207
+ className: cn(
4208
+ "overflow-x-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
4209
+ className
4210
+ ),
4211
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex min-w-max items-center gap-1 p-1", children: sections.map((s) => /* @__PURE__ */ jsxRuntime.jsx(
4212
+ "button",
4213
+ {
4214
+ "data-section": s.id,
4215
+ type: "button",
4216
+ onClick: () => onSelect == null ? void 0 : onSelect(s.id),
4217
+ className: cn(
4218
+ "rounded-full px-4 py-1.5 text-sm font-ui whitespace-nowrap transition-all duration-150",
4219
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4220
+ bold ? "font-semibold" : "font-normal",
4221
+ activeSection === s.id ? "bg-foreground text-background shadow-sm" : "bg-white text-foreground/70 hover:text-foreground shadow-sm"
4222
+ ),
4223
+ children: s.label
4224
+ },
4225
+ s.id
4226
+ )) })
4227
+ }
4228
+ );
4229
+ }
4230
+ function normalise(p) {
4231
+ return typeof p === "string" ? { src: p } : p;
4232
+ }
4233
+ function gridCols(total) {
4234
+ if (total === 1) return "grid-cols-1";
4235
+ if (total === 2) return "grid-cols-2";
4236
+ return "grid-cols-3";
4237
+ }
4238
+ function Lightbox({
4239
+ photos,
4240
+ initialIndex,
4241
+ onClose
4242
+ }) {
4243
+ var _a;
4244
+ const [index, setIndex] = React18__namespace.useState(initialIndex);
4245
+ const total = photos.length;
4246
+ const photo = photos[index];
4247
+ const prev = React18__namespace.useCallback(
4248
+ () => setIndex((i) => (i - 1 + total) % total),
4249
+ [total]
4250
+ );
4251
+ const next = React18__namespace.useCallback(
4252
+ () => setIndex((i) => (i + 1) % total),
4253
+ [total]
4254
+ );
4255
+ React18__namespace.useEffect(() => {
4256
+ const onKey = (e) => {
4257
+ if (e.key === "Escape") onClose();
4258
+ if (e.key === "ArrowLeft") prev();
4259
+ if (e.key === "ArrowRight") next();
4260
+ };
4261
+ document.addEventListener("keydown", onKey);
4262
+ return () => document.removeEventListener("keydown", onKey);
4263
+ }, [onClose, prev, next]);
4264
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4265
+ "div",
4266
+ {
4267
+ className: "fixed inset-0 z-50 bg-black/92 flex flex-col items-center justify-center",
4268
+ onClick: onClose,
4269
+ children: [
4270
+ /* @__PURE__ */ jsxRuntime.jsx(
4271
+ "button",
4272
+ {
4273
+ type: "button",
4274
+ onClick: onClose,
4275
+ 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",
4276
+ "aria-label": "Close lightbox",
4277
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5" })
4278
+ }
4279
+ ),
4280
+ total > 1 && /* @__PURE__ */ jsxRuntime.jsx(
4281
+ "button",
4282
+ {
4283
+ type: "button",
4284
+ onClick: (e) => {
4285
+ e.stopPropagation();
4286
+ prev();
4287
+ },
4288
+ 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",
4289
+ "aria-label": "Previous photo",
4290
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
4291
+ }
4292
+ ),
4293
+ total > 1 && /* @__PURE__ */ jsxRuntime.jsx(
4294
+ "button",
4295
+ {
4296
+ type: "button",
4297
+ onClick: (e) => {
4298
+ e.stopPropagation();
4299
+ next();
4300
+ },
4301
+ 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",
4302
+ "aria-label": "Next photo",
4303
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
4304
+ }
4305
+ ),
4306
+ /* @__PURE__ */ jsxRuntime.jsx(
4307
+ "img",
4308
+ {
4309
+ src: photo.src,
4310
+ alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
4311
+ className: "max-w-[calc(100%-6rem)] max-h-[calc(100vh-11rem)] object-contain rounded-lg shadow-2xl",
4312
+ onClick: (e) => e.stopPropagation()
4313
+ }
4314
+ ),
4315
+ (photo.caption || photo.credit) && /* @__PURE__ */ jsxRuntime.jsxs(
4316
+ "div",
4317
+ {
4318
+ className: "mt-4 flex flex-col items-center gap-0.5 px-16 text-center",
4319
+ onClick: (e) => e.stopPropagation(),
4320
+ children: [
4321
+ photo.caption && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-white/90 font-ui leading-snug max-w-xl", children: photo.caption }),
4322
+ photo.credit && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-white/45 font-ui", children: [
4323
+ "\xA9 ",
4324
+ photo.credit
4325
+ ] })
4326
+ ]
4327
+ }
4328
+ ),
4329
+ total > 1 && /* @__PURE__ */ jsxRuntime.jsxs(
4330
+ "div",
4331
+ {
4332
+ className: "absolute bottom-5 inset-x-0 flex items-center justify-center gap-3 px-5",
4333
+ onClick: (e) => e.stopPropagation(),
4334
+ children: [
4335
+ /* @__PURE__ */ jsxRuntime.jsx(
4336
+ "button",
4337
+ {
4338
+ type: "button",
4339
+ onClick: (e) => {
4340
+ e.stopPropagation();
4341
+ prev();
4342
+ },
4343
+ className: "flex h-9 w-9 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",
4344
+ "aria-label": "Previous photo",
4345
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-4 w-4" })
4346
+ }
4347
+ ),
4348
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5", children: photos.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
4349
+ "button",
4350
+ {
4351
+ type: "button",
4352
+ onClick: (e) => {
4353
+ e.stopPropagation();
4354
+ setIndex(i);
4355
+ },
4356
+ "aria-label": `Go to photo ${i + 1}`,
4357
+ className: cn(
4358
+ "h-1.5 rounded-full transition-all duration-300 focus-visible:outline-none",
4359
+ i === index ? "w-6 bg-primary" : "w-1.5 bg-white/40 hover:bg-white/70"
4360
+ )
4361
+ },
4362
+ i
4363
+ )) }),
4364
+ /* @__PURE__ */ jsxRuntime.jsx(
4365
+ "button",
4366
+ {
4367
+ type: "button",
4368
+ onClick: (e) => {
4369
+ e.stopPropagation();
4370
+ next();
4371
+ },
4372
+ className: "flex h-9 w-9 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",
4373
+ "aria-label": "Next photo",
4374
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-4 w-4" })
4375
+ }
4376
+ )
4377
+ ]
4378
+ }
4379
+ )
4380
+ ]
4381
+ }
4382
+ );
4383
+ }
4384
+ function PhotoTile({
4385
+ photo,
4386
+ index,
4387
+ className,
4388
+ onClick
4389
+ }) {
4390
+ var _a, _b;
4391
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4392
+ "button",
4393
+ {
4394
+ type: "button",
4395
+ onClick,
4396
+ className: cn(
4397
+ "relative overflow-hidden group block w-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4398
+ className
4399
+ ),
4400
+ "aria-label": (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
4401
+ children: [
4402
+ /* @__PURE__ */ jsxRuntime.jsx(
4403
+ "img",
4404
+ {
4405
+ src: photo.src,
4406
+ alt: (_b = photo.alt) != null ? _b : `Photo ${index + 1}`,
4407
+ className: "w-full h-full object-cover transition-transform duration-700 group-hover:scale-105",
4408
+ loading: "lazy"
4409
+ }
4410
+ ),
4411
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ZoomInIcon, { className: "h-8 w-8 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300 drop-shadow-lg" }) })
4412
+ ]
4413
+ }
4414
+ );
4415
+ }
4416
+ function ShowMoreButton({
4417
+ count,
4418
+ expanded,
4419
+ onClick
4420
+ }) {
4421
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
4422
+ "button",
4423
+ {
4424
+ type: "button",
4425
+ onClick,
4426
+ className: cn(
4427
+ "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
4428
+ "text-sm font-semibold text-foreground shadow-sm",
4429
+ "hover:bg-muted transition-colors duration-150",
4430
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
4431
+ ),
4432
+ children: expanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4433
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
4434
+ "Show less"
4435
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4436
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LayoutGridIcon, { className: "h-4 w-4 text-muted-foreground" }),
4437
+ "See more (",
4438
+ count,
4439
+ ")"
4440
+ ] })
4441
+ }
4442
+ ) });
4443
+ }
4444
+ function GridGallery({
4445
+ photos,
4446
+ initialVisible,
4447
+ onOpen
4448
+ }) {
4449
+ const [expanded, setExpanded] = React18__namespace.useState(false);
4450
+ const cols = gridCols(photos.length);
4451
+ const hasMore = photos.length > initialVisible;
4452
+ const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
4453
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4454
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid", cols), children: visible.map((p, i) => /* @__PURE__ */ jsxRuntime.jsx(
4455
+ PhotoTile,
4456
+ {
4457
+ photo: p,
4458
+ index: i,
4459
+ className: "aspect-[4/3]",
4460
+ onClick: () => onOpen(i)
4461
+ },
4462
+ i
4463
+ )) }),
4464
+ hasMore && /* @__PURE__ */ jsxRuntime.jsx(
4465
+ ShowMoreButton,
4466
+ {
4467
+ count: photos.length - initialVisible,
4468
+ expanded,
4469
+ onClick: () => setExpanded((v) => !v)
4470
+ }
4471
+ )
4472
+ ] });
4473
+ }
4474
+ function MasonryGallery({
4475
+ photos,
4476
+ initialVisible,
4477
+ onOpen
4478
+ }) {
4479
+ const [expanded, setExpanded] = React18__namespace.useState(false);
4480
+ const hasMore = photos.length > initialVisible;
4481
+ const visible = expanded || !hasMore ? photos : photos.slice(0, initialVisible);
4482
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4483
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "columns-2 sm:columns-3 gap-1 [&>*]:break-inside-avoid [&>*]:mb-1", children: visible.map((p, i) => {
4484
+ var _a, _b;
4485
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4486
+ "button",
4487
+ {
4488
+ type: "button",
4489
+ onClick: () => onOpen(i),
4490
+ className: "relative overflow-hidden group block w-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4491
+ "aria-label": (_a = p.alt) != null ? _a : `Photo ${i + 1}`,
4492
+ children: [
4493
+ /* @__PURE__ */ jsxRuntime.jsx(
4494
+ "img",
4495
+ {
4496
+ src: p.src,
4497
+ alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
4498
+ className: "w-full h-auto object-cover transition-transform duration-700 group-hover:scale-105",
4499
+ loading: "lazy"
4500
+ }
4501
+ ),
4502
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ZoomInIcon, { className: "h-7 w-7 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300 drop-shadow-lg" }) })
4503
+ ]
4504
+ },
4505
+ i
4506
+ );
4507
+ }) }),
4508
+ hasMore && /* @__PURE__ */ jsxRuntime.jsx(
4509
+ ShowMoreButton,
4510
+ {
4511
+ count: photos.length - initialVisible,
4512
+ expanded,
4513
+ onClick: () => setExpanded((v) => !v)
4514
+ }
4515
+ )
4516
+ ] });
4517
+ }
4518
+ function FilmstripGallery({
4519
+ photos,
4520
+ onOpen
4521
+ }) {
4522
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto flex gap-1 snap-x snap-mandatory pb-1 scrollbar-none", children: photos.map((p, i) => {
4523
+ var _a, _b;
4524
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4525
+ "button",
4526
+ {
4527
+ type: "button",
4528
+ onClick: () => onOpen(i),
4529
+ className: "relative shrink-0 overflow-hidden group h-56 w-auto aspect-[4/3] snap-start focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4530
+ "aria-label": (_a = p.alt) != null ? _a : `Photo ${i + 1}`,
4531
+ children: [
4532
+ /* @__PURE__ */ jsxRuntime.jsx(
4533
+ "img",
4534
+ {
4535
+ src: p.src,
4536
+ alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
4537
+ className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
4538
+ loading: "lazy"
4539
+ }
4540
+ ),
4541
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ZoomInIcon, { className: "h-7 w-7 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300 drop-shadow-lg" }) })
4542
+ ]
4543
+ },
4544
+ i
4545
+ );
4546
+ }) });
4547
+ }
4548
+ function FeaturedGallery({
4549
+ photos,
4550
+ onOpen
4551
+ }) {
4552
+ const [expanded, setExpanded] = React18__namespace.useState(false);
4553
+ const featured = photos.slice(0, 3);
4554
+ const extra = photos.slice(3);
4555
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4556
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-3 gap-1.5 h-72 sm:h-80 lg:h-96 rounded-xl overflow-hidden", children: [
4557
+ featured[0] && /* @__PURE__ */ jsxRuntime.jsx(
4558
+ PhotoTile,
4559
+ {
4560
+ photo: featured[0],
4561
+ index: 0,
4562
+ className: "col-span-2 h-full",
4563
+ onClick: () => onOpen(0)
4564
+ }
4565
+ ),
4566
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5 h-full", children: [
4567
+ featured[1] && /* @__PURE__ */ jsxRuntime.jsx(
4568
+ PhotoTile,
4569
+ {
4570
+ photo: featured[1],
4571
+ index: 1,
4572
+ className: "flex-1 min-h-0",
4573
+ onClick: () => onOpen(1)
4574
+ }
4575
+ ),
4576
+ featured[2] && /* @__PURE__ */ jsxRuntime.jsx(
4577
+ PhotoTile,
4578
+ {
4579
+ photo: featured[2],
4580
+ index: 2,
4581
+ className: "flex-1 min-h-0",
4582
+ onClick: () => onOpen(2)
4583
+ }
4584
+ )
4585
+ ] })
4586
+ ] }),
4587
+ expanded && extra.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1.5 overflow-x-auto flex gap-1.5 snap-x snap-mandatory scrollbar-none rounded-xl overflow-hidden pb-0", children: extra.map((p, i) => {
4588
+ var _a, _b;
4589
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4590
+ "button",
4591
+ {
4592
+ type: "button",
4593
+ onClick: () => onOpen(i + 3),
4594
+ className: "relative shrink-0 overflow-hidden group h-40 sm:h-48 aspect-[4/3] snap-start rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4595
+ "aria-label": (_a = p.alt) != null ? _a : `Photo ${i + 4}`,
4596
+ children: [
4597
+ /* @__PURE__ */ jsxRuntime.jsx(
4598
+ "img",
4599
+ {
4600
+ src: p.src,
4601
+ alt: (_b = p.alt) != null ? _b : `Photo ${i + 4}`,
4602
+ className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
4603
+ loading: "lazy"
4604
+ }
4605
+ ),
4606
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ZoomInIcon, { className: "h-7 w-7 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300 drop-shadow-lg" }) })
4607
+ ]
4608
+ },
4609
+ i + 3
4610
+ );
4611
+ }) }),
4612
+ extra.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
4613
+ ShowMoreButton,
4614
+ {
4615
+ count: extra.length,
4616
+ expanded,
4617
+ onClick: () => setExpanded((v) => !v)
4618
+ }
4619
+ )
4620
+ ] });
4621
+ }
4622
+ function PhotoGallery({
4623
+ photos,
4624
+ variant = "grid",
4625
+ initialVisible = 6,
4626
+ onPhotoClick,
4627
+ className
4628
+ }) {
4629
+ const [lightboxIndex, setLightboxIndex] = React18__namespace.useState(null);
4630
+ const normalised = React18__namespace.useMemo(() => photos.map(normalise), [photos]);
4631
+ const handleOpen = (index) => {
4632
+ setLightboxIndex(index);
4633
+ onPhotoClick == null ? void 0 : onPhotoClick(normalised[index].src, index);
4634
+ };
4635
+ if (normalised.length === 0) return null;
4636
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", className), children: [
4637
+ variant === "grid" && /* @__PURE__ */ jsxRuntime.jsx(
4638
+ GridGallery,
4639
+ {
4640
+ photos: normalised,
4641
+ initialVisible,
4642
+ onOpen: handleOpen
4643
+ }
4644
+ ),
4645
+ variant === "masonry" && /* @__PURE__ */ jsxRuntime.jsx(
4646
+ MasonryGallery,
4647
+ {
4648
+ photos: normalised,
4649
+ initialVisible,
4650
+ onOpen: handleOpen
4651
+ }
4652
+ ),
4653
+ variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
4654
+ variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
4655
+ lightboxIndex !== null && /* @__PURE__ */ jsxRuntime.jsx(
4656
+ Lightbox,
4657
+ {
4658
+ photos: normalised,
4659
+ initialIndex: lightboxIndex,
4660
+ onClose: () => setLightboxIndex(null)
4661
+ }
4662
+ )
4663
+ ] });
4664
+ }
4665
+ var badgeVariants = classVarianceAuthority.cva(
4666
+ "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
4667
+ {
4668
+ variants: {
4669
+ variant: {
4670
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
4671
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
4672
+ destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
4673
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
4674
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
4675
+ link: "text-primary underline-offset-4 hover:underline"
4676
+ }
4677
+ },
4678
+ defaultVariants: {
4679
+ variant: "default"
4680
+ }
4681
+ }
4682
+ );
4683
+ function Badge(_a) {
4684
+ var _b = _a, {
4685
+ className,
4686
+ variant = "default",
4687
+ render
4688
+ } = _b, props = __objRest(_b, [
4689
+ "className",
4690
+ "variant",
4691
+ "render"
4692
+ ]);
4693
+ return useRender.useRender({
4694
+ defaultTagName: "span",
4695
+ props: mergeProps.mergeProps(
4696
+ {
4697
+ className: cn(badgeVariants({ variant }), className)
4698
+ },
4699
+ props
4700
+ ),
4701
+ render,
4702
+ state: {
4703
+ slot: "badge",
4704
+ variant
4705
+ }
4706
+ });
4707
+ }
4708
+ function PricingTrip({
4709
+ priceFrom,
4710
+ currency = "CHF",
4711
+ season,
4712
+ departureTimes,
4713
+ pricingOptions,
4714
+ onBook,
4715
+ bookLabel = "Check availability",
4716
+ variant = "card",
4717
+ className
4718
+ }) {
4719
+ const [showPricing, setShowPricing] = React18__namespace.useState(false);
4720
+ if (variant === "compact") {
4721
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-3", className), children: [
4722
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
4723
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
4724
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg font-bold text-foreground font-heading leading-none", children: [
4725
+ currency,
4726
+ " ",
4727
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: priceFrom })
4728
+ ] })
4729
+ ] }),
4730
+ /* @__PURE__ */ jsxRuntime.jsx(
4731
+ "button",
4732
+ {
4733
+ type: "button",
4734
+ onClick: onBook,
4735
+ className: cn(
4736
+ "flex-1 rounded-full bg-primary px-4 py-2 text-sm font-semibold",
4737
+ "text-primary-foreground font-ui transition-colors hover:bg-primary/90",
4738
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
4739
+ ),
4740
+ children: bookLabel
4741
+ }
4742
+ )
4743
+ ] });
4744
+ }
4745
+ if (variant === "bar") {
4746
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4747
+ "div",
4748
+ {
4749
+ className: cn(
4750
+ "flex items-center gap-4 rounded-2xl border border-border bg-card px-5 py-3 shadow-sm",
4751
+ className
4752
+ ),
4753
+ children: [
4754
+ season && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "hidden sm:flex items-center gap-1.5 text-sm text-muted-foreground font-ui shrink-0", children: [
4755
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-3.5 w-3.5 text-primary shrink-0" }),
4756
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate max-w-[180px]", children: season })
4757
+ ] }),
4758
+ departureTimes && departureTimes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "hidden md:flex items-center gap-1.5 shrink-0", children: [
4759
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-3.5 w-3.5 text-primary shrink-0" }),
4760
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-1", children: departureTimes.map((t) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "outline", className: "font-ui text-xs px-1.5 py-0.5", children: t }, t)) })
4761
+ ] }),
4762
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
4763
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "shrink-0 text-right", children: [
4764
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
4765
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xl font-bold text-foreground font-heading leading-none", children: [
4766
+ currency,
4767
+ " ",
4768
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: priceFrom })
4769
+ ] })
4770
+ ] }),
4771
+ /* @__PURE__ */ jsxRuntime.jsxs(
4772
+ "button",
4773
+ {
4774
+ type: "button",
4775
+ onClick: onBook,
4776
+ className: cn(
4777
+ "shrink-0 flex items-center gap-2 rounded-full bg-primary px-5 py-2.5",
4778
+ "text-sm font-semibold text-primary-foreground font-ui",
4779
+ "transition-colors hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
4780
+ ),
4781
+ children: [
4782
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-4 w-4 shrink-0" }),
4783
+ bookLabel
4784
+ ]
4785
+ }
4786
+ )
4787
+ ]
4788
+ }
4789
+ );
4790
+ }
4791
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
4792
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
4793
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: "From" }),
4794
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-3xl font-bold text-foreground font-heading", children: [
4795
+ currency,
4796
+ " ",
4797
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: priceFrom }),
4798
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-base font-normal text-muted-foreground font-ui", children: " / guest" })
4799
+ ] })
4800
+ ] }),
4801
+ season && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-sm text-muted-foreground font-ui", children: [
4802
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-4 w-4 shrink-0 text-primary mt-0.5" }),
4803
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: season })
4804
+ ] }),
4805
+ departureTimes && departureTimes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", children: [
4806
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold text-foreground font-ui uppercase tracking-wide", children: "Departure times" }),
4807
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: departureTimes.map((t) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "outline", className: "font-ui text-xs", children: t }, t)) })
4808
+ ] }),
4809
+ pricingOptions && pricingOptions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
4810
+ /* @__PURE__ */ jsxRuntime.jsx(
4811
+ "button",
4812
+ {
4813
+ type: "button",
4814
+ onClick: () => setShowPricing((v) => !v),
4815
+ className: "flex items-center gap-1 text-xs text-primary font-ui text-left hover:underline underline-offset-2",
4816
+ children: showPricing ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4817
+ "Show pricing options ",
4818
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-3 w-3" })
4819
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4820
+ "Show pricing options ",
4821
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-3 w-3" })
4822
+ ] })
4823
+ }
4824
+ ),
4825
+ showPricing && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-border overflow-hidden", children: pricingOptions.map((opt, i) => /* @__PURE__ */ jsxRuntime.jsxs(
4826
+ "div",
4827
+ {
4828
+ className: cn(
4829
+ "flex items-center justify-between px-3 py-2.5 text-sm",
4830
+ i < pricingOptions.length - 1 && "border-b border-border"
4831
+ ),
4832
+ children: [
4833
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground font-ui", children: opt.label }),
4834
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-right", children: [
4835
+ opt.originalPrice && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-muted-foreground line-through font-ui", children: [
4836
+ currency,
4837
+ " ",
4838
+ opt.originalPrice
4839
+ ] }),
4840
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-bold text-foreground font-ui", children: [
4841
+ currency,
4842
+ " ",
4843
+ opt.price,
4844
+ opt.unit && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-normal text-muted-foreground", children: [
4845
+ " ",
4846
+ "/ ",
4847
+ opt.unit
4848
+ ] })
4849
+ ] })
4850
+ ] })
4851
+ ]
4852
+ },
4853
+ i
4854
+ )) })
4855
+ ] }),
4856
+ /* @__PURE__ */ jsxRuntime.jsx(
4857
+ "button",
4858
+ {
4859
+ type: "button",
4860
+ onClick: onBook,
4861
+ className: cn(
4862
+ "w-full rounded-full bg-primary py-3 text-center text-sm font-semibold",
4863
+ "text-primary-foreground font-ui transition-colors hover:bg-primary/90",
4864
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
4865
+ ),
4866
+ children: bookLabel
4867
+ }
4868
+ )
4869
+ ] });
4870
+ }
4871
+ var VARIANT = {
4872
+ transparent: {
4873
+ header: "",
4874
+ navItem: "text-white hover:text-white/80",
4875
+ navItemOpen: "text-white bg-white/10",
4876
+ chevron: "text-white/50",
4877
+ lang: "text-white/70 hover:text-white",
4878
+ langOpen: "text-white bg-white/10",
4879
+ langChevron: "text-white/40",
4880
+ icon: "text-white/60 hover:text-white hover:bg-white/10",
4881
+ mobileTrigger: "text-white/70 hover:text-primary-400 hover:bg-white/8",
4882
+ mobileDrawer: "bg-primary-900 border-t border-white/10",
4883
+ mobileLink: "text-white hover:text-primary-400 border-b border-white/10",
4884
+ mobileSub: "text-white/70 font-bold hover:text-primary-400 border-b border-white/8",
4885
+ mobileLangActive: "text-primary-400 font-semibold",
4886
+ mobileLangIdle: "text-white/40 hover:text-primary-400",
4887
+ logoBlend: "mix-blend-screen"
4888
+ },
4889
+ white: {
4890
+ header: "bg-white border-b border-border shadow-sm",
4891
+ navItem: "text-foreground/70 hover:text-foreground",
4892
+ navItemOpen: "text-foreground bg-muted",
4893
+ chevron: "text-foreground/35",
4894
+ lang: "text-foreground/60 hover:text-foreground",
4895
+ langOpen: "text-foreground bg-muted",
4896
+ langChevron: "text-foreground/30",
4897
+ icon: "text-foreground/50 hover:text-foreground hover:bg-muted",
4898
+ mobileTrigger: "text-foreground/50 hover:text-foreground hover:bg-muted",
4899
+ mobileDrawer: "bg-white border-t border-border",
4900
+ mobileLink: "text-foreground/80 hover:text-foreground border-b border-border",
4901
+ mobileSub: "text-foreground/50 font-bold hover:text-foreground border-b border-border/40",
4902
+ mobileLangActive: "text-primary font-semibold",
4903
+ mobileLangIdle: "text-muted-foreground hover:text-foreground",
4904
+ logoBlend: "invert mix-blend-multiply"
4905
+ },
4906
+ dark: {
4907
+ header: "bg-neutral-950 border-b border-white/10",
4908
+ navItem: "text-white/70 hover:text-white",
4909
+ navItemOpen: "text-white bg-white/10",
4910
+ chevron: "text-white/40",
4911
+ lang: "text-white/60 hover:text-white",
4912
+ langOpen: "text-white bg-white/10",
4913
+ langChevron: "text-white/30",
4914
+ icon: "text-white/50 hover:text-white hover:bg-white/10",
4915
+ mobileTrigger: "text-white/50 hover:text-white hover:bg-white/10",
4916
+ mobileDrawer: "bg-neutral-950 border-t border-white/10",
4917
+ mobileLink: "text-white/80 hover:text-white border-b border-white/8",
4918
+ mobileSub: "text-white/45 font-bold hover:text-white border-b border-white/5",
4919
+ mobileLangActive: "text-white font-semibold",
4920
+ mobileLangIdle: "text-white/35 hover:text-white/60",
4921
+ logoBlend: "mix-blend-screen"
4922
+ }
4923
+ };
4924
+ var DEFAULT_HEADER_LINKS = [
4925
+ { label: "All trips", href: "#" },
4926
+ {
4927
+ label: "Destinations",
4928
+ items: [
4929
+ { label: "Europe", href: "#" },
4930
+ { label: "South America", href: "#" },
4931
+ { label: "Africa", href: "#" },
4932
+ { label: "Asia", href: "#" },
4933
+ { label: "North America", href: "#" },
4934
+ { label: "Oceania", href: "#" }
4935
+ ]
4936
+ },
4937
+ {
4938
+ label: "Travel themes",
4939
+ items: [
4940
+ { label: "Adventure", href: "#" },
4941
+ { label: "Cultural", href: "#" },
4942
+ { label: "Wildlife", href: "#" },
4943
+ { label: "Beach & Coast", href: "#" },
4944
+ { label: "Trekking", href: "#" }
4945
+ ]
4946
+ },
4947
+ {
4948
+ label: "About",
4949
+ items: [
4950
+ { label: "About us", href: "#" },
4951
+ { label: "Sustainability", href: "#" },
4952
+ { label: "Jobs", href: "#" },
4953
+ { label: "FAQ", href: "#" },
4954
+ { label: "Contact", href: "#" },
4955
+ { label: "Gift Card", href: "#" }
4956
+ ]
4957
+ },
4958
+ { label: "Blog", href: "#" }
4959
+ ];
4960
+ var DEFAULT_LANGUAGES = [
4961
+ { code: "EN", label: "English" },
4962
+ { code: "PT", label: "Portugu\xEAs" },
4963
+ { code: "NL", label: "Nederlands" },
4964
+ { code: "DE", label: "Deutsch" },
4965
+ { code: "FR", label: "Fran\xE7ais" },
4966
+ { code: "ES", label: "Espa\xF1ol" }
4967
+ ];
4968
+ function NavDropdown({
4969
+ items,
4970
+ onClose,
4971
+ onMouseEnter,
4972
+ onMouseLeave
4973
+ }) {
4974
+ return /* @__PURE__ */ jsxRuntime.jsx(
4975
+ "div",
4976
+ {
4977
+ className: "absolute top-[calc(100%+8px)] left-0 min-w-[200px] rounded-xl bg-white shadow-2xl border border-black/8 py-1.5 z-50",
4978
+ onMouseEnter,
4979
+ onMouseLeave,
4980
+ children: items.map((item) => {
4981
+ var _a;
4982
+ return /* @__PURE__ */ jsxRuntime.jsx(
4983
+ "a",
4984
+ {
4985
+ href: (_a = item.href) != null ? _a : "#",
4986
+ onClick: onClose,
4987
+ className: "block px-5 py-2.5 text-sm text-foreground/75 font-ui font-bold hover:text-foreground hover:bg-muted transition-colors whitespace-nowrap",
4988
+ children: item.label
4989
+ },
4990
+ item.label
4991
+ );
4992
+ })
4993
+ }
4994
+ );
4995
+ }
4996
+ function LangDropdown({
4997
+ languages,
4998
+ activeLang,
4999
+ onSelect,
5000
+ onMouseEnter,
5001
+ onMouseLeave
5002
+ }) {
5003
+ return /* @__PURE__ */ jsxRuntime.jsx(
5004
+ "div",
5005
+ {
5006
+ className: "absolute top-[calc(100%+8px)] right-0 min-w-[160px] rounded-xl bg-white shadow-2xl border border-black/8 py-1.5 z-50",
5007
+ onMouseEnter,
5008
+ onMouseLeave,
5009
+ children: languages.map((lang) => /* @__PURE__ */ jsxRuntime.jsxs(
5010
+ "button",
5011
+ {
5012
+ type: "button",
5013
+ onClick: () => onSelect(lang.code),
5014
+ className: cn(
5015
+ "flex items-center gap-3 w-full px-5 py-2.5 text-sm font-ui text-left transition-colors hover:bg-muted",
5016
+ lang.code === activeLang ? "text-primary font-semibold" : "text-foreground"
5017
+ ),
5018
+ children: [
5019
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold w-8 shrink-0", children: lang.code }),
5020
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: lang.label })
5021
+ ]
5022
+ },
5023
+ lang.code
5024
+ ))
5025
+ }
5026
+ );
5027
+ }
5028
+ function SiteHeader({
5029
+ variant = "transparent",
5030
+ links = DEFAULT_HEADER_LINKS,
5031
+ logoSrc = "/logo-planetaexo.png",
5032
+ logoAlt = "Planeta Exo",
5033
+ languages = DEFAULT_LANGUAGES,
5034
+ currentLanguage = "EN",
5035
+ onLanguageChange,
5036
+ onSearch,
5037
+ onAccount,
5038
+ position = variant === "transparent" ? "overlay" : "fixed",
5039
+ className
5040
+ }) {
5041
+ const t = VARIANT[variant];
5042
+ const [openMenu, setOpenMenu] = React18__namespace.useState(null);
5043
+ const [langOpen, setLangOpen] = React18__namespace.useState(false);
5044
+ const [mobileOpen, setMobileOpen] = React18__namespace.useState(false);
5045
+ const [openMobileSection, setOpenMobileSection] = React18__namespace.useState(null);
5046
+ const [activeLang, setActiveLang] = React18__namespace.useState(currentLanguage);
5047
+ const toggleMobileSection = (label) => setOpenMobileSection((prev) => prev === label ? null : label);
5048
+ const menuCloseTimer = React18__namespace.useRef(void 0);
5049
+ const langCloseTimer = React18__namespace.useRef(void 0);
5050
+ const handleMenuEnter = (label) => {
5051
+ clearTimeout(menuCloseTimer.current);
5052
+ setOpenMenu(label);
5053
+ };
5054
+ const handleMenuLeave = () => {
5055
+ menuCloseTimer.current = setTimeout(() => setOpenMenu(null), 120);
5056
+ };
5057
+ const handleLangEnter = () => {
5058
+ clearTimeout(langCloseTimer.current);
5059
+ setLangOpen(true);
5060
+ };
5061
+ const handleLangLeave = () => {
5062
+ langCloseTimer.current = setTimeout(() => setLangOpen(false), 120);
5063
+ };
5064
+ const closeAll = () => {
5065
+ clearTimeout(menuCloseTimer.current);
5066
+ clearTimeout(langCloseTimer.current);
5067
+ setOpenMenu(null);
5068
+ setLangOpen(false);
5069
+ };
5070
+ React18__namespace.useEffect(() => () => {
5071
+ clearTimeout(menuCloseTimer.current);
5072
+ clearTimeout(langCloseTimer.current);
5073
+ }, []);
5074
+ const handleLangSelect = (code) => {
5075
+ setActiveLang(code);
5076
+ onLanguageChange == null ? void 0 : onLanguageChange(code);
5077
+ setLangOpen(false);
5078
+ };
5079
+ const positionClass = position === "overlay" ? "absolute" : position === "fixed" ? "fixed" : "relative";
5080
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5081
+ "header",
5082
+ {
5083
+ className: cn(
5084
+ positionClass,
5085
+ "top-0 left-0 right-0 z-40",
5086
+ t.header,
5087
+ className
5088
+ ),
5089
+ children: [
5090
+ variant === "transparent" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 top-0 h-52 bg-gradient-to-b from-black/55 via-black/20 to-transparent pointer-events-none" }),
5091
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center gap-2 px-6 sm:px-10 h-[72px]", children: [
5092
+ /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#", className: "shrink-0 flex items-center mr-4", children: /* @__PURE__ */ jsxRuntime.jsx(
5093
+ "img",
5094
+ {
5095
+ src: logoSrc,
5096
+ alt: logoAlt,
5097
+ className: cn("h-11 w-auto select-none", t.logoBlend),
5098
+ draggable: false
5099
+ }
5100
+ ) }),
5101
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "hidden lg:flex items-center gap-0.5 mx-auto", children: links.map((link) => {
5102
+ var _a, _b;
5103
+ const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
5104
+ const isOpen = openMenu === link.label;
5105
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5106
+ "div",
5107
+ {
5108
+ className: "relative",
5109
+ onMouseEnter: () => hasDropdown && handleMenuEnter(link.label),
5110
+ onMouseLeave: handleMenuLeave,
5111
+ children: [
5112
+ /* @__PURE__ */ jsxRuntime.jsxs(
5113
+ "a",
5114
+ {
5115
+ href: (_b = link.href) != null ? _b : "#",
5116
+ onClick: hasDropdown ? (e) => e.preventDefault() : void 0,
5117
+ className: cn(
5118
+ "flex items-center gap-1 px-3.5 py-1.5 rounded-full",
5119
+ "text-base font-ui font-black transition-colors whitespace-nowrap",
5120
+ t.navItem,
5121
+ isOpen && t.navItemOpen
5122
+ ),
5123
+ children: [
5124
+ link.label,
5125
+ hasDropdown && /* @__PURE__ */ jsxRuntime.jsx(
5126
+ lucideReact.ChevronDownIcon,
5127
+ {
5128
+ className: cn(
5129
+ "h-3.5 w-3.5 transition-transform duration-150 shrink-0",
5130
+ t.chevron,
5131
+ isOpen && "rotate-180"
5132
+ )
5133
+ }
5134
+ )
5135
+ ]
5136
+ }
5137
+ ),
5138
+ isOpen && link.items && /* @__PURE__ */ jsxRuntime.jsx(
5139
+ NavDropdown,
5140
+ {
5141
+ items: link.items,
5142
+ onClose: closeAll,
5143
+ onMouseEnter: () => handleMenuEnter(link.label),
5144
+ onMouseLeave: handleMenuLeave
5145
+ }
5146
+ )
5147
+ ]
5148
+ },
5149
+ link.label
5150
+ );
5151
+ }) }),
5152
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 ml-auto lg:ml-0 shrink-0", children: [
5153
+ languages.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
5154
+ "div",
5155
+ {
5156
+ className: "relative hidden lg:block",
5157
+ onMouseEnter: handleLangEnter,
5158
+ onMouseLeave: handleLangLeave,
5159
+ children: [
5160
+ /* @__PURE__ */ jsxRuntime.jsxs(
5161
+ "button",
5162
+ {
5163
+ type: "button",
5164
+ "aria-label": "Language",
5165
+ className: cn(
5166
+ "flex items-center gap-0.5 px-2.5 py-1.5 rounded-full",
5167
+ "text-sm font-ui transition-colors",
5168
+ t.lang,
5169
+ langOpen && t.langOpen
5170
+ ),
5171
+ children: [
5172
+ activeLang,
5173
+ /* @__PURE__ */ jsxRuntime.jsx(
5174
+ lucideReact.ChevronDownIcon,
5175
+ {
5176
+ className: cn(
5177
+ "h-3 w-3 transition-transform duration-150",
5178
+ t.langChevron,
5179
+ langOpen && "rotate-180"
5180
+ )
5181
+ }
5182
+ )
5183
+ ]
5184
+ }
5185
+ ),
5186
+ langOpen && /* @__PURE__ */ jsxRuntime.jsx(
5187
+ LangDropdown,
5188
+ {
5189
+ languages,
5190
+ activeLang,
5191
+ onSelect: handleLangSelect,
5192
+ onMouseEnter: handleLangEnter,
5193
+ onMouseLeave: handleLangLeave
5194
+ }
5195
+ )
5196
+ ]
5197
+ }
5198
+ ),
5199
+ /* @__PURE__ */ jsxRuntime.jsx(
5200
+ "button",
5201
+ {
5202
+ type: "button",
5203
+ onClick: onSearch,
5204
+ "aria-label": "Search",
5205
+ className: cn(
5206
+ "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
5207
+ t.icon
5208
+ ),
5209
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "h-[18px] w-[18px]" })
5210
+ }
5211
+ ),
5212
+ /* @__PURE__ */ jsxRuntime.jsx(
5213
+ "button",
5214
+ {
5215
+ type: "button",
5216
+ onClick: onAccount,
5217
+ "aria-label": "Account",
5218
+ className: cn(
5219
+ "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
5220
+ t.icon
5221
+ ),
5222
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserIcon, { className: "h-[18px] w-[18px]" })
5223
+ }
5224
+ ),
5225
+ /* @__PURE__ */ jsxRuntime.jsx(
5226
+ "button",
5227
+ {
5228
+ type: "button",
5229
+ onClick: () => setMobileOpen(true),
5230
+ "aria-label": "Open menu",
5231
+ className: cn(
5232
+ "flex lg:hidden h-9 w-9 items-center justify-center rounded-full transition-colors ml-0.5",
5233
+ t.mobileTrigger
5234
+ ),
5235
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MenuIcon, { className: "h-[18px] w-[18px]" })
5236
+ }
5237
+ )
5238
+ ] })
5239
+ ] }),
5240
+ mobileOpen && /* @__PURE__ */ jsxRuntime.jsxs(
5241
+ "div",
5242
+ {
5243
+ className: cn(
5244
+ "fixed inset-0 z-50 lg:hidden flex flex-col",
5245
+ variant === "white" ? "bg-white" : "bg-primary-900"
5246
+ ),
5247
+ children: [
5248
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 h-[72px] shrink-0 border-b border-white/8", children: [
5249
+ /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#", className: "shrink-0 flex items-center", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsxRuntime.jsx(
5250
+ "img",
5251
+ {
5252
+ src: logoSrc,
5253
+ alt: logoAlt,
5254
+ className: cn("h-11 w-auto select-none", t.logoBlend),
5255
+ draggable: false
5256
+ }
5257
+ ) }),
5258
+ /* @__PURE__ */ jsxRuntime.jsx(
5259
+ "button",
5260
+ {
5261
+ type: "button",
5262
+ onClick: () => setMobileOpen(false),
5263
+ "aria-label": "Close menu",
5264
+ className: cn(
5265
+ "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
5266
+ t.mobileTrigger
5267
+ ),
5268
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5" })
5269
+ }
5270
+ )
5271
+ ] }),
5272
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "flex-1 overflow-y-auto px-6 py-6 flex flex-col gap-1", children: links.map((link) => {
5273
+ var _a, _b;
5274
+ const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
5275
+ const isExpanded = openMobileSection === link.label;
5276
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
5277
+ hasDropdown ? /* @__PURE__ */ jsxRuntime.jsxs(
5278
+ "button",
5279
+ {
5280
+ type: "button",
5281
+ onClick: () => toggleMobileSection(link.label),
5282
+ className: cn(
5283
+ "flex items-center justify-between w-full py-4 text-xl font-ui font-black transition-colors border-b border-white/8",
5284
+ t.mobileLink
5285
+ ),
5286
+ children: [
5287
+ link.label,
5288
+ /* @__PURE__ */ jsxRuntime.jsx(
5289
+ lucideReact.ChevronDownIcon,
5290
+ {
5291
+ className: cn(
5292
+ "h-5 w-5 transition-transform duration-200 opacity-40",
5293
+ isExpanded && "rotate-180"
5294
+ )
5295
+ }
5296
+ )
5297
+ ]
5298
+ }
5299
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
5300
+ "a",
5301
+ {
5302
+ href: (_b = link.href) != null ? _b : "#",
5303
+ onClick: () => setMobileOpen(false),
5304
+ className: cn(
5305
+ "flex items-center py-4 text-xl font-ui font-black transition-colors border-b border-white/8",
5306
+ t.mobileLink
5307
+ ),
5308
+ children: link.label
5309
+ }
5310
+ ),
5311
+ hasDropdown && isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0 pl-4 pb-2", children: link.items.map((item) => {
5312
+ var _a2;
5313
+ return /* @__PURE__ */ jsxRuntime.jsx(
5314
+ "a",
5315
+ {
5316
+ href: (_a2 = item.href) != null ? _a2 : "#",
5317
+ onClick: () => setMobileOpen(false),
5318
+ className: cn(
5319
+ "py-3 text-base font-ui font-bold transition-colors border-b",
5320
+ t.mobileSub
5321
+ ),
5322
+ children: item.label
5323
+ },
5324
+ item.label
5325
+ );
5326
+ }) })
5327
+ ] }, link.label);
5328
+ }) }),
5329
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(
5330
+ "shrink-0 px-6 py-5 flex items-center justify-between border-t",
5331
+ variant === "white" ? "border-border" : "border-white/10"
5332
+ ), children: [
5333
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 flex-wrap", children: languages.map((lang, i) => {
5334
+ const isActive = lang.code === activeLang;
5335
+ return /* @__PURE__ */ jsxRuntime.jsxs(React18__namespace.Fragment, { children: [
5336
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(
5337
+ "text-xs select-none",
5338
+ variant === "white" ? "text-border" : "text-white/15"
5339
+ ), children: "\xB7" }),
5340
+ /* @__PURE__ */ jsxRuntime.jsx(
5341
+ "button",
5342
+ {
5343
+ type: "button",
5344
+ onClick: () => handleLangSelect(lang.code),
5345
+ className: cn(
5346
+ "font-ui font-black transition-all duration-150 rounded-full",
5347
+ isActive ? cn(
5348
+ "text-sm px-3 py-1 border",
5349
+ variant === "white" ? "text-primary border-primary bg-primary/8" : "text-primary-400 border-primary-400/50 bg-primary-400/10"
5350
+ ) : cn(
5351
+ "text-xs px-2 py-1",
5352
+ variant === "white" ? "text-muted-foreground hover:text-foreground" : "text-white/35 hover:text-white/70"
5353
+ )
5354
+ ),
5355
+ children: lang.code
5356
+ }
5357
+ )
5358
+ ] }, lang.code);
5359
+ }) }),
5360
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
5361
+ /* @__PURE__ */ jsxRuntime.jsx(
5362
+ "button",
5363
+ {
5364
+ type: "button",
5365
+ onClick: () => {
5366
+ onSearch == null ? void 0 : onSearch();
5367
+ setMobileOpen(false);
5368
+ },
5369
+ "aria-label": "Search",
5370
+ className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
5371
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "h-[18px] w-[18px]" })
5372
+ }
5373
+ ),
5374
+ /* @__PURE__ */ jsxRuntime.jsx(
5375
+ "button",
5376
+ {
5377
+ type: "button",
5378
+ onClick: () => {
5379
+ onAccount == null ? void 0 : onAccount();
5380
+ setMobileOpen(false);
5381
+ },
5382
+ "aria-label": "Account",
5383
+ className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
5384
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserIcon, { className: "h-[18px] w-[18px]" })
5385
+ }
5386
+ )
5387
+ ] })
5388
+ ] })
5389
+ ]
5390
+ }
5391
+ )
5392
+ ]
5393
+ }
5394
+ );
5395
+ }
5396
+ function ThemeToggle({ className }) {
5397
+ const [dark, setDark] = React18__namespace.useState(false);
5398
+ React18__namespace.useEffect(() => {
5399
+ const saved = localStorage.getItem("theme");
5400
+ const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
5401
+ const isDark = saved === "dark" || !saved && prefersDark;
5402
+ setDark(isDark);
5403
+ document.documentElement.classList.toggle("dark", isDark);
5404
+ }, []);
5405
+ const toggle = () => {
5406
+ const next = !dark;
5407
+ setDark(next);
5408
+ document.documentElement.classList.toggle("dark", next);
5409
+ localStorage.setItem("theme", next ? "dark" : "light");
5410
+ };
5411
+ return /* @__PURE__ */ jsxRuntime.jsx(
5412
+ "button",
5413
+ {
5414
+ type: "button",
5415
+ onClick: toggle,
5416
+ "aria-label": dark ? "Switch to light mode" : "Switch to dark mode",
5417
+ className: cn(
5418
+ "flex h-8 w-8 items-center justify-center rounded-md",
5419
+ "bg-card border border-border text-muted-foreground shadow-sm",
5420
+ "hover:text-foreground hover:bg-muted transition-colors",
5421
+ className
5422
+ ),
5423
+ children: dark ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoonIcon, { className: "h-4 w-4" })
5424
+ }
5425
+ );
5426
+ }
5427
+ function CalendarIcon5() {
5428
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: [
5429
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "4", width: "18", height: "18", rx: "2" }),
5430
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "16", y1: "2", x2: "16", y2: "6" }),
5431
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "8", y1: "2", x2: "8", y2: "6" }),
5432
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "10", x2: "21", y2: "10" })
5433
+ ] });
5434
+ }
5435
+ function TrendingIcon() {
5436
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: [
5437
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "23 6 13.5 15.5 8.5 10.5 1 18" }),
5438
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "17 6 23 6 23 12" })
5439
+ ] });
5440
+ }
5441
+ function ArrowIcon() {
5442
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: [
5443
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
5444
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "12 5 19 12 12 19" })
5445
+ ] });
5446
+ }
5447
+ var sizeConfig = {
5448
+ sm: {
5449
+ card: "h-72 w-56",
5450
+ title: "text-lg font-bold",
5451
+ meta: "text-xs",
5452
+ description: "text-xs"
5453
+ },
5454
+ md: {
5455
+ card: "h-96 w-72",
5456
+ title: "text-xl font-bold",
5457
+ meta: "text-xs",
5458
+ description: "text-sm"
5459
+ },
5460
+ lg: {
5461
+ card: "h-[28rem] w-96",
5462
+ title: "text-2xl font-bold",
5463
+ meta: "text-sm",
5464
+ description: "text-sm"
5465
+ }
5466
+ };
5467
+ var statusConfig = {
5468
+ "sold-out": {
5469
+ label: "All seats taken",
5470
+ icon: /* @__PURE__ */ jsxRuntime.jsx(CalendarIcon5, {})
5471
+ },
5472
+ trending: {
5473
+ label: "Trending",
5474
+ icon: /* @__PURE__ */ jsxRuntime.jsx(TrendingIcon, {})
5475
+ }
5476
+ };
5477
+ function TripCard({
5478
+ image,
5479
+ imageAlt = "",
5480
+ status,
5481
+ nights,
5482
+ period,
5483
+ title,
5484
+ description,
5485
+ cta,
5486
+ price,
5487
+ size = "md",
5488
+ className
5489
+ }) {
5490
+ const s = sizeConfig[size];
5491
+ const statusInfo = status ? statusConfig[status] : null;
5492
+ const meta = [
5493
+ nights ? `${nights} nights` : null,
5494
+ period != null ? period : null
5495
+ ].filter(Boolean).join(" | ");
5496
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5497
+ "div",
5498
+ {
5499
+ className: cn(
5500
+ "group relative flex flex-col justify-between overflow-hidden rounded-2xl",
5501
+ "shadow-md transition-shadow duration-300 hover:shadow-xl",
5502
+ s.card,
5503
+ className
5504
+ ),
5505
+ children: [
5506
+ /* @__PURE__ */ jsxRuntime.jsx(
5507
+ "img",
5508
+ {
5509
+ src: image,
5510
+ alt: imageAlt,
5511
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
5512
+ }
5513
+ ),
5514
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent" }),
5515
+ 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: [
5516
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: statusInfo.icon }),
5517
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusInfo.label })
5518
+ ] }) }),
5519
+ !statusInfo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10" }),
5520
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
5521
+ meta && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/70 font-medium font-ui", s.meta), children: meta }),
5522
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-white leading-snug", s.title), children: title }),
5523
+ description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-white/80 leading-relaxed mt-0.5", s.description), children: description }),
5524
+ (cta || price) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 flex items-center justify-between gap-4", children: [
5525
+ cta && /* @__PURE__ */ jsxRuntime.jsxs(
5526
+ "button",
5527
+ {
5528
+ onClick: cta.onClick,
5529
+ className: cn(
5530
+ "group/cta inline-flex items-center gap-1.5 border-b border-white/70 pb-0.5",
5531
+ "text-sm font-semibold text-white transition-colors hover:border-white hover:text-white",
5532
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50",
5533
+ "font-ui"
5534
+ ),
5535
+ children: [
5536
+ cta.label,
5537
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "transition-transform duration-150 group-hover/cta:translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(ArrowIcon, {}) })
5538
+ ]
5539
+ }
5540
+ ),
5541
+ price && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-white/90 whitespace-nowrap font-ui", children: price })
5542
+ ] })
5543
+ ] })
5544
+ ]
5545
+ }
5546
+ );
5547
+ }
5548
+ function useHlsVideo(videoRef, src) {
5549
+ React18__namespace.useEffect(() => {
5550
+ if (!src || !videoRef.current) return;
5551
+ const video = videoRef.current;
5552
+ if (!src.includes(".m3u8")) return;
5553
+ let hlsInstance = null;
5554
+ import('hls.js').then(({ default: Hls }) => {
5555
+ if (!Hls.isSupported()) {
5556
+ video.src = src;
5557
+ return;
5558
+ }
5559
+ hlsInstance = new Hls({
5560
+ /* Start with low-quality level to show first frame ASAP */
5561
+ startLevel: 0,
5562
+ /* Limit initial buffer to 10s — faster start */
5563
+ maxBufferLength: 10,
5564
+ maxMaxBufferLength: 30
5565
+ });
5566
+ hlsInstance.loadSource(src);
5567
+ hlsInstance.attachMedia(video);
5568
+ hlsInstance.on(Hls.Events.MANIFEST_PARSED, () => {
5569
+ video.play().catch(() => {
5570
+ });
5571
+ });
5572
+ });
5573
+ return () => {
5574
+ hlsInstance == null ? void 0 : hlsInstance.destroy();
5575
+ };
5576
+ }, [src, videoRef]);
5577
+ }
5578
+ function TripHeader({
5579
+ images,
5580
+ videoUrl,
5581
+ title,
5582
+ breadcrumb,
5583
+ destination,
5584
+ duration,
5585
+ tagline,
5586
+ siteHeader,
5587
+ uiVariant = "v1",
5588
+ className
5589
+ }) {
5590
+ var _a;
5591
+ const [heroIndex, setHeroIndex] = React18__namespace.useState(0);
5592
+ const [videoReady, setVideoReady] = React18__namespace.useState(false);
5593
+ const videoRef = React18__namespace.useRef(null);
5594
+ const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
5595
+ const validImages = React18__namespace.useMemo(
5596
+ () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
5597
+ [images]
5598
+ );
5599
+ const hasHeroImage = validImages.length > 0;
5600
+ const heroSrc = (i) => {
5601
+ var _a2;
5602
+ return (_a2 = validImages[i]) != null ? _a2 : "";
5603
+ };
5604
+ const safeIndex = Math.min(heroIndex, Math.max(0, validImages.length - 1));
5605
+ const currentSrc = heroSrc(safeIndex);
5606
+ const showCarousel = !videoUrl && validImages.length > 1;
5607
+ const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
5608
+ const hasMeta = !!(destination || duration);
5609
+ useHlsVideo(videoRef, isHls ? videoUrl : void 0);
5610
+ React18__namespace.useEffect(() => {
5611
+ if (!videoUrl) return;
5612
+ const el = videoRef.current;
5613
+ if (!el) return;
5614
+ const observer = new IntersectionObserver(
5615
+ ([entry]) => {
5616
+ if (entry.isIntersecting) {
5617
+ el.play().catch(() => {
5618
+ });
5619
+ } else {
5620
+ el.pause();
5621
+ }
5622
+ },
5623
+ { threshold: 0.1 }
5624
+ );
5625
+ observer.observe(el);
5626
+ return () => observer.disconnect();
5627
+ }, [videoUrl]);
5628
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5629
+ "div",
5630
+ {
5631
+ className: cn("w-full", className),
5632
+ "data-trip-header-variant": uiVariant,
5633
+ children: [
5634
+ /* @__PURE__ */ jsxRuntime.jsxs(
5635
+ "div",
5636
+ {
5637
+ className: cn(
5638
+ "relative w-full overflow-hidden",
5639
+ hasHeroImage ? "bg-muted" : "bg-zinc-900",
5640
+ siteHeader ? "h-[80vh] min-h-[520px]" : "h-[70vh] min-h-[420px]"
5641
+ ),
5642
+ children: [
5643
+ !videoUrl && !hasHeroImage && /* @__PURE__ */ jsxRuntime.jsx(
5644
+ "div",
5645
+ {
5646
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950",
5647
+ "aria-hidden": true
5648
+ }
5649
+ ),
5650
+ videoUrl ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5651
+ hasHeroImage ? /* @__PURE__ */ jsxRuntime.jsx(
5652
+ "img",
5653
+ {
5654
+ src: validImages[0],
5655
+ alt: "",
5656
+ "aria-hidden": true,
5657
+ fetchPriority: "high",
5658
+ className: cn(
5659
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
5660
+ videoReady ? "opacity-0 pointer-events-none" : "opacity-100"
5661
+ )
5662
+ }
5663
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
5664
+ "div",
5665
+ {
5666
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950 transition-opacity duration-700",
5667
+ "aria-hidden": true
5668
+ }
5669
+ ),
5670
+ /* @__PURE__ */ jsxRuntime.jsx(
5671
+ "video",
5672
+ {
5673
+ ref: videoRef,
5674
+ src: isHls ? void 0 : videoUrl,
5675
+ autoPlay: true,
5676
+ muted: true,
5677
+ loop: true,
5678
+ playsInline: true,
5679
+ preload: "auto",
5680
+ poster: hasHeroImage ? validImages[0] : void 0,
5681
+ onCanPlay: () => setVideoReady(true),
5682
+ className: cn(
5683
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
5684
+ videoReady ? "opacity-100" : "opacity-0"
5685
+ )
5686
+ }
5687
+ )
5688
+ ] }) : hasHeroImage ? /* @__PURE__ */ jsxRuntime.jsx(
5689
+ "img",
5690
+ {
5691
+ src: currentSrc,
5692
+ alt: title,
5693
+ fetchPriority: safeIndex === 0 ? "high" : "auto",
5694
+ className: "absolute inset-0 h-full w-full object-cover transition-opacity duration-700"
5695
+ }
5696
+ ) : null,
5697
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/85 via-black/20 to-transparent" }),
5698
+ siteHeader && /* @__PURE__ */ jsxRuntime.jsx(
5699
+ SiteHeader,
5700
+ {
5701
+ links: Array.isArray(siteHeader) ? siteHeader : void 0,
5702
+ position: "overlay"
5703
+ }
5704
+ ),
5705
+ !videoUrl && showCarousel && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5706
+ /* @__PURE__ */ jsxRuntime.jsx(
5707
+ "button",
5708
+ {
5709
+ type: "button",
5710
+ onClick: () => setHeroIndex(
5711
+ (i) => (i - 1 + validImages.length) % validImages.length
5712
+ ),
5713
+ 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",
5714
+ "aria-label": "Imagem anterior",
5715
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
5716
+ }
5717
+ ),
5718
+ /* @__PURE__ */ jsxRuntime.jsx(
5719
+ "button",
5720
+ {
5721
+ type: "button",
5722
+ onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
5723
+ 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",
5724
+ "aria-label": "Pr\xF3xima imagem",
5725
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
5726
+ }
5727
+ ),
5728
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-5 right-5 flex gap-1.5", children: validImages.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
5729
+ "button",
5730
+ {
5731
+ type: "button",
5732
+ onClick: () => setHeroIndex(i),
5733
+ className: cn(
5734
+ "h-1.5 rounded-full transition-all",
5735
+ i === safeIndex ? "w-5 bg-white" : "w-1.5 bg-white/50"
5736
+ )
5737
+ },
5738
+ i
5739
+ )) })
5740
+ ] })
5741
+ ]
5742
+ }
5743
+ ),
5744
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-5xl px-4 sm:px-6", children: /* @__PURE__ */ jsxRuntime.jsxs(
5745
+ "div",
5746
+ {
5747
+ className: cn(
5748
+ "relative z-10 pb-10",
5749
+ siteHeader ? "-mt-44" : "-mt-36"
5750
+ ),
5751
+ children: [
5752
+ breadcrumb && breadcrumb.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-center gap-1.5 flex-wrap", children: breadcrumb.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React18__namespace.Fragment, { children: [
5753
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-3 w-3 text-white/50 shrink-0" }),
5754
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-white/70 font-ui hover:text-white/90 cursor-default", children: crumb.label })
5755
+ ] }, i)) }),
5756
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight", children: title }),
5757
+ hasMeta ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 flex items-center gap-5 flex-wrap", children: [
5758
+ destination && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-white/85", children: [
5759
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
5760
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: destination })
5761
+ ] }),
5762
+ duration && nights !== null && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-white/85", children: [
5763
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoonIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
5764
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
5765
+ nights,
5766
+ " ",
5767
+ nights === 1 ? "noite" : "noites"
5768
+ ] }),
5769
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white/40", children: "\xB7" }),
5770
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
5771
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
5772
+ duration.days,
5773
+ " ",
5774
+ duration.days === 1 ? "dia" : "dias"
5775
+ ] })
5776
+ ] })
5777
+ ] }) : tagline ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm sm:text-base text-white/80 font-ui", children: tagline }) : null
5778
+ ]
5779
+ }
5780
+ ) })
5781
+ ]
5782
+ }
5783
+ );
5784
+ }
5785
+ function Stars({ count = 5 }) {
5786
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex gap-0.5", children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
5787
+ lucideReact.StarIcon,
5788
+ {
5789
+ className: cn(
5790
+ "h-3.5 w-3.5",
5791
+ i < count ? "fill-primary text-primary" : "fill-muted text-muted"
5792
+ )
5793
+ },
5794
+ i
5795
+ )) });
5796
+ }
5797
+ function ItineraryTimeline({ steps }) {
5798
+ 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: [
5799
+ i < steps.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-3.5 top-7 bottom-0 w-px bg-border" }),
5800
+ /* @__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 }) }),
5801
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1 pt-0.5 flex-1", children: [
5802
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
5803
+ /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-bold text-foreground font-heading", children: step.label }),
5804
+ step.duration && /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "outline", className: "text-xs font-ui h-5 px-2", children: [
5805
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-3 w-3 mr-1" }),
5806
+ step.duration
5807
+ ] }),
5808
+ step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: "Transfer" })
5809
+ ] }),
5810
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground leading-relaxed [&_p:not(:last-child)]:mb-2 [&_strong]:text-foreground [&_strong]:font-semibold", children: step.description })
5811
+ ] })
5812
+ ] }, i)) });
5813
+ }
5814
+ function Checklist({ items, icon }) {
5815
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-2", children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-2.5 text-sm text-foreground", children: [
5816
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 shrink-0 text-primary", children: icon != null ? icon : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "h-4 w-4" }) }),
5817
+ item
5818
+ ] }, i)) });
5819
+ }
5820
+ function TripPage({
5821
+ title,
5822
+ tagline,
5823
+ destination,
5824
+ duration,
5825
+ images,
5826
+ videoUrl,
5827
+ breadcrumb,
5828
+ highlights,
5829
+ infoGroups,
5830
+ recommendedFor,
5831
+ overview,
5832
+ itinerary,
5833
+ gallery,
5834
+ included,
5835
+ whatToBring,
5836
+ weather,
5837
+ meetingPoints,
5838
+ faqs,
5839
+ reviews,
5840
+ priceFrom,
5841
+ currency = "CHF",
5842
+ season,
5843
+ departureTimes,
5844
+ pricingOptions,
5845
+ onBook,
5846
+ bookLabel,
5847
+ siteHeader,
5848
+ uiVariant = "v1",
5849
+ features,
5850
+ className
5851
+ }) {
5852
+ const [activeSection, setActiveSection] = React18__namespace.useState("");
5853
+ const [navFloating, setNavFloating] = React18__namespace.useState(false);
5854
+ const [navHidden, setNavHidden] = React18__namespace.useState(false);
5855
+ const [isFloating, setIsFloating] = React18__namespace.useState(false);
5856
+ const [sidebarPos, setSidebarPos] = React18__namespace.useState(null);
5857
+ const [pricingBarVisible, setPricingBarVisible] = React18__namespace.useState(false);
5858
+ const navRef = React18__namespace.useRef(null);
5859
+ const navSentinelRef = React18__namespace.useRef(null);
5860
+ const sentinelRef = React18__namespace.useRef(null);
5861
+ const sidebarPlaceholderRef = React18__namespace.useRef(null);
5862
+ const pricingBarRef = React18__namespace.useRef(null);
5863
+ const galleryRef = React18__namespace.useRef(null);
5864
+ const sections = React18__namespace.useMemo(
5865
+ () => [
5866
+ { id: "key-info", label: "Key info", show: !!(infoGroups == null ? void 0 : infoGroups.length) },
5867
+ { id: "overview", label: "Overview", show: !!overview },
5868
+ { id: "itinerary", label: "Itinerary", show: !!(itinerary == null ? void 0 : itinerary.length) },
5869
+ { id: "included", label: "Included", show: !!((included == null ? void 0 : included.length) || (whatToBring == null ? void 0 : whatToBring.length)) },
5870
+ { id: "what-to-bring", label: "What to bring", show: !!(whatToBring == null ? void 0 : whatToBring.length) },
5871
+ { id: "weather", label: "Weather", show: !!weather },
5872
+ { id: "meeting", label: "Meeting point", show: !!(meetingPoints == null ? void 0 : meetingPoints.length) },
5873
+ { id: "faq", label: "FAQ", show: !!(faqs == null ? void 0 : faqs.length) },
5874
+ { id: "gallery", label: "Photos", show: !!(gallery == null ? void 0 : gallery.length) }
5875
+ ].filter((s) => s.show),
5876
+ // eslint-disable-next-line react-hooks/exhaustive-deps
5877
+ []
5878
+ );
5879
+ React18__namespace.useEffect(() => {
5880
+ const sentinel = navSentinelRef.current;
5881
+ if (!sentinel) return;
5882
+ const update = () => setNavFloating(sentinel.getBoundingClientRect().top < 1);
5883
+ document.addEventListener("scroll", update, { passive: true, capture: true });
5884
+ update();
5885
+ return () => document.removeEventListener("scroll", update, { capture: true });
5886
+ }, []);
5887
+ React18__namespace.useEffect(() => {
5888
+ const sentinel = sentinelRef.current;
5889
+ if (!sentinel) return;
5890
+ const update = () => setIsFloating(sentinel.getBoundingClientRect().top < 1);
5891
+ document.addEventListener("scroll", update, { passive: true, capture: true });
5892
+ update();
5893
+ return () => document.removeEventListener("scroll", update, { capture: true });
5894
+ }, []);
5895
+ React18__namespace.useEffect(() => {
5896
+ const measure = () => {
5897
+ if (!sidebarPlaceholderRef.current) return;
5898
+ const rect = sidebarPlaceholderRef.current.getBoundingClientRect();
5899
+ setSidebarPos({ left: rect.left, width: rect.width });
5900
+ };
5901
+ measure();
5902
+ window.addEventListener("resize", measure);
5903
+ return () => window.removeEventListener("resize", measure);
5904
+ }, [isFloating]);
5905
+ React18__namespace.useEffect(() => {
5906
+ const check = () => {
5907
+ var _a;
5908
+ const target = (_a = galleryRef.current) != null ? _a : pricingBarRef.current;
5909
+ if (!target) return;
5910
+ setPricingBarVisible(target.getBoundingClientRect().top < window.innerHeight * 0.75);
5911
+ };
5912
+ document.addEventListener("scroll", check, { passive: true, capture: true });
5913
+ check();
5914
+ return () => document.removeEventListener("scroll", check, { capture: true });
5915
+ }, []);
5916
+ React18__namespace.useEffect(() => {
5917
+ const check = () => {
5918
+ if (!pricingBarRef.current) return;
5919
+ setNavHidden(pricingBarRef.current.getBoundingClientRect().top < window.innerHeight * 0.92);
5920
+ };
5921
+ document.addEventListener("scroll", check, { passive: true, capture: true });
5922
+ check();
5923
+ return () => document.removeEventListener("scroll", check, { capture: true });
5924
+ }, []);
5925
+ React18__namespace.useEffect(() => {
5926
+ if (sections.length === 0) return;
5927
+ setActiveSection(sections[0].id);
5928
+ const update = () => {
5929
+ var _a, _b;
5930
+ const navH = ((_b = (_a = navRef.current) == null ? void 0 : _a.offsetHeight) != null ? _b : 56) + 20;
5931
+ for (const { id } of [...sections].reverse()) {
5932
+ const el = document.getElementById(`trip-section-${id}`);
5933
+ if (el && el.getBoundingClientRect().top <= navH) {
5934
+ setActiveSection(id);
5935
+ return;
5936
+ }
5937
+ }
5938
+ setActiveSection(sections[0].id);
5939
+ };
5940
+ document.addEventListener("scroll", update, { passive: true, capture: true });
5941
+ return () => document.removeEventListener("scroll", update, { capture: true });
5942
+ }, [sections]);
5943
+ const scrollToBookingForm = () => {
5944
+ var _a, _b, _c;
5945
+ const el = document.getElementById("trip-booking-form");
5946
+ if (!el) return;
5947
+ const navHeight = ((_b = (_a = navRef.current) == null ? void 0 : _a.offsetHeight) != null ? _b : 56) + 16;
5948
+ const scrollEl = (_c = navRef.current) == null ? void 0 : _c.closest("main");
5949
+ const elTop = el.getBoundingClientRect().top;
5950
+ const containerTop = scrollEl ? scrollEl.getBoundingClientRect().top : 0;
5951
+ const currentScroll = scrollEl ? scrollEl.scrollTop : window.scrollY;
5952
+ const target = currentScroll + (elTop - containerTop) - navHeight;
5953
+ if (scrollEl) {
5954
+ scrollEl.scrollTo({ top: target, behavior: "smooth" });
5955
+ } else {
5956
+ window.scrollTo({ top: target, behavior: "smooth" });
5957
+ }
5958
+ };
5959
+ const scrollToSection = (id) => {
5960
+ var _a, _b, _c;
5961
+ const el = document.getElementById(`trip-section-${id}`);
5962
+ if (!el) return;
5963
+ const navHeight = (_b = (_a = navRef.current) == null ? void 0 : _a.offsetHeight) != null ? _b : 56;
5964
+ const scrollEl = (_c = navRef.current) == null ? void 0 : _c.closest("main");
5965
+ const currentScroll = scrollEl ? scrollEl.scrollTop : window.scrollY;
5966
+ const elTop = el.getBoundingClientRect().top;
5967
+ const containerTop = scrollEl ? scrollEl.getBoundingClientRect().top : 0;
5968
+ const target = currentScroll + (elTop - containerTop) - navHeight - 12;
5969
+ if (scrollEl) {
5970
+ scrollEl.scrollTo({ top: target, behavior: "smooth" });
5971
+ } else {
5972
+ window.scrollTo({ top: target, behavior: "smooth" });
5973
+ }
5974
+ };
5975
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5976
+ "div",
5977
+ {
5978
+ className: cn("w-full overflow-x-hidden", className),
5979
+ "data-ui-variant": uiVariant,
5980
+ "data-features": features ? JSON.stringify(features) : void 0,
5981
+ children: [
5982
+ /* @__PURE__ */ jsxRuntime.jsx(
5983
+ TripHeader,
5984
+ {
5985
+ images,
5986
+ videoUrl,
5987
+ title,
5988
+ breadcrumb,
5989
+ destination,
5990
+ duration,
5991
+ tagline,
5992
+ siteHeader,
5993
+ uiVariant
5994
+ }
5995
+ ),
5996
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-5xl px-4 sm:px-6", children: [
5997
+ highlights && highlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 flex flex-wrap justify-center gap-6 py-2", children: highlights.map((h, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2 text-center", children: [
5998
+ h.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full border-2 border-border text-foreground", children: h.icon }),
5999
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-ui", children: h.label })
6000
+ ] }, i)) }),
6001
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: navSentinelRef, className: "h-px", "aria-hidden": true }),
6002
+ sections.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
6003
+ "div",
6004
+ {
6005
+ className: cn(
6006
+ "py-2 flex justify-center transition-opacity duration-150",
6007
+ navFloating ? "opacity-0 pointer-events-none" : "opacity-100"
6008
+ ),
6009
+ children: /* @__PURE__ */ jsxRuntime.jsx(
6010
+ MenuTrip,
6011
+ {
6012
+ sections,
6013
+ activeSection,
6014
+ onSelect: scrollToSection,
6015
+ variant: "floating"
6016
+ }
6017
+ )
6018
+ }
6019
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "my-6" }),
6020
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: sentinelRef, className: "h-px -mt-px", "aria-hidden": true }),
6021
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col lg:flex-row gap-8 mt-4", children: [
6022
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 space-y-12 pb-12", children: [
6023
+ infoGroups && infoGroups.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-key-info", className: "scroll-mt-20", children: [
6024
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: "Key info" }),
6025
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-6", children: infoGroups.map((group, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6026
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3", children: [
6027
+ group.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: group.icon }),
6028
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground font-heading", children: group.title })
6029
+ ] }),
6030
+ /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: group.items }),
6031
+ i < infoGroups.length - 1 && /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mt-6" })
6032
+ ] }, i)) })
6033
+ ] }),
6034
+ overview && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-overview", className: "scroll-mt-20", children: [
6035
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-4", children: "Overview" }),
6036
+ recommendedFor && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2.5 rounded-xl bg-primary/8 border border-primary/20 p-4 mb-4", children: [
6037
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 text-primary mt-0.5 shrink-0" }),
6038
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-foreground font-ui", children: [
6039
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: "Recommended for: " }),
6040
+ recommendedFor
6041
+ ] })
6042
+ ] }),
6043
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: overview })
6044
+ ] }),
6045
+ itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
6046
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: "Itinerary" }),
6047
+ /* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary })
6048
+ ] }),
6049
+ included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
6050
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
6051
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
6052
+ "Included"
6053
+ ] }),
6054
+ /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: included })
6055
+ ] }),
6056
+ whatToBring && whatToBring.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-what-to-bring", className: "scroll-mt-20", children: [
6057
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
6058
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PackageIcon, { className: "h-5 w-5 text-primary" }),
6059
+ "What to bring"
6060
+ ] }),
6061
+ /* @__PURE__ */ jsxRuntime.jsx(Checklist, { items: whatToBring, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.InfoIcon, { className: "h-4 w-4" }) })
6062
+ ] }),
6063
+ weather && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-weather", className: "scroll-mt-20", children: [
6064
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
6065
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-5 w-5 text-primary" }),
6066
+ "Weather"
6067
+ ] }),
6068
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-start gap-3 rounded-xl bg-muted/60 border border-border p-5", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-foreground leading-relaxed space-y-2 [&_strong]:font-semibold", children: weather }) })
6069
+ ] }),
6070
+ meetingPoints && meetingPoints.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-meeting", className: "scroll-mt-20", children: [
6071
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
6072
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-5 w-5 text-primary" }),
6073
+ "Meeting point"
6074
+ ] }),
6075
+ /* @__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: [
6076
+ /* @__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" }) }),
6077
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6078
+ 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" }),
6079
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
6080
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
6081
+ ] })
6082
+ ] }, i)) })
6083
+ ] }),
6084
+ faqs && faqs.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
6085
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: "FAQ" }),
6086
+ /* @__PURE__ */ jsxRuntime.jsx(Accordion, { variant: "faq", children: faqs.map((faq, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: `faq-${i}`, children: [
6087
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { children: faq.question }),
6088
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { children: faq.answer })
6089
+ ] }, i)) })
6090
+ ] }),
6091
+ reviews && reviews.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6092
+ /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mb-10" }),
6093
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-5", children: "What our guests think" }),
6094
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: reviews.map((r, i) => {
6095
+ var _a;
6096
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border p-5", children: [
6097
+ /* @__PURE__ */ jsxRuntime.jsx(Stars, { count: (_a = r.rating) != null ? _a : 5 }),
6098
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-foreground leading-relaxed line-clamp-4", children: [
6099
+ "\u201C",
6100
+ r.text,
6101
+ "\u201D"
6102
+ ] }),
6103
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs font-semibold text-muted-foreground font-ui mt-auto", children: [
6104
+ "\u2014 ",
6105
+ r.author
6106
+ ] })
6107
+ ] }, i);
6108
+ }) })
6109
+ ] })
6110
+ ] }),
6111
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: sidebarPlaceholderRef, className: "hidden lg:block lg:w-72 xl:w-80 shrink-0", children: !isFloating && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sticky top-20 rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
6112
+ PricingTrip,
6113
+ {
6114
+ priceFrom,
6115
+ currency,
6116
+ season,
6117
+ departureTimes,
6118
+ pricingOptions,
6119
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
6120
+ bookLabel: bookLabel != null ? bookLabel : "Check availability",
6121
+ variant: "card"
6122
+ }
6123
+ ) }) })
6124
+ ] })
6125
+ ] }),
6126
+ sections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
6127
+ "div",
6128
+ {
6129
+ ref: navRef,
6130
+ className: cn(
6131
+ "fixed top-0 left-0 right-0 z-20 py-3 transition-all duration-200",
6132
+ navFloating && !navHidden ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 pointer-events-none"
6133
+ ),
6134
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-5xl px-4 sm:px-6 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
6135
+ MenuTrip,
6136
+ {
6137
+ sections,
6138
+ activeSection,
6139
+ onSelect: scrollToSection,
6140
+ variant: "floating"
6141
+ }
6142
+ ) })
6143
+ }
6144
+ ),
6145
+ isFloating && !pricingBarVisible && sidebarPos && /* @__PURE__ */ jsxRuntime.jsx(
6146
+ "div",
6147
+ {
6148
+ className: "hidden lg:block fixed z-20",
6149
+ style: { top: "5rem", left: sidebarPos.left, width: sidebarPos.width },
6150
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl border border-border bg-card p-6 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
6151
+ PricingTrip,
6152
+ {
6153
+ priceFrom,
6154
+ currency,
6155
+ season,
6156
+ departureTimes,
6157
+ pricingOptions,
6158
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
6159
+ bookLabel: bookLabel != null ? bookLabel : "Check availability",
6160
+ variant: "card"
6161
+ }
6162
+ ) })
6163
+ }
6164
+ ),
6165
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsxRuntime.jsx(
6166
+ PhotoGallery,
6167
+ {
6168
+ photos: gallery,
6169
+ variant: "grid",
6170
+ initialVisible: 6
6171
+ }
6172
+ ) }),
6173
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-5xl px-4 sm:px-6 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(BookingForm, { onSubmit: onBook ? (values) => onBook() : void 0 }) }) }),
6174
+ /* @__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(
6175
+ PricingTrip,
6176
+ {
6177
+ priceFrom,
6178
+ currency,
6179
+ onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
6180
+ bookLabel: bookLabel != null ? bookLabel : "Book now",
6181
+ variant: "compact"
6182
+ }
6183
+ ) }),
6184
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" })
6185
+ ]
6186
+ }
6187
+ );
6188
+ }
6189
+ var sizeConfig2 = {
6190
+ sm: {
6191
+ card: "w-56",
6192
+ image: "h-36",
6193
+ title: "text-sm font-bold",
6194
+ description: "text-xs",
6195
+ price: "text-xs py-2"
6196
+ },
6197
+ md: {
6198
+ card: "w-72",
6199
+ image: "h-52",
6200
+ title: "text-base font-bold",
6201
+ description: "text-sm",
6202
+ price: "text-sm py-2.5"
6203
+ },
6204
+ lg: {
6205
+ card: "w-96",
6206
+ image: "h-64",
6207
+ title: "text-lg font-bold",
6208
+ description: "text-sm",
6209
+ price: "text-sm py-3"
6210
+ }
6211
+ };
6212
+ function ActivityCard({
6213
+ image,
6214
+ imageAlt = "",
6215
+ badge,
6216
+ icon,
6217
+ title,
6218
+ description,
6219
+ price,
6220
+ onClick,
6221
+ size = "md",
6222
+ className
6223
+ }) {
6224
+ const s = sizeConfig2[size];
6225
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6226
+ "div",
6227
+ {
6228
+ role: onClick ? "button" : void 0,
6229
+ tabIndex: onClick ? 0 : void 0,
6230
+ onClick,
6231
+ onKeyDown: onClick ? (e) => (e.key === "Enter" || e.key === " ") && onClick() : void 0,
6232
+ className: cn(
6233
+ "group flex flex-col overflow-hidden rounded-[1.25rem] bg-card",
6234
+ "border border-border shadow-md transition-shadow duration-200",
6235
+ onClick && "cursor-pointer hover:shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
6236
+ s.card,
6237
+ className
6238
+ ),
6239
+ children: [
6240
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative w-full shrink-0 overflow-hidden", s.image), children: [
6241
+ /* @__PURE__ */ jsxRuntime.jsx(
6242
+ "img",
6243
+ {
6244
+ src: image,
6245
+ alt: imageAlt,
6246
+ className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
6247
+ }
6248
+ ),
6249
+ icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-3 top-3 flex h-8 w-8 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm", children: icon }),
6250
+ badge && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute right-3 top-3", children: /* @__PURE__ */ jsxRuntime.jsx(
6251
+ Badge,
6252
+ {
6253
+ variant: "secondary",
6254
+ className: "rounded-full bg-card/90 text-foreground backdrop-blur-sm shadow-sm border-0 font-medium font-ui",
6255
+ children: badge
6256
+ }
6257
+ ) })
6258
+ ] }),
6259
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
6260
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-foreground leading-snug font-ui", s.title), children: title }),
6261
+ description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-muted-foreground leading-relaxed", s.description), children: description }),
6262
+ price && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto pt-2", children: /* @__PURE__ */ jsxRuntime.jsx(
6263
+ "div",
6264
+ {
6265
+ className: cn(
6266
+ "w-full rounded-full bg-muted text-center font-semibold text-foreground font-ui",
6267
+ s.price
6268
+ ),
6269
+ children: price
6270
+ }
6271
+ ) })
6272
+ ] })
6273
+ ]
6274
+ }
6275
+ );
6276
+ }
3047
6277
 
6278
+ exports.ActivityCard = ActivityCard;
3048
6279
  exports.BookingConfirmation = BookingConfirmation;
3049
6280
  exports.BookingConfirmationEmail = BookingConfirmationEmail;
3050
6281
  exports.BookingDetails = BookingDetails;
6282
+ exports.BookingForm = BookingForm;
6283
+ exports.COUNTRIES = COUNTRIES;
6284
+ exports.CounterField = CounterField;
6285
+ exports.CountrySearchField = CountrySearchField;
6286
+ exports.DEFAULT_HEADER_LINKS = DEFAULT_HEADER_LINKS;
6287
+ exports.DEFAULT_LANGUAGES = DEFAULT_LANGUAGES;
6288
+ exports.DatePickerField = DatePickerField;
6289
+ exports.FilterPanel = FilterPanel;
3051
6290
  exports.FloatingInput = FloatingInput;
3052
6291
  exports.FloatingSelect = FloatingSelect;
6292
+ exports.Itinerary = Itinerary;
6293
+ exports.MenuTrip = MenuTrip;
3053
6294
  exports.Offer = Offer;
3054
6295
  exports.OfferAdventureCard = OfferAdventureCard;
6296
+ exports.PhoneCountrySelect = PhoneCountrySelect;
6297
+ exports.PhotoGallery = PhotoGallery;
6298
+ exports.PricingTrip = PricingTrip;
6299
+ exports.SiteHeader = SiteHeader;
6300
+ exports.ThemeToggle = ThemeToggle;
6301
+ exports.TripCard = TripCard;
6302
+ exports.TripHeader = TripHeader;
6303
+ exports.TripPage = TripPage;
3055
6304
  exports.cn = cn;
3056
6305
  //# sourceMappingURL=index.cjs.map
3057
6306
  //# sourceMappingURL=index.cjs.map