@opensite/ui 3.9.0 → 3.11.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/registry.js CHANGED
@@ -26,6 +26,7 @@ import Autoplay from 'embla-carousel-autoplay';
26
26
  import * as ProgressPrimitive from '@radix-ui/react-progress';
27
27
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
28
28
  import AutoScroll3 from 'embla-carousel-auto-scroll';
29
+ import { ImmersiveFeedProvider, ImmersiveViewer, useImmersiveFeed, ThumbnailCard } from '@page-speed/media-immersive';
29
30
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
30
31
  import * as LabelPrimitive from '@radix-ui/react-label';
31
32
  import { SocialShare } from '@page-speed/social-share';
@@ -35231,6 +35232,370 @@ function InteriorCarousel({
35231
35232
  }
35232
35233
  );
35233
35234
  }
35235
+ var IG_TILE_WIDTH = 320;
35236
+ var IG_TILE_STYLE = { width: "100%" };
35237
+ var TITLE_MAX = 90;
35238
+ function truncate(text, max = TITLE_MAX) {
35239
+ const trimmed = text.trim();
35240
+ if (trimmed.length <= max) return trimmed;
35241
+ const slice = trimmed.slice(0, max);
35242
+ const lastSpace = slice.lastIndexOf(" ");
35243
+ const head = lastSpace > max * 0.6 ? slice.slice(0, lastSpace) : slice;
35244
+ return `${head.trimEnd()}\u2026`;
35245
+ }
35246
+ function captionToString(caption) {
35247
+ return typeof caption === "string" ? caption : "";
35248
+ }
35249
+ function toMediaItem(item) {
35250
+ const isVideo = Boolean(item.isVideo && item.videoUrl);
35251
+ const fullCaption = captionToString(item.caption);
35252
+ const title = truncate(fullCaption) || item.imageAlt || "Instagram post";
35253
+ const meta = {
35254
+ href: item.href,
35255
+ likeCount: item.likeCount,
35256
+ commentCount: item.commentCount,
35257
+ viewCount: item.viewCount,
35258
+ date: item.date
35259
+ };
35260
+ return {
35261
+ id: item.id,
35262
+ type: isVideo ? "video" : "image",
35263
+ poster: item.image,
35264
+ // Video source only when the post is a real video (image posts ignore it).
35265
+ src: isVideo ? item.videoUrl : void 0,
35266
+ title,
35267
+ caption: fullCaption || void 0,
35268
+ kind: "Instagram",
35269
+ meta
35270
+ };
35271
+ }
35272
+ function openPermalink(item) {
35273
+ if (typeof window === "undefined") return;
35274
+ const href = item.meta?.href;
35275
+ if (!href) return;
35276
+ window.open(href, "_blank", "noopener,noreferrer");
35277
+ }
35278
+ function likeBadge(likeCount) {
35279
+ return /* @__PURE__ */ jsxs(
35280
+ "span",
35281
+ {
35282
+ "aria-label": `${likeCount.toLocaleString()} likes`,
35283
+ style: {
35284
+ display: "inline-flex",
35285
+ alignItems: "center",
35286
+ gap: 4,
35287
+ padding: "3px 8px",
35288
+ borderRadius: 999,
35289
+ background: "rgba(8,12,24,0.65)",
35290
+ backdropFilter: "blur(6px)",
35291
+ WebkitBackdropFilter: "blur(6px)",
35292
+ color: "#fff",
35293
+ fontSize: 11,
35294
+ fontWeight: 700,
35295
+ lineHeight: 1
35296
+ },
35297
+ children: [
35298
+ /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/heart", size: 13, "aria-hidden": "true" }),
35299
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: likeCount.toLocaleString() })
35300
+ ]
35301
+ }
35302
+ );
35303
+ }
35304
+ var VIEWER_ACTIONS = [
35305
+ {
35306
+ id: "open-in-instagram",
35307
+ icon: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/external-link", size: 22, "aria-hidden": "true" }),
35308
+ label: "Instagram",
35309
+ ariaLabel: "Open in Instagram",
35310
+ onPress: (item) => openPermalink(item)
35311
+ }
35312
+ ];
35313
+ function RailStat({
35314
+ iconName,
35315
+ count,
35316
+ label,
35317
+ onPress
35318
+ }) {
35319
+ return /* @__PURE__ */ jsxs(
35320
+ "button",
35321
+ {
35322
+ type: "button",
35323
+ "aria-label": `${count.toLocaleString()} ${label}`,
35324
+ onClick: (e) => {
35325
+ e.stopPropagation();
35326
+ onPress();
35327
+ },
35328
+ style: {
35329
+ display: "flex",
35330
+ flexDirection: "column",
35331
+ alignItems: "center",
35332
+ gap: 5,
35333
+ padding: 0,
35334
+ border: "none",
35335
+ background: "transparent",
35336
+ color: "inherit",
35337
+ cursor: "pointer",
35338
+ font: "inherit"
35339
+ },
35340
+ children: [
35341
+ /* @__PURE__ */ jsx(
35342
+ "span",
35343
+ {
35344
+ style: {
35345
+ width: 46,
35346
+ height: 46,
35347
+ borderRadius: "50%",
35348
+ background: "var(--psmi-chrome-bg, rgba(255,255,255,0.14))",
35349
+ backdropFilter: "blur(6px)",
35350
+ WebkitBackdropFilter: "blur(6px)",
35351
+ display: "flex",
35352
+ alignItems: "center",
35353
+ justifyContent: "center"
35354
+ },
35355
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: iconName, size: 22, "aria-hidden": "true" })
35356
+ }
35357
+ ),
35358
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: { fontSize: 11, fontWeight: 600 }, children: count.toLocaleString() })
35359
+ ]
35360
+ }
35361
+ );
35362
+ }
35363
+ function InstagramViewerRail({ item }) {
35364
+ const meta = item.meta ?? {};
35365
+ const open = () => openPermalink(item);
35366
+ return /* @__PURE__ */ jsxs(
35367
+ "div",
35368
+ {
35369
+ style: {
35370
+ position: "absolute",
35371
+ right: 11,
35372
+ bottom: 135,
35373
+ display: "flex",
35374
+ flexDirection: "column",
35375
+ alignItems: "center",
35376
+ gap: 18,
35377
+ color: "var(--psmi-chrome-fg, #fff)",
35378
+ zIndex: 3
35379
+ },
35380
+ children: [
35381
+ typeof meta.likeCount === "number" ? /* @__PURE__ */ jsx(
35382
+ RailStat,
35383
+ {
35384
+ iconName: "lucide/heart",
35385
+ count: meta.likeCount,
35386
+ label: "likes",
35387
+ onPress: open
35388
+ }
35389
+ ) : null,
35390
+ typeof meta.commentCount === "number" ? /* @__PURE__ */ jsx(
35391
+ RailStat,
35392
+ {
35393
+ iconName: "lucide/message-circle",
35394
+ count: meta.commentCount,
35395
+ label: "comments",
35396
+ onPress: open
35397
+ }
35398
+ ) : null,
35399
+ typeof meta.viewCount === "number" ? /* @__PURE__ */ jsx(
35400
+ RailStat,
35401
+ {
35402
+ iconName: "lucide/eye",
35403
+ count: meta.viewCount,
35404
+ label: "views",
35405
+ onPress: open
35406
+ }
35407
+ ) : null,
35408
+ meta.href ? /* @__PURE__ */ jsxs(
35409
+ "a",
35410
+ {
35411
+ href: meta.href,
35412
+ target: "_blank",
35413
+ rel: "noopener noreferrer",
35414
+ "aria-label": "Open in Instagram",
35415
+ onClick: (e) => e.stopPropagation(),
35416
+ style: {
35417
+ display: "flex",
35418
+ flexDirection: "column",
35419
+ alignItems: "center",
35420
+ gap: 5,
35421
+ padding: 0,
35422
+ border: "none",
35423
+ background: "transparent",
35424
+ color: "inherit",
35425
+ cursor: "pointer",
35426
+ font: "inherit",
35427
+ textDecoration: "none"
35428
+ },
35429
+ children: [
35430
+ /* @__PURE__ */ jsx(
35431
+ "span",
35432
+ {
35433
+ style: {
35434
+ width: 46,
35435
+ height: 46,
35436
+ borderRadius: "50%",
35437
+ background: "var(--psmi-chrome-bg, rgba(255,255,255,0.14))",
35438
+ backdropFilter: "blur(6px)",
35439
+ WebkitBackdropFilter: "blur(6px)",
35440
+ display: "flex",
35441
+ alignItems: "center",
35442
+ justifyContent: "center"
35443
+ },
35444
+ children: /* @__PURE__ */ jsx(
35445
+ DynamicIcon,
35446
+ {
35447
+ name: "lucide/external-link",
35448
+ size: 22,
35449
+ "aria-hidden": "true"
35450
+ }
35451
+ )
35452
+ }
35453
+ ),
35454
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: { fontSize: 11, fontWeight: 600 }, children: "Instagram" })
35455
+ ]
35456
+ }
35457
+ ) : null
35458
+ ]
35459
+ }
35460
+ );
35461
+ }
35462
+ function InstagramFeedGrid({
35463
+ mediaItems,
35464
+ gridClassName,
35465
+ itemClassName,
35466
+ imageClassName,
35467
+ optixFlowConfig
35468
+ }) {
35469
+ const { open } = useImmersiveFeed();
35470
+ const posterImgProps = useMemo(() => {
35471
+ const next = {};
35472
+ if (imageClassName) next.className = imageClassName;
35473
+ if (optixFlowConfig) next.optixFlowConfig = optixFlowConfig;
35474
+ return Object.keys(next).length > 0 ? next : void 0;
35475
+ }, [imageClassName, optixFlowConfig]);
35476
+ return /* @__PURE__ */ jsx(
35477
+ "div",
35478
+ {
35479
+ className: cn(
35480
+ "grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4",
35481
+ gridClassName
35482
+ ),
35483
+ children: mediaItems.map((mediaItem) => {
35484
+ const likeCount = mediaItem.meta?.likeCount;
35485
+ return /* @__PURE__ */ jsx(
35486
+ ThumbnailCard,
35487
+ {
35488
+ item: mediaItem,
35489
+ onOpen: open,
35490
+ size: IG_TILE_WIDTH,
35491
+ style: IG_TILE_STYLE,
35492
+ className: itemClassName,
35493
+ elevated: false,
35494
+ showDuration: false,
35495
+ glyphMode: "hover",
35496
+ posterImgProps,
35497
+ badgeSlot: typeof likeCount === "number" ? likeBadge(likeCount) : void 0
35498
+ },
35499
+ mediaItem.id
35500
+ );
35501
+ })
35502
+ }
35503
+ );
35504
+ }
35505
+ function InstagramPostGrid({
35506
+ sectionId = "instagram-post-grid",
35507
+ heading,
35508
+ subheading,
35509
+ items,
35510
+ itemsSlot,
35511
+ className,
35512
+ containerClassName,
35513
+ headerClassName,
35514
+ headingClassName,
35515
+ subheadingClassName,
35516
+ gridClassName,
35517
+ itemClassName,
35518
+ imageClassName,
35519
+ optixFlowConfig,
35520
+ background,
35521
+ spacing,
35522
+ pattern,
35523
+ patternOpacity,
35524
+ patternClassName
35525
+ }) {
35526
+ const mediaItems = useMemo(() => {
35527
+ if (itemsSlot || !items) return [];
35528
+ return items.filter((item) => Boolean(item.image)).map(toMediaItem);
35529
+ }, [items, itemsSlot]);
35530
+ if (!itemsSlot && (!items || items.length === 0)) {
35531
+ return null;
35532
+ }
35533
+ return /* @__PURE__ */ jsxs(
35534
+ Section,
35535
+ {
35536
+ id: sectionId,
35537
+ background,
35538
+ spacing,
35539
+ pattern,
35540
+ patternOpacity,
35541
+ patternClassName,
35542
+ className,
35543
+ containerClassName,
35544
+ children: [
35545
+ (heading || subheading) && /* @__PURE__ */ jsxs("div", { className: cn("mb-8 flex flex-col gap-2", headerClassName), children: [
35546
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
35547
+ "h2",
35548
+ {
35549
+ className: cn(
35550
+ "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl text-balance",
35551
+ headingClassName
35552
+ ),
35553
+ children: heading
35554
+ }
35555
+ ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
35556
+ subheading && (typeof subheading === "string" ? /* @__PURE__ */ jsx(
35557
+ "p",
35558
+ {
35559
+ className: cn(
35560
+ "max-w-2xl text-balance text-muted-foreground",
35561
+ subheadingClassName
35562
+ ),
35563
+ children: subheading
35564
+ }
35565
+ ) : /* @__PURE__ */ jsx("div", { className: subheadingClassName, children: subheading }))
35566
+ ] }),
35567
+ itemsSlot ? /* @__PURE__ */ jsx(
35568
+ "div",
35569
+ {
35570
+ className: cn(
35571
+ "grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4",
35572
+ gridClassName
35573
+ ),
35574
+ children: itemsSlot
35575
+ }
35576
+ ) : /* @__PURE__ */ jsxs(ImmersiveFeedProvider, { items: mediaItems, actions: VIEWER_ACTIONS, children: [
35577
+ /* @__PURE__ */ jsx(
35578
+ InstagramFeedGrid,
35579
+ {
35580
+ mediaItems,
35581
+ gridClassName,
35582
+ itemClassName,
35583
+ imageClassName,
35584
+ optixFlowConfig
35585
+ }
35586
+ ),
35587
+ /* @__PURE__ */ jsx(
35588
+ ImmersiveViewer,
35589
+ {
35590
+ ariaLabel: "Instagram post viewer",
35591
+ renderActions: ({ item }) => /* @__PURE__ */ jsx(InstagramViewerRail, { item })
35592
+ }
35593
+ )
35594
+ ] })
35595
+ ]
35596
+ }
35597
+ );
35598
+ }
35234
35599
  function RadialGradientTop({
35235
35600
  className,
35236
35601
  children,
@@ -111106,6 +111471,75 @@ var interiorCarousel = {
111106
111471
  ]
111107
111472
  }
111108
111473
  };
111474
+ var instagramPostGrid = {
111475
+ exampleUsage: "Display a website's Instagram feed as a responsive grid of vertical (9:16) tiles that open a fullscreen, swipeable immersive viewer (TikTok/Reels-style). Photos and reels are both first-class media \u2014 reels play a muted preview and open with playback; photos open as a full-bleed still. Each tile shows a like-count pill top-left (when available), no duration timestamp, and a center glyph on hover only (a play triangle for reels, an expand icon for photos). The fullscreen viewer carries the caption plus a read-only engagement rail (likes/comments/views) and an explicit 'Open in Instagram' link (a real anchor opening in a new tab). Data is hydrated from the toastability Instagram feed (dataSource type 'instagram_feed', bindTo 'items').",
111476
+ importantUsageNotes: `${GALLERY_MEDIA_NOTE} This is a DYNAMIC feed block: its 'items' are hydrated at routing-build time from the connected Instagram profile \u2014 do NOT hand-author post content. 'items[].image' and 'items[].videoUrl' MUST be the re-hosted MediaRecord CDN URLs served by the feed; expiring Instagram CDN URLs must never be used. Tiles are VERTICAL (9:16) and render both photos and reels; a post is treated as a reel only when 'isVideo' is true AND 'videoUrl' is present. Engagement counts ('likeCount', 'commentCount', 'viewCount') render only when the value is present \u2014 never fabricate a zero for a missing metric; 'likeCount' surfaces as the tile's top-left pill and, with comments/views, in the viewer rail. Tapping a tile OPENS THE FULLSCREEN VIEWER (the whole-tile link-out was replaced); the instagram.com permalink ('items[].href') opens from the viewer's 'Open in Instagram' egress, which is rendered as a REAL anchor (target=_blank, rel=noopener noreferrer) \u2014 a crawlable, affordance-correct link, not a scripted window.open button. 'items[].caption' should be a plain STRING when rendered immersively \u2014 it flows through as the tile/viewer title text; a rich ReactNode caption cannot be threaded through the immersive card/viewer and falls back to 'items[].imageAlt' (then a generic label). Consumer image styling is honored: 'imageClassName' and 'optixFlowConfig' are forwarded onto each tile's poster image. Items without an 'image' are skipped; an empty or missing 'items' array renders nothing. Requires the site to have a connected, fully-imported Instagram profile ('instagram_media' capability).`,
111477
+ usageRequirements: {
111478
+ requiredProps: ["items"],
111479
+ requiresSiteCapabilities: galleryCapabilities(
111480
+ "instagram_media",
111481
+ "media_library"
111482
+ ),
111483
+ propConstraints: {
111484
+ items: {
111485
+ minItems: 3,
111486
+ maxItems: 24
111487
+ }
111488
+ },
111489
+ mediaSlots: {
111490
+ "items[].image": {
111491
+ path: "items[].image",
111492
+ roles: ["gallery"],
111493
+ required: true
111494
+ },
111495
+ "items[].videoUrl": {
111496
+ path: "items[].videoUrl",
111497
+ roles: ["gallery"],
111498
+ required: false
111499
+ }
111500
+ }
111501
+ },
111502
+ exampleProps: {
111503
+ heading: "Follow us on Instagram",
111504
+ subheading: "The latest from our feed.",
111505
+ background: "white",
111506
+ spacing: "lg",
111507
+ items: [
111508
+ {
111509
+ id: "1",
111510
+ href: "https://www.instagram.com/p/CxAmpLe001/",
111511
+ image: GALLERY_EXAMPLE_IMAGE_URL,
111512
+ imageAlt: "Espresso being poured at the counter",
111513
+ caption: "Morning pours before the rush \u2615\uFE0F",
111514
+ date: "Jul 1, 2026",
111515
+ likeCount: 128,
111516
+ commentCount: 12
111517
+ },
111518
+ {
111519
+ id: "2",
111520
+ href: "https://www.instagram.com/p/CxAmpLe002/",
111521
+ image: GALLERY_EXAMPLE_IMAGE_URL,
111522
+ imageAlt: "Behind the scenes reel",
111523
+ caption: "Behind the scenes of today's bake #freshbread",
111524
+ date: "Jun 28, 2026",
111525
+ isVideo: true,
111526
+ videoUrl: "https://toastability-production.s3.amazonaws.com/4kox2ux0ye1wlqkdwg03s08a67i1",
111527
+ likeCount: 342,
111528
+ commentCount: 21,
111529
+ viewCount: 4820
111530
+ },
111531
+ {
111532
+ id: "3",
111533
+ href: "https://www.instagram.com/p/CxAmpLe003/",
111534
+ image: GALLERY_EXAMPLE_IMAGE_URL,
111535
+ imageAlt: "Weekend brunch spread",
111536
+ caption: "Weekend brunch is back on the menu",
111537
+ date: "Jun 24, 2026",
111538
+ likeCount: 96
111539
+ }
111540
+ ]
111541
+ }
111542
+ };
111109
111543
  var GALLERY_BLOCK_CONTRACTS = {
111110
111544
  "expandable-case-study-cards": expandableCaseStudyCards,
111111
111545
  "carousel-badge-cards": carouselBadgeCards,
@@ -111122,7 +111556,8 @@ var GALLERY_BLOCK_CONTRACTS = {
111122
111556
  "carousel-scale-focus": carouselScaleFocus,
111123
111557
  "masonry-motion-grid": masonryMotionGrid,
111124
111558
  "blur-vignette-grid": blurVignetteGrid,
111125
- "interior-carousel": interiorCarousel
111559
+ "interior-carousel": interiorCarousel,
111560
+ "instagram-post-grid": instagramPostGrid
111126
111561
  };
111127
111562
  var FOOTER_EXAMPLE_IMAGE_URL = "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp";
111128
111563
  var FOOTER_MEDIA_NOTE = "All media src values must be absolute URLs to real assets; relative paths and placeholder media variables are not allowed.";
@@ -124517,6 +124952,26 @@ var BLOCK_REGISTRY = {
124517
124952
  props: "InteriorCarouselProps",
124518
124953
  ...GALLERY_BLOCK_CONTRACTS["interior-carousel"]
124519
124954
  },
124955
+ "instagram-post-grid": {
124956
+ id: "instagram-post-grid",
124957
+ name: "Instagram Post Grid",
124958
+ description: "A responsive grid of vertical (9:16) tiles rendering a website's Instagram feed. Tapping a tile opens a fullscreen, swipeable immersive viewer (TikTok/Reels-style) with the caption, a read-only engagement rail (likes/comments/views), and an 'Open in Instagram' action. Photos and reels are both first-class media; each tile shows a like-count pill and a hover-only center glyph (play for reels, expand for photos). Content is hydrated dynamically from the connected Instagram profile. Ideal for social proof sections, footers, and community pages that showcase a live Instagram presence.",
124959
+ semanticTags: [
124960
+ "gallery",
124961
+ "instagram",
124962
+ "social",
124963
+ "feed",
124964
+ "grid",
124965
+ "photos",
124966
+ "video",
124967
+ "dynamic",
124968
+ "community"
124969
+ ],
124970
+ category: "gallery",
124971
+ component: InstagramPostGrid,
124972
+ props: "InstagramPostGridProps",
124973
+ ...GALLERY_BLOCK_CONTRACTS["instagram-post-grid"]
124974
+ },
124520
124975
  "radial-gradient-top": {
124521
124976
  id: "radial-gradient-top",
124522
124977
  name: "Radial Gradient Top",
@@ -77,6 +77,6 @@ interface SocialLinkIconProps extends Omit<PressableProps, "children">, SocialLi
77
77
  * />
78
78
  * ```
79
79
  */
80
- declare const SocialLinkIcon: React.ForwardRefExoticComponent<SocialLinkIconProps & React.RefAttributes<HTMLButtonElement | HTMLAnchorElement | HTMLSpanElement>>;
80
+ declare const SocialLinkIcon: React.ForwardRefExoticComponent<SocialLinkIconProps & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement | HTMLSpanElement>>;
81
81
 
82
82
  export { SocialLinkIcon, type SocialLinkIconDynamicIconProps, type SocialLinkIconProps };
@@ -77,6 +77,6 @@ interface SocialLinkIconProps extends Omit<PressableProps, "children">, SocialLi
77
77
  * />
78
78
  * ```
79
79
  */
80
- declare const SocialLinkIcon: React.ForwardRefExoticComponent<SocialLinkIconProps & React.RefAttributes<HTMLButtonElement | HTMLAnchorElement | HTMLSpanElement>>;
80
+ declare const SocialLinkIcon: React.ForwardRefExoticComponent<SocialLinkIconProps & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement | HTMLSpanElement>>;
81
81
 
82
82
  export { SocialLinkIcon, type SocialLinkIconDynamicIconProps, type SocialLinkIconProps };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensite/ui",
3
- "version": "3.9.0",
3
+ "version": "3.11.0",
4
4
  "description": "Foundational UI component library for OpenSite Semantic Site Builder with tree-shakable exports and abstract styling",
5
5
  "keywords": [
6
6
  "react",
@@ -1376,6 +1376,11 @@
1376
1376
  "import": "./dist/expandable-case-study-cards.js",
1377
1377
  "require": "./dist/expandable-case-study-cards.cjs"
1378
1378
  },
1379
+ "./blocks/gallery/instagram-post-grid": {
1380
+ "types": "./dist/instagram-post-grid.d.ts",
1381
+ "import": "./dist/instagram-post-grid.js",
1382
+ "require": "./dist/instagram-post-grid.cjs"
1383
+ },
1379
1384
  "./blocks/gallery/interior-carousel": {
1380
1385
  "types": "./dist/interior-carousel.d.ts",
1381
1386
  "import": "./dist/interior-carousel.js",
@@ -3432,6 +3437,7 @@
3432
3437
  "@page-speed/lightbox": "^0.2.1",
3433
3438
  "@page-speed/maps": "0.2.4",
3434
3439
  "@page-speed/markdown-to-jsx": "^0.0.7",
3440
+ "@page-speed/media-immersive": "0.5.0",
3435
3441
  "@page-speed/pdf-viewer": ">=0.1.9",
3436
3442
  "@page-speed/skins": "0.1.2",
3437
3443
  "@page-speed/social-share": "0.1.7",