@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.js CHANGED
@@ -4,7 +4,7 @@ import { cva } from 'class-variance-authority';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
- import { XIcon, ChevronDownIcon, CalendarIcon, SearchIcon, ChevronRightIcon, ArrowLeftIcon, CheckCircle2Icon, MapIcon, LogOutIcon, UsersIcon, CreditCardIcon, AlertCircleIcon, MinusIcon, PlusIcon, CircleCheckIcon, SlidersHorizontalIcon, ChevronLeftIcon, HomeIcon, SailboatIcon, CarIcon, WavesIcon, FootprintsIcon, InfoIcon, ClockIcon, CheckIcon, ChevronUpIcon, MenuIcon, UserIcon, SunIcon, MoonIcon, MapPinIcon, PackageIcon, BedDoubleIcon, UtensilsIcon, CompassIcon, BackpackIcon, CherryIcon, ReceiptIcon, ArrowRightIcon, Loader2Icon, SendIcon, CheckCircleIcon, ArrowDownIcon, SparkleIcon, Share2Icon, CopyIcon, Info, MailIcon, PhoneIcon, MessageCircleIcon, UserPlusIcon, ExternalLinkIcon, PencilIcon, Trash2Icon, UserMinusIcon, AlertTriangleIcon, ZoomInIcon, StarIcon, TwitterIcon, YoutubeIcon, LinkedinIcon, InstagramIcon, FacebookIcon, LayoutGridIcon } from 'lucide-react';
7
+ import { XIcon, ChevronDownIcon, CalendarIcon, SearchIcon, ChevronRightIcon, ArrowLeftIcon, CheckCircle2Icon, MapIcon, LogOutIcon, UsersIcon, CreditCardIcon, AlertCircleIcon, MinusIcon, PlusIcon, CircleCheckIcon, SlidersHorizontalIcon, ChevronLeftIcon, HomeIcon, SailboatIcon, CarIcon, WavesIcon, FootprintsIcon, InfoIcon, ClockIcon, CheckIcon, ChevronUpIcon, MenuIcon, UserIcon, SunIcon, MoonIcon, MapPinIcon, TwitterIcon, YoutubeIcon, LinkedinIcon, InstagramIcon, FacebookIcon, ArrowRightIcon, PackageIcon, BedDoubleIcon, UtensilsIcon, CompassIcon, BackpackIcon, CherryIcon, ReceiptIcon, Loader2Icon, SendIcon, CheckCircleIcon, ArrowDownIcon, SparkleIcon, Share2Icon, CopyIcon, Info, MailIcon, PhoneIcon, MessageCircleIcon, UserPlusIcon, ExternalLinkIcon, PencilIcon, Trash2Icon, UserMinusIcon, AlertTriangleIcon, ZoomInIcon, StarIcon, LayoutGridIcon } from 'lucide-react';
8
8
  import { Separator as Separator$1 } from '@base-ui/react/separator';
9
9
  import { Dialog as Dialog$1 } from '@base-ui/react/dialog';
10
10
  import { Button as Button$1 } from '@base-ui/react/button';
@@ -617,7 +617,8 @@ function PhoneCountrySelect({
617
617
  value,
618
618
  onChange,
619
619
  className,
620
- disabled
620
+ disabled,
621
+ showDial = true
621
622
  }) {
622
623
  var _a;
623
624
  const [open, setOpen] = React32.useState(false);
@@ -666,7 +667,7 @@ function PhoneCountrySelect({
666
667
  ),
667
668
  children: [
668
669
  /* @__PURE__ */ jsx("span", { className: "text-base leading-none", children: selected.flag }),
669
- /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: selected.dial }),
670
+ showDial && /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: selected.dial }),
670
671
  /* @__PURE__ */ jsx(
671
672
  ChevronDownIcon,
672
673
  {
@@ -1305,7 +1306,7 @@ function AdventureCard({
1305
1306
  labels,
1306
1307
  interactionsDisabled
1307
1308
  }) {
1308
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
1309
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
1309
1310
  const isControlled = (_b = (_a = adventure.optionals) == null ? void 0 : _a.some((o) => o.onCheckedChange !== void 0)) != null ? _b : false;
1310
1311
  const [checkedInternal, setCheckedInternal] = React32.useState(
1311
1312
  new Set((_d = (_c = adventure.optionals) == null ? void 0 : _c.filter((o) => o.defaultChecked).map((o) => o.id)) != null ? _d : [])
@@ -1479,6 +1480,29 @@ function AdventureCard({
1479
1480
  }
1480
1481
  )
1481
1482
  ] }),
1483
+ adventure.rooms && adventure.rooms.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-5 mt-1", children: adventure.rooms.map((room, i) => {
1484
+ var _a2, _b2;
1485
+ 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";
1486
+ const heading = adventure.accommodationRoomHeading ? adventure.accommodationRoomHeading(room.roomName) : `Accommodation: ${room.roomName}`;
1487
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
1488
+ /* @__PURE__ */ jsx("h4", { className: "text-lg font-semibold text-foreground font-heading", children: heading }),
1489
+ room.imageUrl && // eslint-disable-next-line @next/next/no-img-element
1490
+ /* @__PURE__ */ jsx(
1491
+ "img",
1492
+ {
1493
+ src: room.imageUrl,
1494
+ alt: room.roomName,
1495
+ className: "w-full h-auto max-w-full rounded"
1496
+ }
1497
+ ),
1498
+ /* @__PURE__ */ jsx("div", { className: "text-base font-semibold text-foreground", children: `${room.qty}\xD7 ${room.roomName}` }),
1499
+ /* @__PURE__ */ jsxs("div", { className: "text-sm text-foreground/70 flex items-center gap-2 flex-wrap", children: [
1500
+ /* @__PURE__ */ jsx("span", { children: room.accommodationName }),
1501
+ /* @__PURE__ */ 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 })
1502
+ ] }),
1503
+ room.description && /* @__PURE__ */ jsx("p", { className: "text-sm text-foreground/70 leading-snug", children: room.description })
1504
+ ] }, i);
1505
+ }) }),
1482
1506
  (adventure.description || adventure.detailsSlot) && /* @__PURE__ */ jsxs(Fragment, { children: [
1483
1507
  /* @__PURE__ */ jsx(Separator, { className: "my-1" }),
1484
1508
  /* @__PURE__ */ jsxs("div", { children: [
@@ -1507,48 +1531,22 @@ function AdventureCard({
1507
1531
  ), children: adventure.detailsSlot })
1508
1532
  ] })
1509
1533
  ] }),
1510
- adventure.rooms && adventure.rooms.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
1511
- /* @__PURE__ */ jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_p = adventure.accommodationsLabel) != null ? _p : "Accommodations" }),
1512
- /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-3", children: adventure.rooms.map((room, i) => {
1513
- var _a2, _b2;
1514
- 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";
1515
- return /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-3", children: [
1516
- room.imageUrl && // eslint-disable-next-line @next/next/no-img-element
1517
- /* @__PURE__ */ jsx(
1518
- "img",
1519
- {
1520
- src: room.imageUrl,
1521
- alt: room.roomName,
1522
- className: "w-20 h-16 object-cover rounded shrink-0"
1523
- }
1524
- ),
1525
- /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
1526
- /* @__PURE__ */ jsx("div", { className: "text-base font-semibold text-foreground", children: `${room.qty}\xD7 ${room.roomName}` }),
1527
- /* @__PURE__ */ jsxs("div", { className: "text-sm text-foreground/70 flex items-center gap-2 flex-wrap", children: [
1528
- /* @__PURE__ */ jsx("span", { children: room.accommodationName }),
1529
- /* @__PURE__ */ 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 })
1530
- ] }),
1531
- room.description && /* @__PURE__ */ jsx("p", { className: "text-sm text-foreground/70 mt-1 leading-snug", children: room.description })
1532
- ] })
1533
- ] }, i);
1534
- }) })
1535
- ] }),
1536
1534
  adventure.included && adventure.included.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
1537
- /* @__PURE__ */ jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_q = adventure.includedLabel) != null ? _q : "What's included" }),
1535
+ /* @__PURE__ */ jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_p = adventure.includedLabel) != null ? _p : "What's included" }),
1538
1536
  /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.included.map((item, i) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-base text-foreground/80 font-sans", children: [
1539
1537
  /* @__PURE__ */ jsx(CheckIcon, { className: "w-4 h-4 text-primary shrink-0 mt-1" }),
1540
1538
  item
1541
1539
  ] }, i)) })
1542
1540
  ] }),
1543
1541
  adventure.notIncluded && adventure.notIncluded.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
1544
- /* @__PURE__ */ jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_r = adventure.notIncludedLabel) != null ? _r : "What's not included" }),
1542
+ /* @__PURE__ */ jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_q = adventure.notIncludedLabel) != null ? _q : "What's not included" }),
1545
1543
  /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.notIncluded.map((item, i) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-base text-foreground/80 font-sans", children: [
1546
1544
  /* @__PURE__ */ jsx(XIcon, { className: "w-4 h-4 text-destructive shrink-0 mt-1" }),
1547
1545
  item
1548
1546
  ] }, i)) })
1549
1547
  ] }),
1550
1548
  adventure.cancellationPolicy && adventure.cancellationPolicy.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
1551
- /* @__PURE__ */ jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_s = adventure.cancellationPolicyLabel) != null ? _s : "Cancellation policy" }),
1549
+ /* @__PURE__ */ jsx("h4", { className: "text-base font-bold text-foreground font-heading", children: (_r = adventure.cancellationPolicyLabel) != null ? _r : "Cancellation policy" }),
1552
1550
  /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.cancellationPolicy.map((item, i) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-base text-muted-foreground font-sans", children: [
1553
1551
  /* @__PURE__ */ jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-primary shrink-0 mt-2.5" }),
1554
1552
  item
@@ -4125,6 +4123,7 @@ var DEFAULT_LABELS = {
4125
4123
  adultsUnit: "adult(s)",
4126
4124
  childrenUnit: "child(ren)",
4127
4125
  accommodationsHeading: "ACCOMMODATIONS",
4126
+ accommodationRoomHeading: (name) => `Accommodation: ${name}`,
4128
4127
  bedArrangementLabels: {
4129
4128
  DOUBLE: "Double",
4130
4129
  TWIN: "Twin",
@@ -4152,10 +4151,11 @@ function BookingAdventureCard({
4152
4151
  lineItems,
4153
4152
  subtotal,
4154
4153
  rooms,
4154
+ roomLayout = "compact",
4155
4155
  labels,
4156
4156
  className
4157
4157
  }) {
4158
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
4158
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
4159
4159
  const l = {
4160
4160
  travellersHeading: (_a = labels == null ? void 0 : labels.travellersHeading) != null ? _a : DEFAULT_LABELS.travellersHeading,
4161
4161
  detailsHeading: (_b = labels == null ? void 0 : labels.detailsHeading) != null ? _b : DEFAULT_LABELS.detailsHeading,
@@ -4170,11 +4170,12 @@ function BookingAdventureCard({
4170
4170
  adultsUnit: (_k = labels == null ? void 0 : labels.adultsUnit) != null ? _k : DEFAULT_LABELS.adultsUnit,
4171
4171
  childrenUnit: (_l = labels == null ? void 0 : labels.childrenUnit) != null ? _l : DEFAULT_LABELS.childrenUnit,
4172
4172
  accommodationsHeading: (_m = labels == null ? void 0 : labels.accommodationsHeading) != null ? _m : DEFAULT_LABELS.accommodationsHeading,
4173
+ accommodationRoomHeading: (_n = labels == null ? void 0 : labels.accommodationRoomHeading) != null ? _n : DEFAULT_LABELS.accommodationRoomHeading,
4173
4174
  bedArrangementLabels: {
4174
- DOUBLE: (_o = (_n = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _n.DOUBLE) != null ? _o : DEFAULT_LABELS.bedArrangementLabels.DOUBLE,
4175
- TWIN: (_q = (_p = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _p.TWIN) != null ? _q : DEFAULT_LABELS.bedArrangementLabels.TWIN,
4176
- SINGLE: (_s = (_r = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _r.SINGLE) != null ? _s : DEFAULT_LABELS.bedArrangementLabels.SINGLE,
4177
- TRIPLE: (_u = (_t = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _t.TRIPLE) != null ? _u : DEFAULT_LABELS.bedArrangementLabels.TRIPLE
4175
+ DOUBLE: (_p = (_o = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _o.DOUBLE) != null ? _p : DEFAULT_LABELS.bedArrangementLabels.DOUBLE,
4176
+ TWIN: (_r = (_q = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _q.TWIN) != null ? _r : DEFAULT_LABELS.bedArrangementLabels.TWIN,
4177
+ SINGLE: (_t = (_s = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _s.SINGLE) != null ? _t : DEFAULT_LABELS.bedArrangementLabels.SINGLE,
4178
+ TRIPLE: (_v = (_u = labels == null ? void 0 : labels.bedArrangementLabels) == null ? void 0 : _u.TRIPLE) != null ? _v : DEFAULT_LABELS.bedArrangementLabels.TRIPLE
4178
4179
  }
4179
4180
  };
4180
4181
  const hasTravellers = !!travellers && travellers.length > 0;
@@ -4513,7 +4514,116 @@ function BookingAdventureCard({
4513
4514
  );
4514
4515
  })
4515
4516
  ] }),
4516
- hasRooms && /* @__PURE__ */ jsxs("div", { style: { marginTop: "4px" }, children: [
4517
+ hasRooms && roomLayout === "feature" && /* @__PURE__ */ jsxs("div", { style: { marginTop: "4px" }, children: [
4518
+ /* @__PURE__ */ jsx(
4519
+ "hr",
4520
+ {
4521
+ style: {
4522
+ border: "none",
4523
+ borderTop: `1px solid ${emailTokens.border}`,
4524
+ marginBottom: "10px"
4525
+ }
4526
+ }
4527
+ ),
4528
+ /* @__PURE__ */ jsx(
4529
+ "p",
4530
+ {
4531
+ style: {
4532
+ fontSize: "10px",
4533
+ fontWeight: 700,
4534
+ color: emailTokens.mutedForeground,
4535
+ textTransform: "uppercase",
4536
+ letterSpacing: "0.1em",
4537
+ margin: "0 0 10px 0"
4538
+ },
4539
+ children: l.accommodationsHeading
4540
+ }
4541
+ ),
4542
+ rooms.map((room, i) => /* @__PURE__ */ jsxs(
4543
+ "div",
4544
+ {
4545
+ style: {
4546
+ marginBottom: i < rooms.length - 1 ? "16px" : "0"
4547
+ },
4548
+ children: [
4549
+ /* @__PURE__ */ jsx(
4550
+ "p",
4551
+ {
4552
+ style: {
4553
+ fontSize: "16px",
4554
+ fontWeight: 700,
4555
+ color: emailTokens.foreground,
4556
+ lineHeight: "1.3",
4557
+ margin: "0 0 8px 0"
4558
+ },
4559
+ children: l.accommodationRoomHeading(room.roomName)
4560
+ }
4561
+ ),
4562
+ room.imageUrl && /* @__PURE__ */ jsx("div", { style: { marginBottom: "8px" }, children: /* @__PURE__ */ jsx(
4563
+ "img",
4564
+ {
4565
+ src: room.imageUrl,
4566
+ alt: room.roomName,
4567
+ style: {
4568
+ width: "100%",
4569
+ height: "auto",
4570
+ maxWidth: "100%",
4571
+ display: "block",
4572
+ borderRadius: "8px"
4573
+ }
4574
+ }
4575
+ ) }),
4576
+ /* @__PURE__ */ jsx(
4577
+ "div",
4578
+ {
4579
+ style: {
4580
+ fontSize: "14px",
4581
+ fontWeight: 600,
4582
+ color: emailTokens.foreground,
4583
+ marginBottom: "2px"
4584
+ },
4585
+ children: `${room.qty}\xD7 ${room.roomName}`
4586
+ }
4587
+ ),
4588
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: "12px", color: emailTokens.mutedForeground }, children: [
4589
+ room.accommodationName,
4590
+ /* @__PURE__ */ jsx(
4591
+ "span",
4592
+ {
4593
+ style: {
4594
+ display: "inline-block",
4595
+ marginLeft: "8px",
4596
+ padding: "1px 6px",
4597
+ fontSize: "10px",
4598
+ fontWeight: 600,
4599
+ color: emailTokens.primary,
4600
+ backgroundColor: emailTokens.primaryLight,
4601
+ borderRadius: "4px",
4602
+ textTransform: "uppercase",
4603
+ letterSpacing: "0.05em"
4604
+ },
4605
+ children: l.bedArrangementLabels[room.bedArrangement]
4606
+ }
4607
+ )
4608
+ ] }),
4609
+ room.description && /* @__PURE__ */ jsx(
4610
+ "div",
4611
+ {
4612
+ style: {
4613
+ fontSize: "12px",
4614
+ color: emailTokens.bodyText,
4615
+ marginTop: "4px",
4616
+ lineHeight: "1.4"
4617
+ },
4618
+ children: room.description
4619
+ }
4620
+ )
4621
+ ]
4622
+ },
4623
+ i
4624
+ ))
4625
+ ] }),
4626
+ hasRooms && roomLayout === "compact" && /* @__PURE__ */ jsxs("div", { style: { marginTop: "4px" }, children: [
4517
4627
  /* @__PURE__ */ jsx(
4518
4628
  "hr",
4519
4629
  {
@@ -5152,6 +5262,14 @@ var DEFAULT_LABELS3 = {
5152
5262
  pricingLabel: "Pricing",
5153
5263
  subtotalLabel: "Subtotal",
5154
5264
  totalLabel: "Total",
5265
+ accommodationsLabel: "ACCOMMODATIONS",
5266
+ accommodationRoomHeading: (name) => `Accommodation: ${name}`,
5267
+ bedArrangementLabels: {
5268
+ DOUBLE: "Double",
5269
+ TWIN: "Twin",
5270
+ SINGLE: "Single",
5271
+ TRIPLE: "Triple"
5272
+ },
5155
5273
  paymentSummaryHeading: "\u{1F4B0} Payment Summary",
5156
5274
  paymentDetailsHeading: "Payment Details",
5157
5275
  depositLabel: (percent) => `Deposit (${percent}%)`,
@@ -5320,6 +5438,7 @@ function BookingPaymentConfirmationEmail({
5320
5438
  lineItems: lineItemsToPass,
5321
5439
  subtotal: adventure.subtotal,
5322
5440
  rooms: adventure.rooms,
5441
+ roomLayout: "feature",
5323
5442
  labels: {
5324
5443
  travellersHeading: l.travellersLabel,
5325
5444
  detailsHeading: l.itineraryLabel,
@@ -5329,7 +5448,10 @@ function BookingPaymentConfirmationEmail({
5329
5448
  notIncludedHeading: l.notIncludedLabel,
5330
5449
  childBadge: l.childBadge,
5331
5450
  adultsUnit: l.adultsUnit,
5332
- childrenUnit: l.childrenUnit
5451
+ childrenUnit: l.childrenUnit,
5452
+ accommodationsHeading: l.accommodationsLabel,
5453
+ accommodationRoomHeading: l.accommodationRoomHeading,
5454
+ bedArrangementLabels: l.bedArrangementLabels
5333
5455
  }
5334
5456
  }
5335
5457
  )
@@ -7909,7 +8031,8 @@ function DatePickerField({
7909
8031
  placeholder = "Select a date",
7910
8032
  disabled,
7911
8033
  fromDate,
7912
- className
8034
+ className,
8035
+ error
7913
8036
  }) {
7914
8037
  const [open, setOpen] = React32.useState(false);
7915
8038
  const containerRef = React32.useRef(null);
@@ -7923,78 +8046,91 @@ function DatePickerField({
7923
8046
  observer.observe(containerRef.current);
7924
8047
  return () => observer.disconnect();
7925
8048
  }, []);
7926
- return /* @__PURE__ */ jsx("div", { ref: containerRef, className: cn("w-full", className), children: /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
7927
- /* @__PURE__ */ jsxs(
7928
- PopoverTrigger,
7929
- {
7930
- disabled,
7931
- className: cn(
7932
- "relative flex w-full items-center rounded-lg border border-border bg-background",
7933
- "px-3 text-left text-base font-ui transition-colors h-14",
7934
- "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
7935
- "disabled:pointer-events-none disabled:opacity-50",
7936
- open && "border-primary ring-1 ring-primary"
7937
- ),
7938
- children: [
7939
- /* @__PURE__ */ jsxs(
7940
- "span",
7941
- {
7942
- className: cn(
7943
- "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
7944
- hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
7945
- ),
7946
- children: [
7947
- label,
7948
- required && /* @__PURE__ */ jsx("span", { className: "text-primary ml-0.5", children: "*" })
7949
- ]
7950
- }
8049
+ return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("w-full", className), children: [
8050
+ /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
8051
+ /* @__PURE__ */ jsxs(
8052
+ PopoverTrigger,
8053
+ {
8054
+ disabled,
8055
+ className: cn(
8056
+ "relative flex w-full items-center rounded-lg border border-border bg-background",
8057
+ "px-3 text-left text-base font-ui transition-colors h-14",
8058
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
8059
+ "disabled:pointer-events-none disabled:opacity-50",
8060
+ open && "border-primary ring-1 ring-primary",
8061
+ error && "border-destructive focus:border-destructive focus:ring-destructive"
7951
8062
  ),
7952
- /* @__PURE__ */ jsx(
7953
- "span",
8063
+ children: [
8064
+ /* @__PURE__ */ jsxs(
8065
+ "span",
8066
+ {
8067
+ className: cn(
8068
+ "pointer-events-none absolute left-3 transition-all duration-150 font-ui",
8069
+ hasValue || open ? "top-2 text-xs text-primary" : "top-1/2 -translate-y-1/2 text-base text-muted-foreground"
8070
+ ),
8071
+ children: [
8072
+ label,
8073
+ required && /* @__PURE__ */ jsx("span", { className: "text-primary ml-0.5", children: "*" })
8074
+ ]
8075
+ }
8076
+ ),
8077
+ /* @__PURE__ */ jsx(
8078
+ "span",
8079
+ {
8080
+ className: cn(
8081
+ "flex-1 truncate mt-3",
8082
+ hasValue ? "text-foreground" : "invisible"
8083
+ ),
8084
+ children: hasValue ? format(value, "dd MMM yyyy") : placeholder
8085
+ }
8086
+ ),
8087
+ /* @__PURE__ */ jsx(CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
8088
+ ]
8089
+ }
8090
+ ),
8091
+ /* @__PURE__ */ jsx(
8092
+ PopoverContent,
8093
+ {
8094
+ className: "p-0",
8095
+ align: "start",
8096
+ style: calendarWidth ? { width: calendarWidth } : void 0,
8097
+ children: /* @__PURE__ */ jsx(
8098
+ Calendar,
7954
8099
  {
7955
- className: cn(
7956
- "flex-1 truncate mt-3",
7957
- hasValue ? "text-foreground" : "invisible"
7958
- ),
7959
- children: hasValue ? format(value, "dd MMM yyyy") : placeholder
8100
+ mode: "single",
8101
+ selected: value,
8102
+ onSelect: (date) => {
8103
+ onChange == null ? void 0 : onChange(date);
8104
+ setOpen(false);
8105
+ },
8106
+ fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
8107
+ className: "font-ui w-full",
8108
+ autoFocus: true
7960
8109
  }
7961
- ),
7962
- /* @__PURE__ */ jsx(CalendarIcon, { className: "ml-2 h-4 w-4 shrink-0 text-muted-foreground" })
7963
- ]
7964
- }
7965
- ),
7966
- /* @__PURE__ */ jsx(
7967
- PopoverContent,
7968
- {
7969
- className: "p-0",
7970
- align: "start",
7971
- style: calendarWidth ? { width: calendarWidth } : void 0,
7972
- children: /* @__PURE__ */ jsx(
7973
- Calendar,
7974
- {
7975
- mode: "single",
7976
- selected: value,
7977
- onSelect: (date) => {
7978
- onChange == null ? void 0 : onChange(date);
7979
- setOpen(false);
7980
- },
7981
- fromDate: fromDate != null ? fromDate : /* @__PURE__ */ new Date(),
7982
- className: "font-ui w-full",
7983
- autoFocus: true
7984
- }
7985
- )
7986
- }
7987
- )
7988
- ] }) });
8110
+ )
8111
+ }
8112
+ )
8113
+ ] }),
8114
+ error && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: error })
8115
+ ] });
7989
8116
  }
8117
+ function dialFor(iso) {
8118
+ var _a, _b;
8119
+ return (_b = (_a = PHONE_COUNTRIES.find((c) => c.code === iso)) == null ? void 0 : _a.dial) != null ? _b : "";
8120
+ }
8121
+ var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
7990
8122
  function FormSection({
7991
8123
  title,
8124
+ required,
7992
8125
  children,
7993
8126
  className
7994
8127
  }) {
7995
8128
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-5", className), children: [
7996
8129
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
7997
- /* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: title }),
8130
+ /* @__PURE__ */ jsxs("h3", { className: "text-base font-bold text-foreground whitespace-nowrap font-heading", children: [
8131
+ title,
8132
+ required && /* @__PURE__ */ jsx("span", { className: "text-primary ml-0.5", children: "*" })
8133
+ ] }),
7998
8134
  /* @__PURE__ */ jsx("div", { className: "h-px flex-1 bg-border" })
7999
8135
  ] }),
8000
8136
  children
@@ -8010,24 +8146,67 @@ var defaultInitial = {
8010
8146
  phoneCountry: "BR",
8011
8147
  lastName: "",
8012
8148
  firstName: "",
8013
- country: "France",
8149
+ country: "",
8014
8150
  phone: "",
8015
- email: ""
8151
+ email: "",
8152
+ contactVia: "Email"
8016
8153
  };
8017
8154
  function BookingForm({
8018
8155
  defaultValues,
8019
8156
  onSubmit,
8020
- submitLabel = "Send my request",
8157
+ submitLabel,
8021
8158
  loading = false,
8022
8159
  showHeader = true,
8023
- title = "Check availability for your trip",
8024
- subtitle = "Free enquiry \u2013 no commitment",
8160
+ title,
8161
+ subtitle,
8162
+ labels,
8025
8163
  className
8026
8164
  }) {
8165
+ 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;
8166
+ const L = labels != null ? labels : {};
8167
+ const titleText = (_a = title != null ? title : L.title) != null ? _a : "Check availability for your trip";
8168
+ const subtitleText = (_b = subtitle != null ? subtitle : L.subtitle) != null ? _b : "Free enquiry \u2013 no commitment";
8169
+ const submitText = (_c = submitLabel != null ? submitLabel : L.submit) != null ? _c : "Send my request";
8027
8170
  const [values, setValues] = React32.useState(__spreadValues(__spreadValues({}, defaultInitial), defaultValues));
8028
- const set = (key, value) => setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8171
+ const [errors, setErrors] = React32.useState({});
8172
+ const set = (key, value) => {
8173
+ setValues((prev) => __spreadProps(__spreadValues({}, prev), { [key]: value }));
8174
+ setErrors(
8175
+ (prev) => prev[key] ? __spreadProps(__spreadValues({}, prev), { [key]: void 0 }) : prev
8176
+ );
8177
+ };
8178
+ React32.useEffect(() => {
8179
+ if (!defaultValues) return;
8180
+ setValues((prev) => {
8181
+ let changed = false;
8182
+ const next = __spreadValues({}, prev);
8183
+ Object.keys(defaultValues).forEach(
8184
+ (k) => {
8185
+ const incoming = defaultValues[k];
8186
+ if (incoming === void 0 || incoming === "") return;
8187
+ if (prev[k] === defaultInitial[k]) {
8188
+ next[k] = incoming;
8189
+ changed = true;
8190
+ }
8191
+ }
8192
+ );
8193
+ return changed ? next : prev;
8194
+ });
8195
+ }, [defaultValues]);
8196
+ const reqMsg = (_d = L.errorRequired) != null ? _d : "This field is required";
8197
+ const emailMsg = (_e = L.errorEmail) != null ? _e : "Enter a valid email address";
8029
8198
  const handleSubmit = (e) => {
8030
8199
  e.preventDefault();
8200
+ const next = {};
8201
+ if (!values.firstName.trim()) next.firstName = reqMsg;
8202
+ if (!values.lastName.trim()) next.lastName = reqMsg;
8203
+ if (!values.email.trim()) next.email = reqMsg;
8204
+ else if (!EMAIL_RE.test(values.email.trim())) next.email = emailMsg;
8205
+ if (!values.travelDate) next.travelDate = reqMsg;
8206
+ if (!values.phone.trim()) next.phone = reqMsg;
8207
+ if (!values.contactVia) next.contactVia = reqMsg;
8208
+ setErrors(next);
8209
+ if (Object.keys(next).length > 0) return;
8031
8210
  onSubmit == null ? void 0 : onSubmit(values);
8032
8211
  };
8033
8212
  return /* @__PURE__ */ jsxs(
@@ -8038,15 +8217,14 @@ function BookingForm({
8038
8217
  noValidate: true,
8039
8218
  children: [
8040
8219
  showHeader && /* @__PURE__ */ jsxs("div", { children: [
8041
- /* @__PURE__ */ jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: title }),
8042
- /* @__PURE__ */ jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitle })
8220
+ /* @__PURE__ */ jsx("h2", { className: "text-2xl font-black uppercase tracking-wide text-foreground font-heading leading-tight", children: titleText }),
8221
+ /* @__PURE__ */ jsx("p", { className: "mt-1.5 text-sm text-muted-foreground font-ui", children: subtitleText })
8043
8222
  ] }),
8044
- /* @__PURE__ */ jsx(FormSection, { title: "Who's joining the adventure?", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8223
+ /* @__PURE__ */ jsx(FormSection, { title: (_f = L.travelersSection) != null ? _f : "Who's joining the adventure?", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8045
8224
  /* @__PURE__ */ jsx(
8046
8225
  CounterField,
8047
8226
  {
8048
- label: "Adults",
8049
- required: true,
8227
+ label: (_g = L.adults) != null ? _g : "Adults",
8050
8228
  value: values.adults,
8051
8229
  min: 1,
8052
8230
  onChange: (v) => set("adults", v)
@@ -8055,30 +8233,30 @@ function BookingForm({
8055
8233
  /* @__PURE__ */ jsx(
8056
8234
  CounterField,
8057
8235
  {
8058
- label: "Children",
8059
- sublabel: "(under 12)",
8236
+ label: (_h = L.children) != null ? _h : "Children",
8237
+ sublabel: (_i = L.childrenSublabel) != null ? _i : "(under 12)",
8060
8238
  value: values.children,
8061
8239
  min: 0,
8062
8240
  onChange: (v) => set("children", v)
8063
8241
  }
8064
8242
  )
8065
8243
  ] }) }),
8066
- /* @__PURE__ */ jsx(FormSection, { title: "Your next trip", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8244
+ /* @__PURE__ */ jsx(FormSection, { title: (_j = L.tripSection) != null ? _j : "Your next trip", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
8067
8245
  /* @__PURE__ */ jsx(
8068
8246
  DatePickerField,
8069
8247
  {
8070
- label: "Travel date",
8248
+ label: (_k = L.travelDate) != null ? _k : "Travel date",
8071
8249
  required: true,
8072
8250
  value: values.travelDate,
8073
8251
  onChange: (d) => set("travelDate", d),
8074
- placeholder: "Pick a date"
8252
+ placeholder: (_l = L.pickDate) != null ? _l : "Pick a date",
8253
+ error: errors.travelDate
8075
8254
  }
8076
8255
  ),
8077
8256
  /* @__PURE__ */ jsx(
8078
8257
  FloatingInput,
8079
8258
  {
8080
- label: "Budget (per person)",
8081
- required: true,
8259
+ label: (_m = L.budget) != null ? _m : "Budget (per person)",
8082
8260
  type: "number",
8083
8261
  min: 0,
8084
8262
  value: values.budget,
@@ -8086,7 +8264,7 @@ function BookingForm({
8086
8264
  }
8087
8265
  )
8088
8266
  ] }) }),
8089
- /* @__PURE__ */ jsx(FormSection, { title: "Tell us about your trip", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
8267
+ /* @__PURE__ */ jsx(FormSection, { title: (_n = L.projectSection) != null ? _n : "Tell us about your trip", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
8090
8268
  /* @__PURE__ */ jsx(
8091
8269
  "textarea",
8092
8270
  {
@@ -8114,140 +8292,184 @@ function BookingForm({
8114
8292
  "peer-not-placeholder-shown:top-2 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
8115
8293
  ),
8116
8294
  children: [
8117
- "Your trip in a few words",
8295
+ (_o = L.projectLabel) != null ? _o : "Your trip in a few words",
8118
8296
  " ",
8119
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })
8297
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-normal", children: (_p = L.optional) != null ? _p : "(optional)" })
8120
8298
  ]
8121
8299
  }
8122
8300
  )
8123
8301
  ] }) }),
8124
- /* @__PURE__ */ jsxs(FormSection, { title: "Contact details", children: [
8302
+ /* @__PURE__ */ jsxs(FormSection, { title: (_q = L.contactSection) != null ? _q : "Contact details", children: [
8125
8303
  /* @__PURE__ */ jsx(
8126
8304
  "div",
8127
8305
  {
8128
8306
  role: "radiogroup",
8129
- "aria-label": "Title",
8307
+ "aria-label": (_r = L.titleAria) != null ? _r : "Title",
8130
8308
  className: "flex flex-wrap items-center gap-x-6 gap-y-3",
8131
- children: ["ms", "mr"].map((c) => /* @__PURE__ */ jsxs(
8132
- "label",
8133
- {
8134
- className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
8135
- children: [
8136
- /* @__PURE__ */ jsx(
8137
- "input",
8138
- {
8139
- type: "radio",
8140
- name: "civility",
8141
- value: c,
8142
- checked: values.civility === c,
8143
- onChange: () => set("civility", c),
8144
- className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
8145
- }
8146
- ),
8147
- c === "ms" ? "Ms." : "Mr."
8148
- ]
8149
- },
8150
- c
8151
- ))
8309
+ children: ["ms", "mr"].map((c) => {
8310
+ var _a2, _b2;
8311
+ return /* @__PURE__ */ jsxs(
8312
+ "label",
8313
+ {
8314
+ className: "flex min-h-9 cursor-pointer items-center gap-2.5 font-ui text-sm text-foreground",
8315
+ children: [
8316
+ /* @__PURE__ */ jsx(
8317
+ "input",
8318
+ {
8319
+ type: "radio",
8320
+ name: "civility",
8321
+ value: c,
8322
+ checked: values.civility === c,
8323
+ onChange: () => set("civility", c),
8324
+ className: "h-4 w-4 shrink-0 accent-primary cursor-pointer"
8325
+ }
8326
+ ),
8327
+ c === "ms" ? (_a2 = L.ms) != null ? _a2 : "Ms." : (_b2 = L.mr) != null ? _b2 : "Mr."
8328
+ ]
8329
+ },
8330
+ c
8331
+ );
8332
+ })
8152
8333
  }
8153
8334
  ),
8154
8335
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 min-w-0", children: [
8155
8336
  /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
8156
8337
  FloatingInput,
8157
8338
  {
8158
- label: "Last name",
8339
+ label: (_s = L.lastName) != null ? _s : "Last name",
8159
8340
  required: true,
8160
8341
  value: values.lastName,
8161
- onChange: (e) => set("lastName", e.target.value)
8342
+ onChange: (e) => set("lastName", e.target.value),
8343
+ error: errors.lastName
8162
8344
  }
8163
8345
  ) }),
8164
8346
  /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
8165
8347
  FloatingInput,
8166
8348
  {
8167
- label: "First name",
8349
+ label: (_t = L.firstName) != null ? _t : "First name",
8168
8350
  required: true,
8169
8351
  value: values.firstName,
8170
- onChange: (e) => set("firstName", e.target.value)
8352
+ onChange: (e) => set("firstName", e.target.value),
8353
+ error: errors.firstName
8171
8354
  }
8172
8355
  ) }),
8173
- /* @__PURE__ */ jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsxs(
8174
- FloatingSelect,
8356
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 sm:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsx(
8357
+ CountrySearchField,
8175
8358
  {
8176
- label: "Country of residence",
8177
- required: true,
8359
+ label: (_u = L.country) != null ? _u : "Country of residence",
8178
8360
  value: values.country,
8179
- onChange: (e) => set("country", e.target.value),
8180
- children: [
8181
- /* @__PURE__ */ jsx("option", { value: "", disabled: true, hidden: true }),
8182
- /* @__PURE__ */ jsx("option", { value: "France", children: "France" }),
8183
- /* @__PURE__ */ jsx("option", { value: "Belgium", children: "Belgium" }),
8184
- /* @__PURE__ */ jsx("option", { value: "Switzerland", children: "Switzerland" }),
8185
- /* @__PURE__ */ jsx("option", { value: "Canada", children: "Canada" }),
8186
- /* @__PURE__ */ jsx("option", { value: "Luxembourg", children: "Luxembourg" }),
8187
- /* @__PURE__ */ jsx("option", { value: "United Kingdom", children: "United Kingdom" }),
8188
- /* @__PURE__ */ jsx("option", { value: "United States", children: "United States" }),
8189
- /* @__PURE__ */ jsx("option", { value: "Other", children: "Other" })
8190
- ]
8361
+ onChange: (code) => set("country", code),
8362
+ countries: COUNTRIES
8191
8363
  }
8192
8364
  ) })
8193
8365
  ] }),
8194
8366
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [
8195
- /* @__PURE__ */ jsxs("div", { className: "flex w-full min-w-0", children: [
8196
- /* @__PURE__ */ jsx(
8197
- PhoneCountrySelect,
8198
- {
8199
- value: values.phoneCountry,
8200
- onChange: (code) => set("phoneCountry", code),
8201
- className: "shrink-0"
8202
- }
8203
- ),
8204
- /* @__PURE__ */ jsxs("div", { className: "relative min-w-0 flex-1", children: [
8367
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
8368
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full min-w-0", children: [
8205
8369
  /* @__PURE__ */ jsx(
8206
- "input",
8370
+ PhoneCountrySelect,
8207
8371
  {
8208
- id: "phone",
8209
- type: "tel",
8210
- placeholder: " ",
8211
- value: values.phone,
8212
- onChange: (e) => set("phone", e.target.value),
8213
- className: cn(
8214
- "peer block h-14 w-full rounded-r-lg border border-border bg-background",
8215
- "px-3 pt-5 pb-2 text-base text-foreground font-ui",
8216
- "transition-colors placeholder-transparent",
8217
- "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary"
8218
- )
8372
+ value: values.phoneCountry,
8373
+ onChange: (code) => set("phoneCountry", code),
8374
+ className: "shrink-0",
8375
+ showDial: false
8219
8376
  }
8220
8377
  ),
8221
- /* @__PURE__ */ jsxs(
8222
- "label",
8223
- {
8224
- htmlFor: "phone",
8225
- className: cn(
8226
- "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
8227
- "text-base text-muted-foreground font-ui transition-all duration-150",
8228
- "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
8229
- "peer-not-placeholder-shown:top-3 peer-not-placeholder-shown:translate-y-0 peer-not-placeholder-shown:text-xs peer-not-placeholder-shown:text-muted-foreground"
8230
- ),
8231
- children: [
8232
- "Phone ",
8233
- /* @__PURE__ */ jsx("span", { className: "text-primary", children: "*" })
8234
- ]
8235
- }
8236
- )
8237
- ] })
8238
- ] }),
8239
- /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
8240
- FloatingInput,
8241
- {
8242
- label: "Email",
8243
- required: true,
8378
+ /* @__PURE__ */ jsxs("div", { className: "relative min-w-0 flex-1", children: [
8379
+ /* @__PURE__ */ jsx(
8380
+ "input",
8381
+ {
8382
+ id: "phone",
8383
+ type: "tel",
8384
+ placeholder: " ",
8385
+ value: `${dialFor(values.phoneCountry)} ${values.phone}`,
8386
+ onChange: (e) => {
8387
+ const dial = dialFor(values.phoneCountry);
8388
+ let national = e.target.value;
8389
+ if (national.startsWith(dial)) national = national.slice(dial.length);
8390
+ national = national.replace(/^\s+/, "");
8391
+ set("phone", national);
8392
+ },
8393
+ className: cn(
8394
+ "peer block h-14 w-full rounded-r-lg border border-border bg-background",
8395
+ "px-3 pt-5 pb-2 text-base text-foreground font-ui",
8396
+ "transition-colors placeholder-transparent",
8397
+ "focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary",
8398
+ errors.phone && "border-destructive focus:border-destructive focus:ring-destructive"
8399
+ )
8400
+ }
8401
+ ),
8402
+ /* @__PURE__ */ jsxs(
8403
+ "label",
8404
+ {
8405
+ htmlFor: "phone",
8406
+ className: cn(
8407
+ "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2",
8408
+ "text-base text-muted-foreground font-ui transition-all duration-150",
8409
+ "peer-focus:top-3 peer-focus:translate-y-0 peer-focus:text-xs peer-focus:text-primary",
8410
+ "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"
8411
+ ),
8412
+ children: [
8413
+ (_v = L.phone) != null ? _v : "Phone",
8414
+ " ",
8415
+ /* @__PURE__ */ jsx("span", { className: "text-primary", children: "*" })
8416
+ ]
8417
+ }
8418
+ )
8419
+ ] })
8420
+ ] }),
8421
+ errors.phone && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-destructive font-ui", children: errors.phone })
8422
+ ] }),
8423
+ /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx(
8424
+ FloatingInput,
8425
+ {
8426
+ label: (_w = L.email) != null ? _w : "Email",
8427
+ required: true,
8244
8428
  type: "email",
8245
8429
  value: values.email,
8246
- onChange: (e) => set("email", e.target.value)
8430
+ onChange: (e) => set("email", e.target.value),
8431
+ error: errors.email
8247
8432
  }
8248
8433
  ) })
8249
8434
  ] })
8250
8435
  ] }),
8436
+ /* @__PURE__ */ jsxs(
8437
+ FormSection,
8438
+ {
8439
+ title: (_x = L.contactViaSection) != null ? _x : "How should we contact you?",
8440
+ required: true,
8441
+ children: [
8442
+ /* @__PURE__ */ jsx(
8443
+ "div",
8444
+ {
8445
+ role: "radiogroup",
8446
+ "aria-label": (_y = L.contactViaSection) != null ? _y : "How should we contact you?",
8447
+ className: "inline-flex flex-wrap rounded-full border border-border bg-background p-1",
8448
+ children: [
8449
+ ["WhatsApp", (_z = L.contactViaWhatsApp) != null ? _z : "WhatsApp"],
8450
+ ["Email", (_A = L.contactViaEmail) != null ? _A : "Email"],
8451
+ ["Phone", (_B = L.contactViaPhone) != null ? _B : "Phone"]
8452
+ ].map(([value, label]) => /* @__PURE__ */ jsx(
8453
+ "button",
8454
+ {
8455
+ type: "button",
8456
+ role: "radio",
8457
+ "aria-checked": values.contactVia === value,
8458
+ onClick: () => set("contactVia", value),
8459
+ className: cn(
8460
+ "whitespace-nowrap rounded-full px-5 py-2 font-heading text-[13px] font-semibold transition-colors",
8461
+ values.contactVia === value ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:text-foreground"
8462
+ ),
8463
+ children: label
8464
+ },
8465
+ value
8466
+ ))
8467
+ }
8468
+ ),
8469
+ errors.contactVia && /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive font-ui", children: errors.contactVia })
8470
+ ]
8471
+ }
8472
+ ),
8251
8473
  /* @__PURE__ */ jsx("div", { className: "flex justify-center pt-2", children: /* @__PURE__ */ jsx(
8252
8474
  "button",
8253
8475
  {
@@ -8282,8 +8504,8 @@ function BookingForm({
8282
8504
  }
8283
8505
  )
8284
8506
  ] }),
8285
- "Sending\u2026"
8286
- ] }) : submitLabel
8507
+ (_C = L.sending) != null ? _C : "Sending\u2026"
8508
+ ] }) : submitText
8287
8509
  }
8288
8510
  ) })
8289
8511
  ]
@@ -10032,56 +10254,66 @@ function AccordionItem(_a) {
10032
10254
  function AccordionTrigger(_a) {
10033
10255
  var _b = _a, {
10034
10256
  className,
10035
- children
10257
+ children,
10258
+ headingLevel
10036
10259
  } = _b, props = __objRest(_b, [
10037
10260
  "className",
10038
- "children"
10261
+ "children",
10262
+ "headingLevel"
10039
10263
  ]);
10040
10264
  const variant = React32.useContext(AccordionVariantContext);
10041
- return /* @__PURE__ */ jsx(Accordion$1.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
10042
- Accordion$1.Trigger,
10265
+ const headingRender = headingLevel === 2 ? /* @__PURE__ */ jsx("h2", {}) : headingLevel === 4 ? /* @__PURE__ */ jsx("h4", {}) : headingLevel === 5 ? /* @__PURE__ */ jsx("h5", {}) : headingLevel === 6 ? /* @__PURE__ */ jsx("h6", {}) : void 0;
10266
+ return /* @__PURE__ */ jsx(
10267
+ Accordion$1.Header,
10043
10268
  __spreadProps(__spreadValues({
10044
- "data-slot": "accordion-trigger",
10045
- className: cn(
10046
- "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
10047
- "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
10048
- variant === "default" && [
10049
- "rounded-lg border border-transparent py-2.5 text-sm font-medium",
10050
- "hover:underline focus-visible:border-ring",
10051
- "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
10052
- ],
10053
- variant === "faq" && [
10054
- "px-5 py-4 text-base font-bold",
10055
- "hover:bg-muted/30 rounded-lg"
10056
- ],
10057
- className
10058
- )
10059
- }, props), {
10060
- children: [
10061
- children,
10062
- variant === "default" && /* @__PURE__ */ jsxs(Fragment, { children: [
10063
- /* @__PURE__ */ jsx(
10064
- ChevronDownIcon,
10065
- {
10066
- "data-slot": "accordion-trigger-icon",
10067
- className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
10068
- }
10069
- ),
10070
- /* @__PURE__ */ jsx(
10071
- ChevronUpIcon,
10072
- {
10073
- "data-slot": "accordion-trigger-icon",
10074
- className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
10075
- }
10269
+ className: "flex"
10270
+ }, headingRender ? { render: headingRender } : {}), {
10271
+ children: /* @__PURE__ */ jsxs(
10272
+ Accordion$1.Trigger,
10273
+ __spreadProps(__spreadValues({
10274
+ "data-slot": "accordion-trigger",
10275
+ className: cn(
10276
+ "group/accordion-trigger relative flex flex-1 items-center justify-between text-left transition-all outline-none",
10277
+ "focus-visible:ring-3 focus-visible:ring-ring/50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
10278
+ variant === "default" && [
10279
+ "rounded-lg border border-transparent py-2.5 text-sm font-medium",
10280
+ "hover:underline focus-visible:border-ring",
10281
+ "**:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground"
10282
+ ],
10283
+ variant === "faq" && [
10284
+ "px-5 py-4 text-base font-bold",
10285
+ "hover:bg-muted/30 rounded-lg"
10286
+ ],
10287
+ className
10076
10288
  )
10077
- ] }),
10078
- variant === "faq" && /* @__PURE__ */ jsxs(Fragment, { children: [
10079
- /* @__PURE__ */ jsx(PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
10080
- /* @__PURE__ */ jsx(MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
10081
- ] })
10082
- ]
10289
+ }, props), {
10290
+ children: [
10291
+ children,
10292
+ variant === "default" && /* @__PURE__ */ jsxs(Fragment, { children: [
10293
+ /* @__PURE__ */ jsx(
10294
+ ChevronDownIcon,
10295
+ {
10296
+ "data-slot": "accordion-trigger-icon",
10297
+ className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
10298
+ }
10299
+ ),
10300
+ /* @__PURE__ */ jsx(
10301
+ ChevronUpIcon,
10302
+ {
10303
+ "data-slot": "accordion-trigger-icon",
10304
+ className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
10305
+ }
10306
+ )
10307
+ ] }),
10308
+ variant === "faq" && /* @__PURE__ */ jsxs(Fragment, { children: [
10309
+ /* @__PURE__ */ jsx(PlusIcon, { className: "pointer-events-none shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:hidden" }),
10310
+ /* @__PURE__ */ jsx(MinusIcon, { className: "pointer-events-none hidden shrink-0 size-5 text-foreground group-aria-expanded/accordion-trigger:inline" })
10311
+ ] })
10312
+ ]
10313
+ })
10314
+ )
10083
10315
  })
10084
- ) });
10316
+ );
10085
10317
  }
10086
10318
  function AccordionContent(_a) {
10087
10319
  var _b = _a, {
@@ -10306,9 +10538,10 @@ function FilterPanel({
10306
10538
  variant = "sidebar",
10307
10539
  sortOptions,
10308
10540
  sort,
10309
- onSortChange
10541
+ onSortChange,
10542
+ labels
10310
10543
  }) {
10311
- var _a, _b;
10544
+ var _a, _b, _c, _d, _e, _f, _g, _h;
10312
10545
  const resolvedGroups = React32.useMemo(() => resolveGroups(groups), [groups]);
10313
10546
  const [internalValue, setInternalValue] = React32.useState(
10314
10547
  () => Object.fromEntries(groups.map((g) => [g.id, []]))
@@ -10446,7 +10679,7 @@ function FilterPanel({
10446
10679
  type: "button",
10447
10680
  onClick: handleClearAll,
10448
10681
  className: "text-sm font-ui font-semibold text-muted-foreground underline underline-offset-2 hover:text-foreground",
10449
- children: "Clear all"
10682
+ children: (_b = labels == null ? void 0 : labels.clearAll) != null ? _b : "Clear all"
10450
10683
  }
10451
10684
  ),
10452
10685
  /* @__PURE__ */ jsxs(
@@ -10460,9 +10693,8 @@ function FilterPanel({
10460
10693
  }
10461
10694
  ),
10462
10695
  children: [
10463
- "Show ",
10464
- totalSelected > 0 ? `(${totalSelected})` : "",
10465
- " results"
10696
+ (_c = labels == null ? void 0 : labels.showResults) != null ? _c : "Show results",
10697
+ totalSelected > 0 ? ` (${totalSelected})` : ""
10466
10698
  ]
10467
10699
  }
10468
10700
  )
@@ -10487,7 +10719,7 @@ function FilterPanel({
10487
10719
  }
10488
10720
  ),
10489
10721
  children: [
10490
- "Sort",
10722
+ (_d = labels == null ? void 0 : labels.sortLabel) != null ? _d : "Sort",
10491
10723
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" })
10492
10724
  ]
10493
10725
  }
@@ -10597,14 +10829,15 @@ function FilterPanel({
10597
10829
  className: "inline-flex items-center gap-1 rounded-full px-3 py-1.5 text-xs font-ui font-semibold text-muted-foreground hover:text-foreground transition-colors",
10598
10830
  children: [
10599
10831
  /* @__PURE__ */ jsx(XIcon, { className: "h-3 w-3" }),
10600
- "Clear all (",
10832
+ (_e = labels == null ? void 0 : labels.clearAll) != null ? _e : "Clear all",
10833
+ " (",
10601
10834
  totalSelected,
10602
10835
  ")"
10603
10836
  ]
10604
10837
  }
10605
10838
  ),
10606
10839
  sortOptions && sortOptions.length > 0 && /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
10607
- /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: "Sort by" }),
10840
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground font-ui hidden sm:inline", children: (_f = labels == null ? void 0 : labels.sortByLabel) != null ? _f : "Sort by" }),
10608
10841
  /* @__PURE__ */ jsxs(Popover, { children: [
10609
10842
  /* @__PURE__ */ jsxs(
10610
10843
  PopoverTrigger,
@@ -10621,7 +10854,7 @@ function FilterPanel({
10621
10854
  }
10622
10855
  ),
10623
10856
  children: [
10624
- (_b = activeSort == null ? void 0 : activeSort.label) != null ? _b : "Default",
10857
+ (_g = activeSort == null ? void 0 : activeSort.label) != null ? _g : "Default",
10625
10858
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-3.5 w-3.5 text-muted-foreground" })
10626
10859
  ]
10627
10860
  }
@@ -10693,7 +10926,7 @@ function FilterPanel({
10693
10926
  {
10694
10927
  onClick: handleClearAll,
10695
10928
  className: "self-start text-sm text-muted-foreground underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring font-ui",
10696
- children: "Remove all filters"
10929
+ children: (_h = labels == null ? void 0 : labels.removeAllFilters) != null ? _h : "Remove all filters"
10697
10930
  }
10698
10931
  )
10699
10932
  ] });
@@ -10962,7 +11195,7 @@ function Picture(_a) {
10962
11195
  "onLoad",
10963
11196
  "onError"
10964
11197
  ]);
10965
- var _a2;
11198
+ var _a2, _b2;
10966
11199
  const ref = React32.useRef(null);
10967
11200
  const [visible, setVisible] = React32.useState(eager);
10968
11201
  const [loaded, setLoaded] = React32.useState(false);
@@ -10990,8 +11223,9 @@ function Picture(_a) {
10990
11223
  }, [src]);
10991
11224
  const webp = webpVariantUrl(src);
10992
11225
  const realSrc = visible ? src : PLACEHOLDER_SRC;
11226
+ const resolvedTitle = (_a2 = imgProps.title) != null ? _a2 : typeof imgProps.alt === "string" && imgProps.alt.trim() ? imgProps.alt : void 0;
10993
11227
  const decodingResolved = decoding != null ? decoding : eager ? void 0 : "async";
10994
- const fetchPriorityResolved = (_a2 = imgProps.fetchPriority) != null ? _a2 : eager ? void 0 : "low";
11228
+ const fetchPriorityResolved = (_b2 = imgProps.fetchPriority) != null ? _b2 : eager ? void 0 : "low";
10995
11229
  const handleLoad = (e) => {
10996
11230
  if (visible) setLoaded(true);
10997
11231
  onLoad == null ? void 0 : onLoad(e);
@@ -11017,6 +11251,7 @@ function Picture(_a) {
11017
11251
  onLoad: handleLoad,
11018
11252
  onError: handleError
11019
11253
  }, imgProps), {
11254
+ title: resolvedTitle,
11020
11255
  fetchPriority: fetchPriorityResolved,
11021
11256
  style: mergedStyle
11022
11257
  })
@@ -11040,6 +11275,7 @@ function Picture(_a) {
11040
11275
  onLoad: handleLoad,
11041
11276
  onError: handleError
11042
11277
  }, imgProps), {
11278
+ title: resolvedTitle,
11043
11279
  fetchPriority: fetchPriorityResolved,
11044
11280
  style: mergedStyle
11045
11281
  })
@@ -11334,9 +11570,10 @@ function gridCols(total) {
11334
11570
  function Lightbox({
11335
11571
  photos,
11336
11572
  initialIndex,
11337
- onClose
11573
+ onClose,
11574
+ labels
11338
11575
  }) {
11339
- var _a;
11576
+ var _a, _b, _c, _d;
11340
11577
  const [index, setIndex] = React32.useState(initialIndex);
11341
11578
  const total = photos.length;
11342
11579
  const photo = photos[index];
@@ -11369,7 +11606,7 @@ function Lightbox({
11369
11606
  type: "button",
11370
11607
  onClick: onClose,
11371
11608
  className: "absolute top-5 right-5 flex h-10 w-10 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors z-10",
11372
- "aria-label": "Close lightbox",
11609
+ "aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
11373
11610
  children: /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5" })
11374
11611
  }
11375
11612
  ),
@@ -11382,7 +11619,7 @@ function Lightbox({
11382
11619
  prev();
11383
11620
  },
11384
11621
  className: "absolute left-4 top-1/2 -translate-y-1/2 flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/25 transition-colors z-10",
11385
- "aria-label": "Previous photo",
11622
+ "aria-label": (_b = labels == null ? void 0 : labels.previous) != null ? _b : "Previous photo",
11386
11623
  children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-5 w-5" })
11387
11624
  }
11388
11625
  ),
@@ -11395,7 +11632,7 @@ function Lightbox({
11395
11632
  next();
11396
11633
  },
11397
11634
  className: "absolute right-4 top-1/2 -translate-y-1/2 flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/25 transition-colors z-10",
11398
- "aria-label": "Next photo",
11635
+ "aria-label": (_c = labels == null ? void 0 : labels.next) != null ? _c : "Next photo",
11399
11636
  children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
11400
11637
  }
11401
11638
  ),
@@ -11403,7 +11640,8 @@ function Lightbox({
11403
11640
  Picture,
11404
11641
  {
11405
11642
  src: photo.src,
11406
- alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
11643
+ alt: (_d = photo.alt) != null ? _d : `Photo ${index + 1}`,
11644
+ title: photo.caption,
11407
11645
  className: "max-w-[calc(100%-6rem)] max-h-[calc(100vh-11rem)] object-contain rounded-lg shadow-2xl",
11408
11646
  onClick: (e) => e.stopPropagation()
11409
11647
  }
@@ -11473,6 +11711,7 @@ function PhotoTile({
11473
11711
  {
11474
11712
  src: photo.src,
11475
11713
  alt: (_b = photo.alt) != null ? _b : `Photo ${index + 1}`,
11714
+ title: photo.caption,
11476
11715
  className: "w-full h-full object-cover transition-transform duration-700 group-hover:scale-105",
11477
11716
  loading: "lazy"
11478
11717
  }
@@ -11486,8 +11725,10 @@ function PhotoTile({
11486
11725
  function ShowMoreButton({
11487
11726
  count,
11488
11727
  expanded,
11489
- onClick
11728
+ onClick,
11729
+ labels
11490
11730
  }) {
11731
+ var _a, _b;
11491
11732
  return /* @__PURE__ */ jsx("div", { className: "flex justify-center py-4", children: /* @__PURE__ */ jsx(
11492
11733
  "button",
11493
11734
  {
@@ -11501,10 +11742,11 @@ function ShowMoreButton({
11501
11742
  ),
11502
11743
  children: expanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
11503
11744
  /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
11504
- "Show less"
11745
+ (_a = labels == null ? void 0 : labels.showLess) != null ? _a : "Show less"
11505
11746
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
11506
11747
  /* @__PURE__ */ jsx(LayoutGridIcon, { className: "h-4 w-4 text-muted-foreground" }),
11507
- "See more (",
11748
+ (_b = labels == null ? void 0 : labels.seeMore) != null ? _b : "See more",
11749
+ " (",
11508
11750
  count,
11509
11751
  ")"
11510
11752
  ] })
@@ -11514,7 +11756,8 @@ function ShowMoreButton({
11514
11756
  function GridGallery({
11515
11757
  photos,
11516
11758
  initialVisible,
11517
- onOpen
11759
+ onOpen,
11760
+ labels
11518
11761
  }) {
11519
11762
  const [expanded, setExpanded] = React32.useState(false);
11520
11763
  const cols = gridCols(photos.length);
@@ -11536,7 +11779,8 @@ function GridGallery({
11536
11779
  {
11537
11780
  count: photos.length - initialVisible,
11538
11781
  expanded,
11539
- onClick: () => setExpanded((v) => !v)
11782
+ onClick: () => setExpanded((v) => !v),
11783
+ labels
11540
11784
  }
11541
11785
  )
11542
11786
  ] });
@@ -11544,7 +11788,8 @@ function GridGallery({
11544
11788
  function CompactGridGallery({
11545
11789
  photos,
11546
11790
  initialVisible,
11547
- onOpen
11791
+ onOpen,
11792
+ labels
11548
11793
  }) {
11549
11794
  const [expanded, setExpanded] = React32.useState(false);
11550
11795
  const hasMore = photos.length > initialVisible;
@@ -11565,7 +11810,8 @@ function CompactGridGallery({
11565
11810
  {
11566
11811
  count: photos.length - initialVisible,
11567
11812
  expanded,
11568
- onClick: () => setExpanded((v) => !v)
11813
+ onClick: () => setExpanded((v) => !v),
11814
+ labels
11569
11815
  }
11570
11816
  )
11571
11817
  ] });
@@ -11573,7 +11819,8 @@ function CompactGridGallery({
11573
11819
  function MasonryGallery({
11574
11820
  photos,
11575
11821
  initialVisible,
11576
- onOpen
11822
+ onOpen,
11823
+ labels
11577
11824
  }) {
11578
11825
  const [expanded, setExpanded] = React32.useState(false);
11579
11826
  const hasMore = photos.length > initialVisible;
@@ -11594,6 +11841,7 @@ function MasonryGallery({
11594
11841
  {
11595
11842
  src: p.src,
11596
11843
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
11844
+ title: p.caption,
11597
11845
  className: "w-full h-auto object-cover transition-transform duration-700 group-hover:scale-105",
11598
11846
  loading: "lazy"
11599
11847
  }
@@ -11609,7 +11857,8 @@ function MasonryGallery({
11609
11857
  {
11610
11858
  count: photos.length - initialVisible,
11611
11859
  expanded,
11612
- onClick: () => setExpanded((v) => !v)
11860
+ onClick: () => setExpanded((v) => !v),
11861
+ labels
11613
11862
  }
11614
11863
  )
11615
11864
  ] });
@@ -11633,6 +11882,7 @@ function FilmstripGallery({
11633
11882
  {
11634
11883
  src: p.src,
11635
11884
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 1}`,
11885
+ title: p.caption,
11636
11886
  className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
11637
11887
  loading: "lazy"
11638
11888
  }
@@ -11646,7 +11896,8 @@ function FilmstripGallery({
11646
11896
  }
11647
11897
  function FeaturedGallery({
11648
11898
  photos,
11649
- onOpen
11899
+ onOpen,
11900
+ labels
11650
11901
  }) {
11651
11902
  const [expanded, setExpanded] = React32.useState(false);
11652
11903
  const featured = photos.slice(0, 3);
@@ -11698,6 +11949,7 @@ function FeaturedGallery({
11698
11949
  {
11699
11950
  src: p.src,
11700
11951
  alt: (_b = p.alt) != null ? _b : `Photo ${i + 4}`,
11952
+ title: p.caption,
11701
11953
  className: "h-full w-full object-cover transition-transform duration-700 group-hover:scale-105",
11702
11954
  loading: "lazy"
11703
11955
  }
@@ -11713,7 +11965,8 @@ function FeaturedGallery({
11713
11965
  {
11714
11966
  count: extra.length,
11715
11967
  expanded,
11716
- onClick: () => setExpanded((v) => !v)
11968
+ onClick: () => setExpanded((v) => !v),
11969
+ labels
11717
11970
  }
11718
11971
  )
11719
11972
  ] });
@@ -11781,6 +12034,7 @@ function CarouselGallery({
11781
12034
  {
11782
12035
  src: photo.src,
11783
12036
  alt: (_a = photo.alt) != null ? _a : `Photo ${index + 1}`,
12037
+ title: photo.caption,
11784
12038
  className: "h-full w-full object-cover transition-transform duration-500 group-hover/photo:scale-[1.02]",
11785
12039
  loading: "lazy"
11786
12040
  },
@@ -11844,6 +12098,7 @@ function PhotoGallery({
11844
12098
  variant = "grid",
11845
12099
  initialVisible = 6,
11846
12100
  onPhotoClick,
12101
+ labels,
11847
12102
  className
11848
12103
  }) {
11849
12104
  const [lightboxIndex, setLightboxIndex] = React32.useState(null);
@@ -11859,7 +12114,8 @@ function PhotoGallery({
11859
12114
  {
11860
12115
  photos: normalised,
11861
12116
  initialIndex: lightboxIndex,
11862
- onClose: () => setLightboxIndex(null)
12117
+ onClose: () => setLightboxIndex(null),
12118
+ labels
11863
12119
  }
11864
12120
  );
11865
12121
  if (variant === "carousel" || variant === "fullBleed") {
@@ -11887,7 +12143,8 @@ function PhotoGallery({
11887
12143
  {
11888
12144
  photos: normalised,
11889
12145
  initialVisible,
11890
- onOpen: handleOpen
12146
+ onOpen: handleOpen,
12147
+ labels
11891
12148
  }
11892
12149
  ),
11893
12150
  variant === "gridCompact" && /* @__PURE__ */ jsx(
@@ -11895,7 +12152,8 @@ function PhotoGallery({
11895
12152
  {
11896
12153
  photos: normalised,
11897
12154
  initialVisible,
11898
- onOpen: handleOpen
12155
+ onOpen: handleOpen,
12156
+ labels
11899
12157
  }
11900
12158
  ),
11901
12159
  variant === "masonry" && /* @__PURE__ */ jsx(
@@ -11903,11 +12161,12 @@ function PhotoGallery({
11903
12161
  {
11904
12162
  photos: normalised,
11905
12163
  initialVisible,
11906
- onOpen: handleOpen
12164
+ onOpen: handleOpen,
12165
+ labels
11907
12166
  }
11908
12167
  ),
11909
12168
  variant === "filmstrip" && /* @__PURE__ */ jsx(FilmstripGallery, { photos: normalised, onOpen: handleOpen }),
11910
- variant === "featured" && /* @__PURE__ */ jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen }),
12169
+ variant === "featured" && /* @__PURE__ */ jsx(FeaturedGallery, { photos: normalised, onOpen: handleOpen, labels }),
11911
12170
  variant === "collage" && /* @__PURE__ */ jsx(CollageGallery, { photos: normalised, onOpen: handleOpen }),
11912
12171
  variant === "collageTight" && /* @__PURE__ */ jsx(CollageGallery, { photos: normalised, onOpen: handleOpen, seamless: true }),
11913
12172
  lightbox
@@ -12177,6 +12436,8 @@ function PricingTrip({
12177
12436
  departureTimes,
12178
12437
  onBook,
12179
12438
  bookLabel = "Check availability",
12439
+ fromLabel = "From",
12440
+ perPersonLabel = "per person",
12180
12441
  variant = "card",
12181
12442
  sharp = false,
12182
12443
  belowPrice,
@@ -12203,13 +12464,16 @@ function PricingTrip({
12203
12464
  ),
12204
12465
  /* @__PURE__ */ jsxs("div", { className: "relative flex items-center gap-3", children: [
12205
12466
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
12206
- /* @__PURE__ */ jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
12467
+ /* @__PURE__ */ jsx("p", { className: "text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
12207
12468
  /* @__PURE__ */ jsxs("div", { className: "flex items-end gap-1.5 flex-wrap", children: [
12208
12469
  /* @__PURE__ */ jsxs("p", { className: "text-lg font-bold text-foreground font-heading leading-none", children: [
12209
12470
  currency,
12210
12471
  " ",
12211
12472
  priceFrom,
12212
- /* @__PURE__ */ jsx("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: "/ per person" })
12473
+ /* @__PURE__ */ jsxs("span", { className: "text-[11px] font-normal text-muted-foreground font-ui ml-1", children: [
12474
+ "/ ",
12475
+ perPersonLabel
12476
+ ] })
12213
12477
  ] }),
12214
12478
  (priceInfo || currencyEstimates && currencyEstimates.length > 0) && /* @__PURE__ */ jsx(
12215
12479
  "button",
@@ -12321,7 +12585,7 @@ function PricingTrip({
12321
12585
  ] }),
12322
12586
  /* @__PURE__ */ jsx("div", { className: "flex-1" }),
12323
12587
  /* @__PURE__ */ jsxs("div", { className: "shrink-0 text-right", children: [
12324
- /* @__PURE__ */ jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: "from" }),
12588
+ /* @__PURE__ */ jsx("span", { className: "block text-[10px] uppercase tracking-wide text-muted-foreground font-ui leading-none mb-0.5", children: fromLabel }),
12325
12589
  /* @__PURE__ */ jsxs("span", { className: "text-xl font-bold text-foreground font-heading leading-none", children: [
12326
12590
  currency,
12327
12591
  " ",
@@ -12350,13 +12614,16 @@ function PricingTrip({
12350
12614
  }
12351
12615
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
12352
12616
  /* @__PURE__ */ jsxs("div", { children: [
12353
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: "From" }),
12617
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide", children: fromLabel }),
12354
12618
  /* @__PURE__ */ jsxs("p", { className: "text-2xl font-bold text-foreground font-heading flex items-center gap-2 flex-wrap", children: [
12355
12619
  /* @__PURE__ */ jsxs("span", { children: [
12356
12620
  currency,
12357
12621
  " ",
12358
12622
  priceFrom,
12359
- /* @__PURE__ */ jsx("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: " / per person" })
12623
+ /* @__PURE__ */ jsxs("span", { className: "text-sm font-normal text-muted-foreground font-ui", children: [
12624
+ " / ",
12625
+ perPersonLabel
12626
+ ] })
12360
12627
  ] }),
12361
12628
  priceInfo && /* @__PURE__ */ jsx(
12362
12629
  "button",
@@ -12623,8 +12890,10 @@ function SiteHeader({
12623
12890
  onSearch,
12624
12891
  onAccount,
12625
12892
  position = variant === "transparent" ? "overlay" : "fixed",
12893
+ labels,
12626
12894
  className
12627
12895
  }) {
12896
+ var _a, _b, _c, _d, _e, _f, _g;
12628
12897
  const t = VARIANT[variant];
12629
12898
  const resolvedLogo = logoSrc != null ? logoSrc : variant === "white" ? logoSrcDark : logoSrcLight;
12630
12899
  const [openMenu, setOpenMenu] = React32.useState(null);
@@ -12682,7 +12951,7 @@ function SiteHeader({
12682
12951
  {
12683
12952
  type: "button",
12684
12953
  onClick: () => setMobileOpen(true),
12685
- "aria-label": "Open menu",
12954
+ "aria-label": (_a = labels == null ? void 0 : labels.openMenu) != null ? _a : "Open menu",
12686
12955
  className: cn(
12687
12956
  "flex lg:hidden h-9 w-9 items-center justify-center rounded-full transition-colors -ml-1.5",
12688
12957
  t.mobileTrigger
@@ -12711,8 +12980,8 @@ function SiteHeader({
12711
12980
  }
12712
12981
  ),
12713
12982
  /* @__PURE__ */ jsx("nav", { className: "hidden lg:flex items-center gap-0.5 mx-auto", children: links.map((link) => {
12714
- var _a, _b;
12715
- const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
12983
+ var _a2, _b2;
12984
+ const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
12716
12985
  const isOpen = openMenu === link.label;
12717
12986
  return /* @__PURE__ */ jsxs(
12718
12987
  "div",
@@ -12724,7 +12993,7 @@ function SiteHeader({
12724
12993
  /* @__PURE__ */ jsxs(
12725
12994
  "a",
12726
12995
  {
12727
- href: (_b = link.href) != null ? _b : "#",
12996
+ href: (_b2 = link.href) != null ? _b2 : "#",
12728
12997
  onClick: hasDropdown ? (e) => e.preventDefault() : void 0,
12729
12998
  className: cn(
12730
12999
  "flex items-center gap-1 px-3.5 py-1.5 rounded-full",
@@ -12773,7 +13042,7 @@ function SiteHeader({
12773
13042
  "button",
12774
13043
  {
12775
13044
  type: "button",
12776
- "aria-label": "Language",
13045
+ "aria-label": (_b = labels == null ? void 0 : labels.language) != null ? _b : "Language",
12777
13046
  className: cn(
12778
13047
  "flex items-center gap-0.5 px-2.5 py-1.5 rounded-full",
12779
13048
  "text-sm font-ui transition-colors",
@@ -12813,7 +13082,7 @@ function SiteHeader({
12813
13082
  {
12814
13083
  type: "button",
12815
13084
  onClick: onSearch,
12816
- "aria-label": "Search",
13085
+ "aria-label": (_c = labels == null ? void 0 : labels.search) != null ? _c : "Search",
12817
13086
  className: cn(
12818
13087
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12819
13088
  t.icon
@@ -12826,7 +13095,7 @@ function SiteHeader({
12826
13095
  {
12827
13096
  type: "button",
12828
13097
  onClick: onAccount,
12829
- "aria-label": "Account",
13098
+ "aria-label": (_d = labels == null ? void 0 : labels.account) != null ? _d : "Account",
12830
13099
  className: cn(
12831
13100
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12832
13101
  t.icon
@@ -12859,7 +13128,7 @@ function SiteHeader({
12859
13128
  {
12860
13129
  type: "button",
12861
13130
  onClick: () => setMobileOpen(false),
12862
- "aria-label": "Close menu",
13131
+ "aria-label": (_e = labels == null ? void 0 : labels.closeMenu) != null ? _e : "Close menu",
12863
13132
  className: cn(
12864
13133
  "flex h-9 w-9 items-center justify-center rounded-full transition-colors",
12865
13134
  t.mobileTrigger
@@ -12869,8 +13138,8 @@ function SiteHeader({
12869
13138
  )
12870
13139
  ] }),
12871
13140
  /* @__PURE__ */ jsx("nav", { className: "flex-1 overflow-y-auto px-6 py-6 flex flex-col gap-1", children: links.map((link) => {
12872
- var _a, _b;
12873
- const hasDropdown = !!((_a = link.items) == null ? void 0 : _a.length);
13141
+ var _a2, _b2;
13142
+ const hasDropdown = !!((_a2 = link.items) == null ? void 0 : _a2.length);
12874
13143
  const isExpanded = openMobileSection === link.label;
12875
13144
  return /* @__PURE__ */ jsxs("div", { children: [
12876
13145
  hasDropdown ? /* @__PURE__ */ jsxs(
@@ -12898,7 +13167,7 @@ function SiteHeader({
12898
13167
  ) : /* @__PURE__ */ jsx(
12899
13168
  "a",
12900
13169
  {
12901
- href: (_b = link.href) != null ? _b : "#",
13170
+ href: (_b2 = link.href) != null ? _b2 : "#",
12902
13171
  onClick: () => setMobileOpen(false),
12903
13172
  className: cn(
12904
13173
  "flex items-center py-4 text-xl font-ui font-black transition-colors border-b border-white/8",
@@ -12908,11 +13177,11 @@ function SiteHeader({
12908
13177
  }
12909
13178
  ),
12910
13179
  hasDropdown && isExpanded && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0 pl-4 pb-2", children: link.items.map((item) => {
12911
- var _a2;
13180
+ var _a3;
12912
13181
  return /* @__PURE__ */ jsx(
12913
13182
  "a",
12914
13183
  {
12915
- href: (_a2 = item.href) != null ? _a2 : "#",
13184
+ href: (_a3 = item.href) != null ? _a3 : "#",
12916
13185
  onClick: () => setMobileOpen(false),
12917
13186
  className: cn(
12918
13187
  "py-3 text-base font-ui font-bold transition-colors border-b",
@@ -12965,7 +13234,7 @@ function SiteHeader({
12965
13234
  onSearch == null ? void 0 : onSearch();
12966
13235
  setMobileOpen(false);
12967
13236
  },
12968
- "aria-label": "Search",
13237
+ "aria-label": (_f = labels == null ? void 0 : labels.search) != null ? _f : "Search",
12969
13238
  className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
12970
13239
  children: /* @__PURE__ */ jsx(SearchIcon, { className: "h-[18px] w-[18px]" })
12971
13240
  }
@@ -12978,7 +13247,7 @@ function SiteHeader({
12978
13247
  onAccount == null ? void 0 : onAccount();
12979
13248
  setMobileOpen(false);
12980
13249
  },
12981
- "aria-label": "Account",
13250
+ "aria-label": (_g = labels == null ? void 0 : labels.account) != null ? _g : "Account",
12982
13251
  className: cn("flex h-9 w-9 items-center justify-center rounded-full transition-colors", t.icon),
12983
13252
  children: /* @__PURE__ */ jsx(UserIcon, { className: "h-[18px] w-[18px]" })
12984
13253
  }
@@ -13128,9 +13397,11 @@ function HeartIcon({ filled = false }) {
13128
13397
  );
13129
13398
  }
13130
13399
  function TripCardEditorial(props) {
13400
+ var _a, _b, _c, _d;
13131
13401
  const {
13132
13402
  image,
13133
13403
  imageAlt = "",
13404
+ labels,
13134
13405
  title,
13135
13406
  description,
13136
13407
  nights,
@@ -13188,7 +13459,7 @@ function TripCardEditorial(props) {
13188
13459
  "button",
13189
13460
  {
13190
13461
  type: "button",
13191
- "aria-label": favorited ? "Remove from favorites" : "Add to favorites",
13462
+ "aria-label": favorited ? (_a = labels == null ? void 0 : labels.removeFromFavorites) != null ? _a : "Remove from favorites" : (_b = labels == null ? void 0 : labels.addToFavorites) != null ? _b : "Add to favorites",
13192
13463
  "aria-pressed": favorited,
13193
13464
  onClick: handleFav,
13194
13465
  className: cn(
@@ -13232,7 +13503,7 @@ function TripCardEditorial(props) {
13232
13503
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13233
13504
  nights,
13234
13505
  " ",
13235
- nights === 1 ? "night" : "nights"
13506
+ nights === 1 ? (_c = labels == null ? void 0 : labels.night) != null ? _c : "night" : (_d = labels == null ? void 0 : labels.nights) != null ? _d : "nights"
13236
13507
  ] })
13237
13508
  ] }) : /* @__PURE__ */ jsx("span", {}),
13238
13509
  price && /* @__PURE__ */ jsx("p", { className: "text-base font-bold text-foreground font-ui", children: price })
@@ -13257,12 +13528,14 @@ function TripCardEditorial(props) {
13257
13528
  ] });
13258
13529
  }
13259
13530
  function TripCard(props) {
13531
+ var _a, _b;
13260
13532
  if (props.variant === "editorial") {
13261
13533
  return /* @__PURE__ */ jsx(TripCardEditorial, __spreadValues({}, props));
13262
13534
  }
13263
13535
  const {
13264
13536
  image,
13265
13537
  imageAlt = "",
13538
+ labels,
13266
13539
  status,
13267
13540
  nights,
13268
13541
  period,
@@ -13275,6 +13548,7 @@ function TripCard(props) {
13275
13548
  } = props;
13276
13549
  const s = sizeConfig[size];
13277
13550
  const statusInfo = status ? statusConfig[status] : null;
13551
+ const statusLabel = statusInfo ? status === "sold-out" ? (_a = labels == null ? void 0 : labels.soldOut) != null ? _a : statusInfo.label : status === "trending" ? (_b = labels == null ? void 0 : labels.trending) != null ? _b : statusInfo.label : statusInfo.label : null;
13278
13552
  const meta = [
13279
13553
  nights ? `${nights} nights` : null,
13280
13554
  period != null ? period : null
@@ -13300,7 +13574,7 @@ function TripCard(props) {
13300
13574
  /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent" }),
13301
13575
  statusInfo && /* @__PURE__ */ jsx("div", { className: "relative z-10 p-3", children: /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-1.5 rounded-xl bg-card/90 px-3 py-1.5 backdrop-blur-sm shadow-sm", children: [
13302
13576
  /* @__PURE__ */ jsx("span", { className: "text-primary", children: statusInfo.icon }),
13303
- /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusInfo.label })
13577
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-foreground font-ui", children: statusLabel })
13304
13578
  ] }) }),
13305
13579
  !statusInfo && /* @__PURE__ */ jsx("div", { className: "relative z-10" }),
13306
13580
  /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex flex-col gap-1.5 p-5", children: [
@@ -13394,6 +13668,7 @@ function BlogCard({
13394
13668
  {
13395
13669
  src: image,
13396
13670
  alt: imageAlt,
13671
+ title: imageAlt || void 0,
13397
13672
  loading: "lazy",
13398
13673
  className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
13399
13674
  }
@@ -13747,6 +14022,8 @@ function TripHeader({
13747
14022
  breadcrumb,
13748
14023
  destination,
13749
14024
  duration,
14025
+ groupSize,
14026
+ labels,
13750
14027
  tagline,
13751
14028
  chips,
13752
14029
  belowMeta,
@@ -13754,7 +14031,7 @@ function TripHeader({
13754
14031
  uiVariant = "v1",
13755
14032
  className
13756
14033
  }) {
13757
- var _a;
14034
+ var _a, _b, _c, _d, _e, _f, _g;
13758
14035
  const [heroIndex, setHeroIndex] = React32.useState(0);
13759
14036
  const [videoReady, setVideoReady] = React32.useState(false);
13760
14037
  const videoRef = React32.useRef(null);
@@ -13772,7 +14049,7 @@ function TripHeader({
13772
14049
  const currentSrc = heroSrc(safeIndex);
13773
14050
  const showCarousel = !videoUrl && validImages.length > 1;
13774
14051
  const nights = duration ? (_a = duration.nights) != null ? _a : Math.max(duration.days - 1, 1) : null;
13775
- const hasMeta = !!(destination || duration);
14052
+ const hasMeta = !!(destination || duration || groupSize);
13776
14053
  useHlsVideo(videoRef, isHls ? videoUrl : void 0);
13777
14054
  React32.useEffect(() => {
13778
14055
  if (!videoUrl) return;
@@ -13879,7 +14156,7 @@ function TripHeader({
13879
14156
  (i) => (i - 1 + validImages.length) % validImages.length
13880
14157
  ),
13881
14158
  className: "absolute left-4 top-1/2 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
13882
- "aria-label": "Imagem anterior",
14159
+ "aria-label": (_b = labels == null ? void 0 : labels.previousImage) != null ? _b : "Previous image",
13883
14160
  children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-5 w-5" })
13884
14161
  }
13885
14162
  ),
@@ -13889,7 +14166,7 @@ function TripHeader({
13889
14166
  type: "button",
13890
14167
  onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
13891
14168
  className: "absolute right-4 top-1/2 -translate-y-1/2 flex h-10 w-10 items-center justify-center rounded-full bg-black/30 text-white backdrop-blur-sm hover:bg-black/50 transition-colors",
13892
- "aria-label": "Pr\xF3xima imagem",
14169
+ "aria-label": (_c = labels == null ? void 0 : labels.nextImage) != null ? _c : "Next image",
13893
14170
  children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
13894
14171
  }
13895
14172
  ),
@@ -13932,15 +14209,19 @@ function TripHeader({
13932
14209
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13933
14210
  nights,
13934
14211
  " ",
13935
- nights === 1 ? "noite" : "noites"
14212
+ nights === 1 ? (_d = labels == null ? void 0 : labels.night) != null ? _d : "night" : (_e = labels == null ? void 0 : labels.nights) != null ? _e : "nights"
13936
14213
  ] }),
13937
14214
  /* @__PURE__ */ jsx("span", { className: "text-white/40", children: "\xB7" }),
13938
14215
  /* @__PURE__ */ jsx(SunIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
13939
14216
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-ui font-semibold", children: [
13940
14217
  duration.days,
13941
14218
  " ",
13942
- duration.days === 1 ? "dia" : "dias"
14219
+ duration.days === 1 ? (_f = labels == null ? void 0 : labels.day) != null ? _f : "day" : (_g = labels == null ? void 0 : labels.days) != null ? _g : "days"
13943
14220
  ] })
14221
+ ] }),
14222
+ groupSize && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-white/85", children: [
14223
+ /* @__PURE__ */ jsx(UsersIcon, { className: "h-4 w-4 shrink-0 text-primary-400" }),
14224
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-ui font-semibold", children: groupSize })
13944
14225
  ] })
13945
14226
  ] }) : tagline ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm sm:text-base text-white/80 font-ui", children: tagline }) : null,
13946
14227
  chips && chips.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-3 flex flex-wrap items-center gap-1.5", children: chips.map((chip, i) => /* @__PURE__ */ jsx(Chip, { href: chip.href, children: chip.label }, i)) }),
@@ -14385,7 +14666,10 @@ function Stars({ count = 5 }) {
14385
14666
  i
14386
14667
  )) });
14387
14668
  }
14388
- function ItineraryTimeline({ steps }) {
14669
+ function ItineraryTimeline({
14670
+ steps,
14671
+ transferLabel
14672
+ }) {
14389
14673
  return /* @__PURE__ */ jsx("ol", { className: "relative flex flex-col gap-0", children: steps.map((step, i) => /* @__PURE__ */ jsxs("li", { className: "relative flex gap-4 pb-8 last:pb-0", children: [
14390
14674
  i < steps.length - 1 && /* @__PURE__ */ jsx("div", { className: "absolute left-3.5 top-7 bottom-0 w-px bg-border" }),
14391
14675
  /* @__PURE__ */ jsx("div", { className: "relative z-10 mt-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-full border-2 border-primary bg-background", children: /* @__PURE__ */ jsx("span", { className: "text-[10px] font-bold text-primary font-ui", children: i + 1 }) }),
@@ -14396,7 +14680,7 @@ function ItineraryTimeline({ steps }) {
14396
14680
  /* @__PURE__ */ jsx(ClockIcon, { className: "h-3 w-3 mr-1" }),
14397
14681
  step.duration
14398
14682
  ] }),
14399
- step.isTransfer && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: "Transfer" })
14683
+ step.isTransfer && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs font-ui h-5 px-2", children: transferLabel != null ? transferLabel : "Transfer" })
14400
14684
  ] }),
14401
14685
  /* @__PURE__ */ jsx("div", { className: "text-base text-muted-foreground leading-relaxed [&_p:not(:last-child)]:mb-2 [&_strong]:text-foreground [&_strong]:font-semibold", children: step.description })
14402
14686
  ] })
@@ -14413,6 +14697,7 @@ function TripPage({
14413
14697
  tagline,
14414
14698
  destination,
14415
14699
  duration,
14700
+ groupSize,
14416
14701
  images,
14417
14702
  videoUrl,
14418
14703
  breadcrumb,
@@ -14436,6 +14721,7 @@ function TripPage({
14436
14721
  whenItOperates,
14437
14722
  food,
14438
14723
  foodGallery,
14724
+ foodGalleryVariant = "gridCompact",
14439
14725
  termsAndConditions,
14440
14726
  meetingPoints,
14441
14727
  meetingPoint,
@@ -14455,7 +14741,13 @@ function TripPage({
14455
14741
  currencyEstimates,
14456
14742
  priceInfo,
14457
14743
  onBook,
14744
+ onBookingSubmit,
14745
+ bookingLoading,
14746
+ bookingDefaults,
14747
+ bookingLabels,
14458
14748
  bookLabel,
14749
+ fromLabel,
14750
+ perPersonLabel,
14459
14751
  siteHeader,
14460
14752
  uiVariant = "v1",
14461
14753
  features,
@@ -14632,6 +14924,15 @@ function TripPage({
14632
14924
  breadcrumb,
14633
14925
  destination,
14634
14926
  duration,
14927
+ groupSize,
14928
+ labels: {
14929
+ night: labels == null ? void 0 : labels.night,
14930
+ nights: labels == null ? void 0 : labels.nights,
14931
+ day: labels == null ? void 0 : labels.day,
14932
+ days: labels == null ? void 0 : labels.days,
14933
+ previousImage: labels == null ? void 0 : labels.previousImage,
14934
+ nextImage: labels == null ? void 0 : labels.nextImage
14935
+ },
14635
14936
  tagline,
14636
14937
  chips,
14637
14938
  siteHeader,
@@ -14692,7 +14993,7 @@ function TripPage({
14692
14993
  )) })
14693
14994
  ] }) : itinerary && itinerary.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-itinerary", className: "scroll-mt-20", children: [
14694
14995
  /* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-foreground font-heading mb-6", children: (_c = labels == null ? void 0 : labels.itinerary) != null ? _c : "Itinerary" }),
14695
- /* @__PURE__ */ jsx(ItineraryTimeline, { steps: itinerary })
14996
+ /* @__PURE__ */ jsx(ItineraryTimeline, { steps: itinerary, transferLabel: labels == null ? void 0 : labels.transfer })
14696
14997
  ] }),
14697
14998
  included && included.length > 0 && /* @__PURE__ */ jsxs("section", { id: "trip-section-included", className: "scroll-mt-20", children: [
14698
14999
  /* @__PURE__ */ jsxs("h2", { className: "text-xl font-bold text-foreground font-heading mb-4 flex items-center gap-2", children: [
@@ -14729,7 +15030,7 @@ function TripPage({
14729
15030
  id: "trip-section-when-it-operates",
14730
15031
  className: "scroll-mt-20 border-b border-border",
14731
15032
  children: [
14732
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15033
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14733
15034
  (sectionIcons == null ? void 0 : sectionIcons.whenItOperates) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whenItOperates }) : /* @__PURE__ */ jsx(CalendarIcon, { className: "h-5 w-5 text-primary" }),
14734
15035
  (_f = labels == null ? void 0 : labels.whenItOperates) != null ? _f : "When this tour operates"
14735
15036
  ] }) }),
@@ -14744,7 +15045,7 @@ function TripPage({
14744
15045
  id: "trip-section-accommodation",
14745
15046
  className: "scroll-mt-20 border-b border-border",
14746
15047
  children: [
14747
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15048
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14748
15049
  (sectionIcons == null ? void 0 : sectionIcons.accommodation) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.accommodation }) : /* @__PURE__ */ jsx(BedDoubleIcon, { className: "h-5 w-5 text-primary" }),
14749
15050
  (_g = labels == null ? void 0 : labels.accommodation) != null ? _g : "Accommodation"
14750
15051
  ] }) }),
@@ -14753,6 +15054,13 @@ function TripPage({
14753
15054
  accommodationGallery && accommodationGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(accommodation && "mt-6"), children: /* @__PURE__ */ jsx(
14754
15055
  PhotoGallery,
14755
15056
  {
15057
+ labels: {
15058
+ seeMore: labels == null ? void 0 : labels.seeMore,
15059
+ showLess: labels == null ? void 0 : labels.showLess,
15060
+ close: labels == null ? void 0 : labels.galleryClose,
15061
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15062
+ next: labels == null ? void 0 : labels.galleryNext
15063
+ },
14756
15064
  photos: accommodationGallery,
14757
15065
  variant: accommodationGalleryVariant,
14758
15066
  initialVisible: 6
@@ -14769,7 +15077,7 @@ function TripPage({
14769
15077
  id: "trip-section-food",
14770
15078
  className: "scroll-mt-20 border-b border-border",
14771
15079
  children: [
14772
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15080
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14773
15081
  (sectionIcons == null ? void 0 : sectionIcons.food) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.food }) : /* @__PURE__ */ jsx(UtensilsIcon, { className: "h-5 w-5 text-primary" }),
14774
15082
  (_h = labels == null ? void 0 : labels.food) != null ? _h : "Food"
14775
15083
  ] }) }),
@@ -14778,8 +15086,15 @@ function TripPage({
14778
15086
  foodGallery && foodGallery.length > 0 && /* @__PURE__ */ jsx("div", { className: cn(food && "mt-6"), children: /* @__PURE__ */ jsx(
14779
15087
  PhotoGallery,
14780
15088
  {
15089
+ labels: {
15090
+ seeMore: labels == null ? void 0 : labels.seeMore,
15091
+ showLess: labels == null ? void 0 : labels.showLess,
15092
+ close: labels == null ? void 0 : labels.galleryClose,
15093
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15094
+ next: labels == null ? void 0 : labels.galleryNext
15095
+ },
14781
15096
  photos: foodGallery,
14782
- variant: "gridCompact",
15097
+ variant: foodGalleryVariant,
14783
15098
  initialVisible: 6
14784
15099
  }
14785
15100
  ) })
@@ -14794,18 +15109,21 @@ function TripPage({
14794
15109
  id: "trip-section-meeting",
14795
15110
  className: "scroll-mt-20 border-b border-border",
14796
15111
  children: [
14797
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15112
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14798
15113
  (sectionIcons == null ? void 0 : sectionIcons.meetingPoint) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.meetingPoint }) : /* @__PURE__ */ jsx(MapPinIcon, { className: "h-5 w-5 text-primary" }),
14799
15114
  (_i = labels == null ? void 0 : labels.meetingPoint) != null ? _i : "Meeting point"
14800
15115
  ] }) }),
14801
- /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
14802
- /* @__PURE__ */ jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
14803
- /* @__PURE__ */ jsxs("div", { children: [
14804
- mp.type && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? "Activity location" : mp.type === "alternative" ? "Alternative meeting point" : "Meeting point" }),
14805
- /* @__PURE__ */ jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
14806
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
14807
- ] })
14808
- ] }, i)) }) })
15116
+ /* @__PURE__ */ jsx(AccordionContent, { className: "pb-6", children: meetingPoint ? /* @__PURE__ */ jsx("div", { className: "text-base text-foreground leading-relaxed space-y-3 [&_strong]:font-semibold [&_a]:text-primary [&_a]:underline", children: meetingPoint }) : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: meetingPoints.map((mp, i) => {
15117
+ var _a2, _b2, _c2;
15118
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border p-4", children: [
15119
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(MapPinIcon, { className: "h-4 w-4 text-primary" }) }),
15120
+ /* @__PURE__ */ jsxs("div", { children: [
15121
+ mp.type && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui uppercase tracking-wide mb-0.5", children: mp.type === "activity" ? (_a2 = labels == null ? void 0 : labels.meetingPointActivity) != null ? _a2 : "Activity location" : mp.type === "alternative" ? (_b2 = labels == null ? void 0 : labels.meetingPointAlternative) != null ? _b2 : "Alternative meeting point" : (_c2 = labels == null ? void 0 : labels.meetingPoint) != null ? _c2 : "Meeting point" }),
15122
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold text-foreground font-heading", children: mp.name }),
15123
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground font-ui mt-0.5", children: mp.address })
15124
+ ] })
15125
+ ] }, i);
15126
+ }) }) })
14809
15127
  ]
14810
15128
  }
14811
15129
  ),
@@ -14816,7 +15134,7 @@ function TripPage({
14816
15134
  id: "trip-section-how-to-get-there",
14817
15135
  className: "scroll-mt-20 border-b border-border",
14818
15136
  children: [
14819
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15137
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14820
15138
  (sectionIcons == null ? void 0 : sectionIcons.howToGetThere) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.howToGetThere }) : /* @__PURE__ */ jsx(CompassIcon, { className: "h-5 w-5 text-primary" }),
14821
15139
  (_j = labels == null ? void 0 : labels.howToGetThere) != null ? _j : "How to get there"
14822
15140
  ] }) }),
@@ -14831,7 +15149,7 @@ function TripPage({
14831
15149
  id: "trip-section-weather",
14832
15150
  className: "scroll-mt-20 border-b border-border",
14833
15151
  children: [
14834
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15152
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14835
15153
  (sectionIcons == null ? void 0 : sectionIcons.weather) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.weather }) : /* @__PURE__ */ jsx(SunIcon, { className: "h-5 w-5 text-primary" }),
14836
15154
  (_k = labels == null ? void 0 : labels.weather) != null ? _k : "Weather"
14837
15155
  ] }) }),
@@ -14846,7 +15164,7 @@ function TripPage({
14846
15164
  id: "trip-section-what-to-bring",
14847
15165
  className: "scroll-mt-20 border-b border-border",
14848
15166
  children: [
14849
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15167
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14850
15168
  (sectionIcons == null ? void 0 : sectionIcons.whatToBring) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.whatToBring }) : /* @__PURE__ */ jsx(BackpackIcon, { className: "h-5 w-5 text-primary" }),
14851
15169
  (_l = labels == null ? void 0 : labels.whatToBring) != null ? _l : "What to bring"
14852
15170
  ] }) }),
@@ -14861,7 +15179,7 @@ function TripPage({
14861
15179
  id: "trip-section-optional-extras",
14862
15180
  className: "scroll-mt-20 border-b border-border",
14863
15181
  children: [
14864
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15182
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14865
15183
  (sectionIcons == null ? void 0 : sectionIcons.optionalExtras) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.optionalExtras }) : /* @__PURE__ */ jsx(CherryIcon, { className: "h-5 w-5 text-primary" }),
14866
15184
  (_m = labels == null ? void 0 : labels.optionalExtras) != null ? _m : "Optional extras"
14867
15185
  ] }) }),
@@ -14876,7 +15194,7 @@ function TripPage({
14876
15194
  id: "trip-section-terms",
14877
15195
  className: "scroll-mt-20 border-b border-border",
14878
15196
  children: [
14879
- /* @__PURE__ */ jsx(AccordionTrigger, { className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
15197
+ /* @__PURE__ */ jsx(AccordionTrigger, { headingLevel: 2, className: "py-5 text-xl font-bold text-foreground font-heading hover:no-underline", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
14880
15198
  (sectionIcons == null ? void 0 : sectionIcons.terms) ? /* @__PURE__ */ jsx("span", { className: "text-primary [&>svg]:h-5 [&>svg]:w-5", children: sectionIcons.terms }) : /* @__PURE__ */ jsx(ReceiptIcon, { className: "h-5 w-5 text-primary" }),
14881
15199
  (_n = labels == null ? void 0 : labels.terms) != null ? _n : "Terms & conditions"
14882
15200
  ] }) }),
@@ -14888,7 +15206,7 @@ function TripPage({
14888
15206
  }
14889
15207
  ),
14890
15208
  faqs && faqs.length > 0 && (() => {
14891
- var _a2;
15209
+ var _a2, _b2, _c2;
14892
15210
  const visibleFaqs = faqsExpanded ? faqs : faqs.slice(0, faqInitialCount);
14893
15211
  const hiddenCount = faqs.length - visibleFaqs.length;
14894
15212
  return /* @__PURE__ */ jsxs("section", { id: "trip-section-faq", className: "scroll-mt-20", children: [
@@ -14910,10 +15228,11 @@ function TripPage({
14910
15228
  ),
14911
15229
  children: faqsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
14912
15230
  /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
14913
- "Show less"
15231
+ (_b2 = labels == null ? void 0 : labels.showLess) != null ? _b2 : "Show less"
14914
15232
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
14915
15233
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
14916
- "See more (",
15234
+ (_c2 = labels == null ? void 0 : labels.seeMore) != null ? _c2 : "See more",
15235
+ " (",
14917
15236
  hiddenCount,
14918
15237
  ")"
14919
15238
  ] })
@@ -14954,6 +15273,8 @@ function TripPage({
14954
15273
  departureTimes,
14955
15274
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
14956
15275
  bookLabel: bookLabel != null ? bookLabel : "Check availability",
15276
+ fromLabel,
15277
+ perPersonLabel,
14957
15278
  variant: "card",
14958
15279
  belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
14959
15280
  benefits,
@@ -14996,6 +15317,8 @@ function TripPage({
14996
15317
  departureTimes,
14997
15318
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
14998
15319
  bookLabel: bookLabel != null ? bookLabel : "Check availability",
15320
+ fromLabel,
15321
+ perPersonLabel,
14999
15322
  variant: "card",
15000
15323
  belowPrice: trustpilotMini ? /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) : void 0,
15001
15324
  benefits,
@@ -15008,12 +15331,27 @@ function TripPage({
15008
15331
  gallery && gallery.length > 0 && /* @__PURE__ */ jsx("section", { ref: galleryRef, id: "trip-section-gallery", className: "scroll-mt-20", children: /* @__PURE__ */ jsx(
15009
15332
  PhotoGallery,
15010
15333
  {
15334
+ labels: {
15335
+ seeMore: labels == null ? void 0 : labels.seeMore,
15336
+ showLess: labels == null ? void 0 : labels.showLess,
15337
+ close: labels == null ? void 0 : labels.galleryClose,
15338
+ previous: labels == null ? void 0 : labels.galleryPrevious,
15339
+ next: labels == null ? void 0 : labels.galleryNext
15340
+ },
15011
15341
  photos: gallery,
15012
15342
  variant: "gridCompact",
15013
15343
  initialVisible: 8
15014
15344
  }
15015
15345
  ) }),
15016
- gallery && gallery.length > 0 && /* @__PURE__ */ jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsx(BookingForm, { onSubmit: onBook ? (values) => onBook() : void 0 }) }) }),
15346
+ gallery && gallery.length > 0 && /* @__PURE__ */ jsx("div", { ref: pricingBarRef, className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12", children: /* @__PURE__ */ jsx("div", { id: "trip-booking-form", className: "rounded-2xl border border-border bg-card p-8 shadow-sm", children: /* @__PURE__ */ jsx(
15347
+ BookingForm,
15348
+ {
15349
+ labels: bookingLabels,
15350
+ defaultValues: bookingDefaults,
15351
+ onSubmit: onBookingSubmit,
15352
+ loading: bookingLoading
15353
+ }
15354
+ ) }) }),
15017
15355
  /* @__PURE__ */ jsx("div", { className: "fixed bottom-0 inset-x-0 z-30 lg:hidden border-t border-border bg-background/95 backdrop-blur-sm px-4 py-3", children: /* @__PURE__ */ jsx(
15018
15356
  PricingTrip,
15019
15357
  {
@@ -15021,6 +15359,8 @@ function TripPage({
15021
15359
  currency,
15022
15360
  onBook: (gallery == null ? void 0 : gallery.length) ? scrollToBookingForm : onBook,
15023
15361
  bookLabel: bookLabel != null ? bookLabel : "Book now",
15362
+ fromLabel,
15363
+ perPersonLabel,
15024
15364
  variant: "compact",
15025
15365
  sharp: true,
15026
15366
  priceInfo,
@@ -15054,6 +15394,7 @@ function CategoryPage2({
15054
15394
  trustpilotMini,
15055
15395
  breadcrumb,
15056
15396
  siteHeader,
15397
+ heroRightSlot,
15057
15398
  popularTours,
15058
15399
  popularToursTitle = "More adventures calling your name",
15059
15400
  popularToursEyebrow = "Popular tours",
@@ -15064,6 +15405,7 @@ function CategoryPage2({
15064
15405
  sortOptions,
15065
15406
  defaultSort,
15066
15407
  tripsInitialCount = 15,
15408
+ tripListingSlot,
15067
15409
  trustpilot,
15068
15410
  reviewsTitle = "Don't just take our word for it",
15069
15411
  reviewsSubtitle,
@@ -15080,6 +15422,12 @@ function CategoryPage2({
15080
15422
  faqInitialCount = 5,
15081
15423
  gallery,
15082
15424
  galleryTitle,
15425
+ loadMoreLabel,
15426
+ showLessLabel,
15427
+ seeMoreLabel,
15428
+ viewAllPostsLabel,
15429
+ cardLabels,
15430
+ filterLabels,
15083
15431
  className
15084
15432
  }) {
15085
15433
  var _a;
@@ -15236,7 +15584,8 @@ function CategoryPage2({
15236
15584
  /* @__PURE__ */ jsx("h1", { className: "text-3xl sm:text-5xl font-bold text-white font-heading leading-tight max-w-3xl", children: title }),
15237
15585
  intro && /* @__PURE__ */ jsx("div", { className: "mt-4 text-base sm:text-lg text-white/90 leading-relaxed max-w-2xl [&_strong]:font-semibold [&_a]:underline", children: intro }),
15238
15586
  trustpilotMini && /* @__PURE__ */ jsx("div", { className: "mt-5 max-w-sm", children: /* @__PURE__ */ jsx(TrustpilotEmbed, { config: trustpilotMini }) })
15239
- ] })
15587
+ ] }),
15588
+ heroRightSlot && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-5 z-20 sm:bottom-6", children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex max-w-6xl justify-end px-6 sm:px-8", children: /* @__PURE__ */ jsx("div", { className: "pointer-events-auto", children: heroRightSlot }) }) })
15240
15589
  ]
15241
15590
  }
15242
15591
  ),
@@ -15254,6 +15603,7 @@ function CategoryPage2({
15254
15603
  return /* @__PURE__ */ jsx(
15255
15604
  TripCard,
15256
15605
  __spreadProps(__spreadValues({}, cardProps), {
15606
+ labels: cardLabels,
15257
15607
  variant: "overlay",
15258
15608
  size: (_b = cardProps.size) != null ? _b : "md"
15259
15609
  }),
@@ -15263,63 +15613,68 @@ function CategoryPage2({
15263
15613
  ] }),
15264
15614
  /* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 pt-6 sm:pt-8 pb-12", children: [
15265
15615
  (tripsTitle || tripsEyebrow) && /* @__PURE__ */ jsx(SectionHeading2, { eyebrow: tripsEyebrow, title: tripsTitle != null ? tripsTitle : "" }),
15266
- filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(
15267
- FilterPanel,
15268
- {
15269
- variant: "horizontal",
15270
- groups: filterGroups,
15271
- value: filterValue,
15272
- onChange: setFilterValue,
15273
- onClearAll: () => setFilterValue({}),
15274
- sortOptions,
15275
- sort,
15276
- onSortChange: setSort
15277
- }
15278
- ) }),
15279
- /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
15280
- sortedTrips.length,
15281
- " ",
15282
- sortedTrips.length === 1 ? "trip" : "trips",
15283
- " found"
15284
- ] }),
15285
- (() => {
15286
- const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
15287
- const hiddenCount = sortedTrips.length - visibleTrips.length;
15288
- return /* @__PURE__ */ jsxs(Fragment, { children: [
15289
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-6 gap-y-8 lg:gap-x-[35px] lg:gap-y-[38px]", children: visibleTrips.map((trip, i) => {
15290
- const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
15291
- return /* @__PURE__ */ jsx(
15292
- TripCard,
15293
- __spreadProps(__spreadValues({}, cardProps), {
15294
- className: cn("w-full h-auto", cardProps.className)
15295
- }),
15296
- i
15297
- );
15298
- }) }),
15299
- sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsx(
15300
- "button",
15301
- {
15302
- type: "button",
15303
- onClick: () => setTripsExpanded((v) => !v),
15304
- className: cn(
15305
- "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15306
- "text-sm font-semibold text-foreground shadow-sm",
15307
- "hover:bg-muted transition-colors duration-150",
15308
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15309
- ),
15310
- children: tripsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
15311
- /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15312
- "Show less"
15313
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15314
- /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15315
- "Load more (",
15316
- hiddenCount,
15317
- ")"
15318
- ] })
15319
- }
15320
- ) })
15321
- ] });
15322
- })()
15616
+ tripListingSlot != null ? tripListingSlot : /* @__PURE__ */ jsxs(Fragment, { children: [
15617
+ filterGroups && filterGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(
15618
+ FilterPanel,
15619
+ {
15620
+ variant: "horizontal",
15621
+ labels: filterLabels,
15622
+ groups: filterGroups,
15623
+ value: filterValue,
15624
+ onChange: setFilterValue,
15625
+ onClearAll: () => setFilterValue({}),
15626
+ sortOptions,
15627
+ sort,
15628
+ onSortChange: setSort
15629
+ }
15630
+ ) }),
15631
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground font-ui mb-5", children: [
15632
+ sortedTrips.length,
15633
+ " ",
15634
+ sortedTrips.length === 1 ? "trip" : "trips",
15635
+ " found"
15636
+ ] }),
15637
+ (() => {
15638
+ const visibleTrips = tripsExpanded ? sortedTrips : sortedTrips.slice(0, tripsInitialCount);
15639
+ const hiddenCount = sortedTrips.length - visibleTrips.length;
15640
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
15641
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-6 gap-y-8 lg:gap-x-[35px] lg:gap-y-[38px]", children: visibleTrips.map((trip, i) => {
15642
+ const _a2 = trip, { featured: _featured, filterTags: _filterTags, priceValue: _priceValue } = _a2, cardProps = __objRest(_a2, ["featured", "filterTags", "priceValue"]);
15643
+ return /* @__PURE__ */ jsx(
15644
+ TripCard,
15645
+ __spreadProps(__spreadValues({}, cardProps), {
15646
+ labels: cardLabels,
15647
+ className: cn("w-full h-auto", cardProps.className)
15648
+ }),
15649
+ i
15650
+ );
15651
+ }) }),
15652
+ sortedTrips.length > tripsInitialCount && /* @__PURE__ */ jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsx(
15653
+ "button",
15654
+ {
15655
+ type: "button",
15656
+ onClick: () => setTripsExpanded((v) => !v),
15657
+ className: cn(
15658
+ "inline-flex items-center gap-2 rounded-full border border-border bg-background px-5 py-2.5",
15659
+ "text-sm font-semibold text-foreground shadow-sm",
15660
+ "hover:bg-muted transition-colors duration-150",
15661
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
15662
+ ),
15663
+ children: tripsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
15664
+ /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15665
+ showLessLabel != null ? showLessLabel : "Show less"
15666
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15667
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15668
+ loadMoreLabel != null ? loadMoreLabel : "Load more",
15669
+ " (",
15670
+ hiddenCount,
15671
+ ")"
15672
+ ] })
15673
+ }
15674
+ ) })
15675
+ ] });
15676
+ })()
15677
+ ] })
15323
15678
  ] }),
15324
15679
  trustpilot && /* @__PURE__ */ jsxs("section", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-12 border-t border-border", children: [
15325
15680
  /* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground font-heading mb-2", children: reviewsTitle }),
@@ -15356,7 +15711,7 @@ function CategoryPage2({
15356
15711
  href: travelGuideHref != null ? travelGuideHref : blogPostsViewAllHref,
15357
15712
  className: "inline-flex items-center gap-1.5 text-sm font-semibold text-primary hover:underline",
15358
15713
  children: [
15359
- travelGuideHref ? travelGuideLabel : "View all posts",
15714
+ travelGuideHref ? travelGuideLabel : viewAllPostsLabel != null ? viewAllPostsLabel : "View all posts",
15360
15715
  /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4" })
15361
15716
  ]
15362
15717
  }
@@ -15385,10 +15740,11 @@ function CategoryPage2({
15385
15740
  ),
15386
15741
  children: faqsExpanded ? /* @__PURE__ */ jsxs(Fragment, { children: [
15387
15742
  /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-4 w-4 text-muted-foreground" }),
15388
- "Show less"
15743
+ showLessLabel != null ? showLessLabel : "Show less"
15389
15744
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15390
15745
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 text-muted-foreground" }),
15391
- "See more (",
15746
+ seeMoreLabel != null ? seeMoreLabel : "See more",
15747
+ " (",
15392
15748
  hiddenCount,
15393
15749
  ")"
15394
15750
  ] })
@@ -15456,6 +15812,7 @@ function ActivityCard({
15456
15812
  {
15457
15813
  src: image,
15458
15814
  alt: imageAlt,
15815
+ title: imageAlt || void 0,
15459
15816
  className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
15460
15817
  }
15461
15818
  ),
@@ -17157,7 +17514,1402 @@ function StickyBookingCard({
17157
17514
  }
17158
17515
  );
17159
17516
  }
17517
+ var DEFAULT_TRUSTPILOT = {
17518
+ businessUnitId: "6171e6a56fc555750dd81ae7",
17519
+ templateId: "5419b732fbfb950b10de65e5",
17520
+ locale: "en-US",
17521
+ styleHeight: "24px",
17522
+ styleWidth: "100%",
17523
+ token: "d3580e48-fedc-4b14-b705-172180cf241d",
17524
+ theme: "dark",
17525
+ fallbackHref: "https://www.trustpilot.com/review/planetaexo.com",
17526
+ fallbackLabel: "Excellent"
17527
+ };
17528
+ function RatingStars({ stars = 5 }) {
17529
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", "aria-hidden": true, children: Array.from({ length: 5 }).map((_, i) => {
17530
+ const filled = i + 1 <= Math.round(stars);
17531
+ return /* @__PURE__ */ jsx(
17532
+ "span",
17533
+ {
17534
+ className: cn(
17535
+ "flex h-5 w-5 items-center justify-center rounded-[3px]",
17536
+ filled ? "bg-primary" : "bg-white/30"
17537
+ ),
17538
+ children: /* @__PURE__ */ jsx(StarIcon, { className: "h-3 w-3 fill-white text-white" })
17539
+ },
17540
+ i
17541
+ );
17542
+ }) });
17543
+ }
17544
+ function Rating({ label, stars = 5, provider, href }) {
17545
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
17546
+ label && /* @__PURE__ */ jsx("span", { className: "text-sm font-ui font-bold text-white", children: label }),
17547
+ /* @__PURE__ */ jsx(RatingStars, { stars }),
17548
+ provider && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-sm font-ui font-bold text-white", children: [
17549
+ /* @__PURE__ */ jsx(StarIcon, { className: "h-4 w-4 fill-primary text-primary" }),
17550
+ provider
17551
+ ] })
17552
+ ] });
17553
+ if (href) {
17554
+ return /* @__PURE__ */ jsx(
17555
+ "a",
17556
+ {
17557
+ href,
17558
+ target: "_blank",
17559
+ rel: "noreferrer noopener",
17560
+ "aria-label": `${label != null ? label : ""} ${stars} out of 5 \u2014 ${provider != null ? provider : "reviews"}`.trim(),
17561
+ className: "inline-flex items-center gap-2.5 transition-opacity hover:opacity-90",
17562
+ children: content
17563
+ }
17564
+ );
17565
+ }
17566
+ return /* @__PURE__ */ jsx("div", { className: "inline-flex items-center gap-2.5", children: content });
17567
+ }
17568
+ function HomeHeader({
17569
+ images,
17570
+ videoUrl,
17571
+ eyebrow,
17572
+ title,
17573
+ subtitle,
17574
+ cta,
17575
+ trustpilot,
17576
+ rating,
17577
+ pressLogos,
17578
+ pressLabel = "In the press",
17579
+ pressLabelHref,
17580
+ siteHeader,
17581
+ align = "center",
17582
+ className
17583
+ }) {
17584
+ var _a;
17585
+ const [heroIndex, setHeroIndex] = React32.useState(0);
17586
+ const [videoReady, setVideoReady] = React32.useState(false);
17587
+ const videoRef = React32.useRef(null);
17588
+ const isHls = !!(videoUrl == null ? void 0 : videoUrl.includes(".m3u8"));
17589
+ const validImages = React32.useMemo(
17590
+ () => images.map((u) => u == null ? void 0 : u.trim()).filter(Boolean),
17591
+ [images]
17592
+ );
17593
+ const hasHeroImage = validImages.length > 0;
17594
+ const heroSrc = (i) => {
17595
+ var _a2;
17596
+ return (_a2 = validImages[i]) != null ? _a2 : "";
17597
+ };
17598
+ const safeIndex = Math.min(heroIndex, Math.max(0, validImages.length - 1));
17599
+ const currentSrc = heroSrc(safeIndex);
17600
+ const showCarousel = !videoUrl && validImages.length > 1;
17601
+ const tpConfig = trustpilot ? typeof trustpilot === "object" ? __spreadValues(__spreadValues({}, DEFAULT_TRUSTPILOT), trustpilot) : DEFAULT_TRUSTPILOT : null;
17602
+ useHlsVideo(videoRef, isHls ? videoUrl : void 0);
17603
+ React32.useEffect(() => {
17604
+ if (!videoUrl) return;
17605
+ const el = videoRef.current;
17606
+ if (!el) return;
17607
+ const observer = new IntersectionObserver(
17608
+ ([entry]) => {
17609
+ if (entry.isIntersecting) {
17610
+ el.play().catch(() => {
17611
+ });
17612
+ } else {
17613
+ el.pause();
17614
+ }
17615
+ },
17616
+ { threshold: 0.1 }
17617
+ );
17618
+ observer.observe(el);
17619
+ return () => observer.disconnect();
17620
+ }, [videoUrl]);
17621
+ const isCenter = align === "center";
17622
+ return /* @__PURE__ */ jsxs(
17623
+ "section",
17624
+ {
17625
+ className: cn(
17626
+ "relative w-full overflow-hidden",
17627
+ "h-screen min-h-[640px]",
17628
+ hasHeroImage ? "bg-muted" : "bg-zinc-900",
17629
+ className
17630
+ ),
17631
+ "data-home-header-align": align,
17632
+ children: [
17633
+ !videoUrl && !hasHeroImage && /* @__PURE__ */ jsx(
17634
+ "div",
17635
+ {
17636
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950",
17637
+ "aria-hidden": true
17638
+ }
17639
+ ),
17640
+ videoUrl ? /* @__PURE__ */ jsxs(Fragment, { children: [
17641
+ hasHeroImage ? /* @__PURE__ */ jsx(
17642
+ Picture,
17643
+ {
17644
+ src: validImages[0],
17645
+ alt: "",
17646
+ "aria-hidden": true,
17647
+ fetchPriority: "high",
17648
+ eager: true,
17649
+ className: cn(
17650
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
17651
+ videoReady ? "opacity-0 pointer-events-none" : "opacity-100"
17652
+ )
17653
+ }
17654
+ ) : /* @__PURE__ */ jsx(
17655
+ "div",
17656
+ {
17657
+ className: "absolute inset-0 bg-gradient-to-br from-zinc-900 via-zinc-800 to-zinc-950 transition-opacity duration-700",
17658
+ "aria-hidden": true
17659
+ }
17660
+ ),
17661
+ /* @__PURE__ */ jsx(
17662
+ "video",
17663
+ {
17664
+ ref: videoRef,
17665
+ src: isHls ? void 0 : videoUrl,
17666
+ autoPlay: true,
17667
+ muted: true,
17668
+ loop: true,
17669
+ playsInline: true,
17670
+ preload: "auto",
17671
+ poster: hasHeroImage ? validImages[0] : void 0,
17672
+ onCanPlay: () => setVideoReady(true),
17673
+ className: cn(
17674
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700",
17675
+ videoReady ? "opacity-100" : "opacity-0"
17676
+ )
17677
+ }
17678
+ )
17679
+ ] }) : hasHeroImage ? /* @__PURE__ */ jsx(
17680
+ Picture,
17681
+ {
17682
+ src: currentSrc,
17683
+ alt: title,
17684
+ fetchPriority: safeIndex === 0 ? "high" : "auto",
17685
+ eager: safeIndex === 0,
17686
+ className: "absolute inset-0 h-full w-full object-cover transition-opacity duration-700"
17687
+ }
17688
+ ) : null,
17689
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/30", "aria-hidden": true }),
17690
+ /* @__PURE__ */ jsx(
17691
+ "div",
17692
+ {
17693
+ className: "absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-black/30",
17694
+ "aria-hidden": true
17695
+ }
17696
+ ),
17697
+ siteHeader && /* @__PURE__ */ jsx(
17698
+ SiteHeader,
17699
+ __spreadProps(__spreadValues({}, Array.isArray(siteHeader) ? { links: siteHeader } : typeof siteHeader === "object" ? siteHeader : {}), {
17700
+ position: "overlay"
17701
+ })
17702
+ ),
17703
+ showCarousel && /* @__PURE__ */ jsxs(Fragment, { children: [
17704
+ /* @__PURE__ */ jsx(
17705
+ "button",
17706
+ {
17707
+ type: "button",
17708
+ onClick: () => setHeroIndex(
17709
+ (i) => (i - 1 + validImages.length) % validImages.length
17710
+ ),
17711
+ 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",
17712
+ "aria-label": "Previous image",
17713
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-5 w-5" })
17714
+ }
17715
+ ),
17716
+ /* @__PURE__ */ jsx(
17717
+ "button",
17718
+ {
17719
+ type: "button",
17720
+ onClick: () => setHeroIndex((i) => (i + 1) % validImages.length),
17721
+ 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",
17722
+ "aria-label": "Next image",
17723
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
17724
+ }
17725
+ )
17726
+ ] }),
17727
+ /* @__PURE__ */ jsxs(
17728
+ "div",
17729
+ {
17730
+ className: cn(
17731
+ "absolute inset-0 z-10 flex flex-col justify-center",
17732
+ "mx-auto w-full max-w-6xl px-6 sm:px-8",
17733
+ "pt-[72px]",
17734
+ // clear the overlay header
17735
+ pressLogos && pressLogos.length > 0 ? "pb-28" : "pb-16",
17736
+ isCenter ? "items-center text-center" : "items-start text-left"
17737
+ ),
17738
+ children: [
17739
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs sm:text-sm font-ui font-bold uppercase tracking-[0.2em] text-primary-400", children: eyebrow }),
17740
+ /* @__PURE__ */ jsx(
17741
+ "h1",
17742
+ {
17743
+ className: cn(
17744
+ "font-heading font-black uppercase text-white leading-[0.95]",
17745
+ "text-5xl sm:text-6xl lg:text-7xl",
17746
+ isCenter ? "max-w-4xl" : "max-w-3xl"
17747
+ ),
17748
+ children: title
17749
+ }
17750
+ ),
17751
+ subtitle && /* @__PURE__ */ jsx(
17752
+ "p",
17753
+ {
17754
+ className: cn(
17755
+ "mt-5 text-lg sm:text-xl font-sans text-white/90",
17756
+ isCenter ? "max-w-2xl" : "max-w-xl"
17757
+ ),
17758
+ children: subtitle
17759
+ }
17760
+ ),
17761
+ cta && /* @__PURE__ */ jsx("div", { className: "mt-8", children: cta.href ? /* @__PURE__ */ jsx(
17762
+ "a",
17763
+ {
17764
+ href: cta.href,
17765
+ onClick: cta.onClick,
17766
+ className: buttonVariants({ size: "lg" }),
17767
+ children: cta.label
17768
+ }
17769
+ ) : /* @__PURE__ */ jsx(Button, { size: "lg", onClick: cta.onClick, children: cta.label }) }),
17770
+ tpConfig ? /* @__PURE__ */ jsxs(
17771
+ "div",
17772
+ {
17773
+ className: cn(
17774
+ "home-trustpilot relative mt-8",
17775
+ // Wide enough for the Micro Star to show the full "Excellent
17776
+ // ★★★★★ Trustpilot" lockup — at 260px the Trustpilot wordmark
17777
+ // was clipped.
17778
+ isCenter && "w-full max-w-[340px]"
17779
+ ),
17780
+ children: [
17781
+ /* @__PURE__ */ jsx(TrustpilotEmbed, { config: tpConfig }),
17782
+ /* @__PURE__ */ jsx(
17783
+ "a",
17784
+ {
17785
+ href: (_a = tpConfig.fallbackHref) != null ? _a : "https://www.trustpilot.com/review/planetaexo.com",
17786
+ target: "_blank",
17787
+ rel: "noopener noreferrer",
17788
+ "aria-label": "Read our reviews on Trustpilot",
17789
+ className: "absolute inset-0 z-10"
17790
+ }
17791
+ )
17792
+ ]
17793
+ }
17794
+ ) : rating ? /* @__PURE__ */ jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsx(Rating, __spreadValues({}, rating)) }) : null
17795
+ ]
17796
+ }
17797
+ ),
17798
+ pressLogos && pressLogos.length > 0 && /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0 z-10 pb-7", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-6xl flex-wrap items-center justify-center gap-x-7 gap-y-3 px-6 sm:px-8", children: [
17799
+ pressLabelHref ? /* @__PURE__ */ jsx(
17800
+ "a",
17801
+ {
17802
+ href: pressLabelHref,
17803
+ target: "_blank",
17804
+ rel: "noopener noreferrer",
17805
+ className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70 transition-colors hover:text-white",
17806
+ children: pressLabel
17807
+ }
17808
+ ) : /* @__PURE__ */ jsx("span", { className: "text-[10px] font-ui font-bold uppercase tracking-[0.25em] leading-tight text-white/70", children: pressLabel }),
17809
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-nowrap items-center justify-center gap-x-7", children: [
17810
+ /* @__PURE__ */ jsx("span", { className: "hidden h-5 w-px bg-white/25 sm:block", "aria-hidden": true }),
17811
+ pressLogos.map((logo, i) => {
17812
+ var _a2, _b, _c, _d;
17813
+ const content = logo.src ? (
17814
+ // eslint-disable-next-line @next/next/no-img-element
17815
+ /* @__PURE__ */ jsx(
17816
+ "img",
17817
+ {
17818
+ src: logo.src,
17819
+ alt: (_b = (_a2 = logo.alt) != null ? _a2 : logo.label) != null ? _b : "Press logo",
17820
+ className: "h-12 w-12 shrink-0 select-none object-contain",
17821
+ draggable: false
17822
+ }
17823
+ )
17824
+ ) : /* @__PURE__ */ jsx("span", { className: "font-heading text-base font-bold uppercase tracking-wide", children: logo.label });
17825
+ return logo.href ? /* @__PURE__ */ jsx(
17826
+ "a",
17827
+ {
17828
+ href: logo.href,
17829
+ target: "_blank",
17830
+ rel: "noopener noreferrer",
17831
+ "aria-label": (_d = (_c = logo.alt) != null ? _c : logo.label) != null ? _d : "Press article",
17832
+ 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",
17833
+ children: content
17834
+ },
17835
+ i
17836
+ ) : /* @__PURE__ */ jsx(
17837
+ "span",
17838
+ {
17839
+ className: "shrink-0 text-white/80 [&>img]:opacity-80",
17840
+ children: content
17841
+ },
17842
+ i
17843
+ );
17844
+ })
17845
+ ] })
17846
+ ] }) })
17847
+ ]
17848
+ }
17849
+ );
17850
+ }
17851
+ var ACCENT_PILL = "bg-primary text-primary-foreground";
17852
+ var ACCENT_BUTTON = "bg-primary text-primary-foreground hover:bg-primary/90";
17853
+ var THEME = {
17854
+ dark: {
17855
+ section: "bg-neutral-950",
17856
+ heading: "text-white",
17857
+ body: "text-white/60",
17858
+ tabTrack: "bg-white/5 border-white/10",
17859
+ tabActive: ACCENT_PILL,
17860
+ tabIdle: "text-white/60 hover:text-white",
17861
+ cardRing: "focus-visible:ring-white/70 focus-visible:ring-offset-neutral-950",
17862
+ divider: "border-white/15"
17863
+ },
17864
+ light: {
17865
+ /* Explicit light colours (not mode-aware tokens) so this variant stays a
17866
+ light surface even when the app is in dark mode. */
17867
+ section: "bg-white",
17868
+ heading: "text-neutral-900",
17869
+ body: "text-neutral-500",
17870
+ tabTrack: "bg-neutral-100 border-black/10",
17871
+ tabActive: ACCENT_PILL,
17872
+ tabIdle: "text-neutral-500 hover:text-neutral-900",
17873
+ cardRing: "focus-visible:ring-neutral-900/40 focus-visible:ring-offset-white",
17874
+ divider: "border-black/10"
17875
+ }
17876
+ };
17877
+ var BENTO_SPAN = {
17878
+ featured: "col-span-2 row-span-2",
17879
+ tall: "col-span-2 sm:col-span-1 row-span-2",
17880
+ wide: "col-span-2",
17881
+ normal: "col-span-2 sm:col-span-1"
17882
+ };
17883
+ function BentoTile({
17884
+ card,
17885
+ ring
17886
+ }) {
17887
+ var _a, _b, _c;
17888
+ const isFeatured = card.size === "featured";
17889
+ const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
17890
+ card.image ? /* @__PURE__ */ jsxs(Fragment, { children: [
17891
+ /* @__PURE__ */ jsx(
17892
+ Picture,
17893
+ {
17894
+ src: card.image,
17895
+ alt: (_a = card.imageAlt) != null ? _a : card.label,
17896
+ loading: "lazy",
17897
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
17898
+ }
17899
+ ),
17900
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/85 via-black/15 to-transparent" })
17901
+ ] }) : /* @__PURE__ */ jsx(
17902
+ "div",
17903
+ {
17904
+ className: cn(
17905
+ "absolute inset-0 bg-gradient-to-br",
17906
+ (_b = card.gradient) != null ? _b : "from-primary-800 to-primary-900"
17907
+ )
17908
+ }
17909
+ ),
17910
+ card.tripCount && /* @__PURE__ */ jsx("span", { className: "absolute right-3 top-3 z-10 rounded-full bg-white/90 px-2.5 py-1 text-[11px] font-ui font-bold uppercase tracking-wide text-neutral-900", children: card.tripCount }),
17911
+ /* @__PURE__ */ jsxs("div", { className: "absolute inset-x-0 bottom-0 z-10 p-5", children: [
17912
+ /* @__PURE__ */ jsx(
17913
+ "h3",
17914
+ {
17915
+ className: cn(
17916
+ "font-heading font-bold uppercase leading-tight tracking-wide text-white",
17917
+ isFeatured ? "text-2xl sm:text-3xl" : "text-lg sm:text-xl"
17918
+ ),
17919
+ children: card.label
17920
+ }
17921
+ ),
17922
+ card.description && /* @__PURE__ */ jsx("p", { className: "mt-1 max-h-0 overflow-hidden text-sm leading-snug text-white/85 opacity-0 transition-all duration-300 group-hover:mt-2 group-hover:max-h-32 group-hover:opacity-100", children: card.description }),
17923
+ card.ctaLabel && /* @__PURE__ */ jsxs("span", { className: "mt-2 inline-flex items-center gap-1 text-sm font-ui font-bold text-primary-400", children: [
17924
+ card.ctaLabel,
17925
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17926
+ ] })
17927
+ ] })
17928
+ ] });
17929
+ const tileClass = cn(
17930
+ "group relative overflow-hidden rounded-2xl bg-muted shadow-sm",
17931
+ BENTO_SPAN[(_c = card.size) != null ? _c : "normal"]
17932
+ );
17933
+ return card.href ? /* @__PURE__ */ jsx(
17934
+ "a",
17935
+ {
17936
+ href: card.href,
17937
+ className: cn(
17938
+ tileClass,
17939
+ "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
17940
+ ring
17941
+ ),
17942
+ children: inner
17943
+ }
17944
+ ) : /* @__PURE__ */ jsx("div", { className: tileClass, children: inner });
17945
+ }
17946
+ function AdventureExplorer({
17947
+ tabs,
17948
+ eyebrow,
17949
+ heading,
17950
+ subheading,
17951
+ defaultTabId,
17952
+ viewAllLabel = "View All Adventures",
17953
+ viewAllHref,
17954
+ theme = "dark",
17955
+ layout = "carousel",
17956
+ bentoLimit,
17957
+ moreLabel = "More wild places",
17958
+ className
17959
+ }) {
17960
+ var _a, _b, _c, _d, _e;
17961
+ const [activeId, setActiveId] = React32.useState(
17962
+ defaultTabId != null ? defaultTabId : (_a = tabs[0]) == null ? void 0 : _a.id
17963
+ );
17964
+ const active = (_b = tabs.find((t2) => t2.id === activeId)) != null ? _b : tabs[0];
17965
+ const t = THEME[theme];
17966
+ const ctaHref = (_d = (_c = active == null ? void 0 : active.viewAllHref) != null ? _c : viewAllHref) != null ? _d : "#";
17967
+ const showCta = viewAllLabel.length > 0;
17968
+ const hasHeading = !!(eyebrow || heading || subheading);
17969
+ const cards = (_e = active == null ? void 0 : active.cards) != null ? _e : [];
17970
+ const limited = layout === "bento" && bentoLimit != null && cards.length > bentoLimit;
17971
+ const gridCards = limited ? cards.slice(0, bentoLimit) : cards;
17972
+ const moreCards = limited ? cards.slice(bentoLimit) : [];
17973
+ const showHeadCta = showCta && !limited;
17974
+ return /* @__PURE__ */ jsx("section", { className: cn("w-full py-10 sm:py-16", t.section, className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
17975
+ hasHeading && /* @__PURE__ */ jsxs("div", { className: "mb-8 flex flex-wrap items-end justify-between gap-6", children: [
17976
+ /* @__PURE__ */ jsxs("div", { className: "max-w-2xl", children: [
17977
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
17978
+ heading && /* @__PURE__ */ jsx(
17979
+ "h2",
17980
+ {
17981
+ className: cn(
17982
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
17983
+ t.heading
17984
+ ),
17985
+ children: heading
17986
+ }
17987
+ ),
17988
+ subheading && /* @__PURE__ */ jsx("p", { className: cn("mt-3 text-base", t.body), children: subheading })
17989
+ ] }),
17990
+ showHeadCta && /* @__PURE__ */ jsxs(
17991
+ "a",
17992
+ {
17993
+ href: ctaHref,
17994
+ 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",
17995
+ children: [
17996
+ viewAllLabel,
17997
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
17998
+ ]
17999
+ }
18000
+ )
18001
+ ] }),
18002
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
18003
+ /* @__PURE__ */ jsx(
18004
+ "div",
18005
+ {
18006
+ role: "tablist",
18007
+ "aria-label": "Explore categories",
18008
+ className: cn(
18009
+ "inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
18010
+ t.tabTrack
18011
+ ),
18012
+ children: tabs.map((tab) => {
18013
+ const isActive = tab.id === (active == null ? void 0 : active.id);
18014
+ return /* @__PURE__ */ jsx(
18015
+ "button",
18016
+ {
18017
+ type: "button",
18018
+ role: "tab",
18019
+ "aria-selected": isActive,
18020
+ onClick: () => setActiveId(tab.id),
18021
+ className: cn(
18022
+ "shrink-0 rounded-full px-5 py-2 text-sm font-ui font-bold transition-colors",
18023
+ isActive ? t.tabActive : t.tabIdle
18024
+ ),
18025
+ children: tab.label
18026
+ },
18027
+ tab.id
18028
+ );
18029
+ })
18030
+ }
18031
+ ),
18032
+ showCta && !hasHeading && /* @__PURE__ */ jsx(
18033
+ "a",
18034
+ {
18035
+ href: ctaHref,
18036
+ className: cn(
18037
+ "hidden shrink-0 items-center rounded-full px-6 py-2.5 text-sm font-heading font-bold transition-colors sm:inline-flex",
18038
+ ACCENT_BUTTON
18039
+ ),
18040
+ children: viewAllLabel
18041
+ }
18042
+ )
18043
+ ] }),
18044
+ layout === "bento" && /* @__PURE__ */ jsx("div", { className: "mt-6 grid auto-rows-[170px] grid-cols-2 gap-4 sm:mt-8 sm:auto-rows-[200px] lg:grid-cols-4", children: gridCards.map((card, i) => /* @__PURE__ */ jsx(BentoTile, { card, ring: t.cardRing }, i)) }),
18045
+ limited && /* @__PURE__ */ jsxs(
18046
+ "div",
18047
+ {
18048
+ className: cn(
18049
+ "mt-7 flex flex-wrap items-center justify-between gap-x-8 gap-y-3 border-t pt-6",
18050
+ t.divider
18051
+ ),
18052
+ children: [
18053
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2", children: [
18054
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-ui font-bold uppercase tracking-[0.18em] text-primary", children: moreLabel }),
18055
+ moreCards.map((card, i) => {
18056
+ var _a2;
18057
+ return /* @__PURE__ */ jsxs(
18058
+ "a",
18059
+ {
18060
+ href: (_a2 = card.href) != null ? _a2 : "#",
18061
+ className: "group inline-flex items-baseline gap-2",
18062
+ children: [
18063
+ /* @__PURE__ */ jsx(
18064
+ "span",
18065
+ {
18066
+ className: cn(
18067
+ "font-heading text-base font-bold transition-colors group-hover:text-primary",
18068
+ t.heading
18069
+ ),
18070
+ children: card.label
18071
+ }
18072
+ ),
18073
+ card.tripCount && /* @__PURE__ */ jsx("span", { className: cn("text-sm", t.body), children: card.tripCount })
18074
+ ]
18075
+ },
18076
+ i
18077
+ );
18078
+ })
18079
+ ] }),
18080
+ showCta && /* @__PURE__ */ jsxs(
18081
+ "a",
18082
+ {
18083
+ href: ctaHref,
18084
+ 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",
18085
+ children: [
18086
+ viewAllLabel,
18087
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "transition-transform group-hover:translate-x-1", children: "\u2192" })
18088
+ ]
18089
+ }
18090
+ )
18091
+ ]
18092
+ }
18093
+ ),
18094
+ layout !== "bento" && /* @__PURE__ */ jsx("div", { className: "-mx-6 mt-6 flex gap-3 overflow-x-auto px-6 pb-2 snap-x snap-mandatory scroll-px-6 scroll-smooth scrollbar-none sm:mx-0 sm:mt-8 sm:gap-4 sm:px-0 sm:scroll-px-0", children: active == null ? void 0 : active.cards.map((card, i) => {
18095
+ var _a2, _b2;
18096
+ const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
18097
+ /* @__PURE__ */ jsx(
18098
+ Picture,
18099
+ {
18100
+ src: (_a2 = card.image) != null ? _a2 : "",
18101
+ alt: (_b2 = card.imageAlt) != null ? _b2 : card.label,
18102
+ loading: "lazy",
18103
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
18104
+ }
18105
+ ),
18106
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/15 to-transparent" }),
18107
+ /* @__PURE__ */ jsx("span", { className: "absolute inset-x-0 bottom-0 p-4 font-heading text-sm font-bold uppercase leading-tight tracking-wide text-white", children: card.label })
18108
+ ] });
18109
+ 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";
18110
+ return card.href ? /* @__PURE__ */ jsx(
18111
+ "a",
18112
+ {
18113
+ href: card.href,
18114
+ className: cn(
18115
+ cardClass,
18116
+ "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
18117
+ t.cardRing
18118
+ ),
18119
+ children: inner
18120
+ },
18121
+ i
18122
+ ) : /* @__PURE__ */ jsx("div", { className: cardClass, children: inner }, i);
18123
+ }) }),
18124
+ showCta && /* @__PURE__ */ jsx("div", { className: "mt-6 sm:hidden", children: /* @__PURE__ */ jsx(
18125
+ "a",
18126
+ {
18127
+ href: ctaHref,
18128
+ className: cn(
18129
+ "inline-flex w-full items-center justify-center rounded-full px-6 py-3 text-sm font-heading font-bold transition-colors",
18130
+ ACCENT_BUTTON
18131
+ ),
18132
+ children: viewAllLabel
18133
+ }
18134
+ ) })
18135
+ ] }) });
18136
+ }
18137
+ var THEME2 = {
18138
+ light: {
18139
+ section: "bg-neutral-100",
18140
+ heading: "text-neutral-900",
18141
+ title: "text-neutral-800",
18142
+ body: "text-neutral-500",
18143
+ icon: "text-primary",
18144
+ card: "bg-white border-black/10 shadow-sm",
18145
+ chip: "bg-primary/10 text-primary",
18146
+ number: "text-primary"
18147
+ },
18148
+ dark: {
18149
+ section: "bg-neutral-950",
18150
+ heading: "text-white",
18151
+ title: "text-white",
18152
+ body: "text-white/60",
18153
+ icon: "text-primary-400",
18154
+ card: "bg-white/5 border-white/10",
18155
+ chip: "bg-primary-400/15 text-primary-400",
18156
+ number: "text-primary-400"
18157
+ }
18158
+ };
18159
+ var COLS = {
18160
+ 2: "sm:grid-cols-2",
18161
+ 3: "sm:grid-cols-2 lg:grid-cols-3",
18162
+ 4: "sm:grid-cols-2 lg:grid-cols-4"
18163
+ };
18164
+ function USP({
18165
+ items,
18166
+ heading,
18167
+ subheading,
18168
+ columns,
18169
+ variant = "minimal",
18170
+ theme = "light",
18171
+ className
18172
+ }) {
18173
+ const t = THEME2[theme];
18174
+ const cols = columns != null ? columns : Math.min(Math.max(items.length, 2), 4);
18175
+ const isInline = variant === "inline";
18176
+ const isCard = variant === "card";
18177
+ const isNumbered = variant === "numbered";
18178
+ const stacked = !isInline;
18179
+ return /* @__PURE__ */ jsx("section", { className: cn("w-full py-14 sm:py-20", t.section, className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18180
+ (heading || subheading) && /* @__PURE__ */ jsxs(
18181
+ "div",
18182
+ {
18183
+ className: cn(
18184
+ "mb-12 max-w-2xl",
18185
+ isNumbered ? "text-left" : "mx-auto text-center"
18186
+ ),
18187
+ children: [
18188
+ heading && /* @__PURE__ */ jsx(
18189
+ "h2",
18190
+ {
18191
+ className: cn(
18192
+ "font-heading font-bold uppercase tracking-wide",
18193
+ isNumbered ? "text-3xl sm:text-4xl lg:text-5xl" : "text-2xl sm:text-3xl",
18194
+ t.heading
18195
+ ),
18196
+ children: heading
18197
+ }
18198
+ ),
18199
+ subheading && /* @__PURE__ */ jsx("p", { className: cn("mt-3 font-sans text-base", t.body), children: subheading })
18200
+ ]
18201
+ }
18202
+ ),
18203
+ /* @__PURE__ */ jsxs(
18204
+ "div",
18205
+ {
18206
+ className: cn(
18207
+ "grid grid-cols-1 gap-x-8 gap-y-10",
18208
+ COLS[cols]
18209
+ ),
18210
+ children: [
18211
+ isNumbered && items.map((item, i) => /* @__PURE__ */ jsxs(
18212
+ "div",
18213
+ {
18214
+ className: cn(
18215
+ "flex flex-col rounded-2xl border p-6 text-left sm:p-7",
18216
+ t.card
18217
+ ),
18218
+ children: [
18219
+ /* @__PURE__ */ jsx(
18220
+ "span",
18221
+ {
18222
+ className: cn(
18223
+ "mb-4 font-sans text-xl font-semibold italic",
18224
+ t.number
18225
+ ),
18226
+ children: String(i + 1).padStart(2, "0")
18227
+ }
18228
+ ),
18229
+ /* @__PURE__ */ jsx(
18230
+ "h3",
18231
+ {
18232
+ className: cn(
18233
+ "font-heading text-lg font-bold leading-snug",
18234
+ t.heading
18235
+ ),
18236
+ children: item.title
18237
+ }
18238
+ ),
18239
+ /* @__PURE__ */ jsx("p", { className: cn("mt-2 font-sans text-base leading-relaxed", t.body), children: item.description })
18240
+ ]
18241
+ },
18242
+ i
18243
+ )),
18244
+ !isNumbered && items.map((item, i) => /* @__PURE__ */ jsxs(
18245
+ "div",
18246
+ {
18247
+ className: cn(
18248
+ isCard && cn("rounded-2xl border p-6 sm:p-7", t.card),
18249
+ stacked ? "flex flex-col items-center text-center" : "flex items-start gap-4 text-left"
18250
+ ),
18251
+ children: [
18252
+ /* @__PURE__ */ jsx(
18253
+ "span",
18254
+ {
18255
+ className: cn(
18256
+ "flex shrink-0 items-center justify-center",
18257
+ isCard ? cn("h-14 w-14 rounded-full [&>svg]:size-7", t.chip) : cn("[&>svg]:size-8", t.icon),
18258
+ stacked && "mb-4"
18259
+ ),
18260
+ children: item.icon
18261
+ }
18262
+ ),
18263
+ /* @__PURE__ */ jsxs("div", { className: isInline ? "flex-1" : "contents", children: [
18264
+ /* @__PURE__ */ jsx(
18265
+ "h3",
18266
+ {
18267
+ className: cn(
18268
+ "font-heading text-sm font-bold uppercase leading-snug tracking-wide",
18269
+ t.title,
18270
+ stacked && "mb-3"
18271
+ ),
18272
+ children: item.title
18273
+ }
18274
+ ),
18275
+ /* @__PURE__ */ jsx(
18276
+ "p",
18277
+ {
18278
+ className: cn(
18279
+ "font-sans text-base leading-relaxed",
18280
+ t.body,
18281
+ isInline && "mt-1.5"
18282
+ ),
18283
+ children: item.description
18284
+ }
18285
+ )
18286
+ ] })
18287
+ ]
18288
+ },
18289
+ i
18290
+ ))
18291
+ ]
18292
+ }
18293
+ )
18294
+ ] }) });
18295
+ }
18296
+ function RotatingSubtitle({
18297
+ phrases,
18298
+ interval,
18299
+ className
18300
+ }) {
18301
+ const [index, setIndex] = React32.useState(0);
18302
+ React32.useEffect(() => {
18303
+ var _a;
18304
+ if (phrases.length < 2) return;
18305
+ const reduce = typeof window !== "undefined" && ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-reduced-motion: reduce)").matches);
18306
+ if (reduce) return;
18307
+ const id = setInterval(
18308
+ () => setIndex((i) => (i + 1) % phrases.length),
18309
+ interval
18310
+ );
18311
+ return () => clearInterval(id);
18312
+ }, [phrases.length, interval]);
18313
+ return (
18314
+ /* Grid-stacks all phrases so the box keeps the height of the tallest line
18315
+ and the crossfade has no layout shift. */
18316
+ /* @__PURE__ */ jsx("span", { className: cn("grid", className), children: phrases.map((phrase, i) => /* @__PURE__ */ jsx(
18317
+ "span",
18318
+ {
18319
+ "aria-hidden": i !== index,
18320
+ className: cn(
18321
+ "col-start-1 row-start-1 transition-opacity duration-700",
18322
+ i === index ? "opacity-100" : "opacity-0"
18323
+ ),
18324
+ children: phrase
18325
+ },
18326
+ phrase + i
18327
+ )) })
18328
+ );
18329
+ }
18330
+ function CtaBanner({
18331
+ image,
18332
+ imageAlt = "",
18333
+ title,
18334
+ subtitle,
18335
+ cta,
18336
+ rotateInterval = 3e3,
18337
+ parallax = true,
18338
+ overlayOpacity = 35,
18339
+ className
18340
+ }) {
18341
+ const phrases = React32.useMemo(
18342
+ () => (Array.isArray(subtitle) ? subtitle : subtitle ? [subtitle] : []).map((s) => s.trim()).filter(Boolean),
18343
+ [subtitle]
18344
+ );
18345
+ return /* @__PURE__ */ jsxs(
18346
+ "section",
18347
+ {
18348
+ className: cn(
18349
+ "relative w-full overflow-hidden",
18350
+ "flex items-center justify-center",
18351
+ "min-h-[360px] py-24 sm:py-28 lg:py-32",
18352
+ "bg-muted",
18353
+ className
18354
+ ),
18355
+ children: [
18356
+ parallax ? (
18357
+ /* Parallax: fixed-attachment CSS background (sm+). Uses a plain div so
18358
+ `bg-fixed` works; on mobile it falls back to a normal cover image. */
18359
+ /* @__PURE__ */ jsx(
18360
+ "div",
18361
+ {
18362
+ "aria-hidden": true,
18363
+ role: imageAlt ? "img" : void 0,
18364
+ "aria-label": imageAlt || void 0,
18365
+ className: "absolute inset-0 bg-cover bg-center sm:bg-fixed",
18366
+ style: { backgroundImage: `url("${image}")` }
18367
+ }
18368
+ )
18369
+ ) : /* @__PURE__ */ jsx(
18370
+ Picture,
18371
+ {
18372
+ src: image,
18373
+ alt: imageAlt,
18374
+ eager: true,
18375
+ className: "absolute inset-0 h-full w-full object-cover"
18376
+ }
18377
+ ),
18378
+ /* @__PURE__ */ jsx(
18379
+ "div",
18380
+ {
18381
+ className: "absolute inset-0 bg-black",
18382
+ style: { opacity: overlayOpacity / 100 },
18383
+ "aria-hidden": true
18384
+ }
18385
+ ),
18386
+ /* @__PURE__ */ jsxs("div", { className: "relative z-10 mx-auto flex w-full max-w-4xl flex-col items-center px-6 text-center", children: [
18387
+ /* @__PURE__ */ jsx("h2", { className: "font-heading text-4xl font-black uppercase leading-none tracking-tight text-white sm:text-5xl lg:text-[3.25rem]", children: title }),
18388
+ phrases.length > 0 && /* @__PURE__ */ jsx("p", { className: "mt-4 font-sans text-xl font-semibold text-white sm:text-2xl lg:text-[1.7rem]", children: phrases.length > 1 ? /* @__PURE__ */ jsx(RotatingSubtitle, { phrases, interval: rotateInterval }) : phrases[0] }),
18389
+ cta && (cta.href ? /* @__PURE__ */ jsx(
18390
+ "a",
18391
+ {
18392
+ href: cta.href,
18393
+ onClick: cta.onClick,
18394
+ 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",
18395
+ children: cta.label
18396
+ }
18397
+ ) : /* @__PURE__ */ jsx(
18398
+ "button",
18399
+ {
18400
+ type: "button",
18401
+ onClick: cta.onClick,
18402
+ 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",
18403
+ children: cta.label
18404
+ }
18405
+ ))
18406
+ ] })
18407
+ ]
18408
+ }
18409
+ );
18410
+ }
18411
+ var THEME3 = {
18412
+ light: {
18413
+ section: "bg-background",
18414
+ heading: "text-foreground",
18415
+ sub: "text-muted-foreground",
18416
+ rowTitle: "text-foreground",
18417
+ rowBorder: "border-border",
18418
+ rowArrow: "text-primary"
18419
+ },
18420
+ dark: {
18421
+ section: "bg-neutral-950",
18422
+ heading: "text-white",
18423
+ sub: "text-white/60",
18424
+ rowTitle: "text-white",
18425
+ rowBorder: "border-white/10",
18426
+ rowArrow: "text-primary-400"
18427
+ }
18428
+ };
18429
+ function BlogJournal({
18430
+ eyebrow,
18431
+ title,
18432
+ subtitle,
18433
+ link,
18434
+ feature,
18435
+ posts,
18436
+ theme = "light",
18437
+ className
18438
+ }) {
18439
+ var _a, _b, _c, _d;
18440
+ const t = THEME3[theme];
18441
+ const featRel = feature.external ? "noopener noreferrer" : void 0;
18442
+ const featTarget = feature.external ? "_blank" : void 0;
18443
+ return /* @__PURE__ */ jsx("section", { className: cn("w-full py-20 sm:py-28", t.section, className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18444
+ (title || eyebrow || link) && /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
18445
+ /* @__PURE__ */ jsxs("div", { className: "max-w-2xl", children: [
18446
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18447
+ title && /* @__PURE__ */ jsx(
18448
+ "h2",
18449
+ {
18450
+ className: cn(
18451
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18452
+ t.heading
18453
+ ),
18454
+ children: title
18455
+ }
18456
+ ),
18457
+ subtitle && /* @__PURE__ */ jsx("p", { className: cn("mt-3 text-base", t.sub), children: subtitle })
18458
+ ] }),
18459
+ link && /* @__PURE__ */ jsxs(
18460
+ "a",
18461
+ {
18462
+ href: (_a = link.href) != null ? _a : "#",
18463
+ 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",
18464
+ children: [
18465
+ link.label,
18466
+ /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18467
+ ]
18468
+ }
18469
+ )
18470
+ ] }),
18471
+ /* @__PURE__ */ jsxs("div", { className: "grid items-stretch gap-7 lg:grid-cols-[1.12fr_0.88fr]", children: [
18472
+ /* @__PURE__ */ jsxs(
18473
+ "a",
18474
+ {
18475
+ href: (_b = feature.href) != null ? _b : "#",
18476
+ target: featTarget,
18477
+ rel: featRel,
18478
+ 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]",
18479
+ children: [
18480
+ /* @__PURE__ */ jsx(
18481
+ Picture,
18482
+ {
18483
+ src: feature.image,
18484
+ alt: (_c = feature.imageAlt) != null ? _c : feature.title,
18485
+ loading: "lazy",
18486
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
18487
+ }
18488
+ ),
18489
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/90 via-black/25 to-transparent" }),
18490
+ /* @__PURE__ */ jsxs("div", { className: "relative p-8 sm:p-9", children: [
18491
+ feature.tag && /* @__PURE__ */ jsx("span", { className: "mb-3.5 inline-block rounded-full bg-primary px-3 py-1 text-[11px] font-ui font-bold uppercase tracking-[0.12em] text-primary-foreground", children: feature.tag }),
18492
+ feature.date && /* @__PURE__ */ jsx("span", { className: "block text-xs font-ui font-bold uppercase tracking-[0.1em] text-primary-400", children: feature.date }),
18493
+ /* @__PURE__ */ jsx("h3", { className: "mt-2.5 max-w-[20ch] font-heading text-2xl font-bold leading-[1.08] sm:text-3xl lg:text-4xl", children: feature.title }),
18494
+ feature.excerpt && /* @__PURE__ */ jsx("p", { className: "mt-3 max-w-[46ch] text-sm leading-relaxed text-white/85", children: feature.excerpt }),
18495
+ /* @__PURE__ */ jsxs("span", { className: "mt-5 inline-flex items-center gap-1.5 font-ui text-sm font-bold", children: [
18496
+ (_d = feature.ctaLabel) != null ? _d : "Read the guide",
18497
+ /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18498
+ ] })
18499
+ ] })
18500
+ ]
18501
+ }
18502
+ ),
18503
+ /* @__PURE__ */ jsx("ul", { className: "flex flex-col justify-center", children: posts.map((post, i) => {
18504
+ var _a2, _b2;
18505
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
18506
+ "a",
18507
+ {
18508
+ href: (_a2 = post.href) != null ? _a2 : "#",
18509
+ target: post.external ? "_blank" : void 0,
18510
+ rel: post.external ? "noopener noreferrer" : void 0,
18511
+ className: cn(
18512
+ "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]",
18513
+ t.rowBorder,
18514
+ i === 0 && "border-t-0 pt-0"
18515
+ ),
18516
+ children: [
18517
+ /* @__PURE__ */ jsx(
18518
+ Picture,
18519
+ {
18520
+ src: post.image,
18521
+ alt: (_b2 = post.imageAlt) != null ? _b2 : post.title,
18522
+ loading: "lazy",
18523
+ className: "h-16 w-16 rounded-xl object-cover sm:h-[78px] sm:w-[78px]"
18524
+ }
18525
+ ),
18526
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
18527
+ /* @__PURE__ */ jsxs("span", { className: "text-[11px] font-ui font-bold uppercase tracking-[0.1em] text-primary", children: [
18528
+ post.category,
18529
+ post.category && post.date && /* @__PURE__ */ jsx("span", { className: cn("ml-2 font-semibold", t.sub), children: post.date }),
18530
+ !post.category && post.date && /* @__PURE__ */ jsx("span", { className: cn("font-semibold", t.sub), children: post.date })
18531
+ ] }),
18532
+ /* @__PURE__ */ jsx(
18533
+ "h4",
18534
+ {
18535
+ className: cn(
18536
+ "mt-1.5 font-heading text-base font-bold leading-snug sm:text-lg",
18537
+ t.rowTitle
18538
+ ),
18539
+ children: post.title
18540
+ }
18541
+ )
18542
+ ] }),
18543
+ /* @__PURE__ */ jsx(
18544
+ ArrowRightIcon,
18545
+ {
18546
+ className: cn(
18547
+ "h-5 w-5 shrink-0 transition-transform group-hover:translate-x-1",
18548
+ t.rowArrow
18549
+ )
18550
+ }
18551
+ )
18552
+ ]
18553
+ }
18554
+ ) }, i);
18555
+ }) })
18556
+ ] })
18557
+ ] }) });
18558
+ }
18559
+ var SURFACE_WHITE = "bg-white";
18560
+ var SURFACE_SAND = "bg-[oklch(0.94_0.016_86)]";
18561
+ var SURFACE_PRIMARY_700 = "bg-[oklch(0.52_0.082_179)]";
18562
+ var SURFACE_PRIMARY_800 = "bg-[oklch(0.39_0.062_179)]";
18563
+ var SURFACE_PRIMARY_900 = "bg-[oklch(0.27_0.040_179)]";
18564
+ function SectionHead({
18565
+ eyebrow,
18566
+ title,
18567
+ subtitle,
18568
+ link,
18569
+ align = "between",
18570
+ theme = "light"
18571
+ }) {
18572
+ var _a;
18573
+ const isCenter = align === "center";
18574
+ return /* @__PURE__ */ jsxs(
18575
+ "div",
18576
+ {
18577
+ className: cn(
18578
+ "mb-10 flex flex-wrap items-end gap-6",
18579
+ isCenter ? "flex-col items-center text-center" : "justify-between"
18580
+ ),
18581
+ children: [
18582
+ /* @__PURE__ */ jsxs("div", { className: cn("max-w-2xl", isCenter && "mx-auto"), children: [
18583
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18584
+ /* @__PURE__ */ jsx(
18585
+ "h2",
18586
+ {
18587
+ className: cn(
18588
+ "font-heading text-3xl font-black uppercase leading-[1.05] sm:text-4xl lg:text-5xl",
18589
+ theme === "dark" ? "text-white" : "text-foreground"
18590
+ ),
18591
+ children: title
18592
+ }
18593
+ ),
18594
+ subtitle && /* @__PURE__ */ jsx(
18595
+ "p",
18596
+ {
18597
+ className: cn(
18598
+ "mt-3 text-base",
18599
+ theme === "dark" ? "text-white/70" : "text-muted-foreground"
18600
+ ),
18601
+ children: subtitle
18602
+ }
18603
+ )
18604
+ ] }),
18605
+ link && !isCenter && /* @__PURE__ */ jsxs(
18606
+ "a",
18607
+ {
18608
+ href: (_a = link.href) != null ? _a : "#",
18609
+ 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",
18610
+ children: [
18611
+ link.label,
18612
+ /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18613
+ ]
18614
+ }
18615
+ )
18616
+ ]
18617
+ }
18618
+ );
18619
+ }
18620
+ function ExpeditionsRail({ eyebrow, title, subtitle, link, trips }) {
18621
+ var _a;
18622
+ const railRef = React32.useRef(null);
18623
+ const scrollByCard = (dir) => {
18624
+ const rail = railRef.current;
18625
+ if (!rail) return;
18626
+ const card = rail.querySelector("[data-rail-card]");
18627
+ const amount = card ? card.offsetWidth + 22 : rail.clientWidth * 0.8;
18628
+ rail.scrollBy({ left: dir * amount, behavior: "smooth" });
18629
+ };
18630
+ return /* @__PURE__ */ jsxs("section", { className: cn(SURFACE_SAND, "py-20 sm:py-28"), children: [
18631
+ /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-wrap items-end justify-between gap-6", children: [
18632
+ /* @__PURE__ */ jsxs("div", { className: "max-w-2xl", children: [
18633
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "mb-3 text-xs font-ui font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
18634
+ /* @__PURE__ */ jsx("h2", { className: "font-heading text-3xl font-black uppercase leading-[1.05] text-foreground sm:text-4xl lg:text-5xl", children: title }),
18635
+ subtitle && /* @__PURE__ */ jsx("p", { className: "mt-3 text-base text-muted-foreground", children: subtitle })
18636
+ ] }),
18637
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
18638
+ link && /* @__PURE__ */ jsxs(
18639
+ "a",
18640
+ {
18641
+ href: (_a = link.href) != null ? _a : "#",
18642
+ 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",
18643
+ children: [
18644
+ link.label,
18645
+ /* @__PURE__ */ jsx(ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
18646
+ ]
18647
+ }
18648
+ ),
18649
+ /* @__PURE__ */ jsx(
18650
+ "button",
18651
+ {
18652
+ type: "button",
18653
+ onClick: () => scrollByCard(-1),
18654
+ "aria-label": "Previous expeditions",
18655
+ 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",
18656
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-5 w-5" })
18657
+ }
18658
+ ),
18659
+ /* @__PURE__ */ jsx(
18660
+ "button",
18661
+ {
18662
+ type: "button",
18663
+ onClick: () => scrollByCard(1),
18664
+ "aria-label": "Next expeditions",
18665
+ 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",
18666
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
18667
+ }
18668
+ )
18669
+ ] })
18670
+ ] }) }),
18671
+ /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl", children: /* @__PURE__ */ jsx(
18672
+ "div",
18673
+ {
18674
+ ref: railRef,
18675
+ 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",
18676
+ children: trips.map((trip, i) => /* @__PURE__ */ jsx(
18677
+ "div",
18678
+ {
18679
+ "data-rail-card": true,
18680
+ className: "w-[320px] shrink-0 snap-start sm:w-[340px]",
18681
+ children: /* @__PURE__ */ jsx(TripCard, __spreadValues({ variant: "editorial" }, trip))
18682
+ },
18683
+ i
18684
+ ))
18685
+ }
18686
+ ) })
18687
+ ] });
18688
+ }
18689
+ function PopularCloud({ eyebrow, title, subtitle, chips }) {
18690
+ return /* @__PURE__ */ jsx("section", { className: cn(SURFACE_WHITE, "py-20 sm:py-28"), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18691
+ /* @__PURE__ */ jsx(
18692
+ SectionHead,
18693
+ {
18694
+ eyebrow,
18695
+ title,
18696
+ subtitle,
18697
+ align: "center"
18698
+ }
18699
+ ),
18700
+ /* @__PURE__ */ jsx("div", { className: "mx-auto flex max-w-3xl flex-wrap items-center justify-center gap-3", children: chips.map((chip, i) => {
18701
+ var _a;
18702
+ return /* @__PURE__ */ jsx(
18703
+ Chip,
18704
+ {
18705
+ href: chip.href,
18706
+ variant: chip.featured ? "solid" : "outline",
18707
+ size: (_a = chip.size) != null ? _a : "md",
18708
+ className: "transition-transform hover:-translate-y-0.5",
18709
+ children: chip.label
18710
+ },
18711
+ i
18712
+ );
18713
+ }) })
18714
+ ] }) });
18715
+ }
18716
+ function StatsBand({ items }) {
18717
+ return /* @__PURE__ */ jsx("section", { className: cn(SURFACE_PRIMARY_700, "py-16 text-white sm:py-20"), children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-x-6 gap-y-10 text-center lg:grid-cols-4", children: items.map((stat, i) => /* @__PURE__ */ jsxs("div", { children: [
18718
+ /* @__PURE__ */ jsx("div", { className: "font-heading text-4xl font-black leading-none text-[oklch(0.94_0.05_179)] sm:text-5xl lg:text-6xl", children: stat.value }),
18719
+ /* @__PURE__ */ jsx("div", { className: "mt-3 text-sm font-medium text-white/90", children: stat.label })
18720
+ ] }, i)) }) }) });
18721
+ }
18722
+ function ReviewStars({ stars = 5 }) {
18723
+ return /* @__PURE__ */ jsx("div", { className: "mb-4 flex items-center gap-0.5", "aria-label": `${stars} out of 5 stars`, children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx(
18724
+ StarIcon,
18725
+ {
18726
+ className: cn(
18727
+ "h-4 w-4",
18728
+ i + 1 <= Math.round(stars) ? "fill-amber-400 text-amber-400" : "fill-white/15 text-white/15"
18729
+ )
18730
+ },
18731
+ i
18732
+ )) });
18733
+ }
18734
+ function ReviewsBand({ eyebrow, title, subtitle, link, items, note }) {
18735
+ return /* @__PURE__ */ jsx("section", { className: cn(SURFACE_PRIMARY_900, "py-20 text-white sm:py-28"), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8", children: [
18736
+ /* @__PURE__ */ jsx(
18737
+ SectionHead,
18738
+ {
18739
+ eyebrow,
18740
+ title,
18741
+ subtitle,
18742
+ link,
18743
+ theme: "dark"
18744
+ }
18745
+ ),
18746
+ /* @__PURE__ */ jsx("div", { className: "grid gap-5 sm:grid-cols-2 lg:grid-cols-3", children: items.map((review, i) => /* @__PURE__ */ jsxs(
18747
+ "figure",
18748
+ {
18749
+ className: "rounded-2xl border border-white/10 bg-white/5 p-7 transition-colors hover:bg-white/10",
18750
+ children: [
18751
+ /* @__PURE__ */ jsx(ReviewStars, { stars: review.stars }),
18752
+ /* @__PURE__ */ jsxs("blockquote", { className: "font-sans text-lg italic leading-relaxed text-white/90", children: [
18753
+ "\u201C",
18754
+ review.quote,
18755
+ "\u201D"
18756
+ ] }),
18757
+ /* @__PURE__ */ jsxs("figcaption", { className: "mt-5 text-sm font-medium text-white/60", children: [
18758
+ "\u2014 ",
18759
+ review.author
18760
+ ] })
18761
+ ]
18762
+ },
18763
+ i
18764
+ )) }),
18765
+ note && /* @__PURE__ */ jsx("p", { className: "mt-8 text-center text-xs text-white/40", children: note })
18766
+ ] }) });
18767
+ }
18768
+ function NewHome({
18769
+ hero,
18770
+ explorer,
18771
+ expeditions,
18772
+ popular,
18773
+ stats,
18774
+ usp,
18775
+ reviews,
18776
+ journal,
18777
+ cta,
18778
+ footer,
18779
+ className
18780
+ }) {
18781
+ return /* @__PURE__ */ jsxs("div", { className: cn("w-full bg-background", className), children: [
18782
+ /* @__PURE__ */ jsx(HomeHeader, __spreadValues({}, hero)),
18783
+ explorer && /* @__PURE__ */ jsx(
18784
+ AdventureExplorer,
18785
+ __spreadProps(__spreadValues({}, explorer), {
18786
+ className: cn(SURFACE_WHITE, explorer.className)
18787
+ })
18788
+ ),
18789
+ expeditions && /* @__PURE__ */ jsx(ExpeditionsRail, __spreadValues({}, expeditions)),
18790
+ popular && /* @__PURE__ */ jsx(PopularCloud, __spreadValues({}, popular)),
18791
+ stats && /* @__PURE__ */ jsx(StatsBand, __spreadValues({}, stats)),
18792
+ usp && /* @__PURE__ */ jsx(USP, __spreadProps(__spreadValues({}, usp), { className: cn(SURFACE_PRIMARY_800, usp.className) })),
18793
+ reviews && /* @__PURE__ */ jsx(ReviewsBand, __spreadValues({}, reviews)),
18794
+ journal && /* @__PURE__ */ jsx(BlogJournal, __spreadProps(__spreadValues({}, journal), { className: cn(SURFACE_WHITE, journal.className) })),
18795
+ cta && /* @__PURE__ */ jsx(CtaBanner, __spreadValues({}, cta)),
18796
+ footer && /* @__PURE__ */ jsx(SiteFooter, __spreadValues({}, footer))
18797
+ ] });
18798
+ }
18799
+ var ACTIVE_PILL = "bg-primary text-white shadow-sm";
18800
+ var VARIANT3 = {
18801
+ black: {
18802
+ track: "bg-white/5 border-white/10",
18803
+ idle: "text-white/55 hover:text-white",
18804
+ ring: "focus-visible:ring-white/70"
18805
+ },
18806
+ white: {
18807
+ track: "bg-neutral-100 border-black/10",
18808
+ idle: "text-neutral-500 hover:text-neutral-900",
18809
+ ring: "focus-visible:ring-neutral-900/40"
18810
+ }
18811
+ };
18812
+ var SIZE = {
18813
+ sm: "px-4 py-1.5 text-[13px]",
18814
+ md: "px-5 py-2 text-sm"
18815
+ };
18816
+ function SegmentedControl({
18817
+ items,
18818
+ value,
18819
+ defaultValue,
18820
+ onValueChange,
18821
+ variant = "black",
18822
+ size = "md",
18823
+ fullWidth = false,
18824
+ collapse = false,
18825
+ "aria-label": ariaLabel = "Options",
18826
+ className
18827
+ }) {
18828
+ var _a;
18829
+ const isControlled = value != null;
18830
+ const [internal, setInternal] = React32.useState(
18831
+ defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.id
18832
+ );
18833
+ const active = isControlled ? value : internal;
18834
+ const select = (id) => {
18835
+ if (!isControlled) setInternal(id);
18836
+ onValueChange == null ? void 0 : onValueChange(id);
18837
+ };
18838
+ const onKeyDown = (e) => {
18839
+ if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return;
18840
+ e.preventDefault();
18841
+ const enabled = items.filter((i) => !i.disabled);
18842
+ const idx = enabled.findIndex((i) => i.id === active);
18843
+ if (idx === -1) return;
18844
+ const next = e.key === "ArrowRight" ? enabled[(idx + 1) % enabled.length] : enabled[(idx - 1 + enabled.length) % enabled.length];
18845
+ select(next.id);
18846
+ };
18847
+ const v = VARIANT3[variant];
18848
+ return /* @__PURE__ */ jsx(
18849
+ "div",
18850
+ {
18851
+ role: "radiogroup",
18852
+ "aria-label": ariaLabel,
18853
+ onKeyDown,
18854
+ className: cn(
18855
+ "inline-flex max-w-full items-center gap-1 overflow-x-auto rounded-full border p-1.5 scrollbar-none",
18856
+ fullWidth && "flex w-full",
18857
+ v.track,
18858
+ className
18859
+ ),
18860
+ children: items.map((item) => {
18861
+ const isActive = item.id === active;
18862
+ const Icon = item.icon;
18863
+ const showLabel = collapse === "all" ? false : collapse ? isActive : true;
18864
+ return /* @__PURE__ */ jsxs(
18865
+ "button",
18866
+ {
18867
+ type: "button",
18868
+ role: "radio",
18869
+ "aria-checked": isActive,
18870
+ "aria-label": collapse && !showLabel ? item.label : void 0,
18871
+ title: collapse && !showLabel ? item.label : void 0,
18872
+ disabled: item.disabled,
18873
+ tabIndex: isActive ? 0 : -1,
18874
+ onClick: () => select(item.id),
18875
+ className: cn(
18876
+ "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",
18877
+ showLabel && Icon ? "gap-2" : "gap-0",
18878
+ variant === "black" ? "focus-visible:ring-offset-neutral-950" : "focus-visible:ring-offset-white",
18879
+ fullWidth && "flex-1",
18880
+ SIZE[size],
18881
+ /* Icon-only segments are square-ish — drop the side padding so
18882
+ the icon centres in a circular pill. */
18883
+ collapse && !showLabel && (size === "sm" ? "!px-1.5" : "!px-2"),
18884
+ isActive ? ACTIVE_PILL : v.idle,
18885
+ v.ring
18886
+ ),
18887
+ children: [
18888
+ Icon && /* @__PURE__ */ jsx(
18889
+ Icon,
18890
+ {
18891
+ className: cn("shrink-0", size === "sm" ? "size-4" : "size-[18px]")
18892
+ }
18893
+ ),
18894
+ /* @__PURE__ */ jsx(
18895
+ "span",
18896
+ {
18897
+ className: cn(
18898
+ "overflow-hidden whitespace-nowrap transition-all duration-300 ease-out",
18899
+ showLabel ? "max-w-[12ch] opacity-100" : "max-w-0 opacity-0"
18900
+ ),
18901
+ children: item.label
18902
+ }
18903
+ )
18904
+ ]
18905
+ },
18906
+ item.id
18907
+ );
18908
+ })
18909
+ }
18910
+ );
18911
+ }
17160
18912
 
17161
- export { ActivityCard, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CancellationForm, CategoryPage2, CounterField, CountrySearchField, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, ShareWidget, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, buttonVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
18913
+ export { ActivityCard, AdventureExplorer, AgentContactCard, Alert, AskExo, BirthDateField, BlogCard, BlogJournal, BlogPost, BookingAdventureCard, BookingCancellationEmail, BookingConfirmedCard, BookingCreatedEmail, BookingDetails, BookingForm, BookingOtpEmail, BookingPaymentConfirmationEmail, BookingShell, BookingSummary, Button, COUNTRIES, CancellationForm, CategoryPage2, Chip, CounterField, CountrySearchField, CtaBanner, DEFAULT_FOOTER_BADGES, DEFAULT_FOOTER_DESTINATIONS, DEFAULT_FOOTER_LANGUAGES, DEFAULT_FOOTER_LEGAL, DEFAULT_FOOTER_PAGES, DEFAULT_FOOTER_SOCIALS, DEFAULT_FOOTER_THEMES, DEFAULT_HEADER_LINKS, DEFAULT_LANGUAGES, STATUS_MAP as DEPARTURE_STATUS_MAP, DatePickerField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, ExoOrb, FilterPanel, FloatingInput, FloatingSelect, GroupProgressBar, GroupStatusBanner, HomeHeader, Itinerary, ItineraryDay, LOGO_PLANETAEXO_DATA_URI, LeadCapturePopup, MenuTrip, NewHome, NotificationEmail, OTPCodeInput, Offer, OfferAdventureCard, ParticipantCounter, ParticipantList, PartnerBookingCreatedEmail, PartnerRegistrationCompleteEmail, PaymentAmountSelector, PaymentDetailsBlock, PaymentMethodSelector, PaymentModalShell, PaymentReceiptEmail, PaymentReminderEmail, PhoneCountrySelect, PhotoGallery, Picture, PriceProgress, PricingMatrixCard, PricingTrip, RegistrationForm, RegistrationProgressBar, RegistrationReminderEmail, RegistrationReminderIndividualEmail, RegistrationSuccessCard, SegmentedControl, ShareWidget, SiteFooter, SiteHeader, StatusBadge2 as StatusBadge, StickyBookingCard, TERMS_ACCEPT_KEY, TermsSection, ThemeToggle, Toast, TransferDetailsBlock, TravellerFormInviteEmail, TripCard, TripHeader, TripPage, TrustpilotEmbed, USP, buttonVariants, chipVariants, cn, emailTokens, formatCpf, getStripeAppearance, itineraryDaySpecIcons, stripeAppearance, validateCpf, webpVariantUrl, wrapEmailHtml };
17162
18914
  //# sourceMappingURL=index.js.map
17163
18915
  //# sourceMappingURL=index.js.map