@planetaexo/design-system 0.79.0 → 0.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -15163,7 +15163,7 @@ var VARIANT2 = {
15163
15163
  heading: "text-foreground",
15164
15164
  body: "text-foreground/75",
15165
15165
  muted: "text-foreground/60",
15166
- link: "text-foreground/85 hover:text-primary-800 underline decoration-foreground/25 underline-offset-4 hover:decoration-primary-800",
15166
+ link: "rounded-full px-3 py-1.5 -ml-3 transition-colors text-foreground/85 hover:bg-primary hover:text-white",
15167
15167
  badgeStroke: "text-foreground/80",
15168
15168
  /** Inverts white logos so they read on the light background. */
15169
15169
  badgeFilter: "[filter:invert(1)_brightness(0.2)]",
@@ -15180,7 +15180,7 @@ var VARIANT2 = {
15180
15180
  heading: "text-white",
15181
15181
  body: "text-white/75",
15182
15182
  muted: "text-white/55",
15183
- link: "text-white/85 hover:text-primary-400 underline decoration-white/20 underline-offset-4 hover:decoration-primary-400",
15183
+ link: "rounded-full px-3 py-1.5 -ml-3 transition-colors text-white/85 hover:bg-primary hover:text-white",
15184
15184
  badgeStroke: "text-white",
15185
15185
  badgeFilter: "",
15186
15186
  socialBtn: "bg-white/10 text-white hover:bg-primary-400 hover:text-primary-900",
@@ -15390,8 +15390,8 @@ function SiteFooter({
15390
15390
  title: "Basecamp S\xE3o Paulo",
15391
15391
  lines: ["Av. Paulista, 1234", "01310-100 S\xE3o Paulo \xB7 Brasil"]
15392
15392
  },
15393
- phone = "+55 11 9999-0000",
15394
- email = "ola@planetaexo.com",
15393
+ phone,
15394
+ email,
15395
15395
  socials = DEFAULT_FOOTER_SOCIALS,
15396
15396
  themesTitle = "Temas",
15397
15397
  themes = DEFAULT_FOOTER_THEMES,
@@ -15400,11 +15400,7 @@ function SiteFooter({
15400
15400
  destinationsMore = { label: "Ver todos os destinos", href: "#" },
15401
15401
  pagesTitle = "P\xE1ginas",
15402
15402
  pages = DEFAULT_FOOTER_PAGES,
15403
- cta = {
15404
- title: "Colaborar?",
15405
- label: "parceiros@planetaexo.com",
15406
- href: "mailto:parceiros@planetaexo.com"
15407
- },
15403
+ cta,
15408
15404
  copyright,
15409
15405
  legalLinks = DEFAULT_FOOTER_LEGAL,
15410
15406
  className
@@ -15504,22 +15500,22 @@ function SiteFooter({
15504
15500
  ] }),
15505
15501
  themes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
15506
15502
  /* @__PURE__ */ jsxRuntime.jsx(ColumnHeading, { className: t.heading, children: themesTitle }),
15507
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-2.5", children: themes.map((c) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
15503
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-0.5", children: themes.map((c) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
15508
15504
  "a",
15509
15505
  {
15510
15506
  href: c.href,
15511
- className: cn("text-sm font-ui font-bold", t.link),
15507
+ className: cn("inline-block text-sm font-ui font-bold", t.link),
15512
15508
  children: c.label
15513
15509
  }
15514
15510
  ) }, c.label)) })
15515
15511
  ] }),
15516
15512
  destinations.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3", children: [
15517
15513
  /* @__PURE__ */ jsxRuntime.jsx(ColumnHeading, { className: t.heading, children: destinationsTitle }),
15518
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-2.5", children: destinations.map((c) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
15514
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-0.5", children: destinations.map((c) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
15519
15515
  "a",
15520
15516
  {
15521
15517
  href: c.href,
15522
- className: cn("text-sm font-ui font-bold", t.link),
15518
+ className: cn("inline-block text-sm font-ui font-bold", t.link),
15523
15519
  children: c.label
15524
15520
  }
15525
15521
  ) }, c.label)) }),
@@ -15541,11 +15537,11 @@ function SiteFooter({
15541
15537
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-2 space-y-8", children: [
15542
15538
  pages.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
15543
15539
  /* @__PURE__ */ jsxRuntime.jsx(ColumnHeading, { className: t.heading, children: pagesTitle }),
15544
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-2.5", children: pages.map((p) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
15540
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-0.5", children: pages.map((p) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
15545
15541
  "a",
15546
15542
  {
15547
15543
  href: p.href,
15548
- className: cn("text-sm font-ui font-bold", t.link),
15544
+ className: cn("inline-block text-sm font-ui font-bold", t.link),
15549
15545
  children: p.label
15550
15546
  }
15551
15547
  ) }, p.label)) })
@@ -15684,6 +15680,7 @@ function TripPage({
15684
15680
  perPersonLabel,
15685
15681
  siteHeader,
15686
15682
  footerBadges,
15683
+ footer,
15687
15684
  uiVariant = "v1",
15688
15685
  features,
15689
15686
  className
@@ -16318,7 +16315,7 @@ function TripPage({
16318
16315
  }
16319
16316
  ) }),
16320
16317
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 lg:hidden" }),
16321
- /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { badges: footerBadges })
16318
+ /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, __spreadValues({ badges: footerBadges }, footer))
16322
16319
  ]
16323
16320
  }
16324
16321
  )
@@ -16382,6 +16379,7 @@ function CategoryPage2({
16382
16379
  cardLabels,
16383
16380
  filterLabels,
16384
16381
  footerBadges,
16382
+ footer,
16385
16383
  className
16386
16384
  }) {
16387
16385
  var _a;
@@ -16714,7 +16712,7 @@ function CategoryPage2({
16714
16712
  ) })
16715
16713
  ] });
16716
16714
  })(),
16717
- /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { badges: footerBadges })
16715
+ /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, __spreadValues({ badges: footerBadges }, footer))
16718
16716
  ] });
16719
16717
  }
16720
16718
  var sizeConfig3 = {
@@ -19416,6 +19414,159 @@ function USPBand({
19416
19414
  }
19417
19415
  );
19418
19416
  }
19417
+ var TONES = {
19418
+ light: {
19419
+ bg: "#faf7f1",
19420
+ vars: {
19421
+ "--ps-eyebrow": "#1a5f56",
19422
+ "--ps-head": "#2e2d2c",
19423
+ "--ps-sub": "#74726e",
19424
+ "--ps-chip-bd": "#ccd2d0",
19425
+ "--ps-chip-fg": "#2e2d2c",
19426
+ "--ps-chip-hover-bg": "#1a5f56",
19427
+ "--ps-chip-hover-fg": "#ffffff",
19428
+ "--ps-feat-bg": "#1a5f56",
19429
+ "--ps-feat-fg": "#ffffff",
19430
+ "--ps-feat-hover-bg": "#0d3832"
19431
+ }
19432
+ },
19433
+ dark: {
19434
+ bg: "#14352e",
19435
+ vars: {
19436
+ "--ps-eyebrow": "#a7e8c4",
19437
+ "--ps-head": "#f4f1e9",
19438
+ "--ps-sub": "rgba(244,241,233,.7)",
19439
+ "--ps-chip-bd": "rgba(244,241,233,.22)",
19440
+ "--ps-chip-fg": "#f4f1e9",
19441
+ "--ps-chip-hover-bg": "#f4f1e9",
19442
+ "--ps-chip-hover-fg": "#14352e",
19443
+ "--ps-feat-bg": "#bff0d6",
19444
+ "--ps-feat-fg": "#08231e",
19445
+ "--ps-feat-hover-bg": "#a7e8c4"
19446
+ }
19447
+ }
19448
+ };
19449
+ var SIZES = {
19450
+ md: {
19451
+ pad: "py-20 sm:py-28",
19452
+ heading: "text-2xl sm:text-3xl lg:text-4xl",
19453
+ chip: "px-3 py-1 text-xs sm:px-5 sm:py-2.5 sm:text-sm",
19454
+ gap: "gap-1.5 sm:gap-2.5",
19455
+ chipsMt: "mt-6 sm:mt-9"
19456
+ },
19457
+ sm: {
19458
+ pad: "py-16 sm:py-24",
19459
+ heading: "text-xl sm:text-2xl lg:text-3xl",
19460
+ chip: "px-2.5 py-1 text-[11px] sm:px-3.5 sm:py-1.5 sm:text-[13px]",
19461
+ gap: "gap-1.5 sm:gap-2",
19462
+ chipsMt: "mt-5 sm:mt-7"
19463
+ }
19464
+ };
19465
+ var SCOPED_CSS = `
19466
+ .ps-chip{border:1px solid var(--ps-chip-bd);background:transparent;color:var(--ps-chip-fg);text-decoration:none;transition:background-color .15s ease,color .15s ease,border-color .15s ease}
19467
+ .ps-chip:hover{background:var(--ps-chip-hover-bg);border-color:var(--ps-chip-hover-bg);color:var(--ps-chip-hover-fg)}
19468
+ .ps-chip[data-featured="true"]{background:var(--ps-feat-bg);border-color:var(--ps-feat-bg);color:var(--ps-feat-fg)}
19469
+ .ps-chip[data-featured="true"]:hover{background:var(--ps-feat-hover-bg);border-color:var(--ps-feat-hover-bg)}
19470
+ `;
19471
+ function PopularSearches({
19472
+ eyebrow,
19473
+ title,
19474
+ subtitle,
19475
+ chips,
19476
+ tone = "light",
19477
+ size = "md",
19478
+ align = "center",
19479
+ className
19480
+ }) {
19481
+ const t = TONES[tone];
19482
+ const s = SIZES[size];
19483
+ const centered = align === "center";
19484
+ return /* @__PURE__ */ jsxRuntime.jsxs(
19485
+ "section",
19486
+ {
19487
+ className: cn("ps-root w-full", className),
19488
+ style: __spreadValues({ backgroundColor: t.bg }, t.vars),
19489
+ children: [
19490
+ /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: SCOPED_CSS } }),
19491
+ /* @__PURE__ */ jsxRuntime.jsxs(
19492
+ "div",
19493
+ {
19494
+ className: cn(
19495
+ "mx-auto w-full max-w-6xl px-6 sm:px-8",
19496
+ s.pad,
19497
+ centered && "text-center"
19498
+ ),
19499
+ children: [
19500
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("max-w-2xl", centered && "mx-auto"), children: [
19501
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx(
19502
+ "p",
19503
+ {
19504
+ className: "mb-3 font-ui text-xs font-bold uppercase tracking-[0.24em]",
19505
+ style: { color: "var(--ps-eyebrow)" },
19506
+ children: eyebrow
19507
+ }
19508
+ ),
19509
+ /* @__PURE__ */ jsxRuntime.jsx(
19510
+ "h2",
19511
+ {
19512
+ className: cn(
19513
+ "font-heading font-black uppercase leading-[1.05]",
19514
+ s.heading
19515
+ ),
19516
+ style: { color: "var(--ps-head)" },
19517
+ children: title
19518
+ }
19519
+ ),
19520
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx(
19521
+ "p",
19522
+ {
19523
+ className: cn("mt-3 max-w-[46ch] text-base", centered && "mx-auto"),
19524
+ style: { color: "var(--ps-sub)" },
19525
+ children: subtitle
19526
+ }
19527
+ )
19528
+ ] }),
19529
+ /* @__PURE__ */ jsxRuntime.jsx(
19530
+ "div",
19531
+ {
19532
+ className: cn(
19533
+ "flex max-w-4xl flex-wrap items-center",
19534
+ s.gap,
19535
+ s.chipsMt,
19536
+ centered ? "mx-auto justify-center" : "justify-start"
19537
+ ),
19538
+ children: chips.map((chip, i) => {
19539
+ const className2 = "ps-chip inline-flex items-center rounded-full font-ui font-bold " + s.chip;
19540
+ const inner = chip.label;
19541
+ return chip.href ? /* @__PURE__ */ jsxRuntime.jsx(
19542
+ "a",
19543
+ {
19544
+ href: chip.href,
19545
+ onClick: chip.onClick,
19546
+ "data-featured": chip.featured ? "true" : void 0,
19547
+ className: className2,
19548
+ children: inner
19549
+ },
19550
+ i
19551
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
19552
+ "span",
19553
+ {
19554
+ "data-featured": chip.featured ? "true" : void 0,
19555
+ className: className2,
19556
+ children: inner
19557
+ },
19558
+ i
19559
+ );
19560
+ })
19561
+ }
19562
+ )
19563
+ ]
19564
+ }
19565
+ )
19566
+ ]
19567
+ }
19568
+ );
19569
+ }
19419
19570
  function RotatingSubtitle({
19420
19571
  phrases,
19421
19572
  interval,
@@ -19919,6 +20070,148 @@ function NewHome({
19919
20070
  footer && /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, __spreadValues({}, footer))
19920
20071
  ] });
19921
20072
  }
20073
+ var SURFACE_PRIMARY_9002 = "bg-[oklch(0.27_0.040_179)]";
20074
+ function TrustpilotStar({
20075
+ filled,
20076
+ className
20077
+ }) {
20078
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 24 24", className, "aria-hidden": true, children: [
20079
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "24", height: "24", fill: filled ? "#00b67a" : "#dcdce6" }),
20080
+ /* @__PURE__ */ jsxRuntime.jsx(
20081
+ "path",
20082
+ {
20083
+ fill: "#ffffff",
20084
+ d: "m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"
20085
+ }
20086
+ )
20087
+ ] });
20088
+ }
20089
+ function TrustpilotStars({
20090
+ stars = 5,
20091
+ className = "h-7 w-7"
20092
+ }) {
20093
+ return /* @__PURE__ */ jsxRuntime.jsx(
20094
+ "div",
20095
+ {
20096
+ className: "flex items-center gap-1",
20097
+ "aria-label": `${stars} out of 5 stars`,
20098
+ children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
20099
+ TrustpilotStar,
20100
+ {
20101
+ filled: i + 1 <= Math.round(stars),
20102
+ className
20103
+ },
20104
+ i
20105
+ ))
20106
+ }
20107
+ );
20108
+ }
20109
+ function ReviewsSpotlight({
20110
+ eyebrow,
20111
+ title,
20112
+ link,
20113
+ items,
20114
+ intervalMs = 7e3,
20115
+ className
20116
+ }) {
20117
+ const [index, setIndex] = React20__namespace.useState(0);
20118
+ const [visible, setVisible] = React20__namespace.useState(true);
20119
+ const reduced = React20__namespace.useRef(false);
20120
+ const swapRef = React20__namespace.useRef(null);
20121
+ React20__namespace.useEffect(() => {
20122
+ var _a;
20123
+ const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
20124
+ reduced.current = mq.matches;
20125
+ const onChange = () => {
20126
+ reduced.current = mq.matches;
20127
+ };
20128
+ (_a = mq.addEventListener) == null ? void 0 : _a.call(mq, "change", onChange);
20129
+ return () => {
20130
+ var _a2;
20131
+ return (_a2 = mq.removeEventListener) == null ? void 0 : _a2.call(mq, "change", onChange);
20132
+ };
20133
+ }, []);
20134
+ const goTo = React20__namespace.useCallback((resolve) => {
20135
+ if (reduced.current) {
20136
+ setIndex((i) => resolve(i));
20137
+ return;
20138
+ }
20139
+ setVisible(false);
20140
+ swapRef.current = setTimeout(() => {
20141
+ setIndex((i) => resolve(i));
20142
+ setVisible(true);
20143
+ }, 260);
20144
+ }, []);
20145
+ React20__namespace.useEffect(() => {
20146
+ if (items.length <= 1 || intervalMs <= 0) return;
20147
+ const id = setInterval(() => {
20148
+ if (!reduced.current) goTo((i) => (i + 1) % items.length);
20149
+ }, intervalMs);
20150
+ return () => {
20151
+ clearInterval(id);
20152
+ if (swapRef.current) clearTimeout(swapRef.current);
20153
+ };
20154
+ }, [items.length, intervalMs, goTo]);
20155
+ if (!items.length) return null;
20156
+ const safe = Math.min(index, items.length - 1);
20157
+ const review = items[safe];
20158
+ return /* @__PURE__ */ jsxRuntime.jsx(
20159
+ "section",
20160
+ {
20161
+ className: cn(SURFACE_PRIMARY_9002, "py-24 text-white sm:py-32", className),
20162
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-3xl px-6 text-center sm:px-8", children: [
20163
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-ui text-xs font-bold uppercase tracking-[0.22em] text-primary", children: eyebrow }),
20164
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "sr-only", children: title }),
20165
+ /* @__PURE__ */ jsxRuntime.jsxs(
20166
+ "div",
20167
+ {
20168
+ className: cn(
20169
+ "transition-opacity duration-300",
20170
+ visible ? "opacity-100" : "opacity-0"
20171
+ ),
20172
+ children: [
20173
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(TrustpilotStars, { stars: review.stars, className: "h-7 w-7" }) }),
20174
+ /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "mx-auto mt-8 max-w-[20ch] font-sans text-3xl font-normal italic leading-[1.3] text-white sm:text-4xl", children: [
20175
+ "\u201C",
20176
+ review.quote,
20177
+ "\u201D"
20178
+ ] }),
20179
+ (review.author || review.location) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6", children: [
20180
+ review.author && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-ui text-base font-bold tracking-wide text-white", children: review.author }),
20181
+ review.location && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 font-sans text-sm text-white/55", children: review.location })
20182
+ ] })
20183
+ ]
20184
+ }
20185
+ ),
20186
+ items.length > 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-10 flex justify-center gap-2.5", children: items.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
20187
+ "button",
20188
+ {
20189
+ type: "button",
20190
+ "aria-label": `Show review ${i + 1} of ${items.length}`,
20191
+ "aria-current": i === safe,
20192
+ onClick: () => goTo(() => i),
20193
+ className: cn(
20194
+ "h-2 w-2 rounded-full transition-colors",
20195
+ i === safe ? "bg-primary" : "bg-white/25 hover:bg-white/45"
20196
+ )
20197
+ },
20198
+ i
20199
+ )) }),
20200
+ link && /* @__PURE__ */ jsxRuntime.jsxs(
20201
+ "a",
20202
+ {
20203
+ href: link.href,
20204
+ className: "group mt-10 inline-flex items-center gap-1.5 font-ui text-sm font-bold text-primary transition-colors hover:text-primary-800",
20205
+ children: [
20206
+ link.label,
20207
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
20208
+ ]
20209
+ }
20210
+ )
20211
+ ] })
20212
+ }
20213
+ );
20214
+ }
19922
20215
  var ACTIVE_PILL = "bg-primary text-white shadow-sm";
19923
20216
  var VARIANT3 = {
19924
20217
  black: {
@@ -20111,6 +20404,7 @@ exports.PhoneCountrySelect = PhoneCountrySelect;
20111
20404
  exports.PhotoGallery = PhotoGallery;
20112
20405
  exports.PhotoTourProvider = PhotoTourProvider;
20113
20406
  exports.Picture = Picture;
20407
+ exports.PopularSearches = PopularSearches;
20114
20408
  exports.PriceProgress = PriceProgress;
20115
20409
  exports.PricingMatrixCard = PricingMatrixCard;
20116
20410
  exports.PricingTrip = PricingTrip;
@@ -20119,6 +20413,7 @@ exports.RegistrationProgressBar = RegistrationProgressBar;
20119
20413
  exports.RegistrationReminderEmail = RegistrationReminderEmail;
20120
20414
  exports.RegistrationReminderIndividualEmail = RegistrationReminderIndividualEmail;
20121
20415
  exports.RegistrationSuccessCard = RegistrationSuccessCard;
20416
+ exports.ReviewsSpotlight = ReviewsSpotlight;
20122
20417
  exports.SegmentedControl = SegmentedControl;
20123
20418
  exports.ShareWidget = ShareWidget;
20124
20419
  exports.SiteFooter = SiteFooter;