@planetaexo/design-system 0.37.3 → 0.37.5

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
@@ -1980,6 +1980,18 @@ interface FilterItem {
1980
1980
  label: string;
1981
1981
  /** Contagem de resultados disponíveis */
1982
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;
1983
1995
  }
1984
1996
  interface FilterGroup {
1985
1997
  id: string;
@@ -1989,7 +2001,29 @@ interface FilterGroup {
1989
2001
  items: FilterItem[];
1990
2002
  /** Abre este grupo por padrão */
1991
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;
2015
+ }
2016
+ interface FilterSortOption {
2017
+ id: string;
2018
+ label: string;
1992
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";
1993
2027
  interface FilterPanelProps {
1994
2028
  groups: FilterGroup[];
1995
2029
  /** Estado controlado: { groupId: string[] } */
@@ -2000,8 +2034,14 @@ interface FilterPanelProps {
2000
2034
  alwaysShowClear?: boolean;
2001
2035
  title?: string;
2002
2036
  className?: string;
2003
- }
2004
- 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;
2005
2045
 
2006
2046
  /**
2007
2047
  * Configuration for any Trustpilot widget embedded in the design system.
@@ -2038,6 +2078,22 @@ interface TrustpilotWidgetConfig {
2038
2078
  starColor?: string;
2039
2079
  /** Fallback link target (e.g. "https://www.trustpilot.com/review/yourdomain.com"). */
2040
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;
2041
2097
  }
2042
2098
  /**
2043
2099
  * Renders a Trustpilot widget div with the right data-* attributes and
@@ -2137,7 +2193,7 @@ interface MenuTripProps {
2137
2193
  }
2138
2194
  declare function MenuTrip({ sections, activeSection, onSelect, variant, bold, className, }: MenuTripProps): react_jsx_runtime.JSX.Element;
2139
2195
 
2140
- type PhotoGalleryVariant = "grid" | "masonry" | "filmstrip" | "featured" | "carousel" | "fullBleed";
2196
+ type PhotoGalleryVariant = "grid" | "gridCompact" | "masonry" | "filmstrip" | "featured" | "carousel" | "fullBleed";
2141
2197
  interface PhotoGalleryPhoto {
2142
2198
  src: string;
2143
2199
  alt?: string;
@@ -2240,6 +2296,11 @@ type SiteHeaderVariant = "transparent" | "white" | "dark";
2240
2296
  interface SiteHeaderProps {
2241
2297
  variant?: SiteHeaderVariant;
2242
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. */
2243
2304
  logoSrc?: string;
2244
2305
  logoAlt?: string;
2245
2306
  languages?: SiteHeaderLanguage[];
@@ -2253,7 +2314,7 @@ interface SiteHeaderProps {
2253
2314
  }
2254
2315
  declare const DEFAULT_HEADER_LINKS: SiteHeaderLink[];
2255
2316
  declare const DEFAULT_LANGUAGES: SiteHeaderLanguage[];
2256
- 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;
2257
2318
 
2258
2319
  declare function ThemeToggle({ className }: {
2259
2320
  className?: string;
@@ -2261,6 +2322,13 @@ declare function ThemeToggle({ className }: {
2261
2322
 
2262
2323
  type TripCardStatus = "sold-out" | "trending";
2263
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";
2264
2332
  interface TripCardCta {
2265
2333
  /** Texto do link (ex: "Discover this trip" ou "5 dates available") */
2266
2334
  label: string;
@@ -2271,24 +2339,42 @@ interface TripCardProps {
2271
2339
  /** URL da imagem de capa */
2272
2340
  image: string;
2273
2341
  imageAlt?: string;
2274
- /** Badge de status exibido no topo esquerdo */
2342
+ /** Badge de status (ex.: trending) usado pelo variant="overlay". */
2275
2343
  status?: TripCardStatus;
2276
2344
  /** Número de noites */
2277
2345
  nights?: number;
2278
- /** Período (ex: "Feb - Mar") */
2346
+ /** Período (ex: "Feb - Mar") — usado pelo variant="overlay". */
2279
2347
  period?: string;
2280
2348
  /** Título da viagem */
2281
2349
  title: string;
2282
- /** Descrição curta */
2350
+ /** Descrição / excerpt curto — usado em ambos os variants. */
2283
2351
  description?: string;
2284
- /** Link/CTA de ação */
2352
+ /** Link/CTA de ação — usado pelo variant="overlay". */
2285
2353
  cta?: TripCardCta;
2286
- /** Preço exibido ao lado do CTA (ex: "from € 769") */
2354
+ /** Preço (ex: "from € 769"). */
2287
2355
  price?: string;
2288
2356
  size?: TripCardSize;
2289
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;
2290
2376
  }
2291
- 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;
2292
2378
 
2293
2379
  interface TripDuration {
2294
2380
  /** Total number of days */
@@ -2296,6 +2382,10 @@ interface TripDuration {
2296
2382
  /** Number of nights — defaults to days - 1 */
2297
2383
  nights?: number;
2298
2384
  }
2385
+ interface TripHeaderChip {
2386
+ label: string;
2387
+ href?: string;
2388
+ }
2299
2389
  interface TripHeaderProps {
2300
2390
  /** Hero image array — shows a carousel when more than one image */
2301
2391
  images: string[];
@@ -2314,6 +2404,8 @@ interface TripHeaderProps {
2314
2404
  duration?: TripDuration;
2315
2405
  /** Legacy tagline — shown only when destination/duration are not provided */
2316
2406
  tagline?: string;
2407
+ /** Pill-shaped category chips rendered under the meta row (e.g. related tour categories). */
2408
+ chips?: TripHeaderChip[];
2317
2409
  /**
2318
2410
  * Optional content rendered directly below the destination/duration meta
2319
2411
  * row. Use it to slot in a small Trustpilot widget, sponsor badge, etc.
@@ -2325,7 +2417,7 @@ interface TripHeaderProps {
2325
2417
  uiVariant?: "v1" | "v2";
2326
2418
  className?: string;
2327
2419
  }
2328
- 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;
2329
2421
 
2330
2422
  interface TripHighlight {
2331
2423
  label: string;
@@ -2386,7 +2478,7 @@ interface TripSectionIcons {
2386
2478
  itinerary?: React.ReactNode;
2387
2479
  whatIsIncluded?: React.ReactNode;
2388
2480
  /** Accordion sections */
2389
- keyInfo?: React.ReactNode;
2481
+ howToGetThere?: React.ReactNode;
2390
2482
  meetingPoint?: React.ReactNode;
2391
2483
  optionalExtras?: React.ReactNode;
2392
2484
  whatToBring?: React.ReactNode;
@@ -2412,15 +2504,13 @@ interface TripPageProps {
2412
2504
  label: string;
2413
2505
  href?: string;
2414
2506
  }>;
2507
+ /** Pill chips rendered under the hero meta row (e.g. related tour categories). */
2508
+ chips?: TripHeaderChip[];
2415
2509
  highlights?: TripHighlight[];
2416
2510
  infoGroups?: TripInfoGroup[];
2417
- /**
2418
- * Rich-text "Key info" content (WYSIWYG). When provided, replaces the
2419
- * structured `infoGroups` render inside the accordion item — useful when
2420
- * the source of truth is a free-form WP WYSIWYG field instead of
2421
- * structured groups.
2422
- */
2423
2511
  keyInfo?: React.ReactNode;
2512
+ /** Rich-text "How to get there" content (WYSIWYG) — directions, arrival info, etc. */
2513
+ howToGetThere?: React.ReactNode;
2424
2514
  recommendedFor?: string;
2425
2515
  overview?: React.ReactNode;
2426
2516
  /** Optional list of long-form highlights rendered inside the Overview section. */
@@ -2448,6 +2538,8 @@ interface TripPageProps {
2448
2538
  */
2449
2539
  meetingPoint?: React.ReactNode;
2450
2540
  faqs?: TripFaq[];
2541
+ /** Number of FAQs shown before the "Load more" button appears. @default 5 */
2542
+ faqInitialCount?: number;
2451
2543
  /**
2452
2544
  * Per-section icon overrides for the trip details accordion. When a value
2453
2545
  * is supplied for a section, it replaces the hardcoded lucide icon next
@@ -2492,7 +2584,7 @@ interface TripPageProps {
2492
2584
  features?: Record<string, boolean>;
2493
2585
  className?: string;
2494
2586
  }
2495
- 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;
2496
2588
 
2497
2589
  type ActivityCardSize = "sm" | "md" | "lg";
2498
2590
  interface ActivityCardProps {
package/dist/index.d.ts CHANGED
@@ -1980,6 +1980,18 @@ interface FilterItem {
1980
1980
  label: string;
1981
1981
  /** Contagem de resultados disponíveis */
1982
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;
1983
1995
  }
1984
1996
  interface FilterGroup {
1985
1997
  id: string;
@@ -1989,7 +2001,29 @@ interface FilterGroup {
1989
2001
  items: FilterItem[];
1990
2002
  /** Abre este grupo por padrão */
1991
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;
2015
+ }
2016
+ interface FilterSortOption {
2017
+ id: string;
2018
+ label: string;
1992
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";
1993
2027
  interface FilterPanelProps {
1994
2028
  groups: FilterGroup[];
1995
2029
  /** Estado controlado: { groupId: string[] } */
@@ -2000,8 +2034,14 @@ interface FilterPanelProps {
2000
2034
  alwaysShowClear?: boolean;
2001
2035
  title?: string;
2002
2036
  className?: string;
2003
- }
2004
- 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;
2005
2045
 
2006
2046
  /**
2007
2047
  * Configuration for any Trustpilot widget embedded in the design system.
@@ -2038,6 +2078,22 @@ interface TrustpilotWidgetConfig {
2038
2078
  starColor?: string;
2039
2079
  /** Fallback link target (e.g. "https://www.trustpilot.com/review/yourdomain.com"). */
2040
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;
2041
2097
  }
2042
2098
  /**
2043
2099
  * Renders a Trustpilot widget div with the right data-* attributes and
@@ -2137,7 +2193,7 @@ interface MenuTripProps {
2137
2193
  }
2138
2194
  declare function MenuTrip({ sections, activeSection, onSelect, variant, bold, className, }: MenuTripProps): react_jsx_runtime.JSX.Element;
2139
2195
 
2140
- type PhotoGalleryVariant = "grid" | "masonry" | "filmstrip" | "featured" | "carousel" | "fullBleed";
2196
+ type PhotoGalleryVariant = "grid" | "gridCompact" | "masonry" | "filmstrip" | "featured" | "carousel" | "fullBleed";
2141
2197
  interface PhotoGalleryPhoto {
2142
2198
  src: string;
2143
2199
  alt?: string;
@@ -2240,6 +2296,11 @@ type SiteHeaderVariant = "transparent" | "white" | "dark";
2240
2296
  interface SiteHeaderProps {
2241
2297
  variant?: SiteHeaderVariant;
2242
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. */
2243
2304
  logoSrc?: string;
2244
2305
  logoAlt?: string;
2245
2306
  languages?: SiteHeaderLanguage[];
@@ -2253,7 +2314,7 @@ interface SiteHeaderProps {
2253
2314
  }
2254
2315
  declare const DEFAULT_HEADER_LINKS: SiteHeaderLink[];
2255
2316
  declare const DEFAULT_LANGUAGES: SiteHeaderLanguage[];
2256
- 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;
2257
2318
 
2258
2319
  declare function ThemeToggle({ className }: {
2259
2320
  className?: string;
@@ -2261,6 +2322,13 @@ declare function ThemeToggle({ className }: {
2261
2322
 
2262
2323
  type TripCardStatus = "sold-out" | "trending";
2263
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";
2264
2332
  interface TripCardCta {
2265
2333
  /** Texto do link (ex: "Discover this trip" ou "5 dates available") */
2266
2334
  label: string;
@@ -2271,24 +2339,42 @@ interface TripCardProps {
2271
2339
  /** URL da imagem de capa */
2272
2340
  image: string;
2273
2341
  imageAlt?: string;
2274
- /** Badge de status exibido no topo esquerdo */
2342
+ /** Badge de status (ex.: trending) usado pelo variant="overlay". */
2275
2343
  status?: TripCardStatus;
2276
2344
  /** Número de noites */
2277
2345
  nights?: number;
2278
- /** Período (ex: "Feb - Mar") */
2346
+ /** Período (ex: "Feb - Mar") — usado pelo variant="overlay". */
2279
2347
  period?: string;
2280
2348
  /** Título da viagem */
2281
2349
  title: string;
2282
- /** Descrição curta */
2350
+ /** Descrição / excerpt curto — usado em ambos os variants. */
2283
2351
  description?: string;
2284
- /** Link/CTA de ação */
2352
+ /** Link/CTA de ação — usado pelo variant="overlay". */
2285
2353
  cta?: TripCardCta;
2286
- /** Preço exibido ao lado do CTA (ex: "from € 769") */
2354
+ /** Preço (ex: "from € 769"). */
2287
2355
  price?: string;
2288
2356
  size?: TripCardSize;
2289
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;
2290
2376
  }
2291
- 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;
2292
2378
 
2293
2379
  interface TripDuration {
2294
2380
  /** Total number of days */
@@ -2296,6 +2382,10 @@ interface TripDuration {
2296
2382
  /** Number of nights — defaults to days - 1 */
2297
2383
  nights?: number;
2298
2384
  }
2385
+ interface TripHeaderChip {
2386
+ label: string;
2387
+ href?: string;
2388
+ }
2299
2389
  interface TripHeaderProps {
2300
2390
  /** Hero image array — shows a carousel when more than one image */
2301
2391
  images: string[];
@@ -2314,6 +2404,8 @@ interface TripHeaderProps {
2314
2404
  duration?: TripDuration;
2315
2405
  /** Legacy tagline — shown only when destination/duration are not provided */
2316
2406
  tagline?: string;
2407
+ /** Pill-shaped category chips rendered under the meta row (e.g. related tour categories). */
2408
+ chips?: TripHeaderChip[];
2317
2409
  /**
2318
2410
  * Optional content rendered directly below the destination/duration meta
2319
2411
  * row. Use it to slot in a small Trustpilot widget, sponsor badge, etc.
@@ -2325,7 +2417,7 @@ interface TripHeaderProps {
2325
2417
  uiVariant?: "v1" | "v2";
2326
2418
  className?: string;
2327
2419
  }
2328
- 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;
2329
2421
 
2330
2422
  interface TripHighlight {
2331
2423
  label: string;
@@ -2386,7 +2478,7 @@ interface TripSectionIcons {
2386
2478
  itinerary?: React.ReactNode;
2387
2479
  whatIsIncluded?: React.ReactNode;
2388
2480
  /** Accordion sections */
2389
- keyInfo?: React.ReactNode;
2481
+ howToGetThere?: React.ReactNode;
2390
2482
  meetingPoint?: React.ReactNode;
2391
2483
  optionalExtras?: React.ReactNode;
2392
2484
  whatToBring?: React.ReactNode;
@@ -2412,15 +2504,13 @@ interface TripPageProps {
2412
2504
  label: string;
2413
2505
  href?: string;
2414
2506
  }>;
2507
+ /** Pill chips rendered under the hero meta row (e.g. related tour categories). */
2508
+ chips?: TripHeaderChip[];
2415
2509
  highlights?: TripHighlight[];
2416
2510
  infoGroups?: TripInfoGroup[];
2417
- /**
2418
- * Rich-text "Key info" content (WYSIWYG). When provided, replaces the
2419
- * structured `infoGroups` render inside the accordion item — useful when
2420
- * the source of truth is a free-form WP WYSIWYG field instead of
2421
- * structured groups.
2422
- */
2423
2511
  keyInfo?: React.ReactNode;
2512
+ /** Rich-text "How to get there" content (WYSIWYG) — directions, arrival info, etc. */
2513
+ howToGetThere?: React.ReactNode;
2424
2514
  recommendedFor?: string;
2425
2515
  overview?: React.ReactNode;
2426
2516
  /** Optional list of long-form highlights rendered inside the Overview section. */
@@ -2448,6 +2538,8 @@ interface TripPageProps {
2448
2538
  */
2449
2539
  meetingPoint?: React.ReactNode;
2450
2540
  faqs?: TripFaq[];
2541
+ /** Number of FAQs shown before the "Load more" button appears. @default 5 */
2542
+ faqInitialCount?: number;
2451
2543
  /**
2452
2544
  * Per-section icon overrides for the trip details accordion. When a value
2453
2545
  * is supplied for a section, it replaces the hardcoded lucide icon next
@@ -2492,7 +2584,7 @@ interface TripPageProps {
2492
2584
  features?: Record<string, boolean>;
2493
2585
  className?: string;
2494
2586
  }
2495
- 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;
2496
2588
 
2497
2589
  type ActivityCardSize = "sm" | "md" | "lg";
2498
2590
  interface ActivityCardProps {