@planetaexo/design-system 0.64.0 → 0.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -638,7 +638,8 @@ function PhoneCountrySelect({
638
638
  value,
639
639
  onChange,
640
640
  className,
641
- disabled
641
+ disabled,
642
+ showDial = true
642
643
  }) {
643
644
  var _a;
644
645
  const [open, setOpen] = React32__namespace.useState(false);
@@ -687,7 +688,7 @@ function PhoneCountrySelect({
687
688
  ),
688
689
  children: [
689
690
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-base leading-none", children: selected.flag }),
690
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: selected.dial }),
691
+ showDial && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: selected.dial }),
691
692
  /* @__PURE__ */ jsxRuntime.jsx(
692
693
  lucideReact.ChevronDownIcon,
693
694
  {
@@ -1326,7 +1327,7 @@ function AdventureCard({
1326
1327
  labels,
1327
1328
  interactionsDisabled
1328
1329
  }) {
1329
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
1330
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
1330
1331
  const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
1331
1332
  const [checkedInternal, setCheckedInternal] = React32__namespace.useState(
1332
1333
  new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
@@ -1500,6 +1501,29 @@ function AdventureCard({
1500
1501
  }
1501
1502
  )
1502
1503
  ] }),
1504
+ adventure.rooms && adventure.rooms.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-5 mt-1", children: adventure.rooms.map((room, i) => {
1505
+ var _a2, _b2;
1506
+ const bedLabel = (_b2 = (_a2 = adventure.bedArrangementLabels) == null ? void 0 : _a2[room.bedArrangement]) != null ? _b2 : room.bedArrangement === "DOUBLE" ? "Double" : room.bedArrangement === "TWIN" ? "Twin" : room.bedArrangement === "SINGLE" ? "Single" : "Triple";
1507
+ const heading = adventure.accommodationRoomHeading ? adventure.accommodationRoomHeading(room.roomName) : `Accommodation: ${room.roomName}`;
1508
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
1509
+ /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-lg font-semibold text-foreground font-heading", children: heading }),
1510
+ room.imageUrl && // eslint-disable-next-line @next/next/no-img-element
1511
+ /* @__PURE__ */ jsxRuntime.jsx(
1512
+ "img",
1513
+ {
1514
+ src: room.imageUrl,
1515
+ alt: room.roomName,
1516
+ className: "w-full h-auto max-w-full rounded"
1517
+ }
1518
+ ),
1519
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold text-foreground", children: `${room.qty}\xD7 ${room.roomName}` }),
1520
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm text-foreground/70 flex items-center gap-2 flex-wrap", children: [
1521
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: room.accommodationName }),
1522
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-2 py-0.5 text-xs font-semibold bg-primary/10 text-primary rounded uppercase tracking-wide", children: bedLabel })
1523
+ ] }),
1524
+ room.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground/70 leading-snug", children: room.description })
1525
+ ] }, i);
1526
+ }) }),
1503
1527
  (adventure.description || adventure.detailsSlot) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1504
1528
  /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "my-1" }),
1505
1529
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
@@ -1528,48 +1552,22 @@ function AdventureCard({
1528
1552
  ), children: adventure.detailsSlot })
1529
1553
  ] })
1530
1554
  ] }),
1531
- adventure.rooms && adventure.rooms.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
1532
- /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_p = adventure.accommodationsLabel) != null ? _p : "Accommodations" }),
1533
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-3", children: adventure.rooms.map((room, i) => {
1534
- var _a2, _b2;
1535
- const bedLabel = (_b2 = (_a2 = adventure.bedArrangementLabels) == null ? void 0 : _a2[room.bedArrangement]) != null ? _b2 : room.bedArrangement === "DOUBLE" ? "Double" : room.bedArrangement === "TWIN" ? "Twin" : room.bedArrangement === "SINGLE" ? "Single" : "Triple";
1536
- return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-3", children: [
1537
- room.imageUrl && // eslint-disable-next-line @next/next/no-img-element
1538
- /* @__PURE__ */ jsxRuntime.jsx(
1539
- "img",
1540
- {
1541
- src: room.imageUrl,
1542
- alt: room.roomName,
1543
- className: "w-20 h-16 object-cover rounded shrink-0"
1544
- }
1545
- ),
1546
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
1547
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold text-foreground", children: `${room.qty}\xD7 ${room.roomName}` }),
1548
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm text-foreground/70 flex items-center gap-2 flex-wrap", children: [
1549
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: room.accommodationName }),
1550
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-2 py-0.5 text-xs font-semibold bg-primary/10 text-primary rounded uppercase tracking-wide", children: bedLabel })
1551
- ] }),
1552
- room.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground/70 mt-1 leading-snug", children: room.description })
1553
- ] })
1554
- ] }, i);
1555
- }) })
1556
- ] }),
1557
1555
  adventure.included && adventure.included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
1558
- /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_q = adventure.includedLabel) != null ? _q : "What's included" }),
1556
+ /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_p = adventure.includedLabel) != null ? _p : "What's included" }),
1559
1557
  /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.included.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-2 text-base text-foreground/80 font-sans", children: [
1560
1558
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "w-4 h-4 text-primary shrink-0 mt-1" }),
1561
1559
  item
1562
1560
  ] }, i)) })
1563
1561
  ] }),
1564
1562
  adventure.notIncluded && adventure.notIncluded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
1565
- /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_r = adventure.notIncludedLabel) != null ? _r : "What's not included" }),
1563
+ /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_q = adventure.notIncludedLabel) != null ? _q : "What's not included" }),
1566
1564
  /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.notIncluded.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-2 text-base text-foreground/80 font-sans", children: [
1567
1565
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "w-4 h-4 text-destructive shrink-0 mt-1" }),
1568
1566
  item
1569
1567
  ] }, i)) })
1570
1568
  ] }),
1571
1569
  adventure.cancellationPolicy && adventure.cancellationPolicy.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
1572
- /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_s = adventure.cancellationPolicyLabel) != null ? _s : "Cancellation policy" }),
1570
+ /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_r = adventure.cancellationPolicyLabel) != null ? _r : "Cancellation policy" }),
1573
1571
  /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.cancellationPolicy.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-2 text-base text-muted-foreground font-sans", children: [
1574
1572
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-primary shrink-0 mt-2.5" }),
1575
1573
  item
@@ -4146,6 +4144,7 @@ var DEFAULT_LABELS = {
4146
4144
  adultsUnit: "adult(s)",
4147
4145
  childrenUnit: "child(ren)",
4148
4146
  accommodationsHeading: "ACCOMMODATIONS",
4147
+ accommodationRoomHeading: (name) => `Accommodation: ${name}`,
4149
4148
  bedArrangementLabels: {
4150
4149
  DOUBLE: "Double",
4151
4150
  TWIN: "Twin",
@@ -4173,10 +4172,11 @@ function BookingAdventureCard({
4173
4172
  lineItems,
4174
4173
  subtotal,
4175
4174
  rooms,
4175
+ roomLayout = "compact",
4176
4176
  labels,
4177
4177
  className
4178
4178
  }) {
4179
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
4179
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
4180
4180
  const l = {
4181
4181
  travellersHeading: (_a = labels == null ? void 0 : labels.travellersHeading) != null ? _a : DEFAULT_LABELS.travellersHeading,
4182
4182
  detailsHeading: (_b = labels == null ? void 0 : labels.detailsHeading) != null ? _b : DEFAULT_LABELS.detailsHeading,
@@ -4191,11 +4191,12 @@ function BookingAdventureCard({
4191
4191
  adultsUnit: (_k = labels == null ? void 0 : labels.adultsUnit) != null ? _k : DEFAULT_LABELS.adultsUnit,
4192
4192
  childrenUnit: (_l = labels == null ? void 0 : labels.childrenUnit) != null ? _l : DEFAULT_LABELS.childrenUnit,
4193
4193
  accommodationsHeading: (_m = labels == null ? void 0 : labels.accommodationsHeading) != null ? _m : DEFAULT_LABELS.accommodationsHeading,
4194
+ accommodationRoomHeading: (_n = labels == null ? void 0 : labels.accommodationRoomHeading) != null ? _n : DEFAULT_LABELS.accommodationRoomHeading,
4194
4195
  bedArrangementLabels: {
4195
- DOUBLE: (_o = (_n = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _n.DOUBLE) != null ? _o : DEFAULT_LABELS.bedArrangementLabels.DOUBLE,
4196
- TWIN: (_q = (_p = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _p.TWIN) != null ? _q : DEFAULT_LABELS.bedArrangementLabels.TWIN,
4197
- SINGLE: (_s = (_r = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _r.SINGLE) != null ? _s : DEFAULT_LABELS.bedArrangementLabels.SINGLE,
4198
- TRIPLE: (_u = (_t = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _t.TRIPLE) != null ? _u : DEFAULT_LABELS.bedArrangementLabels.TRIPLE
4196
+ DOUBLE: (_p = (_o = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _o.DOUBLE) != null ? _p : DEFAULT_LABELS.bedArrangementLabels.DOUBLE,
4197
+ TWIN: (_r = (_q = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _q.TWIN) != null ? _r : DEFAULT_LABELS.bedArrangementLabels.TWIN,
4198
+ SINGLE: (_t = (_s = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _s.SINGLE) != null ? _t : DEFAULT_LABELS.bedArrangementLabels.SINGLE,
4199
+ TRIPLE: (_v = (_u = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _u.TRIPLE) != null ? _v : DEFAULT_LABELS.bedArrangementLabels.TRIPLE
4199
4200
  }
4200
4201
  };
4201
4202
  const hasTravellers = !!travellers && travellers.length > 0;
@@ -4534,7 +4535,116 @@ function BookingAdventureCard({
4534
4535
  );
4535
4536
  })
4536
4537
  ] }),
4537
- hasRooms && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "4px" }, children: [
4538
+ hasRooms && roomLayout === "feature" && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "4px" }, children: [
4539
+ /* @__PURE__ */ jsxRuntime.jsx(
4540
+ "hr",
4541
+ {
4542
+ style: {
4543
+ border: "none",
4544
+ borderTop: `1px solid ${emailTokens.border}`,
4545
+ marginBottom: "10px"
4546
+ }
4547
+ }
4548
+ ),
4549
+ /* @__PURE__ */ jsxRuntime.jsx(
4550
+ "p",
4551
+ {
4552
+ style: {
4553
+ fontSize: "10px",
4554
+ fontWeight: 700,
4555
+ color: emailTokens.mutedForeground,
4556
+ textTransform: "uppercase",
4557
+ letterSpacing: "0.1em",
4558
+ margin: "0 0 10px 0"
4559
+ },
4560
+ children: l.accommodationsHeading
4561
+ }
4562
+ ),
4563
+ rooms.map((room, i) => /* @__PURE__ */ jsxRuntime.jsxs(
4564
+ "div",
4565
+ {
4566
+ style: {
4567
+ marginBottom: i < rooms.length - 1 ? "16px" : "0"
4568
+ },
4569
+ children: [
4570
+ /* @__PURE__ */ jsxRuntime.jsx(
4571
+ "p",
4572
+ {
4573
+ style: {
4574
+ fontSize: "16px",
4575
+ fontWeight: 700,
4576
+ color: emailTokens.foreground,
4577
+ lineHeight: "1.3",
4578
+ margin: "0 0 8px 0"
4579
+ },
4580
+ children: l.accommodationRoomHeading(room.roomName)
4581
+ }
4582
+ ),
4583
+ room.imageUrl && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginBottom: "8px" }, children: /* @__PURE__ */ jsxRuntime.jsx(
4584
+ "img",
4585
+ {
4586
+ src: room.imageUrl,
4587
+ alt: room.roomName,
4588
+ style: {
4589
+ width: "100%",
4590
+ height: "auto",
4591
+ maxWidth: "100%",
4592
+ display: "block",
4593
+ borderRadius: "8px"
4594
+ }
4595
+ }
4596
+ ) }),
4597
+ /* @__PURE__ */ jsxRuntime.jsx(
4598
+ "div",
4599
+ {
4600
+ style: {
4601
+ fontSize: "14px",
4602
+ fontWeight: 600,
4603
+ color: emailTokens.foreground,
4604
+ marginBottom: "2px"
4605
+ },
4606
+ children: `${room.qty}\xD7 ${room.roomName}`
4607
+ }
4608
+ ),
4609
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: "12px", color: emailTokens.mutedForeground }, children: [
4610
+ room.accommodationName,
4611
+ /* @__PURE__ */ jsxRuntime.jsx(
4612
+ "span",
4613
+ {
4614
+ style: {
4615
+ display: "inline-block",
4616
+ marginLeft: "8px",
4617
+ padding: "1px 6px",
4618
+ fontSize: "10px",
4619
+ fontWeight: 600,
4620
+ color: emailTokens.primary,
4621
+ backgroundColor: emailTokens.primaryLight,
4622
+ borderRadius: "4px",
4623
+ textTransform: "uppercase",
4624
+ letterSpacing: "0.05em"
4625
+ },
4626
+ children: l.bedArrangementLabels[room.bedArrangement]
4627
+ }
4628
+ )
4629
+ ] }),
4630
+ room.description && /* @__PURE__ */ jsxRuntime.jsx(
4631
+ "div",
4632
+ {
4633
+ style: {
4634
+ fontSize: "12px",
4635
+ color: emailTokens.bodyText,
4636
+ marginTop: "4px",
4637
+ lineHeight: "1.4"
4638
+ },
4639
+ children: room.description
4640
+ }
4641
+ )
4642
+ ]
4643
+ },
4644
+ i
4645
+ ))
4646
+ ] }),
4647
+ hasRooms && roomLayout === "compact" && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "4px" }, children: [
4538
4648
  /* @__PURE__ */ jsxRuntime.jsx(
4539
4649
  "hr",
4540
4650
  {
@@ -5173,6 +5283,14 @@ var DEFAULT_LABELS3 = {
5173
5283
  pricingLabel: "Pricing",
5174
5284
  subtotalLabel: "Subtotal",
5175
5285
  totalLabel: "Total",
5286
+ accommodationsLabel: "ACCOMMODATIONS",
5287
+ accommodationRoomHeading: (name) => `Accommodation: ${name}`,
5288
+ bedArrangementLabels: {
5289
+ DOUBLE: "Double",
5290
+ TWIN: "Twin",
5291
+ SINGLE: "Single",
5292
+ TRIPLE: "Triple"
5293
+ },
5176
5294
  paymentSummaryHeading: "\u{1F4B0} Payment Summary",
5177
5295
  paymentDetailsHeading: "Payment Details",
5178
5296
  depositLabel: (percent) => `Deposit (${percent}%)`,
@@ -5341,6 +5459,7 @@ function BookingPaymentConfirmationEmail({
5341
5459
  lineItems: lineItemsToPass,
5342
5460
  subtotal: adventure.subtotal,
5343
5461
  rooms: adventure.rooms,
5462
+ roomLayout: "feature",
5344
5463
  labels: {
5345
5464
  travellersHeading: l.travellersLabel,
5346
5465
  detailsHeading: l.itineraryLabel,
@@ -5350,7 +5469,10 @@ function BookingPaymentConfirmationEmail({
5350
5469
  notIncludedHeading: l.notIncludedLabel,
5351
5470
  childBadge: l.childBadge,
5352
5471
  adultsUnit: l.adultsUnit,
5353
- childrenUnit: l.childrenUnit
5472
+ childrenUnit: l.childrenUnit,
5473
+ accommodationsHeading: l.accommodationsLabel,
5474
+ accommodationRoomHeading: l.accommodationRoomHeading,
5475
+ bedArrangementLabels: l.bedArrangementLabels
5354
5476
  }
5355
5477
  }
5356
5478
  )
@@ -7930,7 +8052,8 @@ function DatePickerField({
7930
8052
  placeholder = "Select a date",
7931
8053
  disabled,
7932
8054
  fromDate,
7933
- className
8055
+ className,
8056
+ error
7934
8057
  }) {
7935
8058
  const [open, setOpen] = React32__namespace.useState(false);
7936
8059
  const containerRef = React32__namespace.useRef(null);
@@ -7944,78 +8067,91 @@ function DatePickerField({
7944
8067
  observer.observe(containerRef.current);
7945
8068
  return () => observer.disconnect();
7946
8069
  }, []);
7947
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className: cn("w-full", className), children: /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
7948
- /* @__PURE__ */ jsxRuntime.jsxs(
7949
- PopoverTrigger,
7950
- {
7951
- disabled,
7952
- className: cn(
7953
- "relative flex w-full items-center rounded-lg border border-border bg-background",
7954
- "px-3 text-left text-base font-ui transition-colors h-14",
7955
- "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
7956
- "disabled:pointer-events-none disabled:opacity-50",
7957
- open && "border-primary ring-1 ring-primary"
7958
- ),
7959
- children: [
7960
- /* @__PURE__ */ jsxRuntime.jsxs(
7961
- "span",
7962
- {
7963
- className: cn(
7964
- "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
7965
- hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
7966
- ),
7967
- children: [
7968
- label,
7969
- required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
7970
- ]
7971
- }
8070
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: cn("w-full", className), children: [
8071
+ /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
8072
+ /* @__PURE__ */ jsxRuntime.jsxs(
8073
+ PopoverTrigger,
8074
+ {
8075
+ disabled,
8076
+ className: cn(
8077
+ "relative flex w-full items-center rounded-lg border border-border bg-background",
8078
+ "px-3 text-left text-base font-ui transition-colors h-14",
8079
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
8080
+ "disabled:pointer-events-none disabled:opacity-50",
8081
+ open && "border-primary ring-1 ring-primary",
8082
+ error && "border-destructive focus:border-destructive focus:ring-destructive"
7972
8083
  ),
7973
- /* @__PURE__ */ jsxRuntime.jsx(
7974
- "span",
8084
+ children: [
8085
+ /* @__PURE__ */ jsxRuntime.jsxs(
8086
+ "span",
8087
+ {
8088
+ className: cn(
8089
+ "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
8090
+ hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
8091
+ ),
8092
+ children: [
8093
+ label,
8094
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
8095
+ ]
8096
+ }
8097
+ ),
8098
+ /* @__PURE__ */ jsxRuntime.jsx(
8099
+ "span",
8100
+ {
8101
+ className: cn(
8102
+ "flex-1 truncate mt-3",
8103
+ hasValue ? "text-foreground" : "invisible"
8104
+ ),
8105
+ children: hasValue ? dateFns.format(value, "dd MMM yyyy") : placeholder
8106
+ }
8107
+ ),
8108
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
8109
+ ]
8110
+ }
8111
+ ),
8112
+ /* @__PURE__ */ jsxRuntime.jsx(
8113
+ PopoverContent,
8114
+ {
8115
+ className: "p-0",
8116
+ align: "start",
8117
+ style: calendarWidth ? { width: calendarWidth } : void 0,
8118
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8119
+ Calendar,
7975
8120
  {
7976
- className: cn(
7977
- "flex-1 truncate mt-3",
7978
- hasValue ? "text-foreground" : "invisible"
7979
- ),
7980
- children: hasValue ? dateFns.format(value, "dd MMM yyyy") : placeholder
8121
+ mode: "single",
8122
+ selected: value,
8123
+ onSelect: (date) => {
8124
+ onChange == null ? void 0 : onChange(date);
8125
+ setOpen(false);
8126
+ },
8127
+ fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
8128
+ className: "font-ui w-full",
8129
+ autoFocus: true
7981
8130
  }
7982
- ),
7983
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
7984
- ]
7985
- }
7986
- ),
7987
- /* @__PURE__ */ jsxRuntime.jsx(
7988
- PopoverContent,
7989
- {
7990
- className: "p-0",
7991
- align: "start",
7992
- style: calendarWidth ? { width: calendarWidth } : void 0,
7993
- children: /* @__PURE__ */ jsxRuntime.jsx(
7994
- Calendar,
7995
- {
7996
- mode: "single",
7997
- selected: value,
7998
- onSelect: (date) => {
7999
- onChange == null ? void 0 : onChange(date);
8000
- setOpen(false);
8001
- },
8002
- fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
8003
- className: "font-ui w-full",
8004
- autoFocus: true
8005
- }
8006
- )
8007
- }
8008
- )
8009
- ] }) });
8131
+ )
8132
+ }
8133
+ )
8134
+ ] }),
8135
+ error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: error })
8136
+ ] });
8010
8137
  }
8138
+ function dialFor(iso) {
8139
+ var _a, _b;
8140
+ return (_b = (_a = PHONE_COUNTRIES.find((c) => c.code === iso)) == null ? void 0 : _a.dial) != null ? _b : "";
8141
+ }
8142
+ var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
8011
8143
  function FormSection({
8012
8144
  title,
8145
+ required,
8013
8146
  children,
8014
8147
  className
8015
8148
  }) {
8016
8149
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-5", className), children: [
8017
8150
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
8018
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: title }),
8151
+ /* @__PURE__ */ jsxRuntime.jsxs("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: [
8152
+ title,
8153
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary ml-0.5", children: "*" })
8154
+ ] }),
8019
8155
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px flex-1 bg-border" })
8020
8156
  ] }),
8021
8157
  children
@@ -8031,24 +8167,67 @@ var defaultInitial = {
8031
8167
  phoneCountry: "BR",
8032
8168
  lastName: "",
8033
8169
  firstName: "",
8034
- country: "France",
8170
+ country: "",
8035
8171
  phone: "",
8036
- email: ""
8172
+ email: "",
8173
+ contactVia: "Email"
8037
8174
  };
8038
8175
  function BookingForm({
8039
8176
  defaultValues,
8040
8177
  onSubmit,
8041
- submitLabel = "Send my request",
8178
+ submitLabel,
8042
8179
  loading = false,
8043
8180
  showHeader = true,
8044
- title = "Check availability for your trip",
8045
- subtitle = "Free enquiry \u2013 no commitment",
8181
+ title,
8182
+ subtitle,
8183
+ labels,
8046
8184
  className
8047
8185
  }) {
8186
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C;
8187
+ const L = labels != null ? labels : {};
8188
+ const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
8189
+ const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
8190
+ const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
8048
8191
  const [values, setValues] = React32__namespace.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8049
- const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8192
+ const [errors, setErrors] = React32__namespace.useState({});
8193
+ const set = (key, value) => {
8194
+ setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8195
+ setErrors(
8196
+ (prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
8197
+ );
8198
+ };
8199
+ React32__namespace.useEffect(() => {
8200
+ if (!defaultValues) return;
8201
+ setValues((prev) => {
8202
+ let changed = false;
8203
+ const next = __spreadValues({}, prev);
8204
+ Object.keys(defaultValues).forEach(
8205
+ (k) => {
8206
+ const incoming = defaultValues[k];
8207
+ if (incoming === void 0 || incoming === "") return;
8208
+ if (prev[k] === defaultInitial[k]) {
8209
+ next[k] = incoming;
8210
+ changed = true;
8211
+ }
8212
+ }
8213
+ );
8214
+ return changed ? next : prev;
8215
+ });
8216
+ }, [defaultValues]);
8217
+ const reqMsg = (_d = L.errorRequired) != null ? _d : "This field is required";
8218
+ const emailMsg = (_e = L.errorEmail) != null ? _e : "Enter a valid email address";
8050
8219
  const handleSubmit = (e) => {
8051
8220
  e.preventDefault();
8221
+ const next = {};
8222
+ if (!values.firstName.trim()) next.firstName = reqMsg;
8223
+ if (!values.lastName.trim()) next.lastName = reqMsg;
8224
+ if (!values.email.trim()) next.email = reqMsg;
8225
+ else if (!EMAIL_RE.test(values.email.trim())) next.email = emailMsg;
8226
+ if (!values.travelDate) next.travelDate = reqMsg;
8227
+ if (!values.phone.trim()) next.phone = reqMsg;
8228
+ if (!values.contactVia) next.contactVia = reqMsg;
8229
+ setErrors(next);
8230
+ if (Object.keys(next).length > 0) return;
8052
8231
  onSubmit == null ? void 0 : onSubmit(values);
8053
8232
  };
8054
8233
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -8059,15 +8238,14 @@ function BookingForm({
8059
8238
  noValidate: true,
8060
8239
  children: [
8061
8240
  showHeader && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8062
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: title }),
8063
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitle })
8241
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: titleText }),
8242
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitleText })
8064
8243
  ] }),
8065
- /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Who's joining the adventure?", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8244
+ /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_f = L.travelersSection) != null ? _f : "Who's joining the adventure?", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8066
8245
  /* @__PURE__ */ jsxRuntime.jsx(
8067
8246
  CounterField,
8068
8247
  {
8069
- label: "Adults",
8070
- required: true,
8248
+ label: (_g = L.adults) != null ? _g : "Adults",
8071
8249
  value: values.adults,
8072
8250
  min: 1,
8073
8251
  onChange: (v) => set("adults", v)
@@ -8076,30 +8254,30 @@ function BookingForm({
8076
8254
  /* @__PURE__ */ jsxRuntime.jsx(
8077
8255
  CounterField,
8078
8256
  {
8079
- label: "Children",
8080
- sublabel: "(under 12)",
8257
+ label: (_h = L.children) != null ? _h : "Children",
8258
+ sublabel: (_i = L.childrenSublabel) != null ? _i : "(under 12)",
8081
8259
  value: values.children,
8082
8260
  min: 0,
8083
8261
  onChange: (v) => set("children", v)
8084
8262
  }
8085
8263
  )
8086
8264
  ] }) }),
8087
- /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Your next trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8265
+ /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_j = L.tripSection) != null ? _j : "Your next trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8088
8266
  /* @__PURE__ */ jsxRuntime.jsx(
8089
8267
  DatePickerField,
8090
8268
  {
8091
- label: "Travel date",
8269
+ label: (_k = L.travelDate) != null ? _k : "Travel date",
8092
8270
  required: true,
8093
8271
  value: values.travelDate,
8094
8272
  onChange: (d) => set("travelDate", d),
8095
- placeholder: "Pick a date"
8273
+ placeholder: (_l = L.pickDate) != null ? _l : "Pick a date",
8274
+ error: errors.travelDate
8096
8275
  }
8097
8276
  ),
8098
8277
  /* @__PURE__ */ jsxRuntime.jsx(
8099
8278
  FloatingInput,
8100
8279
  {
8101
- label: "Budget (per person)",
8102
- required: true,
8280
+ label: (_m = L.budget) != null ? _m : "Budget (per person)",
8103
8281
  type: "number",
8104
8282
  min: 0,
8105
8283
  value: values.budget,
@@ -8107,7 +8285,7 @@ function BookingForm({
8107
8285
  }
8108
8286
  )
8109
8287
  ] }) }),
8110
- /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: "Tell us about your trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
8288
+ /* @__PURE__ */ jsxRuntime.jsx(FormSection, { title: (_n = L.projectSection) != null ? _n : "Tell us about your trip", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
8111
8289
  /* @__PURE__ */ jsxRuntime.jsx(
8112
8290
  "textarea",
8113
8291
  {
@@ -8135,140 +8313,184 @@ function BookingForm({
8135
8313
  "peer-not-placeholder-shown:top-2 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
8136
8314
  ),
8137
8315
  children: [
8138
- "Your trip in a few words",
8316
+ (_o = L.projectLabel) != null ? _o : "Your trip in a few words",
8139
8317
  " ",
8140
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })
8318
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground font-normal", children: (_p = L.optional) != null ? _p : "(optional)" })
8141
8319
  ]
8142
8320
  }
8143
8321
  )
8144
8322
  ] }) }),
8145
- /* @__PURE__ */ jsxRuntime.jsxs(FormSection, { title: "Contact details", children: [
8323
+ /* @__PURE__ */ jsxRuntime.jsxs(FormSection, { title: (_q = L.contactSection) != null ? _q : "Contact details", children: [
8146
8324
  /* @__PURE__ */ jsxRuntime.jsx(
8147
8325
  "div",
8148
8326
  {
8149
8327
  role: "radiogroup",
8150
- "aria-label": "Title",
8328
+ "aria-label": (_r = L.titleAria) != null ? _r : "Title",
8151
8329
  className: "flex flex-wrap items-center gap-x-6 gap-y-3",
8152
- children: ["ms", "mr"].map((c) => /* @__PURE__ */ jsxRuntime.jsxs(
8153
- "label",
8154
- {
8155
- className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
8156
- children: [
8157
- /* @__PURE__ */ jsxRuntime.jsx(
8158
- "input",
8159
- {
8160
- type: "radio",
8161
- name: "civility",
8162
- value: c,
8163
- checked: values.civility === c,
8164
- onChange: () => set("civility", c),
8165
- className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
8166
- }
8167
- ),
8168
- c === "ms" ? "Ms." : "Mr."
8169
- ]
8170
- },
8171
- c
8172
- ))
8330
+ children: ["ms", "mr"].map((c) => {
8331
+ var _a2, _b2;
8332
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8333
+ "label",
8334
+ {
8335
+ className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
8336
+ children: [
8337
+ /* @__PURE__ */ jsxRuntime.jsx(
8338
+ "input",
8339
+ {
8340
+ type: "radio",
8341
+ name: "civility",
8342
+ value: c,
8343
+ checked: values.civility === c,
8344
+ onChange: () => set("civility", c),
8345
+ className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
8346
+ }
8347
+ ),
8348
+ c === "ms" ? (_a2 = L.ms) != null ? _a2 : "Ms." : (_b2 = L.mr) != null ? _b2 : "Mr."
8349
+ ]
8350
+ },
8351
+ c
8352
+ );
8353
+ })
8173
8354
  }
8174
8355
  ),
8175
8356
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 min-w-0", children: [
8176
8357
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
8177
8358
  FloatingInput,
8178
8359
  {
8179
- label: "Last name",
8360
+ label: (_s = L.lastName) != null ? _s : "Last name",
8180
8361
  required: true,
8181
8362
  value: values.lastName,
8182
- onChange: (e) => set("lastName", e.target.value)
8363
+ onChange: (e) => set("lastName", e.target.value),
8364
+ error: errors.lastName
8183
8365
  }
8184
8366
  ) }),
8185
8367
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
8186
8368
  FloatingInput,
8187
8369
  {
8188
- label: "First name",
8370
+ label: (_t = L.firstName) != null ? _t : "First name",
8189
8371
  required: true,
8190
8372
  value: values.firstName,
8191
- onChange: (e) => set("firstName", e.target.value)
8373
+ onChange: (e) => set("firstName", e.target.value),
8374
+ error: errors.firstName
8192
8375
  }
8193
8376
  ) }),
8194
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxRuntime.jsxs(
8195
- FloatingSelect,
8377
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxRuntime.jsx(
8378
+ CountrySearchField,
8196
8379
  {
8197
- label: "Country of residence",
8198
- required: true,
8380
+ label: (_u = L.country) != null ? _u : "Country of residence",
8199
8381
  value: values.country,
8200
- onChange: (e) => set("country", e.target.value),
8201
- children: [
8202
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, hidden: true }),
8203
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "France", children: "France" }),
8204
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Belgium", children: "Belgium" }),
8205
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Switzerland", children: "Switzerland" }),
8206
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Canada", children: "Canada" }),
8207
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Luxembourg", children: "Luxembourg" }),
8208
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "United Kingdom", children: "United Kingdom" }),
8209
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "United States", children: "United States" }),
8210
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "Other", children: "Other" })
8211
- ]
8382
+ onChange: (code) => set("country", code),
8383
+ countries: COUNTRIES
8212
8384
  }
8213
8385
  ) })
8214
8386
  ] }),
8215
8387
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [
8216
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full min-w-0", children: [
8217
- /* @__PURE__ */ jsxRuntime.jsx(
8218
- PhoneCountrySelect,
8219
- {
8220
- value: values.phoneCountry,
8221
- onChange: (code) => set("phoneCountry", code),
8222
- className: "shrink-0"
8223
- }
8224
- ),
8225
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-w-0 flex-1", children: [
8388
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
8389
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full min-w-0", children: [
8226
8390
  /* @__PURE__ */ jsxRuntime.jsx(
8227
- "input",
8391
+ PhoneCountrySelect,
8228
8392
  {
8229
- id: "phone",
8230
- type: "tel",
8231
- placeholder: " ",
8232
- value: values.phone,
8233
- onChange: (e) => set("phone", e.target.value),
8234
- className: cn(
8235
- "peer block h-14 w-full rounded-r-lg border border-border bg-background",
8236
- "px-3 pt-5 pb-2 text-base text-foreground font-ui",
8237
- "transition-colors placeholder-transparent",
8238
- "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary"
8239
- )
8393
+ value: values.phoneCountry,
8394
+ onChange: (code) => set("phoneCountry", code),
8395
+ className: "shrink-0",
8396
+ showDial: false
8240
8397
  }
8241
8398
  ),
8242
- /* @__PURE__ */ jsxRuntime.jsxs(
8243
- "label",
8244
- {
8245
- htmlFor: "phone",
8246
- className: cn(
8247
- "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
8248
- "text-base text-muted-foreground font-ui transition-all duration-150",
8249
- "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
8250
- "peer-not-placeholder-shown:top-3 peer-not-placeholder-shown:translate-y-0 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
8251
- ),
8252
- children: [
8253
- "Phone ",
8254
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: "*" })
8255
- ]
8256
- }
8257
- )
8258
- ] })
8259
- ] }),
8260
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
8261
- FloatingInput,
8262
- {
8263
- label: "Email",
8264
- required: true,
8399
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-w-0 flex-1", children: [
8400
+ /* @__PURE__ */ jsxRuntime.jsx(
8401
+ "input",
8402
+ {
8403
+ id: "phone",
8404
+ type: "tel",
8405
+ placeholder: " ",
8406
+ value: `${dialFor(values.phoneCountry)} ${values.phone}`,
8407
+ onChange: (e) => {
8408
+ const dial = dialFor(values.phoneCountry);
8409
+ let national = e.target.value;
8410
+ if (national.startsWith(dial)) national = national.slice(dial.length);
8411
+ national = national.replace(/^\s+/, "");
8412
+ set("phone", national);
8413
+ },
8414
+ className: cn(
8415
+ "peer block h-14 w-full rounded-r-lg border border-border bg-background",
8416
+ "px-3 pt-5 pb-2 text-base text-foreground font-ui",
8417
+ "transition-colors placeholder-transparent",
8418
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
8419
+ errors.phone && "border-destructive focus:border-destructive focus:ring-destructive"
8420
+ )
8421
+ }
8422
+ ),
8423
+ /* @__PURE__ */ jsxRuntime.jsxs(
8424
+ "label",
8425
+ {
8426
+ htmlFor: "phone",
8427
+ className: cn(
8428
+ "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
8429
+ "text-base text-muted-foreground font-ui transition-all duration-150",
8430
+ "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
8431
+ "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"
8432
+ ),
8433
+ children: [
8434
+ (_v = L.phone) != null ? _v : "Phone",
8435
+ " ",
8436
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: "*" })
8437
+ ]
8438
+ }
8439
+ )
8440
+ ] })
8441
+ ] }),
8442
+ errors.phone && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: errors.phone })
8443
+ ] }),
8444
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx(
8445
+ FloatingInput,
8446
+ {
8447
+ label: (_w = L.email) != null ? _w : "Email",
8448
+ required: true,
8265
8449
  type: "email",
8266
8450
  value: values.email,
8267
- onChange: (e) => set("email", e.target.value)
8451
+ onChange: (e) => set("email", e.target.value),
8452
+ error: errors.email
8268
8453
  }
8269
8454
  ) })
8270
8455
  ] })
8271
8456
  ] }),
8457
+ /* @__PURE__ */ jsxRuntime.jsxs(
8458
+ FormSection,
8459
+ {
8460
+ title: (_x = L.contactViaSection) != null ? _x : "How should we contact you?",
8461
+ required: true,
8462
+ children: [
8463
+ /* @__PURE__ */ jsxRuntime.jsx(
8464
+ "div",
8465
+ {
8466
+ role: "radiogroup",
8467
+ "aria-label": (_y = L.contactViaSection) != null ? _y : "How should we contact you?",
8468
+ className: "inline-flex flex-wrap rounded-full border border-border bg-background p-1",
8469
+ children: [
8470
+ ["WhatsApp", (_z = L.contactViaWhatsApp) != null ? _z : "WhatsApp"],
8471
+ ["Email", (_A = L.contactViaEmail) != null ? _A : "Email"],
8472
+ ["Phone", (_B = L.contactViaPhone) != null ? _B : "Phone"]
8473
+ ].map(([value, label]) => /* @__PURE__ */ jsxRuntime.jsx(
8474
+ "button",
8475
+ {
8476
+ type: "button",
8477
+ role: "radio",
8478
+ "aria-checked": values.contactVia === value,
8479
+ onClick: () => set("contactVia", value),
8480
+ className: cn(
8481
+ "whitespace-nowrap rounded-full px-5 py-2 font-heading text-[13px] font-semibold transition-colors",
8482
+ values.contactVia === value ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:text-foreground"
8483
+ ),
8484
+ children: label
8485
+ },
8486
+ value
8487
+ ))
8488
+ }
8489
+ ),
8490
+ errors.contactVia && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-destructive font-ui", children: errors.contactVia })
8491
+ ]
8492
+ }
8493
+ ),
8272
8494
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center pt-2", children: /* @__PURE__ */ jsxRuntime.jsx(
8273
8495
  "button",
8274
8496
  {
@@ -8303,8 +8525,8 @@ function BookingForm({
8303
8525
  }
8304
8526
  )
8305
8527
  ] }),
8306
- "Sending\u2026"
8307
- ] }) : submitLabel
8528
+ (_C = L.sending) != null ? _C : "Sending\u2026"
8529
+ ] }) : submitText
8308
8530
  }
8309
8531
  ) })
8310
8532
  ]
@@ -10053,56 +10275,66 @@ function AccordionItem(_a) {
10053
10275
  function AccordionTrigger(_a) {
10054
10276
  var _b = _a, {
10055
10277
  className,
10056
- children
10278
+ children,
10279
+ headingLevel
10057
10280
  } = _b, props = __objRest(_b, [
10058
10281
  "className",
10059
- "children"
10282
+ "children",
10283
+ "headingLevel"
10060
10284
  ]);
10061
10285
  const variant = React32__namespace.useContext(AccordionVariantContext);
10062
- return /* @__PURE__ */ jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
10063
- accordion.Accordion.Trigger,
10286
+ const headingRender = headingLevel === 2 ? /* @__PURE__ */ jsxRuntime.jsx("h2", {}) : headingLevel === 4 ? /* @__PURE__ */ jsxRuntime.jsx("h4", {}) : headingLevel === 5 ? /* @__PURE__ */ jsxRuntime.jsx("h5", {}) : headingLevel === 6 ? /* @__PURE__ */ jsxRuntime.jsx("h6", {}) : void 0;
10287
+ return /* @__PURE__ */ jsxRuntime.jsx(
10288
+ accordion.Accordion.Header,
10064
10289
  __spreadProps(__spreadValues({
10065
- "data-slot": "accordion-trigger",
10066
- className: cn(
10067
- "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
10068
- "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
10069
- variant === "default" && [
10070
- "rounded-lg border border-transparent py-2.5 text-sm font-medium",
10071
- "hover:underline focus-visible:border-ring",
10072
- "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
10073
- ],
10074
- variant === "faq" && [
10075
- "px-5 py-4 text-base font-bold",
10076
- "hover:bg-muted/30 rounded-lg"
10077
- ],
10078
- className
10079
- )
10080
- }, props), {
10081
- children: [
10082
- children,
10083
- variant === "default" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10084
- /* @__PURE__ */ jsxRuntime.jsx(
10085
- lucideReact.ChevronDownIcon,
10086
- {
10087
- "data-slot": "accordion-trigger-icon",
10088
- className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
10089
- }
10090
- ),
10091
- /* @__PURE__ */ jsxRuntime.jsx(
10092
- lucideReact.ChevronUpIcon,
10093
- {
10094
- "data-slot": "accordion-trigger-icon",
10095
- className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
10096
- }
10290
+ className: "flex"
10291
+ }, headingRender ? { render: headingRender } : {}), {
10292
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
10293
+ accordion.Accordion.Trigger,
10294
+ __spreadProps(__spreadValues({
10295
+ "data-slot": "accordion-trigger",
10296
+ className: cn(
10297
+ "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
10298
+ "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
10299
+ variant === "default" && [
10300
+ "rounded-lg border border-transparent py-2.5 text-sm font-medium",
10301
+ "hover:underline focus-visible:border-ring",
10302
+ "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
10303
+ ],
10304
+ variant === "faq" && [
10305
+ "px-5 py-4 text-base font-bold",
10306
+ "hover:bg-muted/30 rounded-lg"
10307
+ ],
10308
+ className
10097
10309
  )
10098
- ] }),
10099
- variant === "faq" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10100
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
10101
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
10102
- ] })
10103
- ]
10310
+ }, props), {
10311
+ children: [
10312
+ children,
10313
+ variant === "default" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10314
+ /* @__PURE__ */ jsxRuntime.jsx(
10315
+ lucideReact.ChevronDownIcon,
10316
+ {
10317
+ "data-slot": "accordion-trigger-icon",
10318
+ className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
10319
+ }
10320
+ ),
10321
+ /* @__PURE__ */ jsxRuntime.jsx(
10322
+ lucideReact.ChevronUpIcon,
10323
+ {
10324
+ "data-slot": "accordion-trigger-icon",
10325
+ className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
10326
+ }
10327
+ )
10328
+ ] }),
10329
+ variant === "faq" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10330
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
10331
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
10332
+ ] })
10333
+ ]
10334
+ })
10335
+ )
10104
10336
  })
10105
- ) });
10337
+ );
10106
10338
  }
10107
10339
  function AccordionContent(_a) {
10108
10340
  var _b = _a, {
@@ -10327,9 +10559,10 @@ function FilterPanel({
10327
10559
  variant = "sidebar",
10328
10560
  sortOptions,
10329
10561
  sort,
10330
- onSortChange
10562
+ onSortChange,
10563
+ labels
10331
10564
  }) {
10332
- var _a, _b;
10565
+ var _a, _b, _c, _d, _e, _f, _g, _h;
10333
10566
  const resolvedGroups = React32__namespace.useMemo(() => resolveGroups(groups), [groups]);
10334
10567
  const [internalValue, setInternalValue] = React32__namespace.useState(
10335
10568
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
@@ -10467,7 +10700,7 @@ function FilterPanel({
10467
10700
  type: "button",
10468
10701
  onClick: handleClearAll,
10469
10702
  className: "text-sm font-ui font-semibold text-muted-foreground underline underline-offset-2 hover:text-foreground",
10470
- children: "Clear all"
10703
+ children: (_b = labels == null ? void 0 : labels.clearAll) != null ? _b : "Clear all"
10471
10704
  }
10472
10705
  ),
10473
10706
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -10481,9 +10714,8 @@ function FilterPanel({
10481
10714
  }
10482
10715
  ),
10483
10716
  children: [
10484
- "Show ",
10485
- totalSelected > 0 ? `(${totalSelected})` : "",
10486
- " results"
10717
+ (_c = labels == null ? void 0 : labels.showResults) != null ? _c : "Show results",
10718
+ totalSelected > 0 ? ` (${totalSelected})` : ""
10487
10719
  ]
10488
10720
  }
10489
10721
  )
@@ -10508,7 +10740,7 @@ function FilterPanel({
10508
10740
  }
10509
10741
  ),
10510
10742
  children: [
10511
- "Sort",
10743
+ (_d = labels == null ? void 0 : labels.sortLabel) != null ? _d : "Sort",
10512
10744
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" })
10513
10745
  ]
10514
10746
  }
@@ -10618,14 +10850,15 @@ function FilterPanel({
10618
10850
  className: "inline-flex items-center gap-1 rounded-full px-3 py-1.5 text-xs font-ui font-semibold text-muted-foreground hover:text-foreground transition-colors",
10619
10851
  children: [
10620
10852
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-3 w-3" }),
10621
- "Clear all (",
10853
+ (_e = labels == null ? void 0 : labels.clearAll) != null ? _e : "Clear all",
10854
+ " (",
10622
10855
  totalSelected,
10623
10856
  ")"
10624
10857
  ]
10625
10858
  }
10626
10859
  ),
10627
10860
  sortOptions && sortOptions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
10628
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: "Sort by" }),
10861
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: (_f = labels == null ? void 0 : labels.sortByLabel) != null ? _f : "Sort by" }),
10629
10862
  /* @__PURE__ */ jsxRuntime.jsxs(Popover, { children: [
10630
10863
  /* @__PURE__ */ jsxRuntime.jsxs(
10631
10864
  PopoverTrigger,
@@ -10642,7 +10875,7 @@ function FilterPanel({
10642
10875
  }
10643
10876
  ),
10644
10877
  children: [
10645
- (_b = activeSort == null ? void 0 : activeSort.label) != null ? _b : "Default",
10878
+ (_g = activeSort == null ? void 0 : activeSort.label) != null ? _g : "Default",
10646
10879
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-3.5 w-3.5 text-muted-foreground" })
10647
10880
  ]
10648
10881
  }
@@ -10714,7 +10947,7 @@ function FilterPanel({
10714
10947
  {
10715
10948
  onClick: handleClearAll,
10716
10949
  className: "self-start text-sm text-muted-foreground underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring font-ui",
10717
- children: "Remove all filters"
10950
+ children: (_h = labels == null ? void 0 : labels.removeAllFilters) != null ? _h : "Remove all filters"
10718
10951
  }
10719
10952
  )
10720
10953
  ] });
@@ -10983,7 +11216,7 @@ function Picture(_a) {
10983
11216
  "onLoad",
10984
11217
  "onError"
10985
11218
  ]);
10986
- var _a2;
11219
+ var _a2, _b2;
10987
11220
  const ref = React32__namespace.useRef(null);
10988
11221
  const [visible, setVisible] = React32__namespace.useState(eager);
10989
11222
  const [loaded, setLoaded] = React32__namespace.useState(false);
@@ -11011,8 +11244,9 @@ function Picture(_a) {
11011
11244
  }, [src]);
11012
11245
  const webp = webpVariantUrl(src);
11013
11246
  const realSrc = visible ? src : PLACEHOLDER_SRC;
11247
+ const resolvedTitle = (_a2 = imgProps.title) != null ? _a2 : typeof imgProps.alt === "string" && imgProps.alt.trim() ? imgProps.alt : void 0;
11014
11248
  const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
11015
- const fetchPriorityResolved = (_a2 = imgProps.fetchPriority) != null ? _a2 : eager ? void 0 : "low";
11249
+ const fetchPriorityResolved = (_b2 = imgProps.fetchPriority) != null ? _b2 : eager ? void 0 : "low";
11016
11250
  const handleLoad = (e) => {
11017
11251
  if (visible) setLoaded(true);
11018
11252
  onLoad == null ? void 0 : onLoad(e);
@@ -11038,6 +11272,7 @@ function Picture(_a) {
11038
11272
  onLoad: handleLoad,
11039
11273
  onError: handleError
11040
11274
  }, imgProps), {
11275
+ title: resolvedTitle,
11041
11276
  fetchPriority: fetchPriorityResolved,
11042
11277
  style: mergedStyle
11043
11278
  })
@@ -11061,6 +11296,7 @@ function Picture(_a) {
11061
11296
  onLoad: handleLoad,
11062
11297
  onError: handleError
11063
11298
  }, imgProps), {
11299
+ title: resolvedTitle,
11064
11300
  fetchPriority: fetchPriorityResolved,
11065
11301
  style: mergedStyle
11066
11302
  })
@@ -11355,9 +11591,10 @@ function gridCols(total) {
11355
11591
  function Lightbox({
11356
11592
  photos,
11357
11593
  initialIndex,
11358
- onClose
11594
+ onClose,
11595
+ labels
11359
11596
  }) {
11360
- var _a;
11597
+ var _a, _b, _c, _d;
11361
11598
  const [index, setIndex] = React32__namespace.useState(initialIndex);
11362
11599
  const total = photos.length;
11363
11600
  const photo = photos[index];
@@ -11390,7 +11627,7 @@ function Lightbox({
11390
11627
  type: "button",
11391
11628
  onClick: onClose,
11392
11629
  className: "absolute top-5 right-5 flex h-10 w-10 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors z-10",
11393
- "aria-label": "Close lightbox",
11630
+ "aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
11394
11631
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "h-5 w-5" })
11395
11632
  }
11396
11633
  ),
@@ -11403,7 +11640,7 @@ function Lightbox({
11403
11640
  prev();
11404
11641
  },
11405
11642
  className: "absolute left-4 top-1/2 -translate-y-1/2 flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/25 transition-colors z-10",
11406
- "aria-label": "Previous photo",
11643
+ "aria-label": (_b = labels == null ? void 0 : labels.previous) != null ? _b : "Previous photo",
11407
11644
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
11408
11645
  }
11409
11646
  ),
@@ -11416,7 +11653,7 @@ function Lightbox({
11416
11653
  next();
11417
11654
  },
11418
11655
  className: "absolute right-4 top-1/2 -translate-y-1/2 flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/25 transition-colors z-10",
11419
- "aria-label": "Next photo",
11656
+ "aria-label": (_c = labels == null ? void 0 : labels.next) != null ? _c : "Next photo",
11420
11657
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
11421
11658
  }
11422
11659
  ),
@@ -11424,7 +11661,8 @@ function Lightbox({
11424
11661
  Picture,
11425
11662
  {
11426
11663
  src: photo.src,
11427
- alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
11664
+ alt: (_d = photo.alt) != null ? _d : `Photo ${index + 1}`,
11665
+ title: photo.caption,
11428
11666
  className: "max-w-[calc(100%-6rem)] max-h-[calc(100vh-11rem)] object-contain rounded-lg shadow-2xl",
11429
11667
  onClick: (e) => e.stopPropagation()
11430
11668
  }
@@ -11494,6 +11732,7 @@ function PhotoTile({
11494
11732
  {
11495
11733
  src: photo.src,
11496
11734
  alt: (_b = photo.alt) != null ? _b : `Photo ${index + 1}`,
11735
+ title: photo.caption,
11497
11736
  className: "w-full h-full object-cover transition-transform duration-700 group-hover:scale-105",
11498
11737
  loading: "lazy"
11499
11738
  }
@@ -11507,8 +11746,10 @@ function PhotoTile({
11507
11746
  function ShowMoreButton({
11508
11747
  count,
11509
11748
  expanded,
11510
- onClick
11749
+ onClick,
11750
+ labels
11511
11751
  }) {
11752
+ var _a, _b;
11512
11753
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
11513
11754
  "button",
11514
11755
  {
@@ -11522,10 +11763,11 @@ function ShowMoreButton({
11522
11763
  ),
11523
11764
  children: expanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11524
11765
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
11525
- "Show less"
11766
+ (_a = labels == null ? void 0 : labels.showLess) != null ? _a : "Show less"
11526
11767
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11527
11768
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LayoutGridIcon, { className: "h-4 w-4 text-muted-foreground" }),
11528
- "See more (",
11769
+ (_b = labels == null ? void 0 : labels.seeMore) != null ? _b : "See more",
11770
+ " (",
11529
11771
  count,
11530
11772
  ")"
11531
11773
  ] })
@@ -11535,7 +11777,8 @@ function ShowMoreButton({
11535
11777
  function GridGallery({
11536
11778
  photos,
11537
11779
  initialVisible,
11538
- onOpen
11780
+ onOpen,
11781
+ labels
11539
11782
  }) {
11540
11783
  const [expanded, setExpanded] = React32__namespace.useState(false);
11541
11784
  const cols = gridCols(photos.length);
@@ -11557,7 +11800,8 @@ function GridGallery({
11557
11800
  {
11558
11801
  count: photos.length - initialVisible,
11559
11802
  expanded,
11560
- onClick: () => setExpanded((v) => !v)
11803
+ onClick: () => setExpanded((v) => !v),
11804
+ labels
11561
11805
  }
11562
11806
  )
11563
11807
  ] });
@@ -11565,7 +11809,8 @@ function GridGallery({
11565
11809
  function CompactGridGallery({
11566
11810
  photos,
11567
11811
  initialVisible,
11568
- onOpen
11812
+ onOpen,
11813
+ labels
11569
11814
  }) {
11570
11815
  const [expanded, setExpanded] = React32__namespace.useState(false);
11571
11816
  const hasMore = photos.length > initialVisible;
@@ -11586,7 +11831,8 @@ function CompactGridGallery({
11586
11831
  {
11587
11832
  count: photos.length - initialVisible,
11588
11833
  expanded,
11589
- onClick: () => setExpanded((v) => !v)
11834
+ onClick: () => setExpanded((v) => !v),
11835
+ labels
11590
11836
  }
11591
11837
  )
11592
11838
  ] });
@@ -11594,7 +11840,8 @@ function CompactGridGallery({
11594
11840
  function MasonryGallery({
11595
11841
  photos,
11596
11842
  initialVisible,
11597
- onOpen
11843
+ onOpen,
11844
+ labels
11598
11845
  }) {
11599
11846
  const [expanded, setExpanded] = React32__namespace.useState(false);
11600
11847
  const hasMore = photos.length > initialVisible;
@@ -11615,6 +11862,7 @@ function MasonryGallery({
11615
11862
  {
11616
11863
  src: p.src,
11617
11864
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
11865
+ title: p.caption,
11618
11866
  className: "w-full h-auto object-cover transition-transform duration-700 group-hover:scale-105",
11619
11867
  loading: "lazy"
11620
11868
  }
@@ -11630,7 +11878,8 @@ function MasonryGallery({
11630
11878
  {
11631
11879
  count: photos.length - initialVisible,
11632
11880
  expanded,
11633
- onClick: () => setExpanded((v) => !v)
11881
+ onClick: () => setExpanded((v) => !v),
11882
+ labels
11634
11883
  }
11635
11884
  )
11636
11885
  ] });
@@ -11654,6 +11903,7 @@ function FilmstripGallery({
11654
11903
  {
11655
11904
  src: p.src,
11656
11905
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
11906
+ title: p.caption,
11657
11907
  className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
11658
11908
  loading: "lazy"
11659
11909
  }
@@ -11667,7 +11917,8 @@ function FilmstripGallery({
11667
11917
  }
11668
11918
  function FeaturedGallery({
11669
11919
  photos,
11670
- onOpen
11920
+ onOpen,
11921
+ labels
11671
11922
  }) {
11672
11923
  const [expanded, setExpanded] = React32__namespace.useState(false);
11673
11924
  const featured = photos.slice(0, 3);
@@ -11719,6 +11970,7 @@ function FeaturedGallery({
11719
11970
  {
11720
11971
  src: p.src,
11721
11972
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 4}`,
11973
+ title: p.caption,
11722
11974
  className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
11723
11975
  loading: "lazy"
11724
11976
  }
@@ -11734,7 +11986,8 @@ function FeaturedGallery({
11734
11986
  {
11735
11987
  count: extra.length,
11736
11988
  expanded,
11737
- onClick: () => setExpanded((v) => !v)
11989
+ onClick: () => setExpanded((v) => !v),
11990
+ labels
11738
11991
  }
11739
11992
  )
11740
11993
  ] });
@@ -11802,6 +12055,7 @@ function CarouselGallery({
11802
12055
  {
11803
12056
  src: photo.src,
11804
12057
  alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
12058
+ title: photo.caption,
11805
12059
  className: "h-full w-full object-cover transition-transform duration-500 group-hover/photo:scale-[1.02]",
11806
12060
  loading: "lazy"
11807
12061
  },
@@ -11865,6 +12119,7 @@ function PhotoGallery({
11865
12119
  variant = "grid",
11866
12120
  initialVisible = 6,
11867
12121
  onPhotoClick,
12122
+ labels,
11868
12123
  className
11869
12124
  }) {
11870
12125
  const [lightboxIndex, setLightboxIndex] = React32__namespace.useState(null);
@@ -11880,7 +12135,8 @@ function PhotoGallery({
11880
12135
  {
11881
12136
  photos: normalised,
11882
12137
  initialIndex: lightboxIndex,
11883
- onClose: () => setLightboxIndex(null)
12138
+ onClose: () => setLightboxIndex(null),
12139
+ labels
11884
12140
  }
11885
12141
  );
11886
12142
  if (variant === "carousel" || variant === "fullBleed") {
@@ -11908,7 +12164,8 @@ function PhotoGallery({
11908
12164
  {
11909
12165
  photos: normalised,
11910
12166
  initialVisible,
11911
- onOpen: handleOpen
12167
+ onOpen: handleOpen,
12168
+ labels
11912
12169
  }
11913
12170
  ),
11914
12171
  variant === "gridCompact" && /* @__PURE__ */ jsxRuntime.jsx(
@@ -11916,7 +12173,8 @@ function PhotoGallery({
11916
12173
  {
11917
12174
  photos: normalised,
11918
12175
  initialVisible,
11919
- onOpen: handleOpen
12176
+ onOpen: handleOpen,
12177
+ labels
11920
12178
  }
11921
12179
  ),
11922
12180
  variant === "masonry" && /* @__PURE__ */ jsxRuntime.jsx(
@@ -11924,11 +12182,12 @@ function PhotoGallery({
11924
12182
  {
11925
12183
  photos: normalised,
11926
12184
  initialVisible,
11927
- onOpen: handleOpen
12185
+ onOpen: handleOpen,
12186
+ labels
11928
12187
  }
11929
12188
  ),
11930
12189
  variant === "filmstrip" && /* @__PURE__ */ jsxRuntime.jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
11931
- variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
12190
+ variant === "featured" && /* @__PURE__ */ jsxRuntime.jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen, labels }),
11932
12191
  variant === "collage" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
11933
12192
  variant === "collageTight" && /* @__PURE__ */ jsxRuntime.jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
11934
12193
  lightbox
@@ -12198,6 +12457,8 @@ function PricingTrip({
12198
12457
  departureTimes,
12199
12458
  onBook,
12200
12459
  bookLabel = "Check availability",
12460
+ fromLabel = "From",
12461
+ perPersonLabel = "per person",
12201
12462
  variant = "card",
12202
12463
  sharp = false,
12203
12464
  belowPrice,
@@ -12224,13 +12485,16 @@ function PricingTrip({
12224
12485
  ),
12225
12486
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center gap-3", children: [
12226
12487
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
12227
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
12488
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
12228
12489
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-1.5 flex-wrap", children: [
12229
12490
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg font-bold text-foreground font-heading leading-none", children: [
12230
12491
  currency,
12231
12492
  " ",
12232
12493
  priceFrom,
12233
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: "/ per person" })
12494
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: [
12495
+ "/ ",
12496
+ perPersonLabel
12497
+ ] })
12234
12498
  ] }),
12235
12499
  (priceInfo || currencyEstimates && currencyEstimates.length > 0) && /* @__PURE__ */ jsxRuntime.jsx(
12236
12500
  "button",
@@ -12342,7 +12606,7 @@ function PricingTrip({
12342
12606
  ] }),
12343
12607
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
12344
12608
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "shrink-0 text-right", children: [
12345
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
12609
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
12346
12610
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xl font-bold text-foreground font-heading leading-none", children: [
12347
12611
  currency,
12348
12612
  " ",
@@ -12371,13 +12635,16 @@ function PricingTrip({
12371
12635
  }
12372
12636
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
12373
12637
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12374
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: "From" }),
12638
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: fromLabel }),
12375
12639
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-2xl font-bold text-foreground font-heading flex items-center gap-2 flex-wrap", children: [
12376
12640
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
12377
12641
  currency,
12378
12642
  " ",
12379
12643
  priceFrom,
12380
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: " / per person" })
12644
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: [
12645
+ " / ",
12646
+ perPersonLabel
12647
+ ] })
12381
12648
  ] }),
12382
12649
  priceInfo && /* @__PURE__ */ jsxRuntime.jsx(
12383
12650
  "button",
@@ -12644,8 +12911,10 @@ function SiteHeader({
12644
12911
  onSearch,
12645
12912
  onAccount,
12646
12913
  position = variant === "transparent" ? "overlay" : "fixed",
12914
+ labels,
12647
12915
  className
12648
12916
  }) {
12917
+ var _a, _b, _c, _d, _e, _f, _g;
12649
12918
  const t = VARIANT[variant];
12650
12919
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
12651
12920
  const [openMenu, setOpenMenu] = React32__namespace.useState(null);
@@ -12703,7 +12972,7 @@ function SiteHeader({
12703
12972
  {
12704
12973
  type: "button",
12705
12974
  onClick: () => setMobileOpen(true),
12706
- "aria-label": "Open menu",
12975
+ "aria-label": (_a = labels == null ? void 0 : labels.openMenu) != null ? _a : "Open menu",
12707
12976
  className: cn(
12708
12977
  "flex lg:hidden h-9 w-9 items-center justify-center rounded-full transition-colors -ml-1.5",
12709
12978
  t.mobileTrigger
@@ -12732,8 +13001,8 @@ function SiteHeader({
12732
13001
  }
12733
13002
  ),
12734
13003
  /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "hidden lg:flex items-center gap-0.5 mx-auto", children: links.map((link) => {
12735
- var _a, _b;
12736
- const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
13004
+ var _a2, _b2;
13005
+ const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
12737
13006
  const isOpen = openMenu === link.label;
12738
13007
  return /* @__PURE__ */ jsxRuntime.jsxs(
12739
13008
  "div",
@@ -12745,7 +13014,7 @@ function SiteHeader({
12745
13014
  /* @__PURE__ */ jsxRuntime.jsxs(
12746
13015
  "a",
12747
13016
  {
12748
- href: (_b = link.href) != null ? _b : "#",
13017
+ href: (_b2 = link.href) != null ? _b2 : "#",
12749
13018
  onClick: hasDropdown ? (e) => e.preventDefault() : void 0,
12750
13019
  className: cn(
12751
13020
  "flex items-center gap-1 px-3.5 py-1.5 rounded-full",
@@ -12794,7 +13063,7 @@ function SiteHeader({
12794
13063
  "button",
12795
13064
  {
12796
13065
  type: "button",
12797
- "aria-label": "Language",
13066
+ "aria-label": (_b = labels == null ? void 0 : labels.language) != null ? _b : "Language",
12798
13067
  className: cn(
12799
13068
  "flex items-center gap-0.5 px-2.5 py-1.5 rounded-full",
12800
13069
  "text-sm font-ui transition-colors",
@@ -12834,7 +13103,7 @@ function SiteHeader({
12834
13103
  {
12835
13104
  type: "button",
12836
13105
  onClick: onSearch,
12837
- "aria-label": "Search",
13106
+ "aria-label": (_c = labels == null ? void 0 : labels.search) != null ? _c : "Search",
12838
13107
  className: cn(
12839
13108
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12840
13109
  t.icon
@@ -12847,7 +13116,7 @@ function SiteHeader({
12847
13116
  {
12848
13117
  type: "button",
12849
13118
  onClick: onAccount,
12850
- "aria-label": "Account",
13119
+ "aria-label": (_d = labels == null ? void 0 : labels.account) != null ? _d : "Account",
12851
13120
  className: cn(
12852
13121
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12853
13122
  t.icon
@@ -12880,7 +13149,7 @@ function SiteHeader({
12880
13149
  {
12881
13150
  type: "button",
12882
13151
  onClick: () => setMobileOpen(false),
12883
- "aria-label": "Close menu",
13152
+ "aria-label": (_e = labels == null ? void 0 : labels.closeMenu) != null ? _e : "Close menu",
12884
13153
  className: cn(
12885
13154
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12886
13155
  t.mobileTrigger
@@ -12890,8 +13159,8 @@ function SiteHeader({
12890
13159
  )
12891
13160
  ] }),
12892
13161
  /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "flex-1 overflow-y-auto px-6 py-6 flex flex-col gap-1", children: links.map((link) => {
12893
- var _a, _b;
12894
- const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
13162
+ var _a2, _b2;
13163
+ const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
12895
13164
  const isExpanded = openMobileSection === link.label;
12896
13165
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12897
13166
  hasDropdown ? /* @__PURE__ */ jsxRuntime.jsxs(
@@ -12919,7 +13188,7 @@ function SiteHeader({
12919
13188
  ) : /* @__PURE__ */ jsxRuntime.jsx(
12920
13189
  "a",
12921
13190
  {
12922
- href: (_b = link.href) != null ? _b : "#",
13191
+ href: (_b2 = link.href) != null ? _b2 : "#",
12923
13192
  onClick: () => setMobileOpen(false),
12924
13193
  className: cn(
12925
13194
  "flex items-center py-4 text-xl font-ui font-black transition-colors border-b border-white/8",
@@ -12929,11 +13198,11 @@ function SiteHeader({
12929
13198
  }
12930
13199
  ),
12931
13200
  hasDropdown && isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0 pl-4 pb-2", children: link.items.map((item) => {
12932
- var _a2;
13201
+ var _a3;
12933
13202
  return /* @__PURE__ */ jsxRuntime.jsx(
12934
13203
  "a",
12935
13204
  {
12936
- href: (_a2 = item.href) != null ? _a2 : "#",
13205
+ href: (_a3 = item.href) != null ? _a3 : "#",
12937
13206
  onClick: () => setMobileOpen(false),
12938
13207
  className: cn(
12939
13208
  "py-3 text-base font-ui font-bold transition-colors border-b",
@@ -12986,7 +13255,7 @@ function SiteHeader({
12986
13255
  onSearch == null ? void 0 : onSearch();
12987
13256
  setMobileOpen(false);
12988
13257
  },
12989
- "aria-label": "Search",
13258
+ "aria-label": (_f = labels == null ? void 0 : labels.search) != null ? _f : "Search",
12990
13259
  className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
12991
13260
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "h-[18px] w-[18px]" })
12992
13261
  }
@@ -12999,7 +13268,7 @@ function SiteHeader({
12999
13268
  onAccount == null ? void 0 : onAccount();
13000
13269
  setMobileOpen(false);
13001
13270
  },
13002
- "aria-label": "Account",
13271
+ "aria-label": (_g = labels == null ? void 0 : labels.account) != null ? _g : "Account",
13003
13272
  className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
13004
13273
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserIcon, { className: "h-[18px] w-[18px]" })
13005
13274
  }
@@ -13149,9 +13418,11 @@ function HeartIcon({ filled = false }) {
13149
13418
  );
13150
13419
  }
13151
13420
  function TripCardEditorial(props) {
13421
+ var _a, _b, _c, _d;
13152
13422
  const {
13153
13423
  image,
13154
13424
  imageAlt = "",
13425
+ labels,
13155
13426
  title,
13156
13427
  description,
13157
13428
  nights,
@@ -13209,7 +13480,7 @@ function TripCardEditorial(props) {
13209
13480
  "button",
13210
13481
  {
13211
13482
  type: "button",
13212
- "aria-label": favorited ? "Remove from favorites" : "Add to favorites",
13483
+ "aria-label": favorited ? (_a = labels == null ? void 0 : labels.removeFromFavorites) != null ? _a : "Remove from favorites" : (_b = labels == null ? void 0 : labels.addToFavorites) != null ? _b : "Add to favorites",
13213
13484
  "aria-pressed": favorited,
13214
13485
  onClick: handleFav,
13215
13486
  className: cn(
@@ -13253,7 +13524,7 @@ function TripCardEditorial(props) {
13253
13524
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13254
13525
  nights,
13255
13526
  " ",
13256
- nights === 1 ? "night" : "nights"
13527
+ nights === 1 ? (_c = labels == null ? void 0 : labels.night) != null ? _c : "night" : (_d = labels == null ? void 0 : labels.nights) != null ? _d : "nights"
13257
13528
  ] })
13258
13529
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
13259
13530
  price && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
@@ -13278,12 +13549,14 @@ function TripCardEditorial(props) {
13278
13549
  ] });
13279
13550
  }
13280
13551
  function TripCard(props) {
13552
+ var _a, _b;
13281
13553
  if (props.variant === "editorial") {
13282
13554
  return /* @__PURE__ */ jsxRuntime.jsx(TripCardEditorial, __spreadValues({}, props));
13283
13555
  }
13284
13556
  const {
13285
13557
  image,
13286
13558
  imageAlt = "",
13559
+ labels,
13287
13560
  status,
13288
13561
  nights,
13289
13562
  period,
@@ -13296,6 +13569,7 @@ function TripCard(props) {
13296
13569
  } = props;
13297
13570
  const s = sizeConfig[size];
13298
13571
  const statusInfo = status ? statusConfig[status] : null;
13572
+ const statusLabel = statusInfo ? status === "sold-out" ? (_a = labels == null ? void 0 : labels.soldOut) != null ? _a : statusInfo.label : status === "trending" ? (_b = labels == null ? void 0 : labels.trending) != null ? _b : statusInfo.label : statusInfo.label : null;
13299
13573
  const meta = [
13300
13574
  nights ? `${nights} nights` : null,
13301
13575
  period != null ? period : null
@@ -13321,7 +13595,7 @@ function TripCard(props) {
13321
13595
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent" }),
13322
13596
  statusInfo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-1.5 rounded-xl bg-card/90 px-3 py-1.5 backdrop-blur-sm shadow-sm", children: [
13323
13597
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: statusInfo.icon }),
13324
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusInfo.label })
13598
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusLabel })
13325
13599
  ] }) }),
13326
13600
  !statusInfo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10" }),
13327
13601
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
@@ -13415,6 +13689,7 @@ function BlogCard({
13415
13689
  {
13416
13690
  src: image,
13417
13691
  alt: imageAlt,
13692
+ title: imageAlt || void 0,
13418
13693
  loading: "lazy",
13419
13694
  className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
13420
13695
  }
@@ -13768,6 +14043,8 @@ function TripHeader({
13768
14043
  breadcrumb,
13769
14044
  destination,
13770
14045
  duration,
14046
+ groupSize,
14047
+ labels,
13771
14048
  tagline,
13772
14049
  chips,
13773
14050
  belowMeta,
@@ -13775,7 +14052,7 @@ function TripHeader({
13775
14052
  uiVariant = "v1",
13776
14053
  className
13777
14054
  }) {
13778
- var _a;
14055
+ var _a, _b, _c, _d, _e, _f, _g;
13779
14056
  const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
13780
14057
  const [videoReady, setVideoReady] = React32__namespace.useState(false);
13781
14058
  const videoRef = React32__namespace.useRef(null);
@@ -13793,7 +14070,7 @@ function TripHeader({
13793
14070
  const currentSrc = heroSrc(safeIndex);
13794
14071
  const showCarousel = !videoUrl && validImages.length > 1;
13795
14072
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
13796
- const hasMeta = !!(destination || duration);
14073
+ const hasMeta = !!(destination || duration || groupSize);
13797
14074
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13798
14075
  React32__namespace.useEffect(() => {
13799
14076
  if (!videoUrl) return;
@@ -13900,7 +14177,7 @@ function TripHeader({
13900
14177
  (i) => (i - 1 + validImages.length) % validImages.length
13901
14178
  ),
13902
14179
  className: "absolute left-4 top-1/2 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
13903
- "aria-label": "Imagem anterior",
14180
+ "aria-label": (_b = labels == null ? void 0 : labels.previousImage) != null ? _b : "Previous image",
13904
14181
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
13905
14182
  }
13906
14183
  ),
@@ -13910,7 +14187,7 @@ function TripHeader({
13910
14187
  type: "button",
13911
14188
  onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
13912
14189
  className: "absolute right-4 top-1/2 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
13913
- "aria-label": "Pr\xF3xima imagem",
14190
+ "aria-label": (_c = labels == null ? void 0 : labels.nextImage) != null ? _c : "Next image",
13914
14191
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
13915
14192
  }
13916
14193
  ),
@@ -13953,15 +14230,19 @@ function TripHeader({
13953
14230
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13954
14231
  nights,
13955
14232
  " ",
13956
- nights === 1 ? "noite" : "noites"
14233
+ nights === 1 ? (_d = labels == null ? void 0 : labels.night) != null ? _d : "night" : (_e = labels == null ? void 0 : labels.nights) != null ? _e : "nights"
13957
14234
  ] }),
13958
14235
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white/40", children: "\xB7" }),
13959
14236
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
13960
14237
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13961
14238
  duration.days,
13962
14239
  " ",
13963
- duration.days === 1 ? "dia" : "dias"
14240
+ duration.days === 1 ? (_f = labels == null ? void 0 : labels.day) != null ? _f : "day" : (_g = labels == null ? void 0 : labels.days) != null ? _g : "days"
13964
14241
  ] })
14242
+ ] }),
14243
+ groupSize && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-white/85", children: [
14244
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
14245
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-semibold", children: groupSize })
13965
14246
  ] })
13966
14247
  ] }) : tagline ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm sm:text-base text-white/80 font-ui", children: tagline }) : null,
13967
14248
  chips && chips.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex flex-wrap items-center gap-1.5", children: chips.map((chip, i) => /* @__PURE__ */ jsxRuntime.jsx(Chip, { href: chip.href, children: chip.label }, i)) }),
@@ -14406,7 +14687,10 @@ function Stars({ count = 5 }) {
14406
14687
  i
14407
14688
  )) });
14408
14689
  }
14409
- function ItineraryTimeline({ steps }) {
14690
+ function ItineraryTimeline({
14691
+ steps,
14692
+ transferLabel
14693
+ }) {
14410
14694
  return /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "relative flex flex-col gap-0", children: steps.map((step, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "relative flex gap-4 pb-8 last:pb-0", children: [
14411
14695
  i < steps.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-3.5 top-7 bottom-0 w-px bg-border" }),
14412
14696
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 mt-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-full border-2 border-primary bg-background", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-bold text-primary font-ui", children: i + 1 }) }),
@@ -14417,7 +14701,7 @@ function ItineraryTimeline({ steps }) {
14417
14701
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "h-3 w-3 mr-1" }),
14418
14702
  step.duration
14419
14703
  ] }),
14420
- step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: "Transfer" })
14704
+ step.isTransfer && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: transferLabel != null ? transferLabel : "Transfer" })
14421
14705
  ] }),
14422
14706
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-muted-foreground leading-relaxed [&_p:not(:last-child)]:mb-2 [&_strong]:text-foreground [&_strong]:font-semibold", children: step.description })
14423
14707
  ] })
@@ -14434,6 +14718,7 @@ function TripPage({
14434
14718
  tagline,
14435
14719
  destination,
14436
14720
  duration,
14721
+ groupSize,
14437
14722
  images,
14438
14723
  videoUrl,
14439
14724
  breadcrumb,
@@ -14457,6 +14742,7 @@ function TripPage({
14457
14742
  whenItOperates,
14458
14743
  food,
14459
14744
  foodGallery,
14745
+ foodGalleryVariant = "gridCompact",
14460
14746
  termsAndConditions,
14461
14747
  meetingPoints,
14462
14748
  meetingPoint,
@@ -14476,7 +14762,13 @@ function TripPage({
14476
14762
  currencyEstimates,
14477
14763
  priceInfo,
14478
14764
  onBook,
14765
+ onBookingSubmit,
14766
+ bookingLoading,
14767
+ bookingDefaults,
14768
+ bookingLabels,
14479
14769
  bookLabel,
14770
+ fromLabel,
14771
+ perPersonLabel,
14480
14772
  siteHeader,
14481
14773
  uiVariant = "v1",
14482
14774
  features,
@@ -14653,6 +14945,15 @@ function TripPage({
14653
14945
  breadcrumb,
14654
14946
  destination,
14655
14947
  duration,
14948
+ groupSize,
14949
+ labels: {
14950
+ night: labels == null ? void 0 : labels.night,
14951
+ nights: labels == null ? void 0 : labels.nights,
14952
+ day: labels == null ? void 0 : labels.day,
14953
+ days: labels == null ? void 0 : labels.days,
14954
+ previousImage: labels == null ? void 0 : labels.previousImage,
14955
+ nextImage: labels == null ? void 0 : labels.nextImage
14956
+ },
14656
14957
  tagline,
14657
14958
  chips,
14658
14959
  siteHeader,
@@ -14713,7 +15014,7 @@ function TripPage({
14713
15014
  )) })
14714
15015
  ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
14715
15016
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
14716
- /* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary })
15017
+ /* @__PURE__ */ jsxRuntime.jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
14717
15018
  ] }),
14718
15019
  included && included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
14719
15020
  /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
@@ -14750,7 +15051,7 @@ function TripPage({
14750
15051
  id: "trip-section-when-it-operates",
14751
15052
  className: "scroll-mt-20 border-b border-border",
14752
15053
  children: [
14753
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15054
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14754
15055
  (sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-5 w-5 text-primary" }),
14755
15056
  (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
14756
15057
  ] }) }),
@@ -14765,7 +15066,7 @@ function TripPage({
14765
15066
  id: "trip-section-accommodation",
14766
15067
  className: "scroll-mt-20 border-b border-border",
14767
15068
  children: [
14768
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15069
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14769
15070
  (sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
14770
15071
  (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
14771
15072
  ] }) }),
@@ -14774,6 +15075,13 @@ function TripPage({
14774
15075
  accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
14775
15076
  PhotoGallery,
14776
15077
  {
15078
+ labels: {
15079
+ seeMore: labels == null ? void 0 : labels.seeMore,
15080
+ showLess: labels == null ? void 0 : labels.showLess,
15081
+ close: labels == null ? void 0 : labels.galleryClose,
15082
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15083
+ next: labels == null ? void 0 : labels.galleryNext
15084
+ },
14777
15085
  photos: accommodationGallery,
14778
15086
  variant: accommodationGalleryVariant,
14779
15087
  initialVisible: 6
@@ -14790,7 +15098,7 @@ function TripPage({
14790
15098
  id: "trip-section-food",
14791
15099
  className: "scroll-mt-20 border-b border-border",
14792
15100
  children: [
14793
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15101
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14794
15102
  (sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UtensilsIcon, { className: "h-5 w-5 text-primary" }),
14795
15103
  (_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
14796
15104
  ] }) }),
@@ -14799,8 +15107,15 @@ function TripPage({
14799
15107
  foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsxRuntime.jsx(
14800
15108
  PhotoGallery,
14801
15109
  {
15110
+ labels: {
15111
+ seeMore: labels == null ? void 0 : labels.seeMore,
15112
+ showLess: labels == null ? void 0 : labels.showLess,
15113
+ close: labels == null ? void 0 : labels.galleryClose,
15114
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15115
+ next: labels == null ? void 0 : labels.galleryNext
15116
+ },
14802
15117
  photos: foodGallery,
14803
- variant: "gridCompact",
15118
+ variant: foodGalleryVariant,
14804
15119
  initialVisible: 6
14805
15120
  }
14806
15121
  ) })
@@ -14815,18 +15130,21 @@ function TripPage({
14815
15130
  id: "trip-section-meeting",
14816
15131
  className: "scroll-mt-20 border-b border-border",
14817
15132
  children: [
14818
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15133
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14819
15134
  (sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-5 w-5 text-primary" }),
14820
15135
  (_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
14821
15136
  ] }) }),
14822
- /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
14823
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
14824
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
14825
- mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? "Activity location" : mp.type === "alternative" ? "Alternative meeting point" : "Meeting point" }),
14826
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
14827
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
14828
- ] })
14829
- ] }, i)) }) })
15137
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
15138
+ var _a2, _b2, _c2;
15139
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15140
+ /* @__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" }) }),
15141
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
15142
+ mp.type && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? (_a2 = labels == null ? void 0 : labels.meetingPointActivity) != null ? _a2 : "Activity location" : mp.type === "alternative" ? (_b2 = labels == null ? void 0 : labels.meetingPointAlternative) != null ? _b2 : "Alternative meeting point" : (_c2 = labels == null ? void 0 : labels.meetingPoint) != null ? _c2 : "Meeting point" }),
15143
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15144
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15145
+ ] })
15146
+ ] }, i);
15147
+ }) }) })
14830
15148
  ]
14831
15149
  }
14832
15150
  ),
@@ -14837,7 +15155,7 @@ function TripPage({
14837
15155
  id: "trip-section-how-to-get-there",
14838
15156
  className: "scroll-mt-20 border-b border-border",
14839
15157
  children: [
14840
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15158
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14841
15159
  (sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CompassIcon, { className: "h-5 w-5 text-primary" }),
14842
15160
  (_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
14843
15161
  ] }) }),
@@ -14852,7 +15170,7 @@ function TripPage({
14852
15170
  id: "trip-section-weather",
14853
15171
  className: "scroll-mt-20 border-b border-border",
14854
15172
  children: [
14855
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15173
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14856
15174
  (sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SunIcon, { className: "h-5 w-5 text-primary" }),
14857
15175
  (_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
14858
15176
  ] }) }),
@@ -14867,7 +15185,7 @@ function TripPage({
14867
15185
  id: "trip-section-what-to-bring",
14868
15186
  className: "scroll-mt-20 border-b border-border",
14869
15187
  children: [
14870
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15188
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14871
15189
  (sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BackpackIcon, { className: "h-5 w-5 text-primary" }),
14872
15190
  (_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
14873
15191
  ] }) }),
@@ -14882,7 +15200,7 @@ function TripPage({
14882
15200
  id: "trip-section-optional-extras",
14883
15201
  className: "scroll-mt-20 border-b border-border",
14884
15202
  children: [
14885
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15203
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14886
15204
  (sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CherryIcon, { className: "h-5 w-5 text-primary" }),
14887
15205
  (_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
14888
15206
  ] }) }),
@@ -14897,7 +15215,7 @@ function TripPage({
14897
15215
  id: "trip-section-terms",
14898
15216
  className: "scroll-mt-20 border-b border-border",
14899
15217
  children: [
14900
- /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
15218
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
14901
15219
  (sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ReceiptIcon, { className: "h-5 w-5 text-primary" }),
14902
15220
  (_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
14903
15221
  ] }) }),
@@ -14909,7 +15227,7 @@ function TripPage({
14909
15227
  }
14910
15228
  ),
14911
15229
  faqs && faqs.length > 0 && (() => {
14912
- var _a2;
15230
+ var _a2, _b2, _c2;
14913
15231
  const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
14914
15232
  const hiddenCount = faqs.length - visibleFaqs.length;
14915
15233
  return /* @__PURE__ */ jsxRuntime.jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
@@ -14931,10 +15249,11 @@ function TripPage({
14931
15249
  ),
14932
15250
  children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14933
15251
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
14934
- "Show less"
15252
+ (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
14935
15253
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14936
15254
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
14937
- "See more (",
15255
+ (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
15256
+ " (",
14938
15257
  hiddenCount,
14939
15258
  ")"
14940
15259
  ] })
@@ -14975,6 +15294,8 @@ function TripPage({
14975
15294
  departureTimes,
14976
15295
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
14977
15296
  bookLabel: bookLabel != null ? bookLabel : "Check availability",
15297
+ fromLabel,
15298
+ perPersonLabel,
14978
15299
  variant: "card",
14979
15300
  belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
14980
15301
  benefits,
@@ -15017,6 +15338,8 @@ function TripPage({
15017
15338
  departureTimes,
15018
15339
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15019
15340
  bookLabel: bookLabel != null ? bookLabel : "Check availability",
15341
+ fromLabel,
15342
+ perPersonLabel,
15020
15343
  variant: "card",
15021
15344
  belowPrice: trustpilotMini ? /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15022
15345
  benefits,
@@ -15029,12 +15352,27 @@ function TripPage({
15029
15352
  gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsxRuntime.jsx(
15030
15353
  PhotoGallery,
15031
15354
  {
15355
+ labels: {
15356
+ seeMore: labels == null ? void 0 : labels.seeMore,
15357
+ showLess: labels == null ? void 0 : labels.showLess,
15358
+ close: labels == null ? void 0 : labels.galleryClose,
15359
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15360
+ next: labels == null ? void 0 : labels.galleryNext
15361
+ },
15032
15362
  photos: gallery,
15033
15363
  variant: "gridCompact",
15034
15364
  initialVisible: 8
15035
15365
  }
15036
15366
  ) }),
15037
- gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(BookingForm, { onSubmit: onBook ? (values) => onBook() : void 0 }) }) }),
15367
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
15368
+ BookingForm,
15369
+ {
15370
+ labels: bookingLabels,
15371
+ defaultValues: bookingDefaults,
15372
+ onSubmit: onBookingSubmit,
15373
+ loading: bookingLoading
15374
+ }
15375
+ ) }) }),
15038
15376
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed bottom-0 inset-x-0 z-30 lg:hidden border-t border-border bg-background/95 backdrop-blur-sm px-4 py-3", children: /* @__PURE__ */ jsxRuntime.jsx(
15039
15377
  PricingTrip,
15040
15378
  {
@@ -15042,6 +15380,8 @@ function TripPage({
15042
15380
  currency,
15043
15381
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15044
15382
  bookLabel: bookLabel != null ? bookLabel : "Book now",
15383
+ fromLabel,
15384
+ perPersonLabel,
15045
15385
  variant: "compact",
15046
15386
  sharp: true,
15047
15387
  priceInfo,
@@ -15075,6 +15415,7 @@ function CategoryPage2({
15075
15415
  trustpilotMini,
15076
15416
  breadcrumb,
15077
15417
  siteHeader,
15418
+ heroRightSlot,
15078
15419
  popularTours,
15079
15420
  popularToursTitle = "More adventures calling your name",
15080
15421
  popularToursEyebrow = "Popular tours",
@@ -15085,6 +15426,7 @@ function CategoryPage2({
15085
15426
  sortOptions,
15086
15427
  defaultSort,
15087
15428
  tripsInitialCount = 15,
15429
+ tripListingSlot,
15088
15430
  trustpilot,
15089
15431
  reviewsTitle = "Don't just take our word for it",
15090
15432
  reviewsSubtitle,
@@ -15101,6 +15443,12 @@ function CategoryPage2({
15101
15443
  faqInitialCount = 5,
15102
15444
  gallery,
15103
15445
  galleryTitle,
15446
+ loadMoreLabel,
15447
+ showLessLabel,
15448
+ seeMoreLabel,
15449
+ viewAllPostsLabel,
15450
+ cardLabels,
15451
+ filterLabels,
15104
15452
  className
15105
15453
  }) {
15106
15454
  var _a;
@@ -15257,7 +15605,8 @@ function CategoryPage2({
15257
15605
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight max-w-3xl", children: title }),
15258
15606
  intro && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 text-base sm:text-lg text-white/90 leading-relaxed max-w-2xl [&_strong]:font-semibold [&_a]:underline", children: intro }),
15259
15607
  trustpilotMini && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 max-w-sm", children: /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: trustpilotMini }) })
15260
- ] })
15608
+ ] }),
15609
+ heroRightSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-5 z-20 sm:bottom-6", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex max-w-6xl justify-end px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-auto", children: heroRightSlot }) }) })
15261
15610
  ]
15262
15611
  }
15263
15612
  ),
@@ -15275,6 +15624,7 @@ function CategoryPage2({
15275
15624
  return /* @__PURE__ */ jsxRuntime.jsx(
15276
15625
  TripCard,
15277
15626
  __spreadProps(__spreadValues({}, cardProps), {
15627
+ labels: cardLabels,
15278
15628
  variant: "overlay",
15279
15629
  size: (_b = cardProps.size) != null ? _b : "md"
15280
15630
  }),
@@ -15284,63 +15634,68 @@ function CategoryPage2({
15284
15634
  ] }),
15285
15635
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 pt-6 sm:pt-8 pb-12", children: [
15286
15636
  (tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsxRuntime.jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
15287
- filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsxRuntime.jsx(
15288
- FilterPanel,
15289
- {
15290
- variant: "horizontal",
15291
- groups: filterGroups,
15292
- value: filterValue,
15293
- onChange: setFilterValue,
15294
- onClearAll: () => setFilterValue({}),
15295
- sortOptions,
15296
- sort,
15297
- onSortChange: setSort
15298
- }
15299
- ) }),
15300
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
15301
- sortedTrips.length,
15302
- " ",
15303
- sortedTrips.length === 1 ? "trip" : "trips",
15304
- " found"
15305
- ] }),
15306
- (() => {
15307
- const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
15308
- const hiddenCount = sortedTrips.length - visibleTrips.length;
15309
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15310
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-6 gap-y-8 lg:gap-x-[35px] lg:gap-y-[38px]", children: visibleTrips.map((trip, i) => {
15311
- const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
15312
- return /* @__PURE__ */ jsxRuntime.jsx(
15313
- TripCard,
15314
- __spreadProps(__spreadValues({}, cardProps), {
15315
- className: cn("w-full h-auto", cardProps.className)
15316
- }),
15317
- i
15318
- );
15319
- }) }),
15320
- sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
15321
- "button",
15322
- {
15323
- type: "button",
15324
- onClick: () => setTripsExpanded((v) => !v),
15325
- className: cn(
15326
- "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15327
- "text-sm font-semibold text-foreground shadow-sm",
15328
- "hover:bg-muted transition-colors duration-150",
15329
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15330
- ),
15331
- children: tripsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15332
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15333
- "Show less"
15334
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15335
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15336
- "Load more (",
15337
- hiddenCount,
15338
- ")"
15339
- ] })
15340
- }
15341
- ) })
15342
- ] });
15343
- })()
15637
+ tripListingSlot != null ? tripListingSlot : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15638
+ filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsxRuntime.jsx(
15639
+ FilterPanel,
15640
+ {
15641
+ variant: "horizontal",
15642
+ labels: filterLabels,
15643
+ groups: filterGroups,
15644
+ value: filterValue,
15645
+ onChange: setFilterValue,
15646
+ onClearAll: () => setFilterValue({}),
15647
+ sortOptions,
15648
+ sort,
15649
+ onSortChange: setSort
15650
+ }
15651
+ ) }),
15652
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
15653
+ sortedTrips.length,
15654
+ " ",
15655
+ sortedTrips.length === 1 ? "trip" : "trips",
15656
+ " found"
15657
+ ] }),
15658
+ (() => {
15659
+ const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
15660
+ const hiddenCount = sortedTrips.length - visibleTrips.length;
15661
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15662
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-6 gap-y-8 lg:gap-x-[35px] lg:gap-y-[38px]", children: visibleTrips.map((trip, i) => {
15663
+ const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
15664
+ return /* @__PURE__ */ jsxRuntime.jsx(
15665
+ TripCard,
15666
+ __spreadProps(__spreadValues({}, cardProps), {
15667
+ labels: cardLabels,
15668
+ className: cn("w-full h-auto", cardProps.className)
15669
+ }),
15670
+ i
15671
+ );
15672
+ }) }),
15673
+ sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
15674
+ "button",
15675
+ {
15676
+ type: "button",
15677
+ onClick: () => setTripsExpanded((v) => !v),
15678
+ className: cn(
15679
+ "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15680
+ "text-sm font-semibold text-foreground shadow-sm",
15681
+ "hover:bg-muted transition-colors duration-150",
15682
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15683
+ ),
15684
+ children: tripsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15685
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15686
+ showLessLabel != null ? showLessLabel : "Show less"
15687
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15688
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15689
+ loadMoreLabel != null ? loadMoreLabel : "Load more",
15690
+ " (",
15691
+ hiddenCount,
15692
+ ")"
15693
+ ] })
15694
+ }
15695
+ ) })
15696
+ ] });
15697
+ })()
15698
+ ] })
15344
15699
  ] }),
15345
15700
  trustpilot && /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12 border-t border-border", children: [
15346
15701
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground font-heading mb-2", children: reviewsTitle }),
@@ -15377,7 +15732,7 @@ function CategoryPage2({
15377
15732
  href: travelGuideHref != null ? travelGuideHref : blogPostsViewAllHref,
15378
15733
  className: "inline-flex items-center gap-1.5 text-sm font-semibold text-primary hover:underline",
15379
15734
  children: [
15380
- travelGuideHref ? travelGuideLabel : "View all posts",
15735
+ travelGuideHref ? travelGuideLabel : viewAllPostsLabel != null ? viewAllPostsLabel : "View all posts",
15381
15736
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4" })
15382
15737
  ]
15383
15738
  }
@@ -15406,10 +15761,11 @@ function CategoryPage2({
15406
15761
  ),
15407
15762
  children: faqsExpanded ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15408
15763
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15409
- "Show less"
15764
+ showLessLabel != null ? showLessLabel : "Show less"
15410
15765
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15411
15766
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15412
- "See more (",
15767
+ seeMoreLabel != null ? seeMoreLabel : "See more",
15768
+ " (",
15413
15769
  hiddenCount,
15414
15770
  ")"
15415
15771
  ] })
@@ -15477,6 +15833,7 @@ function ActivityCard({
15477
15833
  {
15478
15834
  src: image,
15479
15835
  alt: imageAlt,
15836
+ title: imageAlt || void 0,
15480
15837
  className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
15481
15838
  }
15482
15839
  ),
@@ -17178,13 +17535,1410 @@ function StickyBookingCard({
17178
17535
  }
17179
17536
  );
17180
17537
  }
17538
+ var DEFAULT_TRUSTPILOT = {
17539
+ businessUnitId: "6171e6a56fc555750dd81ae7",
17540
+ templateId: "5419b732fbfb950b10de65e5",
17541
+ locale: "en-US",
17542
+ styleHeight: "24px",
17543
+ styleWidth: "100%",
17544
+ token: "d3580e48-fedc-4b14-b705-172180cf241d",
17545
+ theme: "dark",
17546
+ fallbackHref: "https://www.trustpilot.com/review/planetaexo.com",
17547
+ fallbackLabel: "Excellent"
17548
+ };
17549
+ function RatingStars({ stars = 5 }) {
17550
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", "aria-hidden": true, children: Array.from({ length: 5 }).map((_, i) => {
17551
+ const filled = i + 1 <= Math.round(stars);
17552
+ return /* @__PURE__ */ jsxRuntime.jsx(
17553
+ "span",
17554
+ {
17555
+ className: cn(
17556
+ "flex h-5 w-5 items-center justify-center rounded-[3px]",
17557
+ filled ? "bg-primary" : "bg-white/30"
17558
+ ),
17559
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.StarIcon, { className: "h-3 w-3 fill-white text-white" })
17560
+ },
17561
+ i
17562
+ );
17563
+ }) });
17564
+ }
17565
+ function Rating({ label, stars = 5, provider, href }) {
17566
+ const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17567
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-ui font-bold text-white", children: label }),
17568
+ /* @__PURE__ */ jsxRuntime.jsx(RatingStars, { stars }),
17569
+ provider && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1 text-sm font-ui font-bold text-white", children: [
17570
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.StarIcon, { className: "h-4 w-4 fill-primary text-primary" }),
17571
+ provider
17572
+ ] })
17573
+ ] });
17574
+ if (href) {
17575
+ return /* @__PURE__ */ jsxRuntime.jsx(
17576
+ "a",
17577
+ {
17578
+ href,
17579
+ target: "_blank",
17580
+ rel: "noreferrer noopener",
17581
+ "aria-label": `${label != null ? label : ""} ${stars} out of 5 \u2014 ${provider != null ? provider : "reviews"}`.trim(),
17582
+ className: "inline-flex items-center gap-2.5 transition-opacity hover:opacity-90",
17583
+ children: content
17584
+ }
17585
+ );
17586
+ }
17587
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex items-center gap-2.5", children: content });
17588
+ }
17589
+ function HomeHeader({
17590
+ images,
17591
+ videoUrl,
17592
+ eyebrow,
17593
+ title,
17594
+ subtitle,
17595
+ cta,
17596
+ trustpilot,
17597
+ rating,
17598
+ pressLogos,
17599
+ pressLabel = "In the press",
17600
+ pressLabelHref,
17601
+ siteHeader,
17602
+ align = "center",
17603
+ className
17604
+ }) {
17605
+ var _a;
17606
+ const [heroIndex, setHeroIndex] = React32__namespace.useState(0);
17607
+ const [videoReady, setVideoReady] = React32__namespace.useState(false);
17608
+ const videoRef = React32__namespace.useRef(null);
17609
+ const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
17610
+ const validImages = React32__namespace.useMemo(
17611
+ () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
17612
+ [images]
17613
+ );
17614
+ const hasHeroImage = validImages.length > 0;
17615
+ const heroSrc = (i) => {
17616
+ var _a2;
17617
+ return (_a2 = validImages[i]) != null ? _a2 : "";
17618
+ };
17619
+ const safeIndex = Math.min(heroIndex, Math.max(0, validImages.length - 1));
17620
+ const currentSrc = heroSrc(safeIndex);
17621
+ const showCarousel = !videoUrl && validImages.length > 1;
17622
+ const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
17623
+ useHlsVideo(videoRef, isHls ? videoUrl : void 0);
17624
+ React32__namespace.useEffect(() => {
17625
+ if (!videoUrl) return;
17626
+ const el = videoRef.current;
17627
+ if (!el) return;
17628
+ const observer = new IntersectionObserver(
17629
+ ([entry]) => {
17630
+ if (entry.isIntersecting) {
17631
+ el.play().catch(() => {
17632
+ });
17633
+ } else {
17634
+ el.pause();
17635
+ }
17636
+ },
17637
+ { threshold: 0.1 }
17638
+ );
17639
+ observer.observe(el);
17640
+ return () => observer.disconnect();
17641
+ }, [videoUrl]);
17642
+ const isCenter = align === "center";
17643
+ return /* @__PURE__ */ jsxRuntime.jsxs(
17644
+ "section",
17645
+ {
17646
+ className: cn(
17647
+ "relative w-full overflow-hidden",
17648
+ "h-screen min-h-[640px]",
17649
+ hasHeroImage ? "bg-muted" : "bg-zinc-900",
17650
+ className
17651
+ ),
17652
+ "data-home-header-align": align,
17653
+ children: [
17654
+ !videoUrl && !hasHeroImage && /* @__PURE__ */ jsxRuntime.jsx(
17655
+ "div",
17656
+ {
17657
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950",
17658
+ "aria-hidden": true
17659
+ }
17660
+ ),
17661
+ videoUrl ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17662
+ hasHeroImage ? /* @__PURE__ */ jsxRuntime.jsx(
17663
+ Picture,
17664
+ {
17665
+ src: validImages[0],
17666
+ alt: "",
17667
+ "aria-hidden": true,
17668
+ fetchPriority: "high",
17669
+ eager: true,
17670
+ className: cn(
17671
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
17672
+ videoReady ? "opacity-0 pointer-events-none" : "opacity-100"
17673
+ )
17674
+ }
17675
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
17676
+ "div",
17677
+ {
17678
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950 transition-opacity duration-700",
17679
+ "aria-hidden": true
17680
+ }
17681
+ ),
17682
+ /* @__PURE__ */ jsxRuntime.jsx(
17683
+ "video",
17684
+ {
17685
+ ref: videoRef,
17686
+ src: isHls ? void 0 : videoUrl,
17687
+ autoPlay: true,
17688
+ muted: true,
17689
+ loop: true,
17690
+ playsInline: true,
17691
+ preload: "auto",
17692
+ poster: hasHeroImage ? validImages[0] : void 0,
17693
+ onCanPlay: () => setVideoReady(true),
17694
+ className: cn(
17695
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
17696
+ videoReady ? "opacity-100" : "opacity-0"
17697
+ )
17698
+ }
17699
+ )
17700
+ ] }) : hasHeroImage ? /* @__PURE__ */ jsxRuntime.jsx(
17701
+ Picture,
17702
+ {
17703
+ src: currentSrc,
17704
+ alt: title,
17705
+ fetchPriority: safeIndex === 0 ? "high" : "auto",
17706
+ eager: safeIndex === 0,
17707
+ className: "absolute inset-0 h-full w-full object-cover transition-opacity duration-700"
17708
+ }
17709
+ ) : null,
17710
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/30", "aria-hidden": true }),
17711
+ /* @__PURE__ */ jsxRuntime.jsx(
17712
+ "div",
17713
+ {
17714
+ className: "absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-black/30",
17715
+ "aria-hidden": true
17716
+ }
17717
+ ),
17718
+ siteHeader && /* @__PURE__ */ jsxRuntime.jsx(
17719
+ SiteHeader,
17720
+ __spreadProps(__spreadValues({}, Array.isArray(siteHeader) ? { links: siteHeader } : typeof siteHeader === "object" ? siteHeader : {}), {
17721
+ position: "overlay"
17722
+ })
17723
+ ),
17724
+ showCarousel && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17725
+ /* @__PURE__ */ jsxRuntime.jsx(
17726
+ "button",
17727
+ {
17728
+ type: "button",
17729
+ onClick: () => setHeroIndex(
17730
+ (i) => (i - 1 + validImages.length) % validImages.length
17731
+ ),
17732
+ className: "absolute left-4 top-1/2 z-20 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
17733
+ "aria-label": "Previous image",
17734
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
17735
+ }
17736
+ ),
17737
+ /* @__PURE__ */ jsxRuntime.jsx(
17738
+ "button",
17739
+ {
17740
+ type: "button",
17741
+ onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
17742
+ className: "absolute right-4 top-1/2 z-20 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
17743
+ "aria-label": "Next image",
17744
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
17745
+ }
17746
+ )
17747
+ ] }),
17748
+ /* @__PURE__ */ jsxRuntime.jsxs(
17749
+ "div",
17750
+ {
17751
+ className: cn(
17752
+ "absolute inset-0 z-10 flex flex-col justify-center",
17753
+ "mx-auto w-full max-w-6xl px-6 sm:px-8",
17754
+ "pt-[72px]",
17755
+ // clear the overlay header
17756
+ pressLogos && pressLogos.length > 0 ? "pb-28" : "pb-16",
17757
+ isCenter ? "items-center text-center" : "items-start text-left"
17758
+ ),
17759
+ children: [
17760
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs sm:text-sm font-ui font-bold uppercase tracking-[0.2em] text-primary-400", children: eyebrow }),
17761
+ /* @__PURE__ */ jsxRuntime.jsx(
17762
+ "h1",
17763
+ {
17764
+ className: cn(
17765
+ "font-heading font-black uppercase text-white leading-[0.95]",
17766
+ "text-5xl sm:text-6xl lg:text-7xl",
17767
+ isCenter ? "max-w-4xl" : "max-w-3xl"
17768
+ ),
17769
+ children: title
17770
+ }
17771
+ ),
17772
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx(
17773
+ "p",
17774
+ {
17775
+ className: cn(
17776
+ "mt-5 text-lg sm:text-xl font-sans text-white/90",
17777
+ isCenter ? "max-w-2xl" : "max-w-xl"
17778
+ ),
17779
+ children: subtitle
17780
+ }
17781
+ ),
17782
+ cta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: cta.href ? /* @__PURE__ */ jsxRuntime.jsx(
17783
+ "a",
17784
+ {
17785
+ href: cta.href,
17786
+ onClick: cta.onClick,
17787
+ className: buttonVariants({ size: "lg" }),
17788
+ children: cta.label
17789
+ }
17790
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "lg", onClick: cta.onClick, children: cta.label }) }),
17791
+ tpConfig ? /* @__PURE__ */ jsxRuntime.jsxs(
17792
+ "div",
17793
+ {
17794
+ className: cn(
17795
+ "home-trustpilot relative mt-8",
17796
+ // Wide enough for the Micro Star to show the full "Excellent
17797
+ // ★★★★★ Trustpilot" lockup — at 260px the Trustpilot wordmark
17798
+ // was clipped.
17799
+ isCenter && "w-full max-w-[340px]"
17800
+ ),
17801
+ children: [
17802
+ /* @__PURE__ */ jsxRuntime.jsx(TrustpilotEmbed, { config: tpConfig }),
17803
+ /* @__PURE__ */ jsxRuntime.jsx(
17804
+ "a",
17805
+ {
17806
+ href: (_a = tpConfig.fallbackHref) != null ? _a : "https://www.trustpilot.com/review/planetaexo.com",
17807
+ target: "_blank",
17808
+ rel: "noopener noreferrer",
17809
+ "aria-label": "Read our reviews on Trustpilot",
17810
+ className: "absolute inset-0 z-10"
17811
+ }
17812
+ )
17813
+ ]
17814
+ }
17815
+ ) : rating ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsxRuntime.jsx(Rating, __spreadValues({}, rating)) }) : null
17816
+ ]
17817
+ }
17818
+ ),
17819
+ pressLogos && pressLogos.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0 z-10 pb-7", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto flex w-full max-w-6xl flex-wrap items-center justify-center gap-x-7 gap-y-3 px-6 sm:px-8", children: [
17820
+ pressLabelHref ? /* @__PURE__ */ jsxRuntime.jsx(
17821
+ "a",
17822
+ {
17823
+ href: pressLabelHref,
17824
+ target: "_blank",
17825
+ rel: "noopener noreferrer",
17826
+ className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70 transition-colors hover:text-white",
17827
+ children: pressLabel
17828
+ }
17829
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70", children: pressLabel }),
17830
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-nowrap items-center justify-center gap-x-7", children: [
17831
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden h-5 w-px bg-white/25 sm:block", "aria-hidden": true }),
17832
+ pressLogos.map((logo, i) => {
17833
+ var _a2, _b, _c, _d;
17834
+ const content = logo.src ? (
17835
+ // eslint-disable-next-line @next/next/no-img-element
17836
+ /* @__PURE__ */ jsxRuntime.jsx(
17837
+ "img",
17838
+ {
17839
+ src: logo.src,
17840
+ alt: (_b = (_a2 = logo.alt) != null ? _a2 : logo.label) != null ? _b : "Press logo",
17841
+ className: "h-12 w-12 shrink-0 select-none object-contain",
17842
+ draggable: false
17843
+ }
17844
+ )
17845
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-heading text-base font-bold uppercase tracking-wide", children: logo.label });
17846
+ return logo.href ? /* @__PURE__ */ jsxRuntime.jsx(
17847
+ "a",
17848
+ {
17849
+ href: logo.href,
17850
+ target: "_blank",
17851
+ rel: "noopener noreferrer",
17852
+ "aria-label": (_d = (_c = logo.alt) != null ? _c : logo.label) != null ? _d : "Press article",
17853
+ className: "shrink-0 text-white/80 opacity-100 transition-opacity hover:opacity-100 hover:text-white focus-visible:opacity-100 [&>img]:opacity-80 [&>img]:hover:opacity-100 [&>img]:transition-opacity",
17854
+ children: content
17855
+ },
17856
+ i
17857
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
17858
+ "span",
17859
+ {
17860
+ className: "shrink-0 text-white/80 [&>img]:opacity-80",
17861
+ children: content
17862
+ },
17863
+ i
17864
+ );
17865
+ })
17866
+ ] })
17867
+ ] }) })
17868
+ ]
17869
+ }
17870
+ );
17871
+ }
17872
+ var ACCENT_PILL = "bg-primary text-primary-foreground";
17873
+ var ACCENT_BUTTON = "bg-primary text-primary-foreground hover:bg-primary/90";
17874
+ var THEME = {
17875
+ dark: {
17876
+ section: "bg-neutral-950",
17877
+ heading: "text-white",
17878
+ body: "text-white/60",
17879
+ tabTrack: "bg-white/5 border-white/10",
17880
+ tabActive: ACCENT_PILL,
17881
+ tabIdle: "text-white/60 hover:text-white",
17882
+ cardRing: "focus-visible:ring-white/70 focus-visible:ring-offset-neutral-950",
17883
+ divider: "border-white/15"
17884
+ },
17885
+ light: {
17886
+ /* Explicit light colours (not mode-aware tokens) so this variant stays a
17887
+ light surface even when the app is in dark mode. */
17888
+ section: "bg-white",
17889
+ heading: "text-neutral-900",
17890
+ body: "text-neutral-500",
17891
+ tabTrack: "bg-neutral-100 border-black/10",
17892
+ tabActive: ACCENT_PILL,
17893
+ tabIdle: "text-neutral-500 hover:text-neutral-900",
17894
+ cardRing: "focus-visible:ring-neutral-900/40 focus-visible:ring-offset-white",
17895
+ divider: "border-black/10"
17896
+ }
17897
+ };
17898
+ var BENTO_SPAN = {
17899
+ featured: "col-span-2 row-span-2",
17900
+ tall: "col-span-2 sm:col-span-1 row-span-2",
17901
+ wide: "col-span-2",
17902
+ normal: "col-span-2 sm:col-span-1"
17903
+ };
17904
+ function BentoTile({
17905
+ card,
17906
+ ring
17907
+ }) {
17908
+ var _a, _b, _c;
17909
+ const isFeatured = card.size === "featured";
17910
+ const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17911
+ card.image ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17912
+ /* @__PURE__ */ jsxRuntime.jsx(
17913
+ Picture,
17914
+ {
17915
+ src: card.image,
17916
+ alt: (_a = card.imageAlt) != null ? _a : card.label,
17917
+ loading: "lazy",
17918
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
17919
+ }
17920
+ ),
17921
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/85 via-black/15 to-transparent" })
17922
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(
17923
+ "div",
17924
+ {
17925
+ className: cn(
17926
+ "absolute inset-0 bg-gradient-to-br",
17927
+ (_b = card.gradient) != null ? _b : "from-primary-800 to-primary-900"
17928
+ )
17929
+ }
17930
+ ),
17931
+ card.tripCount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute right-3 top-3 z-10 rounded-full bg-white/90 px-2.5 py-1 text-[11px] font-ui font-bold uppercase tracking-wide text-neutral-900", children: card.tripCount }),
17932
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-x-0 bottom-0 z-10 p-5", children: [
17933
+ /* @__PURE__ */ jsxRuntime.jsx(
17934
+ "h3",
17935
+ {
17936
+ className: cn(
17937
+ "font-heading font-bold uppercase leading-tight tracking-wide text-white",
17938
+ isFeatured ? "text-2xl sm:text-3xl" : "text-lg sm:text-xl"
17939
+ ),
17940
+ children: card.label
17941
+ }
17942
+ ),
17943
+ card.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 max-h-0 overflow-hidden text-sm leading-snug text-white/85 opacity-0 transition-all duration-300 group-hover:mt-2 group-hover:max-h-32 group-hover:opacity-100", children: card.description }),
17944
+ card.ctaLabel && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-2 inline-flex items-center gap-1 text-sm font-ui font-bold text-primary-400", children: [
17945
+ card.ctaLabel,
17946
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17947
+ ] })
17948
+ ] })
17949
+ ] });
17950
+ const tileClass = cn(
17951
+ "group relative overflow-hidden rounded-2xl bg-muted shadow-sm",
17952
+ BENTO_SPAN[(_c = card.size) != null ? _c : "normal"]
17953
+ );
17954
+ return card.href ? /* @__PURE__ */ jsxRuntime.jsx(
17955
+ "a",
17956
+ {
17957
+ href: card.href,
17958
+ className: cn(
17959
+ tileClass,
17960
+ "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
17961
+ ring
17962
+ ),
17963
+ children: inner
17964
+ }
17965
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: tileClass, children: inner });
17966
+ }
17967
+ function AdventureExplorer({
17968
+ tabs,
17969
+ eyebrow,
17970
+ heading,
17971
+ subheading,
17972
+ defaultTabId,
17973
+ viewAllLabel = "View All Adventures",
17974
+ viewAllHref,
17975
+ theme = "dark",
17976
+ layout = "carousel",
17977
+ bentoLimit,
17978
+ moreLabel = "More wild places",
17979
+ className
17980
+ }) {
17981
+ var _a, _b, _c, _d, _e;
17982
+ const [activeId, setActiveId] = React32__namespace.useState(
17983
+ defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
17984
+ );
17985
+ const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
17986
+ const t = THEME[theme];
17987
+ const ctaHref = (_d = (_c = active == null ? void 0 : active.viewAllHref) != null ? _c : viewAllHref) != null ? _d : "#";
17988
+ const showCta = viewAllLabel.length > 0;
17989
+ const hasHeading = !!(eyebrow || heading || subheading);
17990
+ const cards = (_e = active == null ? void 0 : active.cards) != null ? _e : [];
17991
+ const limited = layout === "bento" && bentoLimit != null && cards.length > bentoLimit;
17992
+ const gridCards = limited ? cards.slice(0, bentoLimit) : cards;
17993
+ const moreCards = limited ? cards.slice(bentoLimit) : [];
17994
+ const showHeadCta = showCta && !limited;
17995
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-10 sm:py-16", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
17996
+ hasHeading && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8 flex flex-wrap items-end justify-between gap-6", children: [
17997
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
17998
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
17999
+ heading && /* @__PURE__ */ jsxRuntime.jsx(
18000
+ "h2",
18001
+ {
18002
+ className: cn(
18003
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18004
+ t.heading
18005
+ ),
18006
+ children: heading
18007
+ }
18008
+ ),
18009
+ subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 text-base", t.body), children: subheading })
18010
+ ] }),
18011
+ showHeadCta && /* @__PURE__ */ jsxRuntime.jsxs(
18012
+ "a",
18013
+ {
18014
+ href: ctaHref,
18015
+ className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
18016
+ children: [
18017
+ viewAllLabel,
18018
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
18019
+ ]
18020
+ }
18021
+ )
18022
+ ] }),
18023
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
18024
+ /* @__PURE__ */ jsxRuntime.jsx(
18025
+ "div",
18026
+ {
18027
+ role: "tablist",
18028
+ "aria-label": "Explore categories",
18029
+ className: cn(
18030
+ "inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
18031
+ t.tabTrack
18032
+ ),
18033
+ children: tabs.map((tab) => {
18034
+ const isActive = tab.id === (active == null ? void 0 : active.id);
18035
+ return /* @__PURE__ */ jsxRuntime.jsx(
18036
+ "button",
18037
+ {
18038
+ type: "button",
18039
+ role: "tab",
18040
+ "aria-selected": isActive,
18041
+ onClick: () => setActiveId(tab.id),
18042
+ className: cn(
18043
+ "shrink-0 rounded-full px-5 py-2 text-sm font-ui font-bold transition-colors",
18044
+ isActive ? t.tabActive : t.tabIdle
18045
+ ),
18046
+ children: tab.label
18047
+ },
18048
+ tab.id
18049
+ );
18050
+ })
18051
+ }
18052
+ ),
18053
+ showCta && !hasHeading && /* @__PURE__ */ jsxRuntime.jsx(
18054
+ "a",
18055
+ {
18056
+ href: ctaHref,
18057
+ className: cn(
18058
+ "hidden shrink-0 items-center rounded-full px-6 py-2.5 text-sm font-heading font-bold transition-colors sm:inline-flex",
18059
+ ACCENT_BUTTON
18060
+ ),
18061
+ children: viewAllLabel
18062
+ }
18063
+ )
18064
+ ] }),
18065
+ layout === "bento" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 grid auto-rows-[170px] grid-cols-2 gap-4 sm:mt-8 sm:auto-rows-[200px] lg:grid-cols-4", children: gridCards.map((card, i) => /* @__PURE__ */ jsxRuntime.jsx(BentoTile, { card, ring: t.cardRing }, i)) }),
18066
+ limited && /* @__PURE__ */ jsxRuntime.jsxs(
18067
+ "div",
18068
+ {
18069
+ className: cn(
18070
+ "mt-7 flex flex-wrap items-center justify-between gap-x-8 gap-y-3 border-t pt-6",
18071
+ t.divider
18072
+ ),
18073
+ children: [
18074
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2", children: [
18075
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-ui font-bold uppercase tracking-[0.18em] text-primary", children: moreLabel }),
18076
+ moreCards.map((card, i) => {
18077
+ var _a2;
18078
+ return /* @__PURE__ */ jsxRuntime.jsxs(
18079
+ "a",
18080
+ {
18081
+ href: (_a2 = card.href) != null ? _a2 : "#",
18082
+ className: "group inline-flex items-baseline gap-2",
18083
+ children: [
18084
+ /* @__PURE__ */ jsxRuntime.jsx(
18085
+ "span",
18086
+ {
18087
+ className: cn(
18088
+ "font-heading text-base font-bold transition-colors group-hover:text-primary",
18089
+ t.heading
18090
+ ),
18091
+ children: card.label
18092
+ }
18093
+ ),
18094
+ card.tripCount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-sm", t.body), children: card.tripCount })
18095
+ ]
18096
+ },
18097
+ i
18098
+ );
18099
+ })
18100
+ ] }),
18101
+ showCta && /* @__PURE__ */ jsxRuntime.jsxs(
18102
+ "a",
18103
+ {
18104
+ href: ctaHref,
18105
+ className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
18106
+ children: [
18107
+ viewAllLabel,
18108
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
18109
+ ]
18110
+ }
18111
+ )
18112
+ ]
18113
+ }
18114
+ ),
18115
+ layout !== "bento" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "-mx-6 mt-6 flex gap-3 overflow-x-auto px-6 pb-2 snap-x snap-mandatory scroll-px-6 scroll-smooth scrollbar-none sm:mx-0 sm:mt-8 sm:gap-4 sm:px-0 sm:scroll-px-0", children: active == null ? void 0 : active.cards.map((card, i) => {
18116
+ var _a2, _b2;
18117
+ const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18118
+ /* @__PURE__ */ jsxRuntime.jsx(
18119
+ Picture,
18120
+ {
18121
+ src: (_a2 = card.image) != null ? _a2 : "",
18122
+ alt: (_b2 = card.imageAlt) != null ? _b2 : card.label,
18123
+ loading: "lazy",
18124
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
18125
+ }
18126
+ ),
18127
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/15 to-transparent" }),
18128
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-x-0 bottom-0 p-4 font-heading text-sm font-bold uppercase leading-tight tracking-wide text-white", children: card.label })
18129
+ ] });
18130
+ const cardClass = "group relative aspect-[9/16] w-40 shrink-0 snap-start overflow-hidden rounded-2xl bg-muted sm:w-44 lg:w-48";
18131
+ return card.href ? /* @__PURE__ */ jsxRuntime.jsx(
18132
+ "a",
18133
+ {
18134
+ href: card.href,
18135
+ className: cn(
18136
+ cardClass,
18137
+ "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
18138
+ t.cardRing
18139
+ ),
18140
+ children: inner
18141
+ },
18142
+ i
18143
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cardClass, children: inner }, i);
18144
+ }) }),
18145
+ showCta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 sm:hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
18146
+ "a",
18147
+ {
18148
+ href: ctaHref,
18149
+ className: cn(
18150
+ "inline-flex w-full items-center justify-center rounded-full px-6 py-3 text-sm font-heading font-bold transition-colors",
18151
+ ACCENT_BUTTON
18152
+ ),
18153
+ children: viewAllLabel
18154
+ }
18155
+ ) })
18156
+ ] }) });
18157
+ }
18158
+ var THEME2 = {
18159
+ light: {
18160
+ section: "bg-neutral-100",
18161
+ heading: "text-neutral-900",
18162
+ title: "text-neutral-800",
18163
+ body: "text-neutral-500",
18164
+ icon: "text-primary",
18165
+ card: "bg-white border-black/10 shadow-sm",
18166
+ chip: "bg-primary/10 text-primary",
18167
+ number: "text-primary"
18168
+ },
18169
+ dark: {
18170
+ section: "bg-neutral-950",
18171
+ heading: "text-white",
18172
+ title: "text-white",
18173
+ body: "text-white/60",
18174
+ icon: "text-primary-400",
18175
+ card: "bg-white/5 border-white/10",
18176
+ chip: "bg-primary-400/15 text-primary-400",
18177
+ number: "text-primary-400"
18178
+ }
18179
+ };
18180
+ var COLS = {
18181
+ 2: "sm:grid-cols-2",
18182
+ 3: "sm:grid-cols-2 lg:grid-cols-3",
18183
+ 4: "sm:grid-cols-2 lg:grid-cols-4"
18184
+ };
18185
+ function USP({
18186
+ items,
18187
+ heading,
18188
+ subheading,
18189
+ columns,
18190
+ variant = "minimal",
18191
+ theme = "light",
18192
+ className
18193
+ }) {
18194
+ const t = THEME2[theme];
18195
+ const cols = columns != null ? columns : Math.min(Math.max(items.length, 2), 4);
18196
+ const isInline = variant === "inline";
18197
+ const isCard = variant === "card";
18198
+ const isNumbered = variant === "numbered";
18199
+ const stacked = !isInline;
18200
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-14 sm:py-20", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18201
+ (heading || subheading) && /* @__PURE__ */ jsxRuntime.jsxs(
18202
+ "div",
18203
+ {
18204
+ className: cn(
18205
+ "mb-12 max-w-2xl",
18206
+ isNumbered ? "text-left" : "mx-auto text-center"
18207
+ ),
18208
+ children: [
18209
+ heading && /* @__PURE__ */ jsxRuntime.jsx(
18210
+ "h2",
18211
+ {
18212
+ className: cn(
18213
+ "font-heading font-bold uppercase tracking-wide",
18214
+ isNumbered ? "text-3xl sm:text-4xl lg:text-5xl" : "text-2xl sm:text-3xl",
18215
+ t.heading
18216
+ ),
18217
+ children: heading
18218
+ }
18219
+ ),
18220
+ subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 font-sans text-base", t.body), children: subheading })
18221
+ ]
18222
+ }
18223
+ ),
18224
+ /* @__PURE__ */ jsxRuntime.jsxs(
18225
+ "div",
18226
+ {
18227
+ className: cn(
18228
+ "grid grid-cols-1 gap-x-8 gap-y-10",
18229
+ COLS[cols]
18230
+ ),
18231
+ children: [
18232
+ isNumbered && items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
18233
+ "div",
18234
+ {
18235
+ className: cn(
18236
+ "flex flex-col rounded-2xl border p-6 text-left sm:p-7",
18237
+ t.card
18238
+ ),
18239
+ children: [
18240
+ /* @__PURE__ */ jsxRuntime.jsx(
18241
+ "span",
18242
+ {
18243
+ className: cn(
18244
+ "mb-4 font-sans text-xl font-semibold italic",
18245
+ t.number
18246
+ ),
18247
+ children: String(i + 1).padStart(2, "0")
18248
+ }
18249
+ ),
18250
+ /* @__PURE__ */ jsxRuntime.jsx(
18251
+ "h3",
18252
+ {
18253
+ className: cn(
18254
+ "font-heading text-lg font-bold leading-snug",
18255
+ t.heading
18256
+ ),
18257
+ children: item.title
18258
+ }
18259
+ ),
18260
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-2 font-sans text-base leading-relaxed", t.body), children: item.description })
18261
+ ]
18262
+ },
18263
+ i
18264
+ )),
18265
+ !isNumbered && items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
18266
+ "div",
18267
+ {
18268
+ className: cn(
18269
+ isCard && cn("rounded-2xl border p-6 sm:p-7", t.card),
18270
+ stacked ? "flex flex-col items-center text-center" : "flex items-start gap-4 text-left"
18271
+ ),
18272
+ children: [
18273
+ /* @__PURE__ */ jsxRuntime.jsx(
18274
+ "span",
18275
+ {
18276
+ className: cn(
18277
+ "flex shrink-0 items-center justify-center",
18278
+ isCard ? cn("h-14 w-14 rounded-full [&>svg]:size-7", t.chip) : cn("[&>svg]:size-8", t.icon),
18279
+ stacked && "mb-4"
18280
+ ),
18281
+ children: item.icon
18282
+ }
18283
+ ),
18284
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: isInline ? "flex-1" : "contents", children: [
18285
+ /* @__PURE__ */ jsxRuntime.jsx(
18286
+ "h3",
18287
+ {
18288
+ className: cn(
18289
+ "font-heading text-sm font-bold uppercase leading-snug tracking-wide",
18290
+ t.title,
18291
+ stacked && "mb-3"
18292
+ ),
18293
+ children: item.title
18294
+ }
18295
+ ),
18296
+ /* @__PURE__ */ jsxRuntime.jsx(
18297
+ "p",
18298
+ {
18299
+ className: cn(
18300
+ "font-sans text-base leading-relaxed",
18301
+ t.body,
18302
+ isInline && "mt-1.5"
18303
+ ),
18304
+ children: item.description
18305
+ }
18306
+ )
18307
+ ] })
18308
+ ]
18309
+ },
18310
+ i
18311
+ ))
18312
+ ]
18313
+ }
18314
+ )
18315
+ ] }) });
18316
+ }
18317
+ function RotatingSubtitle({
18318
+ phrases,
18319
+ interval,
18320
+ className
18321
+ }) {
18322
+ const [index, setIndex] = React32__namespace.useState(0);
18323
+ React32__namespace.useEffect(() => {
18324
+ var _a;
18325
+ if (phrases.length < 2) return;
18326
+ const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
18327
+ if (reduce) return;
18328
+ const id = setInterval(
18329
+ () => setIndex((i) => (i + 1) % phrases.length),
18330
+ interval
18331
+ );
18332
+ return () => clearInterval(id);
18333
+ }, [phrases.length, interval]);
18334
+ return (
18335
+ /* Grid-stacks all phrases so the box keeps the height of the tallest line
18336
+ and the crossfade has no layout shift. */
18337
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("grid", className), children: phrases.map((phrase, i) => /* @__PURE__ */ jsxRuntime.jsx(
18338
+ "span",
18339
+ {
18340
+ "aria-hidden": i !== index,
18341
+ className: cn(
18342
+ "col-start-1 row-start-1 transition-opacity duration-700",
18343
+ i === index ? "opacity-100" : "opacity-0"
18344
+ ),
18345
+ children: phrase
18346
+ },
18347
+ phrase + i
18348
+ )) })
18349
+ );
18350
+ }
18351
+ function CtaBanner({
18352
+ image,
18353
+ imageAlt = "",
18354
+ title,
18355
+ subtitle,
18356
+ cta,
18357
+ rotateInterval = 3e3,
18358
+ parallax = true,
18359
+ overlayOpacity = 35,
18360
+ className
18361
+ }) {
18362
+ const phrases = React32__namespace.useMemo(
18363
+ () => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
18364
+ [subtitle]
18365
+ );
18366
+ return /* @__PURE__ */ jsxRuntime.jsxs(
18367
+ "section",
18368
+ {
18369
+ className: cn(
18370
+ "relative w-full overflow-hidden",
18371
+ "flex items-center justify-center",
18372
+ "min-h-[360px] py-24 sm:py-28 lg:py-32",
18373
+ "bg-muted",
18374
+ className
18375
+ ),
18376
+ children: [
18377
+ parallax ? (
18378
+ /* Parallax: fixed-attachment CSS background (sm+). Uses a plain div so
18379
+ `bg-fixed` works; on mobile it falls back to a normal cover image. */
18380
+ /* @__PURE__ */ jsxRuntime.jsx(
18381
+ "div",
18382
+ {
18383
+ "aria-hidden": true,
18384
+ role: imageAlt ? "img" : void 0,
18385
+ "aria-label": imageAlt || void 0,
18386
+ className: "absolute inset-0 bg-cover bg-center sm:bg-fixed",
18387
+ style: { backgroundImage: `url("${image}")` }
18388
+ }
18389
+ )
18390
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
18391
+ Picture,
18392
+ {
18393
+ src: image,
18394
+ alt: imageAlt,
18395
+ eager: true,
18396
+ className: "absolute inset-0 h-full w-full object-cover"
18397
+ }
18398
+ ),
18399
+ /* @__PURE__ */ jsxRuntime.jsx(
18400
+ "div",
18401
+ {
18402
+ className: "absolute inset-0 bg-black",
18403
+ style: { opacity: overlayOpacity / 100 },
18404
+ "aria-hidden": true
18405
+ }
18406
+ ),
18407
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 mx-auto flex w-full max-w-4xl flex-col items-center px-6 text-center", children: [
18408
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-heading text-4xl font-black uppercase leading-none tracking-tight text-white sm:text-5xl lg:text-[3.25rem]", children: title }),
18409
+ phrases.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 font-sans text-xl font-semibold text-white sm:text-2xl lg:text-[1.7rem]", children: phrases.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx(RotatingSubtitle, { phrases, interval: rotateInterval }) : phrases[0] }),
18410
+ cta && (cta.href ? /* @__PURE__ */ jsxRuntime.jsx(
18411
+ "a",
18412
+ {
18413
+ href: cta.href,
18414
+ onClick: cta.onClick,
18415
+ className: "mt-8 inline-block border-b border-white/70 pb-1.5 font-ui text-xs font-light uppercase tracking-[0.2em] text-white transition-colors hover:border-white hover:text-white/80",
18416
+ children: cta.label
18417
+ }
18418
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
18419
+ "button",
18420
+ {
18421
+ type: "button",
18422
+ onClick: cta.onClick,
18423
+ className: "mt-8 inline-block border-b border-white/70 pb-1.5 font-ui text-xs font-light uppercase tracking-[0.2em] text-white transition-colors hover:border-white hover:text-white/80",
18424
+ children: cta.label
18425
+ }
18426
+ ))
18427
+ ] })
18428
+ ]
18429
+ }
18430
+ );
18431
+ }
18432
+ var THEME3 = {
18433
+ light: {
18434
+ section: "bg-background",
18435
+ heading: "text-foreground",
18436
+ sub: "text-muted-foreground",
18437
+ rowTitle: "text-foreground",
18438
+ rowBorder: "border-border",
18439
+ rowArrow: "text-primary"
18440
+ },
18441
+ dark: {
18442
+ section: "bg-neutral-950",
18443
+ heading: "text-white",
18444
+ sub: "text-white/60",
18445
+ rowTitle: "text-white",
18446
+ rowBorder: "border-white/10",
18447
+ rowArrow: "text-primary-400"
18448
+ }
18449
+ };
18450
+ function BlogJournal({
18451
+ eyebrow,
18452
+ title,
18453
+ subtitle,
18454
+ link,
18455
+ feature,
18456
+ posts,
18457
+ theme = "light",
18458
+ className
18459
+ }) {
18460
+ var _a, _b, _c, _d;
18461
+ const t = THEME3[theme];
18462
+ const featRel = feature.external ? "noopener noreferrer" : void 0;
18463
+ const featTarget = feature.external ? "_blank" : void 0;
18464
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn("w-full py-20 sm:py-28", t.section, className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18465
+ (title || eyebrow || link) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
18466
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
18467
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18468
+ title && /* @__PURE__ */ jsxRuntime.jsx(
18469
+ "h2",
18470
+ {
18471
+ className: cn(
18472
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18473
+ t.heading
18474
+ ),
18475
+ children: title
18476
+ }
18477
+ ),
18478
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-3 text-base", t.sub), children: subtitle })
18479
+ ] }),
18480
+ link && /* @__PURE__ */ jsxRuntime.jsxs(
18481
+ "a",
18482
+ {
18483
+ href: (_a = link.href) != null ? _a : "#",
18484
+ className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
18485
+ children: [
18486
+ link.label,
18487
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18488
+ ]
18489
+ }
18490
+ )
18491
+ ] }),
18492
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid items-stretch gap-7 lg:grid-cols-[1.12fr_0.88fr]", children: [
18493
+ /* @__PURE__ */ jsxRuntime.jsxs(
18494
+ "a",
18495
+ {
18496
+ href: (_b = feature.href) != null ? _b : "#",
18497
+ target: featTarget,
18498
+ rel: featRel,
18499
+ className: "group relative flex min-h-[420px] items-end overflow-hidden rounded-2xl text-white shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 lg:min-h-[480px]",
18500
+ children: [
18501
+ /* @__PURE__ */ jsxRuntime.jsx(
18502
+ Picture,
18503
+ {
18504
+ src: feature.image,
18505
+ alt: (_c = feature.imageAlt) != null ? _c : feature.title,
18506
+ loading: "lazy",
18507
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
18508
+ }
18509
+ ),
18510
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/25 to-transparent" }),
18511
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative p-8 sm:p-9", children: [
18512
+ feature.tag && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-3.5 inline-block rounded-full bg-primary px-3 py-1 text-[11px] font-ui font-bold uppercase tracking-[0.12em] text-primary-foreground", children: feature.tag }),
18513
+ feature.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs font-ui font-bold uppercase tracking-[0.1em] text-primary-400", children: feature.date }),
18514
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mt-2.5 max-w-[20ch] font-heading text-2xl font-bold leading-[1.08] sm:text-3xl lg:text-4xl", children: feature.title }),
18515
+ feature.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-3 max-w-[46ch] text-sm leading-relaxed text-white/85", children: feature.excerpt }),
18516
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-5 inline-flex items-center gap-1.5 font-ui text-sm font-bold", children: [
18517
+ (_d = feature.ctaLabel) != null ? _d : "Read the guide",
18518
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18519
+ ] })
18520
+ ] })
18521
+ ]
18522
+ }
18523
+ ),
18524
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col justify-center", children: posts.map((post, i) => {
18525
+ var _a2, _b2;
18526
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
18527
+ "a",
18528
+ {
18529
+ href: (_a2 = post.href) != null ? _a2 : "#",
18530
+ target: post.external ? "_blank" : void 0,
18531
+ rel: post.external ? "noopener noreferrer" : void 0,
18532
+ className: cn(
18533
+ "group grid grid-cols-[64px_1fr_auto] items-center gap-4 border-t py-5 transition-[padding] duration-300 hover:pl-3 sm:grid-cols-[78px_1fr_auto]",
18534
+ t.rowBorder,
18535
+ i === 0 && "border-t-0 pt-0"
18536
+ ),
18537
+ children: [
18538
+ /* @__PURE__ */ jsxRuntime.jsx(
18539
+ Picture,
18540
+ {
18541
+ src: post.image,
18542
+ alt: (_b2 = post.imageAlt) != null ? _b2 : post.title,
18543
+ loading: "lazy",
18544
+ className: "h-16 w-16 rounded-xl object-cover sm:h-[78px] sm:w-[78px]"
18545
+ }
18546
+ ),
18547
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
18548
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] font-ui font-bold uppercase tracking-[0.1em] text-primary", children: [
18549
+ post.category,
18550
+ post.category && post.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("ml-2 font-semibold", t.sub), children: post.date }),
18551
+ !post.category && post.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-semibold", t.sub), children: post.date })
18552
+ ] }),
18553
+ /* @__PURE__ */ jsxRuntime.jsx(
18554
+ "h4",
18555
+ {
18556
+ className: cn(
18557
+ "mt-1.5 font-heading text-base font-bold leading-snug sm:text-lg",
18558
+ t.rowTitle
18559
+ ),
18560
+ children: post.title
18561
+ }
18562
+ )
18563
+ ] }),
18564
+ /* @__PURE__ */ jsxRuntime.jsx(
18565
+ lucideReact.ArrowRightIcon,
18566
+ {
18567
+ className: cn(
18568
+ "h-5 w-5 shrink-0 transition-transform group-hover:translate-x-1",
18569
+ t.rowArrow
18570
+ )
18571
+ }
18572
+ )
18573
+ ]
18574
+ }
18575
+ ) }, i);
18576
+ }) })
18577
+ ] })
18578
+ ] }) });
18579
+ }
18580
+ var SURFACE_WHITE = "bg-white";
18581
+ var SURFACE_SAND = "bg-[oklch(0.94_0.016_86)]";
18582
+ var SURFACE_PRIMARY_700 = "bg-[oklch(0.52_0.082_179)]";
18583
+ var SURFACE_PRIMARY_800 = "bg-[oklch(0.39_0.062_179)]";
18584
+ var SURFACE_PRIMARY_900 = "bg-[oklch(0.27_0.040_179)]";
18585
+ function SectionHead({
18586
+ eyebrow,
18587
+ title,
18588
+ subtitle,
18589
+ link,
18590
+ align = "between",
18591
+ theme = "light"
18592
+ }) {
18593
+ var _a;
18594
+ const isCenter = align === "center";
18595
+ return /* @__PURE__ */ jsxRuntime.jsxs(
18596
+ "div",
18597
+ {
18598
+ className: cn(
18599
+ "mb-10 flex flex-wrap items-end gap-6",
18600
+ isCenter ? "flex-col items-center text-center" : "justify-between"
18601
+ ),
18602
+ children: [
18603
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("max-w-2xl", isCenter && "mx-auto"), children: [
18604
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18605
+ /* @__PURE__ */ jsxRuntime.jsx(
18606
+ "h2",
18607
+ {
18608
+ className: cn(
18609
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18610
+ theme === "dark" ? "text-white" : "text-foreground"
18611
+ ),
18612
+ children: title
18613
+ }
18614
+ ),
18615
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx(
18616
+ "p",
18617
+ {
18618
+ className: cn(
18619
+ "mt-3 text-base",
18620
+ theme === "dark" ? "text-white/70" : "text-muted-foreground"
18621
+ ),
18622
+ children: subtitle
18623
+ }
18624
+ )
18625
+ ] }),
18626
+ link && !isCenter && /* @__PURE__ */ jsxRuntime.jsxs(
18627
+ "a",
18628
+ {
18629
+ href: (_a = link.href) != null ? _a : "#",
18630
+ className: "group inline-flex shrink-0 items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
18631
+ children: [
18632
+ link.label,
18633
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18634
+ ]
18635
+ }
18636
+ )
18637
+ ]
18638
+ }
18639
+ );
18640
+ }
18641
+ function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
18642
+ var _a;
18643
+ const railRef = React32__namespace.useRef(null);
18644
+ const scrollByCard = (dir) => {
18645
+ const rail = railRef.current;
18646
+ if (!rail) return;
18647
+ const card = rail.querySelector("[data-rail-card]");
18648
+ const amount = card ? card.offsetWidth + 22 : rail.clientWidth * 0.8;
18649
+ rail.scrollBy({ left: dir * amount, behavior: "smooth" });
18650
+ };
18651
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: cn(SURFACE_SAND, "py-20 sm:py-28"), children: [
18652
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
18653
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl", children: [
18654
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18655
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "font-heading text-3xl font-black uppercase leading-[1.05] text-foreground sm:text-4xl lg:text-5xl", children: title }),
18656
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-3 text-base text-muted-foreground", children: subtitle })
18657
+ ] }),
18658
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
18659
+ link && /* @__PURE__ */ jsxRuntime.jsxs(
18660
+ "a",
18661
+ {
18662
+ href: (_a = link.href) != null ? _a : "#",
18663
+ className: "group mr-2 hidden items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800 sm:inline-flex",
18664
+ children: [
18665
+ link.label,
18666
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18667
+ ]
18668
+ }
18669
+ ),
18670
+ /* @__PURE__ */ jsxRuntime.jsx(
18671
+ "button",
18672
+ {
18673
+ type: "button",
18674
+ onClick: () => scrollByCard(-1),
18675
+ "aria-label": "Previous expeditions",
18676
+ className: "flex h-11 w-11 items-center justify-center rounded-full border border-border bg-background text-foreground transition-colors hover:border-primary hover:bg-primary hover:text-primary-foreground",
18677
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeftIcon, { className: "h-5 w-5" })
18678
+ }
18679
+ ),
18680
+ /* @__PURE__ */ jsxRuntime.jsx(
18681
+ "button",
18682
+ {
18683
+ type: "button",
18684
+ onClick: () => scrollByCard(1),
18685
+ "aria-label": "Next expeditions",
18686
+ className: "flex h-11 w-11 items-center justify-center rounded-full border border-border bg-background text-foreground transition-colors hover:border-primary hover:bg-primary hover:text-primary-foreground",
18687
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRightIcon, { className: "h-5 w-5" })
18688
+ }
18689
+ )
18690
+ ] })
18691
+ ] }) }),
18692
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl", children: /* @__PURE__ */ jsxRuntime.jsx(
18693
+ "div",
18694
+ {
18695
+ ref: railRef,
18696
+ className: "flex snap-x snap-mandatory gap-[22px] overflow-x-auto scroll-pl-6 px-6 pb-4 [scrollbar-width:none] sm:scroll-pl-8 sm:px-8 [&::-webkit-scrollbar]:hidden",
18697
+ children: trips.map((trip, i) => /* @__PURE__ */ jsxRuntime.jsx(
18698
+ "div",
18699
+ {
18700
+ "data-rail-card": true,
18701
+ className: "w-[320px] shrink-0 snap-start sm:w-[340px]",
18702
+ children: /* @__PURE__ */ jsxRuntime.jsx(TripCard, __spreadValues({ variant: "editorial" }, trip))
18703
+ },
18704
+ i
18705
+ ))
18706
+ }
18707
+ ) })
18708
+ ] });
18709
+ }
18710
+ function PopularCloud({ eyebrow, title, subtitle, chips }) {
18711
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_WHITE, "py-20 sm:py-28"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18712
+ /* @__PURE__ */ jsxRuntime.jsx(
18713
+ SectionHead,
18714
+ {
18715
+ eyebrow,
18716
+ title,
18717
+ subtitle,
18718
+ align: "center"
18719
+ }
18720
+ ),
18721
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex max-w-3xl flex-wrap items-center justify-center gap-3", children: chips.map((chip, i) => {
18722
+ var _a;
18723
+ return /* @__PURE__ */ jsxRuntime.jsx(
18724
+ Chip,
18725
+ {
18726
+ href: chip.href,
18727
+ variant: chip.featured ? "solid" : "outline",
18728
+ size: (_a = chip.size) != null ? _a : "md",
18729
+ className: "transition-transform hover:-translate-y-0.5",
18730
+ children: chip.label
18731
+ },
18732
+ i
18733
+ );
18734
+ }) })
18735
+ ] }) });
18736
+ }
18737
+ function StatsBand({ items }) {
18738
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_PRIMARY_700, "py-16 text-white sm:py-20"), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-x-6 gap-y-10 text-center lg:grid-cols-4", children: items.map((stat, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
18739
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-heading text-4xl font-black leading-none text-[oklch(0.94_0.05_179)] sm:text-5xl lg:text-6xl", children: stat.value }),
18740
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 text-sm font-medium text-white/90", children: stat.label })
18741
+ ] }, i)) }) }) });
18742
+ }
18743
+ function ReviewStars({ stars = 5 }) {
18744
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 flex items-center gap-0.5", "aria-label": `${stars} out of 5 stars`, children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
18745
+ lucideReact.StarIcon,
18746
+ {
18747
+ className: cn(
18748
+ "h-4 w-4",
18749
+ i + 1 <= Math.round(stars) ? "fill-amber-400 text-amber-400" : "fill-white/15 text-white/15"
18750
+ )
18751
+ },
18752
+ i
18753
+ )) });
18754
+ }
18755
+ function ReviewsBand({ eyebrow, title, subtitle, link, items, note }) {
18756
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: cn(SURFACE_PRIMARY_900, "py-20 text-white sm:py-28"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18757
+ /* @__PURE__ */ jsxRuntime.jsx(
18758
+ SectionHead,
18759
+ {
18760
+ eyebrow,
18761
+ title,
18762
+ subtitle,
18763
+ link,
18764
+ theme: "dark"
18765
+ }
18766
+ ),
18767
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid gap-5 sm:grid-cols-2 lg:grid-cols-3", children: items.map((review, i) => /* @__PURE__ */ jsxRuntime.jsxs(
18768
+ "figure",
18769
+ {
18770
+ className: "rounded-2xl border border-white/10 bg-white/5 p-7 transition-colors hover:bg-white/10",
18771
+ children: [
18772
+ /* @__PURE__ */ jsxRuntime.jsx(ReviewStars, { stars: review.stars }),
18773
+ /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "font-sans text-lg italic leading-relaxed text-white/90", children: [
18774
+ "\u201C",
18775
+ review.quote,
18776
+ "\u201D"
18777
+ ] }),
18778
+ /* @__PURE__ */ jsxRuntime.jsxs("figcaption", { className: "mt-5 text-sm font-medium text-white/60", children: [
18779
+ "\u2014 ",
18780
+ review.author
18781
+ ] })
18782
+ ]
18783
+ },
18784
+ i
18785
+ )) }),
18786
+ note && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-8 text-center text-xs text-white/40", children: note })
18787
+ ] }) });
18788
+ }
18789
+ function NewHome({
18790
+ hero,
18791
+ explorer,
18792
+ expeditions,
18793
+ popular,
18794
+ stats,
18795
+ usp,
18796
+ reviews,
18797
+ journal,
18798
+ cta,
18799
+ footer,
18800
+ className
18801
+ }) {
18802
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full bg-background", className), children: [
18803
+ /* @__PURE__ */ jsxRuntime.jsx(HomeHeader, __spreadValues({}, hero)),
18804
+ explorer && /* @__PURE__ */ jsxRuntime.jsx(
18805
+ AdventureExplorer,
18806
+ __spreadProps(__spreadValues({}, explorer), {
18807
+ className: cn(SURFACE_WHITE, explorer.className)
18808
+ })
18809
+ ),
18810
+ expeditions && /* @__PURE__ */ jsxRuntime.jsx(ExpeditionsRail, __spreadValues({}, expeditions)),
18811
+ popular && /* @__PURE__ */ jsxRuntime.jsx(PopularCloud, __spreadValues({}, popular)),
18812
+ stats && /* @__PURE__ */ jsxRuntime.jsx(StatsBand, __spreadValues({}, stats)),
18813
+ usp && /* @__PURE__ */ jsxRuntime.jsx(USP, __spreadProps(__spreadValues({}, usp), { className: cn(SURFACE_PRIMARY_800, usp.className) })),
18814
+ reviews && /* @__PURE__ */ jsxRuntime.jsx(ReviewsBand, __spreadValues({}, reviews)),
18815
+ journal && /* @__PURE__ */ jsxRuntime.jsx(BlogJournal, __spreadProps(__spreadValues({}, journal), { className: cn(SURFACE_WHITE, journal.className) })),
18816
+ cta && /* @__PURE__ */ jsxRuntime.jsx(CtaBanner, __spreadValues({}, cta)),
18817
+ footer && /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, __spreadValues({}, footer))
18818
+ ] });
18819
+ }
18820
+ var ACTIVE_PILL = "bg-primary text-white shadow-sm";
18821
+ var VARIANT3 = {
18822
+ black: {
18823
+ track: "bg-white/5 border-white/10",
18824
+ idle: "text-white/55 hover:text-white",
18825
+ ring: "focus-visible:ring-white/70"
18826
+ },
18827
+ white: {
18828
+ track: "bg-neutral-100 border-black/10",
18829
+ idle: "text-neutral-500 hover:text-neutral-900",
18830
+ ring: "focus-visible:ring-neutral-900/40"
18831
+ }
18832
+ };
18833
+ var SIZE = {
18834
+ sm: "px-4 py-1.5 text-[13px]",
18835
+ md: "px-5 py-2 text-sm"
18836
+ };
18837
+ function SegmentedControl({
18838
+ items,
18839
+ value,
18840
+ defaultValue,
18841
+ onValueChange,
18842
+ variant = "black",
18843
+ size = "md",
18844
+ fullWidth = false,
18845
+ collapse = false,
18846
+ "aria-label": ariaLabel = "Options",
18847
+ className
18848
+ }) {
18849
+ var _a;
18850
+ const isControlled = value != null;
18851
+ const [internal, setInternal] = React32__namespace.useState(
18852
+ defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
18853
+ );
18854
+ const active = isControlled ? value : internal;
18855
+ const select = (id) => {
18856
+ if (!isControlled) setInternal(id);
18857
+ onValueChange == null ? void 0 : onValueChange(id);
18858
+ };
18859
+ const onKeyDown = (e) => {
18860
+ if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return;
18861
+ e.preventDefault();
18862
+ const enabled = items.filter((i) => !i.disabled);
18863
+ const idx = enabled.findIndex((i) => i.id === active);
18864
+ if (idx === -1) return;
18865
+ const next = e.key === "ArrowRight" ? enabled[(idx + 1) % enabled.length] : enabled[(idx - 1 + enabled.length) % enabled.length];
18866
+ select(next.id);
18867
+ };
18868
+ const v = VARIANT3[variant];
18869
+ return /* @__PURE__ */ jsxRuntime.jsx(
18870
+ "div",
18871
+ {
18872
+ role: "radiogroup",
18873
+ "aria-label": ariaLabel,
18874
+ onKeyDown,
18875
+ className: cn(
18876
+ "inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
18877
+ fullWidth && "flex w-full",
18878
+ v.track,
18879
+ className
18880
+ ),
18881
+ children: items.map((item) => {
18882
+ const isActive = item.id === active;
18883
+ const Icon = item.icon;
18884
+ const showLabel = collapse === "all" ? false : collapse ? isActive : true;
18885
+ return /* @__PURE__ */ jsxRuntime.jsxs(
18886
+ "button",
18887
+ {
18888
+ type: "button",
18889
+ role: "radio",
18890
+ "aria-checked": isActive,
18891
+ "aria-label": collapse && !showLabel ? item.label : void 0,
18892
+ title: collapse && !showLabel ? item.label : void 0,
18893
+ disabled: item.disabled,
18894
+ tabIndex: isActive ? 0 : -1,
18895
+ onClick: () => select(item.id),
18896
+ className: cn(
18897
+ "inline-flex shrink-0 items-center justify-center rounded-full font-ui font-bold transition-all duration-300 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-40",
18898
+ showLabel && Icon ? "gap-2" : "gap-0",
18899
+ variant === "black" ? "focus-visible:ring-offset-neutral-950" : "focus-visible:ring-offset-white",
18900
+ fullWidth && "flex-1",
18901
+ SIZE[size],
18902
+ /* Icon-only segments are square-ish — drop the side padding so
18903
+ the icon centres in a circular pill. */
18904
+ collapse && !showLabel && (size === "sm" ? "!px-1.5" : "!px-2"),
18905
+ isActive ? ACTIVE_PILL : v.idle,
18906
+ v.ring
18907
+ ),
18908
+ children: [
18909
+ Icon && /* @__PURE__ */ jsxRuntime.jsx(
18910
+ Icon,
18911
+ {
18912
+ className: cn("shrink-0", size === "sm" ? "size-4" : "size-[18px]")
18913
+ }
18914
+ ),
18915
+ /* @__PURE__ */ jsxRuntime.jsx(
18916
+ "span",
18917
+ {
18918
+ className: cn(
18919
+ "overflow-hidden whitespace-nowrap transition-all duration-300 ease-out",
18920
+ showLabel ? "max-w-[12ch] opacity-100" : "max-w-0 opacity-0"
18921
+ ),
18922
+ children: item.label
18923
+ }
18924
+ )
18925
+ ]
18926
+ },
18927
+ item.id
18928
+ );
18929
+ })
18930
+ }
18931
+ );
18932
+ }
17181
18933
 
17182
18934
  exports.ActivityCard = ActivityCard;
18935
+ exports.AdventureExplorer = AdventureExplorer;
17183
18936
  exports.AgentContactCard = AgentContactCard;
17184
18937
  exports.Alert = Alert;
17185
18938
  exports.AskExo = AskExo;
17186
18939
  exports.BirthDateField = BirthDateField;
17187
18940
  exports.BlogCard = BlogCard;
18941
+ exports.BlogJournal = BlogJournal;
17188
18942
  exports.BlogPost = BlogPost;
17189
18943
  exports.BookingAdventureCard = BookingAdventureCard;
17190
18944
  exports.BookingCancellationEmail = BookingCancellationEmail;
@@ -17200,8 +18954,17 @@ exports.Button = Button;
17200
18954
  exports.COUNTRIES = COUNTRIES;
17201
18955
  exports.CancellationForm = CancellationForm;
17202
18956
  exports.CategoryPage2 = CategoryPage2;
18957
+ exports.Chip = Chip;
17203
18958
  exports.CounterField = CounterField;
17204
18959
  exports.CountrySearchField = CountrySearchField;
18960
+ exports.CtaBanner = CtaBanner;
18961
+ exports.DEFAULT_FOOTER_BADGES = DEFAULT_FOOTER_BADGES;
18962
+ exports.DEFAULT_FOOTER_DESTINATIONS = DEFAULT_FOOTER_DESTINATIONS;
18963
+ exports.DEFAULT_FOOTER_LANGUAGES = DEFAULT_FOOTER_LANGUAGES;
18964
+ exports.DEFAULT_FOOTER_LEGAL = DEFAULT_FOOTER_LEGAL;
18965
+ exports.DEFAULT_FOOTER_PAGES = DEFAULT_FOOTER_PAGES;
18966
+ exports.DEFAULT_FOOTER_SOCIALS = DEFAULT_FOOTER_SOCIALS;
18967
+ exports.DEFAULT_FOOTER_THEMES = DEFAULT_FOOTER_THEMES;
17205
18968
  exports.DEFAULT_HEADER_LINKS = DEFAULT_HEADER_LINKS;
17206
18969
  exports.DEFAULT_LANGUAGES = DEFAULT_LANGUAGES;
17207
18970
  exports.DEPARTURE_STATUS_MAP = STATUS_MAP;
@@ -17219,11 +18982,13 @@ exports.FloatingInput = FloatingInput;
17219
18982
  exports.FloatingSelect = FloatingSelect;
17220
18983
  exports.GroupProgressBar = GroupProgressBar;
17221
18984
  exports.GroupStatusBanner = GroupStatusBanner;
18985
+ exports.HomeHeader = HomeHeader;
17222
18986
  exports.Itinerary = Itinerary;
17223
18987
  exports.ItineraryDay = ItineraryDay;
17224
18988
  exports.LOGO_PLANETAEXO_DATA_URI = LOGO_PLANETAEXO_DATA_URI;
17225
18989
  exports.LeadCapturePopup = LeadCapturePopup;
17226
18990
  exports.MenuTrip = MenuTrip;
18991
+ exports.NewHome = NewHome;
17227
18992
  exports.NotificationEmail = NotificationEmail;
17228
18993
  exports.OTPCodeInput = OTPCodeInput;
17229
18994
  exports.Offer = Offer;
@@ -17249,7 +19014,9 @@ exports.RegistrationProgressBar = RegistrationProgressBar;
17249
19014
  exports.RegistrationReminderEmail = RegistrationReminderEmail;
17250
19015
  exports.RegistrationReminderIndividualEmail = RegistrationReminderIndividualEmail;
17251
19016
  exports.RegistrationSuccessCard = RegistrationSuccessCard;
19017
+ exports.SegmentedControl = SegmentedControl;
17252
19018
  exports.ShareWidget = ShareWidget;
19019
+ exports.SiteFooter = SiteFooter;
17253
19020
  exports.SiteHeader = SiteHeader;
17254
19021
  exports.StatusBadge = StatusBadge2;
17255
19022
  exports.StickyBookingCard = StickyBookingCard;
@@ -17263,7 +19030,9 @@ exports.TripCard = TripCard;
17263
19030
  exports.TripHeader = TripHeader;
17264
19031
  exports.TripPage = TripPage;
17265
19032
  exports.TrustpilotEmbed = TrustpilotEmbed;
19033
+ exports.USP = USP;
17266
19034
  exports.buttonVariants = buttonVariants;
19035
+ exports.chipVariants = chipVariants;
17267
19036
  exports.cn = cn;
17268
19037
  exports.emailTokens = emailTokens;
17269
19038
  exports.formatCpf = formatCpf;