@planetaexo/design-system 0.75.0 → 0.77.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.d.cts CHANGED
@@ -3626,6 +3626,17 @@ interface TripHeaderChip {
3626
3626
  interface TripHeaderProps {
3627
3627
  /** Hero image array — shows a carousel when more than one image */
3628
3628
  images: string[];
3629
+ /**
3630
+ * Responsive `srcSet`/`sizes` for the FIRST hero image (the LCP element),
3631
+ * letting phones fetch a smaller width than the full-bleed desktop cover.
3632
+ * Applied to the video poster and to carousel slide 0 only; the off-screen
3633
+ * slides keep their single `images[i]` src. Omit for the legacy single-src
3634
+ * behaviour. (The host app builds these — e.g. one `/_next/image` URL per
3635
+ * width — since the DS doesn't know the optimizer's allowed widths.)
3636
+ */
3637
+ heroImageSrcSet?: string;
3638
+ /** `sizes` paired with {@link heroImageSrcSet} (e.g. `"100vw"`). */
3639
+ heroImageSizes?: string;
3629
3640
  /** Optional video URL — plays as background instead of the image carousel */
3630
3641
  videoUrl?: string;
3631
3642
  /** Main trip title */
@@ -3665,7 +3676,7 @@ interface TripHeaderProps {
3665
3676
  uiVariant?: "v1" | "v2";
3666
3677
  className?: string;
3667
3678
  }
3668
- declare function TripHeader({ images, videoUrl, title, breadcrumb, destination, duration, groupSize, labels, tagline, chips, belowMeta, siteHeader, uiVariant, className, }: TripHeaderProps): react_jsx_runtime.JSX.Element;
3679
+ declare function TripHeader({ images, heroImageSrcSet, heroImageSizes, videoUrl, title, breadcrumb, destination, duration, groupSize, labels, tagline, chips, belowMeta, siteHeader, uiVariant, className, }: TripHeaderProps): react_jsx_runtime.JSX.Element;
3669
3680
 
3670
3681
  interface SiteFooterChip {
3671
3682
  label: string;
@@ -3907,6 +3918,14 @@ interface TripPageProps {
3907
3918
  /** Group size shown with a people icon in the hero meta row */
3908
3919
  groupSize?: string;
3909
3920
  images: string[];
3921
+ /**
3922
+ * Responsive `srcSet`/`sizes` for the first hero image (LCP) — forwarded to
3923
+ * {@link TripHeader} so phones fetch a smaller width than the desktop cover.
3924
+ * Omit for legacy single-src behaviour.
3925
+ */
3926
+ heroImageSrcSet?: string;
3927
+ /** `sizes` paired with {@link heroImageSrcSet} (e.g. `"100vw"`). */
3928
+ heroImageSizes?: string;
3910
3929
  /** Optional video URL — plays as background instead of the image carousel */
3911
3930
  videoUrl?: string;
3912
3931
  /** Breadcrumb trail displayed above the title */
@@ -4066,7 +4085,7 @@ interface TripPageProps {
4066
4085
  features?: Record<string, boolean>;
4067
4086
  className?: string;
4068
4087
  }
4069
- declare function TripPage({ title, tagline, destination, duration, groupSize, images, videoUrl, breadcrumb, chips, highlights, howToGetThere, recommendedFor, overview, overviewHighlights, itinerary, itineraryDays, gallery, galleryLightbox, included, notIncluded, whatToBring, weather, optionalExtras, accommodation, accommodationGallery, accommodationGalleryVariant, whenItOperates, food, foodGallery, foodGalleryVariant, termsAndConditions, meetingPoints, meetingPoint, faqs, faqInitialCount, sectionIcons, labels, reviews, trustpilot, trustpilotMini, trustpilotHero, priceFrom, currency, season, departureTimes, benefits, currencyEstimates, priceInfo, onBook, onBookingSubmit, bookingLoading, bookingDefaults, bookingLabels, bookLabel, fromLabel, perPersonLabel, siteHeader, footerBadges, uiVariant, features, className, }: TripPageProps): react_jsx_runtime.JSX.Element;
4088
+ declare function TripPage({ title, tagline, destination, duration, groupSize, images, heroImageSrcSet, heroImageSizes, videoUrl, breadcrumb, chips, highlights, howToGetThere, recommendedFor, overview, overviewHighlights, itinerary, itineraryDays, gallery, galleryLightbox, included, notIncluded, whatToBring, weather, optionalExtras, accommodation, accommodationGallery, accommodationGalleryVariant, whenItOperates, food, foodGallery, foodGalleryVariant, termsAndConditions, meetingPoints, meetingPoint, faqs, faqInitialCount, sectionIcons, labels, reviews, trustpilot, trustpilotMini, trustpilotHero, priceFrom, currency, season, departureTimes, benefits, currencyEstimates, priceInfo, onBook, onBookingSubmit, bookingLoading, bookingDefaults, bookingLabels, bookLabel, fromLabel, perPersonLabel, siteHeader, footerBadges, uiVariant, features, className, }: TripPageProps): react_jsx_runtime.JSX.Element;
4070
4089
 
4071
4090
  interface Category2Trip extends TripCardProps {
4072
4091
  /** Marca a trip como featured — sobe para o topo do grid principal. */
@@ -4180,6 +4199,15 @@ interface CategoryPage2Props {
4180
4199
  faqInitialCount?: number;
4181
4200
  gallery?: (string | PhotoGalleryPhoto)[];
4182
4201
  galleryTitle?: string;
4202
+ /**
4203
+ * Lightbox mode for the photo gallery when a photo is tapped.
4204
+ * - `"classic"` — paged single-photo view with prev/next arrows (default).
4205
+ * - `"feed"` — Airbnb "photo tour": one vertical scrollable column of every
4206
+ * photo, opened scrolled to the tapped one (white captions overlaid, focused
4207
+ * photo full-opacity, neighbours dimmed). Pass `"feed"` on mobile.
4208
+ * @default "classic"
4209
+ */
4210
+ galleryLightbox?: "classic" | "feed";
4183
4211
  /** Trips-list expand button: "Load more" (count appended). */
4184
4212
  loadMoreLabel?: string;
4185
4213
  /** Expand/collapse collapse button: "Show less". */
@@ -4194,7 +4222,7 @@ interface CategoryPage2Props {
4194
4222
  filterLabels?: FilterPanelLabels;
4195
4223
  className?: string;
4196
4224
  }
4197
- declare function CategoryPage2({ title, intro, heroImage, videoUrl, trustpilotMini, breadcrumb, siteHeader, heroRightSlot, popularTours, popularToursTitle, popularToursEyebrow, trips, tripsTitle, tripsEyebrow, filterGroups, sortOptions, defaultSort, tripsInitialCount, tripListingSlot, trustpilot, reviewsTitle, reviewsSubtitle, blogPosts, aboutTitle, aboutContent, blogIntro, travelGuideHref, travelGuideLabel, blogPostsTitle, blogPostsViewAllHref, faqs, faqsTitle, faqInitialCount, gallery, galleryTitle, loadMoreLabel, showLessLabel, seeMoreLabel, viewAllPostsLabel, cardLabels, filterLabels, footerBadges, className, }: CategoryPage2Props): react_jsx_runtime.JSX.Element;
4225
+ declare function CategoryPage2({ title, intro, heroImage, videoUrl, trustpilotMini, breadcrumb, siteHeader, heroRightSlot, popularTours, popularToursTitle, popularToursEyebrow, trips, tripsTitle, tripsEyebrow, filterGroups, sortOptions, defaultSort, tripsInitialCount, tripListingSlot, trustpilot, reviewsTitle, reviewsSubtitle, blogPosts, aboutTitle, aboutContent, blogIntro, travelGuideHref, travelGuideLabel, blogPostsTitle, blogPostsViewAllHref, faqs, faqsTitle, faqInitialCount, gallery, galleryTitle, galleryLightbox, loadMoreLabel, showLessLabel, seeMoreLabel, viewAllPostsLabel, cardLabels, filterLabels, footerBadges, className, }: CategoryPage2Props): react_jsx_runtime.JSX.Element;
4198
4226
 
4199
4227
  type ActivityCardSize = "sm" | "md" | "lg";
4200
4228
  interface ActivityCardProps {
package/dist/index.d.ts CHANGED
@@ -3626,6 +3626,17 @@ interface TripHeaderChip {
3626
3626
  interface TripHeaderProps {
3627
3627
  /** Hero image array — shows a carousel when more than one image */
3628
3628
  images: string[];
3629
+ /**
3630
+ * Responsive `srcSet`/`sizes` for the FIRST hero image (the LCP element),
3631
+ * letting phones fetch a smaller width than the full-bleed desktop cover.
3632
+ * Applied to the video poster and to carousel slide 0 only; the off-screen
3633
+ * slides keep their single `images[i]` src. Omit for the legacy single-src
3634
+ * behaviour. (The host app builds these — e.g. one `/_next/image` URL per
3635
+ * width — since the DS doesn't know the optimizer's allowed widths.)
3636
+ */
3637
+ heroImageSrcSet?: string;
3638
+ /** `sizes` paired with {@link heroImageSrcSet} (e.g. `"100vw"`). */
3639
+ heroImageSizes?: string;
3629
3640
  /** Optional video URL — plays as background instead of the image carousel */
3630
3641
  videoUrl?: string;
3631
3642
  /** Main trip title */
@@ -3665,7 +3676,7 @@ interface TripHeaderProps {
3665
3676
  uiVariant?: "v1" | "v2";
3666
3677
  className?: string;
3667
3678
  }
3668
- declare function TripHeader({ images, videoUrl, title, breadcrumb, destination, duration, groupSize, labels, tagline, chips, belowMeta, siteHeader, uiVariant, className, }: TripHeaderProps): react_jsx_runtime.JSX.Element;
3679
+ declare function TripHeader({ images, heroImageSrcSet, heroImageSizes, videoUrl, title, breadcrumb, destination, duration, groupSize, labels, tagline, chips, belowMeta, siteHeader, uiVariant, className, }: TripHeaderProps): react_jsx_runtime.JSX.Element;
3669
3680
 
3670
3681
  interface SiteFooterChip {
3671
3682
  label: string;
@@ -3907,6 +3918,14 @@ interface TripPageProps {
3907
3918
  /** Group size shown with a people icon in the hero meta row */
3908
3919
  groupSize?: string;
3909
3920
  images: string[];
3921
+ /**
3922
+ * Responsive `srcSet`/`sizes` for the first hero image (LCP) — forwarded to
3923
+ * {@link TripHeader} so phones fetch a smaller width than the desktop cover.
3924
+ * Omit for legacy single-src behaviour.
3925
+ */
3926
+ heroImageSrcSet?: string;
3927
+ /** `sizes` paired with {@link heroImageSrcSet} (e.g. `"100vw"`). */
3928
+ heroImageSizes?: string;
3910
3929
  /** Optional video URL — plays as background instead of the image carousel */
3911
3930
  videoUrl?: string;
3912
3931
  /** Breadcrumb trail displayed above the title */
@@ -4066,7 +4085,7 @@ interface TripPageProps {
4066
4085
  features?: Record<string, boolean>;
4067
4086
  className?: string;
4068
4087
  }
4069
- declare function TripPage({ title, tagline, destination, duration, groupSize, images, videoUrl, breadcrumb, chips, highlights, howToGetThere, recommendedFor, overview, overviewHighlights, itinerary, itineraryDays, gallery, galleryLightbox, included, notIncluded, whatToBring, weather, optionalExtras, accommodation, accommodationGallery, accommodationGalleryVariant, whenItOperates, food, foodGallery, foodGalleryVariant, termsAndConditions, meetingPoints, meetingPoint, faqs, faqInitialCount, sectionIcons, labels, reviews, trustpilot, trustpilotMini, trustpilotHero, priceFrom, currency, season, departureTimes, benefits, currencyEstimates, priceInfo, onBook, onBookingSubmit, bookingLoading, bookingDefaults, bookingLabels, bookLabel, fromLabel, perPersonLabel, siteHeader, footerBadges, uiVariant, features, className, }: TripPageProps): react_jsx_runtime.JSX.Element;
4088
+ declare function TripPage({ title, tagline, destination, duration, groupSize, images, heroImageSrcSet, heroImageSizes, videoUrl, breadcrumb, chips, highlights, howToGetThere, recommendedFor, overview, overviewHighlights, itinerary, itineraryDays, gallery, galleryLightbox, included, notIncluded, whatToBring, weather, optionalExtras, accommodation, accommodationGallery, accommodationGalleryVariant, whenItOperates, food, foodGallery, foodGalleryVariant, termsAndConditions, meetingPoints, meetingPoint, faqs, faqInitialCount, sectionIcons, labels, reviews, trustpilot, trustpilotMini, trustpilotHero, priceFrom, currency, season, departureTimes, benefits, currencyEstimates, priceInfo, onBook, onBookingSubmit, bookingLoading, bookingDefaults, bookingLabels, bookLabel, fromLabel, perPersonLabel, siteHeader, footerBadges, uiVariant, features, className, }: TripPageProps): react_jsx_runtime.JSX.Element;
4070
4089
 
4071
4090
  interface Category2Trip extends TripCardProps {
4072
4091
  /** Marca a trip como featured — sobe para o topo do grid principal. */
@@ -4180,6 +4199,15 @@ interface CategoryPage2Props {
4180
4199
  faqInitialCount?: number;
4181
4200
  gallery?: (string | PhotoGalleryPhoto)[];
4182
4201
  galleryTitle?: string;
4202
+ /**
4203
+ * Lightbox mode for the photo gallery when a photo is tapped.
4204
+ * - `"classic"` — paged single-photo view with prev/next arrows (default).
4205
+ * - `"feed"` — Airbnb "photo tour": one vertical scrollable column of every
4206
+ * photo, opened scrolled to the tapped one (white captions overlaid, focused
4207
+ * photo full-opacity, neighbours dimmed). Pass `"feed"` on mobile.
4208
+ * @default "classic"
4209
+ */
4210
+ galleryLightbox?: "classic" | "feed";
4183
4211
  /** Trips-list expand button: "Load more" (count appended). */
4184
4212
  loadMoreLabel?: string;
4185
4213
  /** Expand/collapse collapse button: "Show less". */
@@ -4194,7 +4222,7 @@ interface CategoryPage2Props {
4194
4222
  filterLabels?: FilterPanelLabels;
4195
4223
  className?: string;
4196
4224
  }
4197
- declare function CategoryPage2({ title, intro, heroImage, videoUrl, trustpilotMini, breadcrumb, siteHeader, heroRightSlot, popularTours, popularToursTitle, popularToursEyebrow, trips, tripsTitle, tripsEyebrow, filterGroups, sortOptions, defaultSort, tripsInitialCount, tripListingSlot, trustpilot, reviewsTitle, reviewsSubtitle, blogPosts, aboutTitle, aboutContent, blogIntro, travelGuideHref, travelGuideLabel, blogPostsTitle, blogPostsViewAllHref, faqs, faqsTitle, faqInitialCount, gallery, galleryTitle, loadMoreLabel, showLessLabel, seeMoreLabel, viewAllPostsLabel, cardLabels, filterLabels, footerBadges, className, }: CategoryPage2Props): react_jsx_runtime.JSX.Element;
4225
+ declare function CategoryPage2({ title, intro, heroImage, videoUrl, trustpilotMini, breadcrumb, siteHeader, heroRightSlot, popularTours, popularToursTitle, popularToursEyebrow, trips, tripsTitle, tripsEyebrow, filterGroups, sortOptions, defaultSort, tripsInitialCount, tripListingSlot, trustpilot, reviewsTitle, reviewsSubtitle, blogPosts, aboutTitle, aboutContent, blogIntro, travelGuideHref, travelGuideLabel, blogPostsTitle, blogPostsViewAllHref, faqs, faqsTitle, faqInitialCount, gallery, galleryTitle, galleryLightbox, loadMoreLabel, showLessLabel, seeMoreLabel, viewAllPostsLabel, cardLabels, filterLabels, footerBadges, className, }: CategoryPage2Props): react_jsx_runtime.JSX.Element;
4198
4226
 
4199
4227
  type ActivityCardSize = "sm" | "md" | "lg";
4200
4228
  interface ActivityCardProps {
package/dist/index.js CHANGED
@@ -12015,7 +12015,7 @@ function Lightbox({
12015
12015
  return /* @__PURE__ */ jsxs(
12016
12016
  "div",
12017
12017
  {
12018
- className: "fixed inset-0 z-50 bg-black/92 flex flex-col items-center justify-center",
12018
+ className: "fixed inset-0 z-[1000] bg-black/92 flex flex-col items-center justify-center",
12019
12019
  onClick: onClose,
12020
12020
  children: [
12021
12021
  /* @__PURE__ */ jsx(
@@ -12203,24 +12203,81 @@ function FeedLightbox({
12203
12203
  if (frame) cancelAnimationFrame(frame);
12204
12204
  };
12205
12205
  }, []);
12206
- return /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex flex-col bg-zinc-950 text-white", children: [
12207
- /* @__PURE__ */ jsxs("div", { className: "sticky top-0 z-10 flex items-center gap-3 border-b border-white/10 bg-zinc-950/80 px-3 py-2.5 backdrop-blur-md", children: [
12206
+ return /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-[1000] bg-zinc-950 text-white", children: [
12207
+ /* @__PURE__ */ jsx(
12208
+ "div",
12209
+ {
12210
+ ref: scrollRef,
12211
+ className: "absolute inset-0 overflow-y-auto overscroll-contain",
12212
+ children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex w-full max-w-3xl flex-col", children: items.map(({ photo, index, sectionLabel, isSectionStart }) => {
12213
+ var _a2;
12214
+ const isFocused = index === active;
12215
+ return /* @__PURE__ */ jsxs(
12216
+ "figure",
12217
+ {
12218
+ "data-index": index,
12219
+ ref: (el) => {
12220
+ itemRefs.current[index] = el;
12221
+ },
12222
+ className: cn(
12223
+ "group relative transition-opacity duration-500",
12224
+ // The focused (centred / hovered) photo is at full opacity;
12225
+ // every other photo is dimmed a touch so the eye lands on it.
12226
+ isFocused ? "opacity-100" : "opacity-[0.65] hover:opacity-100"
12227
+ ),
12228
+ children: [
12229
+ /* @__PURE__ */ jsx("div", { className: "overflow-hidden bg-white/5", children: /* @__PURE__ */ jsx(
12230
+ Picture,
12231
+ {
12232
+ src: photo.src,
12233
+ alt: (_a2 = photo.alt) != null ? _a2 : `Photo ${index + 1}`,
12234
+ title: photo.caption,
12235
+ className: "block h-auto w-full",
12236
+ eager: index < 2,
12237
+ rootMargin: "800px"
12238
+ }
12239
+ ) }),
12240
+ sectionLabel && isSectionStart && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 top-0 bg-gradient-to-b from-black/60 via-black/20 to-transparent px-3 pb-12 pt-3 sm:px-4", children: /* @__PURE__ */ jsx("h2", { className: "font-heading text-lg font-bold uppercase tracking-wide text-white drop-shadow-md", children: sectionLabel }) }),
12241
+ (photo.caption || photo.credit) && /* @__PURE__ */ jsxs(
12242
+ "figcaption",
12243
+ {
12244
+ className: cn(
12245
+ "pointer-events-none absolute inset-x-0 bottom-0 flex flex-col items-end gap-0.5 bg-gradient-to-t from-black/60 via-black/20 to-transparent px-3 pb-3 pt-12 text-right transition-opacity duration-500 sm:px-4",
12246
+ isFocused ? "opacity-100" : "opacity-0 group-hover:opacity-100"
12247
+ ),
12248
+ children: [
12249
+ photo.caption && /* @__PURE__ */ jsx("p", { className: "font-ui text-sm font-medium leading-snug text-white drop-shadow-md", children: photo.caption }),
12250
+ photo.credit && /* @__PURE__ */ jsxs("p", { className: "font-ui text-xs text-white/80 drop-shadow-md", children: [
12251
+ "\xA9 ",
12252
+ photo.credit
12253
+ ] })
12254
+ ]
12255
+ }
12256
+ )
12257
+ ]
12258
+ },
12259
+ index
12260
+ );
12261
+ }) })
12262
+ }
12263
+ ),
12264
+ /* @__PURE__ */ jsxs("div", { className: "pointer-events-none absolute inset-x-0 top-0 z-10 flex items-center gap-3 bg-gradient-to-b from-black/70 via-black/30 to-transparent px-3 pb-10 pt-2.5", children: [
12208
12265
  /* @__PURE__ */ jsx(
12209
12266
  "button",
12210
12267
  {
12211
12268
  type: "button",
12212
12269
  onClick: onClose,
12213
- className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full text-white transition-colors hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60",
12270
+ className: "pointer-events-auto flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-black/25 text-white backdrop-blur-sm transition-colors hover:bg-white/15 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60",
12214
12271
  "aria-label": (_a = labels == null ? void 0 : labels.close) != null ? _a : "Close lightbox",
12215
12272
  children: /* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5" })
12216
12273
  }
12217
12274
  ),
12218
- activeLabel && /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-center font-heading text-sm font-bold uppercase tracking-wide text-white", children: activeLabel }),
12275
+ activeLabel && /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-center font-heading text-sm font-bold uppercase tracking-wide text-white drop-shadow-md", children: activeLabel }),
12219
12276
  total > 1 && /* @__PURE__ */ jsxs(
12220
12277
  "span",
12221
12278
  {
12222
12279
  className: cn(
12223
- "shrink-0 font-ui text-sm font-medium tabular-nums text-white/60",
12280
+ "shrink-0 font-ui text-sm font-medium tabular-nums text-white/80 drop-shadow-md",
12224
12281
  !activeLabel && "ml-auto"
12225
12282
  ),
12226
12283
  children: [
@@ -12230,74 +12287,7 @@ function FeedLightbox({
12230
12287
  ]
12231
12288
  }
12232
12289
  )
12233
- ] }),
12234
- /* @__PURE__ */ jsx(
12235
- "div",
12236
- {
12237
- ref: scrollRef,
12238
- className: "flex-1 overflow-y-auto overscroll-contain",
12239
- children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex w-full max-w-3xl flex-col", children: items.map(({ photo, index, sectionLabel, isSectionStart }) => {
12240
- var _a2;
12241
- const isFocused = index === active;
12242
- return /* @__PURE__ */ jsxs(React20.Fragment, { children: [
12243
- sectionLabel && isSectionStart && /* @__PURE__ */ jsx(
12244
- "h2",
12245
- {
12246
- className: cn(
12247
- "px-3 pb-3 font-heading text-lg font-bold uppercase tracking-wide text-white sm:px-4",
12248
- index > 0 ? "pt-8" : "pt-2"
12249
- ),
12250
- children: sectionLabel
12251
- }
12252
- ),
12253
- /* @__PURE__ */ jsxs(
12254
- "figure",
12255
- {
12256
- "data-index": index,
12257
- ref: (el) => {
12258
- itemRefs.current[index] = el;
12259
- },
12260
- className: cn(
12261
- "group relative transition-opacity duration-500",
12262
- // The focused (centred / hovered) photo is at full opacity;
12263
- // every other photo is dimmed a touch so the eye lands on it.
12264
- isFocused ? "opacity-100" : "opacity-[0.65] hover:opacity-100"
12265
- ),
12266
- children: [
12267
- /* @__PURE__ */ jsx("div", { className: "overflow-hidden bg-white/5", children: /* @__PURE__ */ jsx(
12268
- Picture,
12269
- {
12270
- src: photo.src,
12271
- alt: (_a2 = photo.alt) != null ? _a2 : `Photo ${index + 1}`,
12272
- title: photo.caption,
12273
- className: "block h-auto w-full",
12274
- eager: index < 2,
12275
- rootMargin: "800px"
12276
- }
12277
- ) }),
12278
- (photo.caption || photo.credit) && /* @__PURE__ */ jsxs(
12279
- "figcaption",
12280
- {
12281
- className: cn(
12282
- "pointer-events-none absolute inset-x-0 bottom-0 flex flex-col items-end gap-0.5 bg-gradient-to-t from-black/60 via-black/20 to-transparent px-3 pb-3 pt-12 text-right transition-opacity duration-500 sm:px-4",
12283
- isFocused ? "opacity-100" : "opacity-0 group-hover:opacity-100"
12284
- ),
12285
- children: [
12286
- photo.caption && /* @__PURE__ */ jsx("p", { className: "font-ui text-sm font-medium leading-snug text-white drop-shadow-md", children: photo.caption }),
12287
- photo.credit && /* @__PURE__ */ jsxs("p", { className: "font-ui text-xs text-white/80 drop-shadow-md", children: [
12288
- "\xA9 ",
12289
- photo.credit
12290
- ] })
12291
- ]
12292
- }
12293
- )
12294
- ]
12295
- }
12296
- )
12297
- ] }, index);
12298
- }) })
12299
- }
12300
- )
12290
+ ] })
12301
12291
  ] });
12302
12292
  }
12303
12293
  var PhotoTourContext = React20.createContext(null);
@@ -14861,6 +14851,8 @@ function useHlsVideo(videoRef, src) {
14861
14851
  }
14862
14852
  function TripHeader({
14863
14853
  images,
14854
+ heroImageSrcSet,
14855
+ heroImageSizes,
14864
14856
  videoUrl,
14865
14857
  title,
14866
14858
  breadcrumb,
@@ -14940,6 +14932,8 @@ function TripHeader({
14940
14932
  Picture,
14941
14933
  {
14942
14934
  src: validImages[0],
14935
+ srcSet: heroImageSrcSet,
14936
+ sizes: heroImageSizes,
14943
14937
  alt: "",
14944
14938
  "aria-hidden": true,
14945
14939
  fetchPriority: "high",
@@ -14978,6 +14972,8 @@ function TripHeader({
14978
14972
  Picture,
14979
14973
  {
14980
14974
  src: currentSrc,
14975
+ srcSet: safeIndex === 0 ? heroImageSrcSet : void 0,
14976
+ sizes: safeIndex === 0 ? heroImageSizes : void 0,
14981
14977
  alt: title,
14982
14978
  fetchPriority: safeIndex === 0 ? "high" : "auto",
14983
14979
  eager: safeIndex === 0,
@@ -15550,6 +15546,8 @@ function TripPage({
15550
15546
  duration,
15551
15547
  groupSize,
15552
15548
  images,
15549
+ heroImageSrcSet,
15550
+ heroImageSizes,
15553
15551
  videoUrl,
15554
15552
  breadcrumb,
15555
15553
  chips,
@@ -15781,6 +15779,8 @@ function TripPage({
15781
15779
  TripHeader,
15782
15780
  {
15783
15781
  images,
15782
+ heroImageSrcSet,
15783
+ heroImageSizes,
15784
15784
  videoUrl,
15785
15785
  title,
15786
15786
  breadcrumb,
@@ -16290,6 +16290,7 @@ function CategoryPage2({
16290
16290
  faqInitialCount = 5,
16291
16291
  gallery,
16292
16292
  galleryTitle,
16293
+ galleryLightbox = "classic",
16293
16294
  loadMoreLabel,
16294
16295
  showLessLabel,
16295
16296
  seeMoreLabel,
@@ -16552,7 +16553,15 @@ function CategoryPage2({
16552
16553
  ] }),
16553
16554
  gallery && gallery.length > 0 && /* @__PURE__ */ jsxs("section", { className: "pt-4", children: [
16554
16555
  galleryTitle && /* @__PURE__ */ jsx("h2", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 mb-6 text-2xl sm:text-3xl font-bold text-foreground font-heading", children: galleryTitle }),
16555
- /* @__PURE__ */ jsx(PhotoGallery, { photos: gallery, variant: "gridCompact", initialVisible: 8 })
16556
+ /* @__PURE__ */ jsx(
16557
+ PhotoGallery,
16558
+ {
16559
+ photos: gallery,
16560
+ variant: "gridCompact",
16561
+ initialVisible: 8,
16562
+ lightbox: galleryLightbox
16563
+ }
16564
+ )
16556
16565
  ] }),
16557
16566
  (aboutTitle || aboutContent || blogPostsTitle || blogPosts && blogPosts.length > 0) && /* @__PURE__ */ jsx("section", { className: "w-full bg-gray-100", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 sm:px-8 py-14", children: [
16558
16567
  (aboutTitle || blogPostsTitle) && /* @__PURE__ */ jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground font-heading mb-5", children: aboutTitle != null ? aboutTitle : blogPostsTitle }),