@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/instagram-post-grid.cjs +789 -0
- package/dist/instagram-post-grid.d.cts +197 -0
- package/dist/instagram-post-grid.d.ts +197 -0
- package/dist/instagram-post-grid.js +768 -0
- package/dist/registry.cjs +456 -1
- package/dist/registry.d.cts +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.js +456 -1
- package/dist/social-link-icon.d.cts +1 -1
- package/dist/social-link-icon.d.ts +1 -1
- package/package.json +7 -1
package/dist/registry.cjs
CHANGED
|
@@ -27,6 +27,7 @@ var Autoplay = require('embla-carousel-autoplay');
|
|
|
27
27
|
var ProgressPrimitive = require('@radix-ui/react-progress');
|
|
28
28
|
var AvatarPrimitive = require('@radix-ui/react-avatar');
|
|
29
29
|
var AutoScroll3 = require('embla-carousel-auto-scroll');
|
|
30
|
+
var mediaImmersive = require('@page-speed/media-immersive');
|
|
30
31
|
var CheckboxPrimitive = require('@radix-ui/react-checkbox');
|
|
31
32
|
var LabelPrimitive = require('@radix-ui/react-label');
|
|
32
33
|
var socialShare = require('@page-speed/social-share');
|
|
@@ -35271,6 +35272,370 @@ function InteriorCarousel({
|
|
|
35271
35272
|
}
|
|
35272
35273
|
);
|
|
35273
35274
|
}
|
|
35275
|
+
var IG_TILE_WIDTH = 320;
|
|
35276
|
+
var IG_TILE_STYLE = { width: "100%" };
|
|
35277
|
+
var TITLE_MAX = 90;
|
|
35278
|
+
function truncate(text, max = TITLE_MAX) {
|
|
35279
|
+
const trimmed = text.trim();
|
|
35280
|
+
if (trimmed.length <= max) return trimmed;
|
|
35281
|
+
const slice = trimmed.slice(0, max);
|
|
35282
|
+
const lastSpace = slice.lastIndexOf(" ");
|
|
35283
|
+
const head = lastSpace > max * 0.6 ? slice.slice(0, lastSpace) : slice;
|
|
35284
|
+
return `${head.trimEnd()}\u2026`;
|
|
35285
|
+
}
|
|
35286
|
+
function captionToString(caption) {
|
|
35287
|
+
return typeof caption === "string" ? caption : "";
|
|
35288
|
+
}
|
|
35289
|
+
function toMediaItem(item) {
|
|
35290
|
+
const isVideo = Boolean(item.isVideo && item.videoUrl);
|
|
35291
|
+
const fullCaption = captionToString(item.caption);
|
|
35292
|
+
const title = truncate(fullCaption) || item.imageAlt || "Instagram post";
|
|
35293
|
+
const meta = {
|
|
35294
|
+
href: item.href,
|
|
35295
|
+
likeCount: item.likeCount,
|
|
35296
|
+
commentCount: item.commentCount,
|
|
35297
|
+
viewCount: item.viewCount,
|
|
35298
|
+
date: item.date
|
|
35299
|
+
};
|
|
35300
|
+
return {
|
|
35301
|
+
id: item.id,
|
|
35302
|
+
type: isVideo ? "video" : "image",
|
|
35303
|
+
poster: item.image,
|
|
35304
|
+
// Video source only when the post is a real video (image posts ignore it).
|
|
35305
|
+
src: isVideo ? item.videoUrl : void 0,
|
|
35306
|
+
title,
|
|
35307
|
+
caption: fullCaption || void 0,
|
|
35308
|
+
kind: "Instagram",
|
|
35309
|
+
meta
|
|
35310
|
+
};
|
|
35311
|
+
}
|
|
35312
|
+
function openPermalink(item) {
|
|
35313
|
+
if (typeof window === "undefined") return;
|
|
35314
|
+
const href = item.meta?.href;
|
|
35315
|
+
if (!href) return;
|
|
35316
|
+
window.open(href, "_blank", "noopener,noreferrer");
|
|
35317
|
+
}
|
|
35318
|
+
function likeBadge(likeCount) {
|
|
35319
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
35320
|
+
"span",
|
|
35321
|
+
{
|
|
35322
|
+
"aria-label": `${likeCount.toLocaleString()} likes`,
|
|
35323
|
+
style: {
|
|
35324
|
+
display: "inline-flex",
|
|
35325
|
+
alignItems: "center",
|
|
35326
|
+
gap: 4,
|
|
35327
|
+
padding: "3px 8px",
|
|
35328
|
+
borderRadius: 999,
|
|
35329
|
+
background: "rgba(8,12,24,0.65)",
|
|
35330
|
+
backdropFilter: "blur(6px)",
|
|
35331
|
+
WebkitBackdropFilter: "blur(6px)",
|
|
35332
|
+
color: "#fff",
|
|
35333
|
+
fontSize: 11,
|
|
35334
|
+
fontWeight: 700,
|
|
35335
|
+
lineHeight: 1
|
|
35336
|
+
},
|
|
35337
|
+
children: [
|
|
35338
|
+
/* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/heart", size: 13, "aria-hidden": "true" }),
|
|
35339
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: likeCount.toLocaleString() })
|
|
35340
|
+
]
|
|
35341
|
+
}
|
|
35342
|
+
);
|
|
35343
|
+
}
|
|
35344
|
+
var VIEWER_ACTIONS = [
|
|
35345
|
+
{
|
|
35346
|
+
id: "open-in-instagram",
|
|
35347
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/external-link", size: 22, "aria-hidden": "true" }),
|
|
35348
|
+
label: "Instagram",
|
|
35349
|
+
ariaLabel: "Open in Instagram",
|
|
35350
|
+
onPress: (item) => openPermalink(item)
|
|
35351
|
+
}
|
|
35352
|
+
];
|
|
35353
|
+
function RailStat({
|
|
35354
|
+
iconName,
|
|
35355
|
+
count,
|
|
35356
|
+
label,
|
|
35357
|
+
onPress
|
|
35358
|
+
}) {
|
|
35359
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
35360
|
+
"button",
|
|
35361
|
+
{
|
|
35362
|
+
type: "button",
|
|
35363
|
+
"aria-label": `${count.toLocaleString()} ${label}`,
|
|
35364
|
+
onClick: (e) => {
|
|
35365
|
+
e.stopPropagation();
|
|
35366
|
+
onPress();
|
|
35367
|
+
},
|
|
35368
|
+
style: {
|
|
35369
|
+
display: "flex",
|
|
35370
|
+
flexDirection: "column",
|
|
35371
|
+
alignItems: "center",
|
|
35372
|
+
gap: 5,
|
|
35373
|
+
padding: 0,
|
|
35374
|
+
border: "none",
|
|
35375
|
+
background: "transparent",
|
|
35376
|
+
color: "inherit",
|
|
35377
|
+
cursor: "pointer",
|
|
35378
|
+
font: "inherit"
|
|
35379
|
+
},
|
|
35380
|
+
children: [
|
|
35381
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
35382
|
+
"span",
|
|
35383
|
+
{
|
|
35384
|
+
style: {
|
|
35385
|
+
width: 46,
|
|
35386
|
+
height: 46,
|
|
35387
|
+
borderRadius: "50%",
|
|
35388
|
+
background: "var(--psmi-chrome-bg, rgba(255,255,255,0.14))",
|
|
35389
|
+
backdropFilter: "blur(6px)",
|
|
35390
|
+
WebkitBackdropFilter: "blur(6px)",
|
|
35391
|
+
display: "flex",
|
|
35392
|
+
alignItems: "center",
|
|
35393
|
+
justifyContent: "center"
|
|
35394
|
+
},
|
|
35395
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: iconName, size: 22, "aria-hidden": "true" })
|
|
35396
|
+
}
|
|
35397
|
+
),
|
|
35398
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", style: { fontSize: 11, fontWeight: 600 }, children: count.toLocaleString() })
|
|
35399
|
+
]
|
|
35400
|
+
}
|
|
35401
|
+
);
|
|
35402
|
+
}
|
|
35403
|
+
function InstagramViewerRail({ item }) {
|
|
35404
|
+
const meta = item.meta ?? {};
|
|
35405
|
+
const open = () => openPermalink(item);
|
|
35406
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
35407
|
+
"div",
|
|
35408
|
+
{
|
|
35409
|
+
style: {
|
|
35410
|
+
position: "absolute",
|
|
35411
|
+
right: 11,
|
|
35412
|
+
bottom: 135,
|
|
35413
|
+
display: "flex",
|
|
35414
|
+
flexDirection: "column",
|
|
35415
|
+
alignItems: "center",
|
|
35416
|
+
gap: 18,
|
|
35417
|
+
color: "var(--psmi-chrome-fg, #fff)",
|
|
35418
|
+
zIndex: 3
|
|
35419
|
+
},
|
|
35420
|
+
children: [
|
|
35421
|
+
typeof meta.likeCount === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
35422
|
+
RailStat,
|
|
35423
|
+
{
|
|
35424
|
+
iconName: "lucide/heart",
|
|
35425
|
+
count: meta.likeCount,
|
|
35426
|
+
label: "likes",
|
|
35427
|
+
onPress: open
|
|
35428
|
+
}
|
|
35429
|
+
) : null,
|
|
35430
|
+
typeof meta.commentCount === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
35431
|
+
RailStat,
|
|
35432
|
+
{
|
|
35433
|
+
iconName: "lucide/message-circle",
|
|
35434
|
+
count: meta.commentCount,
|
|
35435
|
+
label: "comments",
|
|
35436
|
+
onPress: open
|
|
35437
|
+
}
|
|
35438
|
+
) : null,
|
|
35439
|
+
typeof meta.viewCount === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
35440
|
+
RailStat,
|
|
35441
|
+
{
|
|
35442
|
+
iconName: "lucide/eye",
|
|
35443
|
+
count: meta.viewCount,
|
|
35444
|
+
label: "views",
|
|
35445
|
+
onPress: open
|
|
35446
|
+
}
|
|
35447
|
+
) : null,
|
|
35448
|
+
meta.href ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
35449
|
+
"a",
|
|
35450
|
+
{
|
|
35451
|
+
href: meta.href,
|
|
35452
|
+
target: "_blank",
|
|
35453
|
+
rel: "noopener noreferrer",
|
|
35454
|
+
"aria-label": "Open in Instagram",
|
|
35455
|
+
onClick: (e) => e.stopPropagation(),
|
|
35456
|
+
style: {
|
|
35457
|
+
display: "flex",
|
|
35458
|
+
flexDirection: "column",
|
|
35459
|
+
alignItems: "center",
|
|
35460
|
+
gap: 5,
|
|
35461
|
+
padding: 0,
|
|
35462
|
+
border: "none",
|
|
35463
|
+
background: "transparent",
|
|
35464
|
+
color: "inherit",
|
|
35465
|
+
cursor: "pointer",
|
|
35466
|
+
font: "inherit",
|
|
35467
|
+
textDecoration: "none"
|
|
35468
|
+
},
|
|
35469
|
+
children: [
|
|
35470
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
35471
|
+
"span",
|
|
35472
|
+
{
|
|
35473
|
+
style: {
|
|
35474
|
+
width: 46,
|
|
35475
|
+
height: 46,
|
|
35476
|
+
borderRadius: "50%",
|
|
35477
|
+
background: "var(--psmi-chrome-bg, rgba(255,255,255,0.14))",
|
|
35478
|
+
backdropFilter: "blur(6px)",
|
|
35479
|
+
WebkitBackdropFilter: "blur(6px)",
|
|
35480
|
+
display: "flex",
|
|
35481
|
+
alignItems: "center",
|
|
35482
|
+
justifyContent: "center"
|
|
35483
|
+
},
|
|
35484
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
35485
|
+
DynamicIcon,
|
|
35486
|
+
{
|
|
35487
|
+
name: "lucide/external-link",
|
|
35488
|
+
size: 22,
|
|
35489
|
+
"aria-hidden": "true"
|
|
35490
|
+
}
|
|
35491
|
+
)
|
|
35492
|
+
}
|
|
35493
|
+
),
|
|
35494
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", style: { fontSize: 11, fontWeight: 600 }, children: "Instagram" })
|
|
35495
|
+
]
|
|
35496
|
+
}
|
|
35497
|
+
) : null
|
|
35498
|
+
]
|
|
35499
|
+
}
|
|
35500
|
+
);
|
|
35501
|
+
}
|
|
35502
|
+
function InstagramFeedGrid({
|
|
35503
|
+
mediaItems,
|
|
35504
|
+
gridClassName,
|
|
35505
|
+
itemClassName,
|
|
35506
|
+
imageClassName,
|
|
35507
|
+
optixFlowConfig
|
|
35508
|
+
}) {
|
|
35509
|
+
const { open } = mediaImmersive.useImmersiveFeed();
|
|
35510
|
+
const posterImgProps = React30.useMemo(() => {
|
|
35511
|
+
const next = {};
|
|
35512
|
+
if (imageClassName) next.className = imageClassName;
|
|
35513
|
+
if (optixFlowConfig) next.optixFlowConfig = optixFlowConfig;
|
|
35514
|
+
return Object.keys(next).length > 0 ? next : void 0;
|
|
35515
|
+
}, [imageClassName, optixFlowConfig]);
|
|
35516
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
35517
|
+
"div",
|
|
35518
|
+
{
|
|
35519
|
+
className: cn(
|
|
35520
|
+
"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4",
|
|
35521
|
+
gridClassName
|
|
35522
|
+
),
|
|
35523
|
+
children: mediaItems.map((mediaItem) => {
|
|
35524
|
+
const likeCount = mediaItem.meta?.likeCount;
|
|
35525
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
35526
|
+
mediaImmersive.ThumbnailCard,
|
|
35527
|
+
{
|
|
35528
|
+
item: mediaItem,
|
|
35529
|
+
onOpen: open,
|
|
35530
|
+
size: IG_TILE_WIDTH,
|
|
35531
|
+
style: IG_TILE_STYLE,
|
|
35532
|
+
className: itemClassName,
|
|
35533
|
+
elevated: false,
|
|
35534
|
+
showDuration: false,
|
|
35535
|
+
glyphMode: "hover",
|
|
35536
|
+
posterImgProps,
|
|
35537
|
+
badgeSlot: typeof likeCount === "number" ? likeBadge(likeCount) : void 0
|
|
35538
|
+
},
|
|
35539
|
+
mediaItem.id
|
|
35540
|
+
);
|
|
35541
|
+
})
|
|
35542
|
+
}
|
|
35543
|
+
);
|
|
35544
|
+
}
|
|
35545
|
+
function InstagramPostGrid({
|
|
35546
|
+
sectionId = "instagram-post-grid",
|
|
35547
|
+
heading,
|
|
35548
|
+
subheading,
|
|
35549
|
+
items,
|
|
35550
|
+
itemsSlot,
|
|
35551
|
+
className,
|
|
35552
|
+
containerClassName,
|
|
35553
|
+
headerClassName,
|
|
35554
|
+
headingClassName,
|
|
35555
|
+
subheadingClassName,
|
|
35556
|
+
gridClassName,
|
|
35557
|
+
itemClassName,
|
|
35558
|
+
imageClassName,
|
|
35559
|
+
optixFlowConfig,
|
|
35560
|
+
background,
|
|
35561
|
+
spacing,
|
|
35562
|
+
pattern,
|
|
35563
|
+
patternOpacity,
|
|
35564
|
+
patternClassName
|
|
35565
|
+
}) {
|
|
35566
|
+
const mediaItems = React30.useMemo(() => {
|
|
35567
|
+
if (itemsSlot || !items) return [];
|
|
35568
|
+
return items.filter((item) => Boolean(item.image)).map(toMediaItem);
|
|
35569
|
+
}, [items, itemsSlot]);
|
|
35570
|
+
if (!itemsSlot && (!items || items.length === 0)) {
|
|
35571
|
+
return null;
|
|
35572
|
+
}
|
|
35573
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
35574
|
+
Section,
|
|
35575
|
+
{
|
|
35576
|
+
id: sectionId,
|
|
35577
|
+
background,
|
|
35578
|
+
spacing,
|
|
35579
|
+
pattern,
|
|
35580
|
+
patternOpacity,
|
|
35581
|
+
patternClassName,
|
|
35582
|
+
className,
|
|
35583
|
+
containerClassName,
|
|
35584
|
+
children: [
|
|
35585
|
+
(heading || subheading) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mb-8 flex flex-col gap-2", headerClassName), children: [
|
|
35586
|
+
heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
35587
|
+
"h2",
|
|
35588
|
+
{
|
|
35589
|
+
className: cn(
|
|
35590
|
+
"text-xl font-medium tracking-tight md:text-2xl lg:text-3xl text-balance",
|
|
35591
|
+
headingClassName
|
|
35592
|
+
),
|
|
35593
|
+
children: heading
|
|
35594
|
+
}
|
|
35595
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
|
|
35596
|
+
subheading && (typeof subheading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
35597
|
+
"p",
|
|
35598
|
+
{
|
|
35599
|
+
className: cn(
|
|
35600
|
+
"max-w-2xl text-balance text-muted-foreground",
|
|
35601
|
+
subheadingClassName
|
|
35602
|
+
),
|
|
35603
|
+
children: subheading
|
|
35604
|
+
}
|
|
35605
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: subheadingClassName, children: subheading }))
|
|
35606
|
+
] }),
|
|
35607
|
+
itemsSlot ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
35608
|
+
"div",
|
|
35609
|
+
{
|
|
35610
|
+
className: cn(
|
|
35611
|
+
"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4",
|
|
35612
|
+
gridClassName
|
|
35613
|
+
),
|
|
35614
|
+
children: itemsSlot
|
|
35615
|
+
}
|
|
35616
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs(mediaImmersive.ImmersiveFeedProvider, { items: mediaItems, actions: VIEWER_ACTIONS, children: [
|
|
35617
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
35618
|
+
InstagramFeedGrid,
|
|
35619
|
+
{
|
|
35620
|
+
mediaItems,
|
|
35621
|
+
gridClassName,
|
|
35622
|
+
itemClassName,
|
|
35623
|
+
imageClassName,
|
|
35624
|
+
optixFlowConfig
|
|
35625
|
+
}
|
|
35626
|
+
),
|
|
35627
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
35628
|
+
mediaImmersive.ImmersiveViewer,
|
|
35629
|
+
{
|
|
35630
|
+
ariaLabel: "Instagram post viewer",
|
|
35631
|
+
renderActions: ({ item }) => /* @__PURE__ */ jsxRuntime.jsx(InstagramViewerRail, { item })
|
|
35632
|
+
}
|
|
35633
|
+
)
|
|
35634
|
+
] })
|
|
35635
|
+
]
|
|
35636
|
+
}
|
|
35637
|
+
);
|
|
35638
|
+
}
|
|
35274
35639
|
function RadialGradientTop({
|
|
35275
35640
|
className,
|
|
35276
35641
|
children,
|
|
@@ -111146,6 +111511,75 @@ var interiorCarousel = {
|
|
|
111146
111511
|
]
|
|
111147
111512
|
}
|
|
111148
111513
|
};
|
|
111514
|
+
var instagramPostGrid = {
|
|
111515
|
+
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').",
|
|
111516
|
+
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).`,
|
|
111517
|
+
usageRequirements: {
|
|
111518
|
+
requiredProps: ["items"],
|
|
111519
|
+
requiresSiteCapabilities: galleryCapabilities(
|
|
111520
|
+
"instagram_media",
|
|
111521
|
+
"media_library"
|
|
111522
|
+
),
|
|
111523
|
+
propConstraints: {
|
|
111524
|
+
items: {
|
|
111525
|
+
minItems: 3,
|
|
111526
|
+
maxItems: 24
|
|
111527
|
+
}
|
|
111528
|
+
},
|
|
111529
|
+
mediaSlots: {
|
|
111530
|
+
"items[].image": {
|
|
111531
|
+
path: "items[].image",
|
|
111532
|
+
roles: ["gallery"],
|
|
111533
|
+
required: true
|
|
111534
|
+
},
|
|
111535
|
+
"items[].videoUrl": {
|
|
111536
|
+
path: "items[].videoUrl",
|
|
111537
|
+
roles: ["gallery"],
|
|
111538
|
+
required: false
|
|
111539
|
+
}
|
|
111540
|
+
}
|
|
111541
|
+
},
|
|
111542
|
+
exampleProps: {
|
|
111543
|
+
heading: "Follow us on Instagram",
|
|
111544
|
+
subheading: "The latest from our feed.",
|
|
111545
|
+
background: "white",
|
|
111546
|
+
spacing: "lg",
|
|
111547
|
+
items: [
|
|
111548
|
+
{
|
|
111549
|
+
id: "1",
|
|
111550
|
+
href: "https://www.instagram.com/p/CxAmpLe001/",
|
|
111551
|
+
image: GALLERY_EXAMPLE_IMAGE_URL,
|
|
111552
|
+
imageAlt: "Espresso being poured at the counter",
|
|
111553
|
+
caption: "Morning pours before the rush \u2615\uFE0F",
|
|
111554
|
+
date: "Jul 1, 2026",
|
|
111555
|
+
likeCount: 128,
|
|
111556
|
+
commentCount: 12
|
|
111557
|
+
},
|
|
111558
|
+
{
|
|
111559
|
+
id: "2",
|
|
111560
|
+
href: "https://www.instagram.com/p/CxAmpLe002/",
|
|
111561
|
+
image: GALLERY_EXAMPLE_IMAGE_URL,
|
|
111562
|
+
imageAlt: "Behind the scenes reel",
|
|
111563
|
+
caption: "Behind the scenes of today's bake #freshbread",
|
|
111564
|
+
date: "Jun 28, 2026",
|
|
111565
|
+
isVideo: true,
|
|
111566
|
+
videoUrl: "https://toastability-production.s3.amazonaws.com/4kox2ux0ye1wlqkdwg03s08a67i1",
|
|
111567
|
+
likeCount: 342,
|
|
111568
|
+
commentCount: 21,
|
|
111569
|
+
viewCount: 4820
|
|
111570
|
+
},
|
|
111571
|
+
{
|
|
111572
|
+
id: "3",
|
|
111573
|
+
href: "https://www.instagram.com/p/CxAmpLe003/",
|
|
111574
|
+
image: GALLERY_EXAMPLE_IMAGE_URL,
|
|
111575
|
+
imageAlt: "Weekend brunch spread",
|
|
111576
|
+
caption: "Weekend brunch is back on the menu",
|
|
111577
|
+
date: "Jun 24, 2026",
|
|
111578
|
+
likeCount: 96
|
|
111579
|
+
}
|
|
111580
|
+
]
|
|
111581
|
+
}
|
|
111582
|
+
};
|
|
111149
111583
|
var GALLERY_BLOCK_CONTRACTS = {
|
|
111150
111584
|
"expandable-case-study-cards": expandableCaseStudyCards,
|
|
111151
111585
|
"carousel-badge-cards": carouselBadgeCards,
|
|
@@ -111162,7 +111596,8 @@ var GALLERY_BLOCK_CONTRACTS = {
|
|
|
111162
111596
|
"carousel-scale-focus": carouselScaleFocus,
|
|
111163
111597
|
"masonry-motion-grid": masonryMotionGrid,
|
|
111164
111598
|
"blur-vignette-grid": blurVignetteGrid,
|
|
111165
|
-
"interior-carousel": interiorCarousel
|
|
111599
|
+
"interior-carousel": interiorCarousel,
|
|
111600
|
+
"instagram-post-grid": instagramPostGrid
|
|
111166
111601
|
};
|
|
111167
111602
|
var FOOTER_EXAMPLE_IMAGE_URL = "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp";
|
|
111168
111603
|
var FOOTER_MEDIA_NOTE = "All media src values must be absolute URLs to real assets; relative paths and placeholder media variables are not allowed.";
|
|
@@ -124557,6 +124992,26 @@ var BLOCK_REGISTRY = {
|
|
|
124557
124992
|
props: "InteriorCarouselProps",
|
|
124558
124993
|
...GALLERY_BLOCK_CONTRACTS["interior-carousel"]
|
|
124559
124994
|
},
|
|
124995
|
+
"instagram-post-grid": {
|
|
124996
|
+
id: "instagram-post-grid",
|
|
124997
|
+
name: "Instagram Post Grid",
|
|
124998
|
+
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.",
|
|
124999
|
+
semanticTags: [
|
|
125000
|
+
"gallery",
|
|
125001
|
+
"instagram",
|
|
125002
|
+
"social",
|
|
125003
|
+
"feed",
|
|
125004
|
+
"grid",
|
|
125005
|
+
"photos",
|
|
125006
|
+
"video",
|
|
125007
|
+
"dynamic",
|
|
125008
|
+
"community"
|
|
125009
|
+
],
|
|
125010
|
+
category: "gallery",
|
|
125011
|
+
component: InstagramPostGrid,
|
|
125012
|
+
props: "InstagramPostGridProps",
|
|
125013
|
+
...GALLERY_BLOCK_CONTRACTS["instagram-post-grid"]
|
|
125014
|
+
},
|
|
124560
125015
|
"radial-gradient-top": {
|
|
124561
125016
|
id: "radial-gradient-top",
|
|
124562
125017
|
name: "Radial Gradient Top",
|
package/dist/registry.d.cts
CHANGED
|
@@ -72,7 +72,7 @@ interface BlockPropConstraint {
|
|
|
72
72
|
* suitable. Consumers (e.g. Octane) gate block selection on these BEFORE the
|
|
73
73
|
* block is offered to the model, so it cannot fabricate the missing input.
|
|
74
74
|
*/
|
|
75
|
-
type SiteCapability = "reviews_or_testimonials" | "pricing" | "pricing_data" | "team_members" | "blog_posts" | "portfolio_items" | "case_studies" | "locations" | "events" | "products" | "services" | "stats_or_metrics" | "metrics_or_stats" | "product_catalog" | "media_library" | "contact_form" | "video_assets" | "contact_info";
|
|
75
|
+
type SiteCapability = "reviews_or_testimonials" | "pricing" | "pricing_data" | "team_members" | "blog_posts" | "portfolio_items" | "case_studies" | "locations" | "events" | "products" | "services" | "stats_or_metrics" | "metrics_or_stats" | "product_catalog" | "media_library" | "contact_form" | "video_assets" | "contact_info" | "instagram_media";
|
|
76
76
|
/**
|
|
77
77
|
* Structured usage requirements for a block. This is the executable
|
|
78
78
|
* complement to `importantUsageNotes` (which remains for human-readable
|
package/dist/registry.d.ts
CHANGED
|
@@ -72,7 +72,7 @@ interface BlockPropConstraint {
|
|
|
72
72
|
* suitable. Consumers (e.g. Octane) gate block selection on these BEFORE the
|
|
73
73
|
* block is offered to the model, so it cannot fabricate the missing input.
|
|
74
74
|
*/
|
|
75
|
-
type SiteCapability = "reviews_or_testimonials" | "pricing" | "pricing_data" | "team_members" | "blog_posts" | "portfolio_items" | "case_studies" | "locations" | "events" | "products" | "services" | "stats_or_metrics" | "metrics_or_stats" | "product_catalog" | "media_library" | "contact_form" | "video_assets" | "contact_info";
|
|
75
|
+
type SiteCapability = "reviews_or_testimonials" | "pricing" | "pricing_data" | "team_members" | "blog_posts" | "portfolio_items" | "case_studies" | "locations" | "events" | "products" | "services" | "stats_or_metrics" | "metrics_or_stats" | "product_catalog" | "media_library" | "contact_form" | "video_assets" | "contact_info" | "instagram_media";
|
|
76
76
|
/**
|
|
77
77
|
* Structured usage requirements for a block. This is the executable
|
|
78
78
|
* complement to `importantUsageNotes` (which remains for human-readable
|