@planetaexo/design-system 0.37.2 → 0.37.4

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.d.cts CHANGED
@@ -268,6 +268,13 @@ interface OfferProps {
268
268
  confirmedState?: OfferConfirmedState;
269
269
  /** When true, opcionais (checkbox + stepper) ficam read-only. Usado em estado expirado. */
270
270
  interactionsDisabled?: boolean;
271
+ /**
272
+ * Quando true, "Book now" abre o BookingWizard interno (demo). Em produção
273
+ * (host com checkout próprio via `checkoutSlot`) deixe `false` para que o
274
+ * fallback do wizard interno nunca renderize — evita regressões em que
275
+ * fechar o `checkoutSlot` no host expõe um stepper demo com schema antigo.
276
+ */
277
+ internalDemoCheckout?: boolean;
271
278
  className?: string;
272
279
  }
273
280
  interface BookingShellProps {
@@ -358,7 +365,7 @@ declare function TransferDetailsBlock({ label, items, className, }: TransferDeta
358
365
  declare function OfferAdventureCard({ adventure }: {
359
366
  adventure: OfferAdventureItem;
360
367
  }): react_jsx_runtime.JSX.Element;
361
- declare function Offer({ logo, logoAlt, title, subtitle, adventures, subtotal, total, depositInfo, agent, onContinue, continueLabel, externalBookingFlow, checkoutSlot, summaryNotesSlot, summaryDiscountLine, continueDisabled, labels, confirmedState, interactionsDisabled, className, }: OfferProps): react_jsx_runtime.JSX.Element;
368
+ declare function Offer({ logo, logoAlt, title, subtitle, adventures, subtotal, total, depositInfo, agent, onContinue, continueLabel, externalBookingFlow, checkoutSlot, summaryNotesSlot, summaryDiscountLine, continueDisabled, labels, confirmedState, interactionsDisabled, internalDemoCheckout, className, }: OfferProps): react_jsx_runtime.JSX.Element;
362
369
 
363
370
  type BookingStatus = "pending" | "confirmed" | "cancelled" | "completed" | "pendingRegistration" | "pendingPayment" | "pendingPaymentOverdue" | "complete";
364
371
  interface BookingTraveller {
@@ -1973,6 +1980,18 @@ interface FilterItem {
1973
1980
  label: string;
1974
1981
  /** Contagem de resultados disponíveis */
1975
1982
  count?: number;
1983
+ /**
1984
+ * Subitens aninhados (ex.: Brazil → Pantanal, Amazon, …).
1985
+ * O pai vira um agregador: marcar seleciona todos os filhos;
1986
+ * estado checked/indeterminate é derivado das seleções dos filhos.
1987
+ */
1988
+ children?: FilterItem[];
1989
+ /**
1990
+ * Expande o pai por padrão. Sem isso, pais começam recolhidos
1991
+ * (chevron à direita) e o usuário precisa clicar para revelar os filhos.
1992
+ * @default false
1993
+ */
1994
+ defaultExpanded?: boolean;
1976
1995
  }
1977
1996
  interface FilterGroup {
1978
1997
  id: string;
@@ -1982,7 +2001,29 @@ interface FilterGroup {
1982
2001
  items: FilterItem[];
1983
2002
  /** Abre este grupo por padrão */
1984
2003
  defaultOpen?: boolean;
2004
+ /**
2005
+ * Escopo: id de um item dentro de `items`. Quando definido, o grupo
2006
+ * renderiza apenas os children desse item (não o item em si), permitindo
2007
+ * "afunilar" o filtro para o contexto da página atual.
2008
+ *
2009
+ * Exemplo (WordPress taxonomy): na página "Brazil" passe
2010
+ * `scopeItemId: "brazil"` para mostrar apenas as sub-regiões de Brazil.
2011
+ * Se o item não existir ou não tiver children, o grupo é automaticamente
2012
+ * omitido do painel.
2013
+ */
2014
+ scopeItemId?: string;
1985
2015
  }
2016
+ interface FilterSortOption {
2017
+ id: string;
2018
+ label: string;
2019
+ }
2020
+ /**
2021
+ * Visual style of the filter panel.
2022
+ * - "sidebar" — vertical accordion list (default), good for the left rail.
2023
+ * - "horizontal" — inline pill row of popover buttons, good for compact
2024
+ * category pages where the trip grid uses the full width.
2025
+ */
2026
+ type FilterPanelVariant = "sidebar" | "horizontal";
1986
2027
  interface FilterPanelProps {
1987
2028
  groups: FilterGroup[];
1988
2029
  /** Estado controlado: { groupId: string[] } */
@@ -1993,8 +2034,14 @@ interface FilterPanelProps {
1993
2034
  alwaysShowClear?: boolean;
1994
2035
  title?: string;
1995
2036
  className?: string;
1996
- }
1997
- declare function FilterPanel({ groups, value, onChange, onClearAll, alwaysShowClear, title, className, }: FilterPanelProps): react_jsx_runtime.JSX.Element;
2037
+ /** Variação visual do painel. @default "sidebar" */
2038
+ variant?: FilterPanelVariant;
2039
+ /** Opções do "Sort by" popover (apenas no variant="horizontal"). */
2040
+ sortOptions?: FilterSortOption[];
2041
+ sort?: string;
2042
+ onSortChange?: (id: string) => void;
2043
+ }
2044
+ declare function FilterPanel({ groups, value, onChange, onClearAll, alwaysShowClear, title, className, variant, sortOptions, sort, onSortChange, }: FilterPanelProps): react_jsx_runtime.JSX.Element | null;
1998
2045
 
1999
2046
  /**
2000
2047
  * Configuration for any Trustpilot widget embedded in the design system.
@@ -2031,6 +2078,22 @@ interface TrustpilotWidgetConfig {
2031
2078
  starColor?: string;
2032
2079
  /** Fallback link target (e.g. "https://www.trustpilot.com/review/yourdomain.com"). */
2033
2080
  fallbackHref?: string;
2081
+ /**
2082
+ * Average rating shown by the fallback UI (when the Trustpilot bootstrap
2083
+ * script can't render — typically because of ad-blockers).
2084
+ */
2085
+ fallbackScore?: number;
2086
+ /** Review count shown by the fallback UI. */
2087
+ fallbackCount?: number;
2088
+ /** Short label shown next to the rating (e.g. "Excellent"). @default "Excellent" */
2089
+ fallbackLabel?: string;
2090
+ /** Layout for the fallback UI. @default auto — picked from styleHeight. */
2091
+ fallbackVariant?: "mini" | "card";
2092
+ /**
2093
+ * Milliseconds to wait before showing the fallback if no widget content
2094
+ * has been rendered by the bootstrap script. @default 3000
2095
+ */
2096
+ fallbackDelayMs?: number;
2034
2097
  }
2035
2098
  /**
2036
2099
  * Renders a Trustpilot widget div with the right data-* attributes and
@@ -2130,7 +2193,7 @@ interface MenuTripProps {
2130
2193
  }
2131
2194
  declare function MenuTrip({ sections, activeSection, onSelect, variant, bold, className, }: MenuTripProps): react_jsx_runtime.JSX.Element;
2132
2195
 
2133
- type PhotoGalleryVariant = "grid" | "masonry" | "filmstrip" | "featured" | "carousel" | "fullBleed";
2196
+ type PhotoGalleryVariant = "grid" | "gridCompact" | "masonry" | "filmstrip" | "featured" | "carousel" | "fullBleed";
2134
2197
  interface PhotoGalleryPhoto {
2135
2198
  src: string;
2136
2199
  alt?: string;
@@ -2233,6 +2296,11 @@ type SiteHeaderVariant = "transparent" | "white" | "dark";
2233
2296
  interface SiteHeaderProps {
2234
2297
  variant?: SiteHeaderVariant;
2235
2298
  links?: SiteHeaderLink[];
2299
+ /** Logo used on transparent/dark headers (defaults to the white asset). */
2300
+ logoSrcLight?: string;
2301
+ /** Logo used on the white header (defaults to the green/brand asset). */
2302
+ logoSrcDark?: string;
2303
+ /** Backwards-compatible single-logo override — applied to both variants when set. */
2236
2304
  logoSrc?: string;
2237
2305
  logoAlt?: string;
2238
2306
  languages?: SiteHeaderLanguage[];
@@ -2246,7 +2314,7 @@ interface SiteHeaderProps {
2246
2314
  }
2247
2315
  declare const DEFAULT_HEADER_LINKS: SiteHeaderLink[];
2248
2316
  declare const DEFAULT_LANGUAGES: SiteHeaderLanguage[];
2249
- declare function SiteHeader({ variant, links, logoSrc, logoAlt, languages, currentLanguage, onLanguageChange, onSearch, onAccount, position, className, }: SiteHeaderProps): react_jsx_runtime.JSX.Element;
2317
+ declare function SiteHeader({ variant, links, logoSrcLight, logoSrcDark, logoSrc, logoAlt, languages, currentLanguage, onLanguageChange, onSearch, onAccount, position, className, }: SiteHeaderProps): react_jsx_runtime.JSX.Element;
2250
2318
 
2251
2319
  declare function ThemeToggle({ className }: {
2252
2320
  className?: string;
@@ -2254,6 +2322,13 @@ declare function ThemeToggle({ className }: {
2254
2322
 
2255
2323
  type TripCardStatus = "sold-out" | "trending";
2256
2324
  type TripCardSize = "sm" | "md" | "lg";
2325
+ /**
2326
+ * Visual style of the card.
2327
+ * - "overlay" — full-bleed image with dark gradient + white text on top (default).
2328
+ * - "editorial" — image on top, white body below with title, excerpt, nights + price.
2329
+ */
2330
+ type TripCardVariant = "overlay" | "editorial";
2331
+ type TripCardDifficulty = "easy" | "moderate" | "extreme";
2257
2332
  interface TripCardCta {
2258
2333
  /** Texto do link (ex: "Discover this trip" ou "5 dates available") */
2259
2334
  label: string;
@@ -2264,24 +2339,42 @@ interface TripCardProps {
2264
2339
  /** URL da imagem de capa */
2265
2340
  image: string;
2266
2341
  imageAlt?: string;
2267
- /** Badge de status exibido no topo esquerdo */
2342
+ /** Badge de status (ex.: trending) usado pelo variant="overlay". */
2268
2343
  status?: TripCardStatus;
2269
2344
  /** Número de noites */
2270
2345
  nights?: number;
2271
- /** Período (ex: "Feb - Mar") */
2346
+ /** Período (ex: "Feb - Mar") — usado pelo variant="overlay". */
2272
2347
  period?: string;
2273
2348
  /** Título da viagem */
2274
2349
  title: string;
2275
- /** Descrição curta */
2350
+ /** Descrição / excerpt curto — usado em ambos os variants. */
2276
2351
  description?: string;
2277
- /** Link/CTA de ação */
2352
+ /** Link/CTA de ação — usado pelo variant="overlay". */
2278
2353
  cta?: TripCardCta;
2279
- /** Preço exibido ao lado do CTA (ex: "from € 769") */
2354
+ /** Preço (ex: "from € 769"). */
2280
2355
  price?: string;
2281
2356
  size?: TripCardSize;
2282
2357
  className?: string;
2358
+ /** Variação visual do card. @default "overlay" */
2359
+ variant?: TripCardVariant;
2360
+ /** Quando href é fornecido, o card editorial inteiro vira um link <a>. */
2361
+ href?: string;
2362
+ /** Mostra um botão de favorito (estilo Chip glass) no topo direito. */
2363
+ favoritable?: boolean;
2364
+ /** Estado controlado do favorito. */
2365
+ favorited?: boolean;
2366
+ onFavoriteToggle?: (next: boolean) => void;
2367
+ /** Localização/região exibida no rodapé branco (ex.: "Pantanal, Brazil"). */
2368
+ location?: string;
2369
+ /** Nível de dificuldade — renderizado com um dot colorido. */
2370
+ difficulty?: TripCardDifficulty;
2371
+ /**
2372
+ * Tour-type tag rendered as a chip at the top-left of the image
2373
+ * (ex.: "Family Adventure", "Private Trip", "Luxury").
2374
+ */
2375
+ tag?: string;
2283
2376
  }
2284
- declare function TripCard({ image, imageAlt, status, nights, period, title, description, cta, price, size, className, }: TripCardProps): react_jsx_runtime.JSX.Element;
2377
+ declare function TripCard(props: TripCardProps): react_jsx_runtime.JSX.Element;
2285
2378
 
2286
2379
  interface TripDuration {
2287
2380
  /** Total number of days */
@@ -2289,6 +2382,10 @@ interface TripDuration {
2289
2382
  /** Number of nights — defaults to days - 1 */
2290
2383
  nights?: number;
2291
2384
  }
2385
+ interface TripHeaderChip {
2386
+ label: string;
2387
+ href?: string;
2388
+ }
2292
2389
  interface TripHeaderProps {
2293
2390
  /** Hero image array — shows a carousel when more than one image */
2294
2391
  images: string[];
@@ -2307,6 +2404,8 @@ interface TripHeaderProps {
2307
2404
  duration?: TripDuration;
2308
2405
  /** Legacy tagline — shown only when destination/duration are not provided */
2309
2406
  tagline?: string;
2407
+ /** Pill-shaped category chips rendered under the meta row (e.g. related tour categories). */
2408
+ chips?: TripHeaderChip[];
2310
2409
  /**
2311
2410
  * Optional content rendered directly below the destination/duration meta
2312
2411
  * row. Use it to slot in a small Trustpilot widget, sponsor badge, etc.
@@ -2318,7 +2417,7 @@ interface TripHeaderProps {
2318
2417
  uiVariant?: "v1" | "v2";
2319
2418
  className?: string;
2320
2419
  }
2321
- declare function TripHeader({ images, videoUrl, title, breadcrumb, destination, duration, tagline, belowMeta, siteHeader, uiVariant, className, }: TripHeaderProps): react_jsx_runtime.JSX.Element;
2420
+ declare function TripHeader({ images, videoUrl, title, breadcrumb, destination, duration, tagline, chips, belowMeta, siteHeader, uiVariant, className, }: TripHeaderProps): react_jsx_runtime.JSX.Element;
2322
2421
 
2323
2422
  interface TripHighlight {
2324
2423
  label: string;
@@ -2379,7 +2478,7 @@ interface TripSectionIcons {
2379
2478
  itinerary?: React.ReactNode;
2380
2479
  whatIsIncluded?: React.ReactNode;
2381
2480
  /** Accordion sections */
2382
- keyInfo?: React.ReactNode;
2481
+ howToGetThere?: React.ReactNode;
2383
2482
  meetingPoint?: React.ReactNode;
2384
2483
  optionalExtras?: React.ReactNode;
2385
2484
  whatToBring?: React.ReactNode;
@@ -2405,15 +2504,13 @@ interface TripPageProps {
2405
2504
  label: string;
2406
2505
  href?: string;
2407
2506
  }>;
2507
+ /** Pill chips rendered under the hero meta row (e.g. related tour categories). */
2508
+ chips?: TripHeaderChip[];
2408
2509
  highlights?: TripHighlight[];
2409
2510
  infoGroups?: TripInfoGroup[];
2410
- /**
2411
- * Rich-text "Key info" content (WYSIWYG). When provided, replaces the
2412
- * structured `infoGroups` render inside the accordion item — useful when
2413
- * the source of truth is a free-form WP WYSIWYG field instead of
2414
- * structured groups.
2415
- */
2416
2511
  keyInfo?: React.ReactNode;
2512
+ /** Rich-text "How to get there" content (WYSIWYG) — directions, arrival info, etc. */
2513
+ howToGetThere?: React.ReactNode;
2417
2514
  recommendedFor?: string;
2418
2515
  overview?: React.ReactNode;
2419
2516
  /** Optional list of long-form highlights rendered inside the Overview section. */
@@ -2441,6 +2538,8 @@ interface TripPageProps {
2441
2538
  */
2442
2539
  meetingPoint?: React.ReactNode;
2443
2540
  faqs?: TripFaq[];
2541
+ /** Number of FAQs shown before the "Load more" button appears. @default 5 */
2542
+ faqInitialCount?: number;
2444
2543
  /**
2445
2544
  * Per-section icon overrides for the trip details accordion. When a value
2446
2545
  * is supplied for a section, it replaces the hardcoded lucide icon next
@@ -2485,7 +2584,7 @@ interface TripPageProps {
2485
2584
  features?: Record<string, boolean>;
2486
2585
  className?: string;
2487
2586
  }
2488
- declare function TripPage({ title, tagline, destination, duration, images, videoUrl, breadcrumb, highlights, infoGroups, keyInfo, recommendedFor, overview, overviewHighlights, itinerary, itineraryDays, gallery, included, notIncluded, whatToBring, weather, optionalExtras, accommodation, food, termsAndConditions, meetingPoints, meetingPoint, faqs, sectionIcons, reviews, trustpilot, trustpilotMini, trustpilotHero, priceFrom, currency, season, departureTimes, benefits, currencyEstimates, priceInfo, onBook, bookLabel, siteHeader, uiVariant, features, className, }: TripPageProps): react_jsx_runtime.JSX.Element;
2587
+ declare function TripPage({ title, tagline, destination, duration, images, videoUrl, breadcrumb, chips, highlights, howToGetThere, recommendedFor, overview, overviewHighlights, itinerary, itineraryDays, gallery, included, notIncluded, whatToBring, weather, optionalExtras, accommodation, food, termsAndConditions, meetingPoints, meetingPoint, faqs, faqInitialCount, sectionIcons, reviews, trustpilot, trustpilotMini, trustpilotHero, priceFrom, currency, season, departureTimes, benefits, currencyEstimates, priceInfo, onBook, bookLabel, siteHeader, uiVariant, features, className, }: TripPageProps): react_jsx_runtime.JSX.Element;
2489
2588
 
2490
2589
  type ActivityCardSize = "sm" | "md" | "lg";
2491
2590
  interface ActivityCardProps {
package/dist/index.d.ts CHANGED
@@ -268,6 +268,13 @@ interface OfferProps {
268
268
  confirmedState?: OfferConfirmedState;
269
269
  /** When true, opcionais (checkbox + stepper) ficam read-only. Usado em estado expirado. */
270
270
  interactionsDisabled?: boolean;
271
+ /**
272
+ * Quando true, "Book now" abre o BookingWizard interno (demo). Em produção
273
+ * (host com checkout próprio via `checkoutSlot`) deixe `false` para que o
274
+ * fallback do wizard interno nunca renderize — evita regressões em que
275
+ * fechar o `checkoutSlot` no host expõe um stepper demo com schema antigo.
276
+ */
277
+ internalDemoCheckout?: boolean;
271
278
  className?: string;
272
279
  }
273
280
  interface BookingShellProps {
@@ -358,7 +365,7 @@ declare function TransferDetailsBlock({ label, items, className, }: TransferDeta
358
365
  declare function OfferAdventureCard({ adventure }: {
359
366
  adventure: OfferAdventureItem;
360
367
  }): react_jsx_runtime.JSX.Element;
361
- declare function Offer({ logo, logoAlt, title, subtitle, adventures, subtotal, total, depositInfo, agent, onContinue, continueLabel, externalBookingFlow, checkoutSlot, summaryNotesSlot, summaryDiscountLine, continueDisabled, labels, confirmedState, interactionsDisabled, className, }: OfferProps): react_jsx_runtime.JSX.Element;
368
+ declare function Offer({ logo, logoAlt, title, subtitle, adventures, subtotal, total, depositInfo, agent, onContinue, continueLabel, externalBookingFlow, checkoutSlot, summaryNotesSlot, summaryDiscountLine, continueDisabled, labels, confirmedState, interactionsDisabled, internalDemoCheckout, className, }: OfferProps): react_jsx_runtime.JSX.Element;
362
369
 
363
370
  type BookingStatus = "pending" | "confirmed" | "cancelled" | "completed" | "pendingRegistration" | "pendingPayment" | "pendingPaymentOverdue" | "complete";
364
371
  interface BookingTraveller {
@@ -1973,6 +1980,18 @@ interface FilterItem {
1973
1980
  label: string;
1974
1981
  /** Contagem de resultados disponíveis */
1975
1982
  count?: number;
1983
+ /**
1984
+ * Subitens aninhados (ex.: Brazil → Pantanal, Amazon, …).
1985
+ * O pai vira um agregador: marcar seleciona todos os filhos;
1986
+ * estado checked/indeterminate é derivado das seleções dos filhos.
1987
+ */
1988
+ children?: FilterItem[];
1989
+ /**
1990
+ * Expande o pai por padrão. Sem isso, pais começam recolhidos
1991
+ * (chevron à direita) e o usuário precisa clicar para revelar os filhos.
1992
+ * @default false
1993
+ */
1994
+ defaultExpanded?: boolean;
1976
1995
  }
1977
1996
  interface FilterGroup {
1978
1997
  id: string;
@@ -1982,7 +2001,29 @@ interface FilterGroup {
1982
2001
  items: FilterItem[];
1983
2002
  /** Abre este grupo por padrão */
1984
2003
  defaultOpen?: boolean;
2004
+ /**
2005
+ * Escopo: id de um item dentro de `items`. Quando definido, o grupo
2006
+ * renderiza apenas os children desse item (não o item em si), permitindo
2007
+ * "afunilar" o filtro para o contexto da página atual.
2008
+ *
2009
+ * Exemplo (WordPress taxonomy): na página "Brazil" passe
2010
+ * `scopeItemId: "brazil"` para mostrar apenas as sub-regiões de Brazil.
2011
+ * Se o item não existir ou não tiver children, o grupo é automaticamente
2012
+ * omitido do painel.
2013
+ */
2014
+ scopeItemId?: string;
1985
2015
  }
2016
+ interface FilterSortOption {
2017
+ id: string;
2018
+ label: string;
2019
+ }
2020
+ /**
2021
+ * Visual style of the filter panel.
2022
+ * - "sidebar" — vertical accordion list (default), good for the left rail.
2023
+ * - "horizontal" — inline pill row of popover buttons, good for compact
2024
+ * category pages where the trip grid uses the full width.
2025
+ */
2026
+ type FilterPanelVariant = "sidebar" | "horizontal";
1986
2027
  interface FilterPanelProps {
1987
2028
  groups: FilterGroup[];
1988
2029
  /** Estado controlado: { groupId: string[] } */
@@ -1993,8 +2034,14 @@ interface FilterPanelProps {
1993
2034
  alwaysShowClear?: boolean;
1994
2035
  title?: string;
1995
2036
  className?: string;
1996
- }
1997
- declare function FilterPanel({ groups, value, onChange, onClearAll, alwaysShowClear, title, className, }: FilterPanelProps): react_jsx_runtime.JSX.Element;
2037
+ /** Variação visual do painel. @default "sidebar" */
2038
+ variant?: FilterPanelVariant;
2039
+ /** Opções do "Sort by" popover (apenas no variant="horizontal"). */
2040
+ sortOptions?: FilterSortOption[];
2041
+ sort?: string;
2042
+ onSortChange?: (id: string) => void;
2043
+ }
2044
+ declare function FilterPanel({ groups, value, onChange, onClearAll, alwaysShowClear, title, className, variant, sortOptions, sort, onSortChange, }: FilterPanelProps): react_jsx_runtime.JSX.Element | null;
1998
2045
 
1999
2046
  /**
2000
2047
  * Configuration for any Trustpilot widget embedded in the design system.
@@ -2031,6 +2078,22 @@ interface TrustpilotWidgetConfig {
2031
2078
  starColor?: string;
2032
2079
  /** Fallback link target (e.g. "https://www.trustpilot.com/review/yourdomain.com"). */
2033
2080
  fallbackHref?: string;
2081
+ /**
2082
+ * Average rating shown by the fallback UI (when the Trustpilot bootstrap
2083
+ * script can't render — typically because of ad-blockers).
2084
+ */
2085
+ fallbackScore?: number;
2086
+ /** Review count shown by the fallback UI. */
2087
+ fallbackCount?: number;
2088
+ /** Short label shown next to the rating (e.g. "Excellent"). @default "Excellent" */
2089
+ fallbackLabel?: string;
2090
+ /** Layout for the fallback UI. @default auto — picked from styleHeight. */
2091
+ fallbackVariant?: "mini" | "card";
2092
+ /**
2093
+ * Milliseconds to wait before showing the fallback if no widget content
2094
+ * has been rendered by the bootstrap script. @default 3000
2095
+ */
2096
+ fallbackDelayMs?: number;
2034
2097
  }
2035
2098
  /**
2036
2099
  * Renders a Trustpilot widget div with the right data-* attributes and
@@ -2130,7 +2193,7 @@ interface MenuTripProps {
2130
2193
  }
2131
2194
  declare function MenuTrip({ sections, activeSection, onSelect, variant, bold, className, }: MenuTripProps): react_jsx_runtime.JSX.Element;
2132
2195
 
2133
- type PhotoGalleryVariant = "grid" | "masonry" | "filmstrip" | "featured" | "carousel" | "fullBleed";
2196
+ type PhotoGalleryVariant = "grid" | "gridCompact" | "masonry" | "filmstrip" | "featured" | "carousel" | "fullBleed";
2134
2197
  interface PhotoGalleryPhoto {
2135
2198
  src: string;
2136
2199
  alt?: string;
@@ -2233,6 +2296,11 @@ type SiteHeaderVariant = "transparent" | "white" | "dark";
2233
2296
  interface SiteHeaderProps {
2234
2297
  variant?: SiteHeaderVariant;
2235
2298
  links?: SiteHeaderLink[];
2299
+ /** Logo used on transparent/dark headers (defaults to the white asset). */
2300
+ logoSrcLight?: string;
2301
+ /** Logo used on the white header (defaults to the green/brand asset). */
2302
+ logoSrcDark?: string;
2303
+ /** Backwards-compatible single-logo override — applied to both variants when set. */
2236
2304
  logoSrc?: string;
2237
2305
  logoAlt?: string;
2238
2306
  languages?: SiteHeaderLanguage[];
@@ -2246,7 +2314,7 @@ interface SiteHeaderProps {
2246
2314
  }
2247
2315
  declare const DEFAULT_HEADER_LINKS: SiteHeaderLink[];
2248
2316
  declare const DEFAULT_LANGUAGES: SiteHeaderLanguage[];
2249
- declare function SiteHeader({ variant, links, logoSrc, logoAlt, languages, currentLanguage, onLanguageChange, onSearch, onAccount, position, className, }: SiteHeaderProps): react_jsx_runtime.JSX.Element;
2317
+ declare function SiteHeader({ variant, links, logoSrcLight, logoSrcDark, logoSrc, logoAlt, languages, currentLanguage, onLanguageChange, onSearch, onAccount, position, className, }: SiteHeaderProps): react_jsx_runtime.JSX.Element;
2250
2318
 
2251
2319
  declare function ThemeToggle({ className }: {
2252
2320
  className?: string;
@@ -2254,6 +2322,13 @@ declare function ThemeToggle({ className }: {
2254
2322
 
2255
2323
  type TripCardStatus = "sold-out" | "trending";
2256
2324
  type TripCardSize = "sm" | "md" | "lg";
2325
+ /**
2326
+ * Visual style of the card.
2327
+ * - "overlay" — full-bleed image with dark gradient + white text on top (default).
2328
+ * - "editorial" — image on top, white body below with title, excerpt, nights + price.
2329
+ */
2330
+ type TripCardVariant = "overlay" | "editorial";
2331
+ type TripCardDifficulty = "easy" | "moderate" | "extreme";
2257
2332
  interface TripCardCta {
2258
2333
  /** Texto do link (ex: "Discover this trip" ou "5 dates available") */
2259
2334
  label: string;
@@ -2264,24 +2339,42 @@ interface TripCardProps {
2264
2339
  /** URL da imagem de capa */
2265
2340
  image: string;
2266
2341
  imageAlt?: string;
2267
- /** Badge de status exibido no topo esquerdo */
2342
+ /** Badge de status (ex.: trending) usado pelo variant="overlay". */
2268
2343
  status?: TripCardStatus;
2269
2344
  /** Número de noites */
2270
2345
  nights?: number;
2271
- /** Período (ex: "Feb - Mar") */
2346
+ /** Período (ex: "Feb - Mar") — usado pelo variant="overlay". */
2272
2347
  period?: string;
2273
2348
  /** Título da viagem */
2274
2349
  title: string;
2275
- /** Descrição curta */
2350
+ /** Descrição / excerpt curto — usado em ambos os variants. */
2276
2351
  description?: string;
2277
- /** Link/CTA de ação */
2352
+ /** Link/CTA de ação — usado pelo variant="overlay". */
2278
2353
  cta?: TripCardCta;
2279
- /** Preço exibido ao lado do CTA (ex: "from € 769") */
2354
+ /** Preço (ex: "from € 769"). */
2280
2355
  price?: string;
2281
2356
  size?: TripCardSize;
2282
2357
  className?: string;
2358
+ /** Variação visual do card. @default "overlay" */
2359
+ variant?: TripCardVariant;
2360
+ /** Quando href é fornecido, o card editorial inteiro vira um link <a>. */
2361
+ href?: string;
2362
+ /** Mostra um botão de favorito (estilo Chip glass) no topo direito. */
2363
+ favoritable?: boolean;
2364
+ /** Estado controlado do favorito. */
2365
+ favorited?: boolean;
2366
+ onFavoriteToggle?: (next: boolean) => void;
2367
+ /** Localização/região exibida no rodapé branco (ex.: "Pantanal, Brazil"). */
2368
+ location?: string;
2369
+ /** Nível de dificuldade — renderizado com um dot colorido. */
2370
+ difficulty?: TripCardDifficulty;
2371
+ /**
2372
+ * Tour-type tag rendered as a chip at the top-left of the image
2373
+ * (ex.: "Family Adventure", "Private Trip", "Luxury").
2374
+ */
2375
+ tag?: string;
2283
2376
  }
2284
- declare function TripCard({ image, imageAlt, status, nights, period, title, description, cta, price, size, className, }: TripCardProps): react_jsx_runtime.JSX.Element;
2377
+ declare function TripCard(props: TripCardProps): react_jsx_runtime.JSX.Element;
2285
2378
 
2286
2379
  interface TripDuration {
2287
2380
  /** Total number of days */
@@ -2289,6 +2382,10 @@ interface TripDuration {
2289
2382
  /** Number of nights — defaults to days - 1 */
2290
2383
  nights?: number;
2291
2384
  }
2385
+ interface TripHeaderChip {
2386
+ label: string;
2387
+ href?: string;
2388
+ }
2292
2389
  interface TripHeaderProps {
2293
2390
  /** Hero image array — shows a carousel when more than one image */
2294
2391
  images: string[];
@@ -2307,6 +2404,8 @@ interface TripHeaderProps {
2307
2404
  duration?: TripDuration;
2308
2405
  /** Legacy tagline — shown only when destination/duration are not provided */
2309
2406
  tagline?: string;
2407
+ /** Pill-shaped category chips rendered under the meta row (e.g. related tour categories). */
2408
+ chips?: TripHeaderChip[];
2310
2409
  /**
2311
2410
  * Optional content rendered directly below the destination/duration meta
2312
2411
  * row. Use it to slot in a small Trustpilot widget, sponsor badge, etc.
@@ -2318,7 +2417,7 @@ interface TripHeaderProps {
2318
2417
  uiVariant?: "v1" | "v2";
2319
2418
  className?: string;
2320
2419
  }
2321
- declare function TripHeader({ images, videoUrl, title, breadcrumb, destination, duration, tagline, belowMeta, siteHeader, uiVariant, className, }: TripHeaderProps): react_jsx_runtime.JSX.Element;
2420
+ declare function TripHeader({ images, videoUrl, title, breadcrumb, destination, duration, tagline, chips, belowMeta, siteHeader, uiVariant, className, }: TripHeaderProps): react_jsx_runtime.JSX.Element;
2322
2421
 
2323
2422
  interface TripHighlight {
2324
2423
  label: string;
@@ -2379,7 +2478,7 @@ interface TripSectionIcons {
2379
2478
  itinerary?: React.ReactNode;
2380
2479
  whatIsIncluded?: React.ReactNode;
2381
2480
  /** Accordion sections */
2382
- keyInfo?: React.ReactNode;
2481
+ howToGetThere?: React.ReactNode;
2383
2482
  meetingPoint?: React.ReactNode;
2384
2483
  optionalExtras?: React.ReactNode;
2385
2484
  whatToBring?: React.ReactNode;
@@ -2405,15 +2504,13 @@ interface TripPageProps {
2405
2504
  label: string;
2406
2505
  href?: string;
2407
2506
  }>;
2507
+ /** Pill chips rendered under the hero meta row (e.g. related tour categories). */
2508
+ chips?: TripHeaderChip[];
2408
2509
  highlights?: TripHighlight[];
2409
2510
  infoGroups?: TripInfoGroup[];
2410
- /**
2411
- * Rich-text "Key info" content (WYSIWYG). When provided, replaces the
2412
- * structured `infoGroups` render inside the accordion item — useful when
2413
- * the source of truth is a free-form WP WYSIWYG field instead of
2414
- * structured groups.
2415
- */
2416
2511
  keyInfo?: React.ReactNode;
2512
+ /** Rich-text "How to get there" content (WYSIWYG) — directions, arrival info, etc. */
2513
+ howToGetThere?: React.ReactNode;
2417
2514
  recommendedFor?: string;
2418
2515
  overview?: React.ReactNode;
2419
2516
  /** Optional list of long-form highlights rendered inside the Overview section. */
@@ -2441,6 +2538,8 @@ interface TripPageProps {
2441
2538
  */
2442
2539
  meetingPoint?: React.ReactNode;
2443
2540
  faqs?: TripFaq[];
2541
+ /** Number of FAQs shown before the "Load more" button appears. @default 5 */
2542
+ faqInitialCount?: number;
2444
2543
  /**
2445
2544
  * Per-section icon overrides for the trip details accordion. When a value
2446
2545
  * is supplied for a section, it replaces the hardcoded lucide icon next
@@ -2485,7 +2584,7 @@ interface TripPageProps {
2485
2584
  features?: Record<string, boolean>;
2486
2585
  className?: string;
2487
2586
  }
2488
- declare function TripPage({ title, tagline, destination, duration, images, videoUrl, breadcrumb, highlights, infoGroups, keyInfo, recommendedFor, overview, overviewHighlights, itinerary, itineraryDays, gallery, included, notIncluded, whatToBring, weather, optionalExtras, accommodation, food, termsAndConditions, meetingPoints, meetingPoint, faqs, sectionIcons, reviews, trustpilot, trustpilotMini, trustpilotHero, priceFrom, currency, season, departureTimes, benefits, currencyEstimates, priceInfo, onBook, bookLabel, siteHeader, uiVariant, features, className, }: TripPageProps): react_jsx_runtime.JSX.Element;
2587
+ declare function TripPage({ title, tagline, destination, duration, images, videoUrl, breadcrumb, chips, highlights, howToGetThere, recommendedFor, overview, overviewHighlights, itinerary, itineraryDays, gallery, included, notIncluded, whatToBring, weather, optionalExtras, accommodation, food, termsAndConditions, meetingPoints, meetingPoint, faqs, faqInitialCount, sectionIcons, reviews, trustpilot, trustpilotMini, trustpilotHero, priceFrom, currency, season, departureTimes, benefits, currencyEstimates, priceInfo, onBook, bookLabel, siteHeader, uiVariant, features, className, }: TripPageProps): react_jsx_runtime.JSX.Element;
2489
2588
 
2490
2589
  type ActivityCardSize = "sm" | "md" | "lg";
2491
2590
  interface ActivityCardProps {