{"success":true,"data":{"block":{"id":"link-page-grid-cards","name":"Link Page Grid Cards","title":"Link Page Grid Cards","category":"Link Page","categorySlug":"link-page","description":"A visually rich link page displaying links as a responsive grid of cards. Features profile header with avatar, links as cards with icons, labels and optional descriptions, hover effects with scale and shadow transitions, configurable 2 or 3 column layout, and social media links. Ideal for creators, businesses, and anyone who wants a more visual link page.","thumbnail":{"desktop":"https://cdn.ing/assets/i/r/316362/u1byhb7pk2ejo9vfzjp0x0f3g69g/link-page-grid-cards-desktop.png","mobile":"https://cdn.ing/assets/i/r/316363/tm6rfz7s1v0ze5z1fkr2qkyz4iie/link-page-grid-cards-mobile.png"},"componentPath":"blocks/link-page/link-page-grid-cards.tsx","code":"import { LinkPageGridCards } from \"@opensite/ui/blocks/link-page/link-page-grid-cards\";\nimport { DynamicIcon } from \"@opensite/ui/components/dynamic-icon\";\n\nexport default function Demo() {\n  return (\n    <LinkPageGridCards\n      logo={{\n        src: \"https://cdn.ing/assets/i/r/316361/p1nnyy9j0iuxyo8q53ij8aqygb4q/mark.png\",\n        alt: \"Creative Studio\",\n      }}\n      logoAspect=\"square\"\n      name=\"BECOME THE SIGNAL IN THE NOISE\"\n      socialLinks={[\n        {\n          id: \"1\",\n          href: \"https://instagram.com\",\n        },\n        {\n          id: \"2\",\n          href: \"https://twitter.com\",\n        },\n        {\n          id: \"3\",\n          href: \"https://linkedin.com\",\n        },\n        {\n          id: \"4\",\n          href: \"https://youtube.com\",\n        },\n      ]}\n      links={[\n        {\n          id: \"1\",\n          label: \"Design Work\",\n          description: \"View my portfolio\",\n          href: \"https://example.com/portfolio\",\n          iconName: \"lucide/palette\",\n        },\n        {\n          id: \"2\",\n          label: \"Case Studies\",\n          description: \"Deep dives into projects\",\n          href: \"https://example.com/case-studies\",\n          iconName: \"lucide/file-text\",\n        },\n        {\n          id: \"3\",\n          label: \"NFT Collection\",\n          description: \"Digital art drops\",\n          href: \"https://example.com/nft\",\n          iconName: \"lucide/sparkles\",\n        },\n        {\n          id: \"4\",\n          label: \"Design System\",\n          description: \"Open source toolkit\",\n          href: \"https://example.com/design-system\",\n          iconName: \"lucide/layers\",\n        },\n        {\n          id: \"5\",\n          label: \"Figma Templates\",\n          description: \"UI kits & resources\",\n          href: \"https://example.com/templates\",\n          iconName: \"lucide/layout-template\",\n        },\n        {\n          id: \"6\",\n          label: \"Contact\",\n          description: \"Let's collaborate\",\n          href: \"https://example.com/contact\",\n          iconName: \"lucide/send\",\n        },\n      ]}\n      columns={3}\n      footerAction={{\n        label: \"Built with OpenSite\",\n        href: \"https://opensite.ai\",\n        iconAfter: <DynamicIcon name=\"lucide/code-2\" size={16} />,\n      }}\n      pattern=\"waves\"\n      patternOpacity={0.25}\n      background=\"dark\"\n    />\n  );\n}","propsSchema":{"name":{"type":"object","description":"Profile name displayed at the top","typeLabel":"React.ReactNode","required":true,"maxLength":60},"bio":{"type":"object","description":"Optional bio or description","typeLabel":"React.ReactNode","required":false,"maxLength":140},"avatar":{"type":"object","description":"Avatar image configuration","fields":{"src":{"type":"string","description":"Image source URL","required":true},"alt":{"type":"string","description":"Alt text for accessibility","required":true},"href":{"type":"string","description":"Optional link URL","required":false},"className":{"type":"string","description":"Additional CSS classes for the image","required":false}},"typeLabel":"ImageItem","required":false,"mediaHints":{"path":"avatar.src","roles":["profile","avatar","logo"],"disallowedRoles":["favicon","video-thumbnail"],"minPixelClass":"small","required":false,"note":"Brand logo or profile photo shown at the top of the page. LOGO OR PROFILE IMAGE ONLY. Do not use favicons or video assets."}},"avatarUrl":{"type":"string","description":"Avatar image URL (legacy)","required":false},"logo":{"type":"object","description":"Optional LogoConfig for BrandLogo rendering (takes priority over avatar)","fields":{"url":{"type":"string","description":"URL to navigate to when logo is clicked","required":false},"src":{"type":"string","description":"Image source for the logo","required":false},"alt":{"type":"string","description":"Alt text for the logo image","required":false},"title":{"type":"object","description":"Text title to display (alternative to image)","typeLabel":"React.ReactNode","required":false},"className":{"type":"string","description":"Additional CSS classes for the logo","required":false}},"typeLabel":"LogoConfig","required":false,"mediaHints":{"path":"logo.src","roles":["logo"],"disallowedRoles":["favicon","video-thumbnail"],"minPixelClass":"small","required":false,"note":"Brand logo shown at the top of the page. Takes priority over avatar. LOGO IMAGE ONLY. Do not use photos, favicons, or video assets."}},"logoSlot":{"type":"object","description":"Custom slot for the logo/avatar (takes priority over logo and avatar)","typeLabel":"React.ReactNode","required":false},"logoClassName":{"type":"string","description":"Additional CSS classes for the logo WRAPPER (not the image). Has no effect on\nlive client sites (not harvested for compiled CSS) — never use it for logo\nsizing; use logoAspect.","required":false},"logoAspect":{"type":"string","description":"Placement and shape mode for the brand mark at the top of the page.\n\"horizontal\" (default) keeps the legacy modest wordmark bar. \"square\" renders a\nroughly 1:1 mark LARGE and centered (about half the column width). \"vertical\"\nrenders a stacked/portrait lockup tall and centered. \"banner\" renders\nlogoBannerImage as a full-bleed edge-to-edge band at the very top of the page\nand hides the centered logo. Logo sizing is controlled ONLY by this prop —\nnever by logoClassName or any className prop.","typeLabel":"LinkPageLogoAspect","enum":["square","horizontal","vertical","banner"],"required":false},"logoBannerImage":{"type":"object","description":"Full-bleed banner image rendered edge-to-edge (100vw) at the very top of the\npage. Only rendered when logoAspect is \"banner\". Requires an absolute https\nsrc and descriptive alt text. The image is never cropped — it renders\nfull-width at its natural aspect ratio, so artwork carrying text or labels\nstays fully visible. On mobile the banner is full-bleed edge-to-edge; on\ndesktop it renders at the content column's width, flush with the top.","fields":{"src":{"type":"string","description":"Image source URL","required":true},"alt":{"type":"string","description":"Alt text for accessibility","required":true},"href":{"type":"string","description":"Optional link URL","required":false},"className":{"type":"string","description":"Additional CSS classes for the image","required":false}},"typeLabel":"ImageItem","required":false,"mediaHints":{"path":"logoBannerImage.src","roles":["hero","background"],"disallowedRoles":["logo","favicon","video-thumbnail"],"minPixelClass":"large","required":false,"preferredAspect":"3:1","note":"Banner image rendered at the very top of the page at its natural aspect ratio — never cropped, so text or labels inside the artwork stay intact: full-bleed edge-to-edge on mobile, while on desktop the banner matches the content column width and hugs the image height. Wide artwork (~3:1) fills the band best; a very tall image is letterboxed at the logoBannerAspect height cap. Only used when logoAspect is \"banner\". IMAGE MEDIA ONLY. Do not use logos, favicons, or video assets."}},"logoBannerAspect":{"type":"string","description":"Aspect ratio of the full-bleed banner band: \"standard\" (~16:7 reserved band,\nmax 60vh), \"wide\" (3:1, max 50vh), \"ultrawide\" (4:1, max 40vh). The reserved\nshape only holds until the image loads — the banner image always renders\nfull-width at its natural aspect ratio and is NEVER cropped, so artwork with\ntext or labels stays fully visible; the max height caps the band\n(letterboxing, not cropping, when it binds). The reserved shape applies on\nmobile only — at md+ the band's height comes from the artwork itself.\nOn mobile the banner is full-bleed edge-to-edge; on desktop it renders at\nthe content column's width, flush with the top.","typeLabel":"LinkPageLogoBannerAspect","enum":["standard","wide","ultrawide"],"required":false},"profileSlot":{"type":"object","description":"Custom slot for profile header content","typeLabel":"React.ReactNode","required":false},"links":{"type":"array","description":"Array of links to display as cards","items":{"type":"object","description":"","fields":{"variant":{"type":"string","description":"","typeLabel":"\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"","enum":["default","destructive","outline","secondary","ghost","link"],"required":false},"size":{"type":"string","description":"","typeLabel":"\"default\" | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\"","enum":["default","sm","md","lg","icon","icon-sm","icon-lg"],"required":false},"label":{"type":"object","description":"Button/link label text or ReactNode","typeLabel":"ReactNode","required":false},"icon":{"type":"object","description":"Icon to display (typically before label)","typeLabel":"ReactNode | string","required":false},"iconAfter":{"type":"object","description":"Icon to display after the label","typeLabel":"ReactNode | string","required":false},"href":{"type":"string","description":"URL for link behavior","required":false},"onClick":{"type":"object","description":"Click handler for button behavior","typeLabel":"MouseEventHandler","required":false},"className":{"type":"string","description":"Additional CSS classes for the action","required":false},"children":{"type":"object","description":"Custom children (overrides label + icon rendering)","typeLabel":"ReactNode","required":false},"aria-label":{"type":"string","description":"ARIA label for accessibility","required":false},"asButton":{"type":"boolean","description":"Render as a button element instead of an anchor/link","required":false},"id":{"type":"string","description":"","required":false},"description":{"type":"object","description":"","typeLabel":"React.ReactNode","required":false},"iconName":{"type":"string","description":"","required":false}},"typeLabel":"GridCardLink"},"typeLabel":"GridCardLink[]","required":false},"linksSlot":{"type":"object","description":"Custom slot for rendering links (overrides links array)","typeLabel":"React.ReactNode","required":false},"socialLinks":{"type":"array","description":"Array of social media links","items":{"type":"object","description":"","fields":{"platformName":{"type":"object","description":"Social platform name - determines which icon to display.\nIf not provided, the platform is auto-detected from the href URL.","typeLabel":"SocialPlatformName","required":false},"platform":{"type":"object","description":"","typeLabel":"SocialPlatformName","required":false},"href":{"type":"string","description":"Link URL (required). Platform is auto-detected from this URL if platformName is not set.","required":true},"label":{"type":"string","description":"Display label for the link (used for aria-label if not specified)","required":false},"icon":{"type":"object","description":"Platform icon or icon API name - overrides automatic icon selection","typeLabel":"ReactNode | string","required":false},"iconNameOverride":{"type":"string","description":"Icon name override for DynamicIcon (e.g., \"lucide/twitter\")","required":false},"iconSize":{"type":"number","description":"Icon size in pixels","required":false},"iconColor":{"type":"string","description":"Icon color - accepts any valid CSS color","required":false},"iconClassName":{"type":"string","description":"Additional CSS classes for the icon","required":false},"aria-label":{"type":"string","description":"ARIA label for accessibility","required":false},"className":{"type":"string","description":"Additional CSS classes for the link wrapper","required":false},"id":{"type":"string","description":"","required":false},"iconName":{"type":"string","description":"","required":false}},"typeLabel":"GridCardSocialLink"},"typeLabel":"GridCardSocialLink[]","required":false},"socialLinksSlot":{"type":"object","description":"Custom slot for rendering social links (overrides socialLinks array)","typeLabel":"React.ReactNode","required":false},"columns":{"type":"number","description":"Number of columns in the grid (2 or 3)","typeLabel":"2 | 3","enum":[2,3],"required":false},"footerAction":{"type":"object","description":"Footer action configuration","fields":{"variant":{"type":"string","description":"","typeLabel":"\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"","enum":["default","destructive","outline","secondary","ghost","link"],"required":false},"size":{"type":"string","description":"","typeLabel":"\"default\" | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\"","enum":["default","sm","md","lg","icon","icon-sm","icon-lg"],"required":false},"label":{"type":"object","description":"Button/link label text or ReactNode","typeLabel":"ReactNode","required":false},"icon":{"type":"object","description":"Icon to display (typically before label)","typeLabel":"ReactNode | string","required":false},"iconAfter":{"type":"object","description":"Icon to display after the label","typeLabel":"ReactNode | string","required":false},"href":{"type":"string","description":"URL for link behavior","required":false},"onClick":{"type":"object","description":"Click handler for button behavior","typeLabel":"MouseEventHandler","required":false},"className":{"type":"string","description":"Additional CSS classes for the action","required":false},"children":{"type":"object","description":"Custom children (overrides label + icon rendering)","typeLabel":"ReactNode","required":false},"aria-label":{"type":"string","description":"ARIA label for accessibility","required":false},"asButton":{"type":"boolean","description":"Render as a button element instead of an anchor/link","required":false}},"typeLabel":"ActionConfig","required":false},"footerSlot":{"type":"object","description":"Custom slot for rendering footer content","typeLabel":"React.ReactNode","required":false},"className":{"type":"string","description":"Additional CSS classes for the section","required":false},"containerClassName":{"type":"string","description":"Additional CSS classes for the outer wrapper","required":false},"contentClassName":{"type":"string","description":"Additional CSS classes for the inner content container","required":false},"headerClassName":{"type":"string","description":"Additional CSS classes for the profile header","required":false},"avatarClassName":{"type":"string","description":"Additional CSS classes for the avatar wrapper","required":false},"nameClassName":{"type":"string","description":"Additional CSS classes for the name","required":false},"bioClassName":{"type":"string","description":"Additional CSS classes for the bio","required":false},"socialLinksClassName":{"type":"string","description":"Additional CSS classes for the social links container","required":false},"socialLinkClassName":{"type":"string","description":"Additional CSS classes for each social link","required":false},"socialIconClassName":{"type":"string","description":"Additional CSS classes for social icons","required":false},"gridClassName":{"type":"string","description":"Additional CSS classes for the links grid","required":false},"cardClassName":{"type":"string","description":"Additional CSS classes for each card","required":false},"cardIconWrapperClassName":{"type":"string","description":"Additional CSS classes for card icon wrapper","required":false},"cardIconClassName":{"type":"string","description":"Additional CSS classes for card icons","required":false},"cardLabelClassName":{"type":"string","description":"Additional CSS classes for card labels","required":false},"cardDescriptionClassName":{"type":"string","description":"Additional CSS classes for card descriptions","required":false},"footerClassName":{"type":"string","description":"Additional CSS classes for the footer","required":false},"background":{"type":"string","description":"Background style for the section","typeLabel":"SectionBackground","enum":["default","white","gray","dark","gradient","primary","secondary","transparent","muted"],"required":false},"spacing":{"type":"string","description":"Vertical spacing for the section","typeLabel":"SectionSpacing","enum":["none","sm","md","lg","xl","hero"],"required":false},"pattern":{"type":"string","description":"Optional background pattern name or URL","typeLabel":"PatternName","enum":["squareAltGrid","grid1","noise","dotPattern","dotPattern2","circles","waves","crossPattern","architect","tinyCheckers","p6","dots","circuitBoardBasic","circuitBoardFadeTop","circuitBoardFadeBottom","circuitBoardFadeCenter","circuitBoardFadeTopLeft","circuitBoardFadeTopRight","circuitBoardFadeBottomLeft","circuitBoardFadeBottomRight","dashedGridBasic","dashedGridFadeTop","dashedGridFadeBottom","dashedGridFadeCenter","dashedGridFadeTopLeft","dashedGridFadeTopRight","dashedGridFadeBottomLeft","dashedGridFadeBottomRight","diagonalCrossBasic","diagonalCrossFadeTop","diagonalCrossFadeBottom","diagonalCrossFadeCenter","diagonalCrossFadeTopLeft","diagonalCrossFadeTopRight","diagonalCrossFadeBottomLeft","diagonalCrossFadeBottomRight","gridBasic","gridFadeTop","gridFadeBottom","gridFadeCenter","gridFadeTopLeft","gridFadeTopRight","gridFadeBottomLeft","gridFadeBottomRight","gridDotsBasic","gridDotsFadeCenter","gradientGlowTop","gradientGlowBottom","spotlightLeft","spotlightRight","radialGradientTop","radialGradientBottom"],"required":false},"patternOpacity":{"type":"number","description":"Pattern overlay opacity (0-1)","required":false},"patternClassName":{"type":"string","description":"Additional CSS classes for the pattern overlay","required":false},"optixFlowConfig":{"type":"object","description":"OptixFlow image optimization configuration","fields":{"apiKey":{"type":"string","description":"API key for OptixFlow service","required":true},"compression":{"type":"number","description":"Compression level (0-100)","required":false}},"typeLabel":"OptixFlowConfig","required":false},"sectionId":{"type":"string","description":"Optional Section ID","required":false},"links[]":{"type":"object","description":"","required":false,"minItems":2,"maxItems":9},"links[].label":{"type":"object","description":"","required":true,"maxLength":30},"links[].description":{"type":"object","description":"","required":false,"maxLength":50},"links[].href":{"type":"object","description":"","required":true},"links[].iconName":{"type":"object","description":"","required":false},"socialLinks[]":{"type":"object","description":"","required":false,"minItems":1,"maxItems":8},"logoBannerImage.src":{"type":"object","description":"","required":false}},"exampleProps":{"name":"Marcus Chen","bio":"Product Designer & Digital Artist","avatar":{"src":"https://cdn.ing/assets/i/r/287634/e4cmvu8nbwoqy2qer90t4gpap0ed/logo-light.png","alt":"Marcus Chen"},"logo":{"src":"https://cdn.ing/assets/i/r/287634/e4cmvu8nbwoqy2qer90t4gpap0ed/logo-light.png","alt":"Marcus Chen"},"logoAspect":"horizontal","logoBannerImage":{"src":"https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp","alt":"Marcus Chen cover banner"},"logoBannerAspect":"standard","socialLinks":[{"id":"1","href":"https://instagram.com/marcuschen"},{"id":"2","href":"https://twitter.com/marcuschen"},{"id":"3","href":"https://linkedin.com/in/marcuschen"}],"columns":3,"links":[{"id":"1","label":"Design Work","description":"View my portfolio","href":"https://example.com/portfolio","iconName":"lucide/palette"},{"id":"2","label":"Case Studies","description":"Deep dives into projects","href":"https://example.com/case-studies","iconName":"lucide/file-text"},{"id":"3","label":"Design System","description":"Open source toolkit","href":"https://example.com/design-system","iconName":"lucide/layers"},{"id":"4","label":"Figma Templates","description":"UI kits & resources","href":"https://example.com/templates","iconName":"lucide/layout-template"},{"id":"5","label":"Blog","description":"Thoughts & tutorials","href":"https://example.com/blog","iconName":"lucide/pen-line"},{"id":"6","label":"Contact","description":"Let's collaborate","href":"https://example.com/contact","iconName":"lucide/send"}],"footerAction":{"label":"Built with OpenSite","href":"https://opensite.ai"},"background":"dark","pattern":"diagonalCrossFadeTop","patternOpacity":0.08},"dependencies":["@opensite/ui"],"tags":["link-page","grid","cards","visual","creative","business","portfolio","showcase","links"],"performance":{},"importantUsageNotes":"Displays links as a 2- or 3-column grid of cards, each with an icon, label, and optional description. Best for creators or businesses with 4–9 distinct destinations. columns=2 works well on mobile; columns=3 adds a third column on sm and larger screens. Each card has hover scale and shadow transitions. Social links appear above the grid. Profile avatar is typically a logo or portrait. Logo sizing/placement is controlled ONLY by logoAspect. Never attempt to size the logo with logoClassName or any className prop — class props have no effect on live sites. Pick logoAspect from the user's asset or words: square icon/mark → \"square\"; stacked or portrait logo → \"vertical\"; \"banner across the top\" / wide cover image → \"banner\" with logoBannerImage. Default wide wordmark → \"horizontal\" (or omit). Only set logoAspect:\"banner\" and logoBannerImage when the user asks for a banner/cover image; omit both otherwise. The banner always renders at the image's NATURAL aspect ratio and is NEVER cropped, so banner artwork containing text or labels is safe; it is full-bleed edge-to-edge on mobile, and on desktop the banner matches the content column width and hugs the image height. logoBannerAspect only sets the reserved pre-load band shape and the maximum band height (\"standard\" ~16:7 capped at 60vh (default), \"wide\" 3:1 capped at 50vh, \"ultrawide\" 4:1 capped at 40vh), and a very tall image is letterboxed at that cap rather than cropped. Wide artwork (~3:1) still looks best. logo takes priority over avatar; put the brand mark in logo.src and NEVER in avatar or brandAvatar — the brand-mark stripper nulls logo URLs on avatar-named props (only logo*/favicon/brandmark keys are exempt), so a logo placed there renders nothing. avatar/brandAvatar is for a person's profile photo (headshot).","usageRequirements":{"requiredProps":["name"],"propConstraints":{"name":{"required":true,"maxLength":60},"bio":{"required":false,"maxLength":140},"columns":{"required":false,"note":"2 or 3; defaults to 2"},"links[]":{"required":false,"minItems":2,"maxItems":9},"links[].label":{"required":true,"maxLength":30},"links[].description":{"required":false,"maxLength":50},"links[].href":{"required":true},"links[].iconName":{"required":false,"note":"Iconify icon name displayed in a 48px square icon wrapper"},"socialLinks[]":{"required":false,"minItems":1,"maxItems":8},"logo":{"required":false,"note":"LogoConfig { src, alt, url? }. This prop carries the site brand mark on real sites — prefer it over avatar."},"logoAspect":{"required":false,"note":"Shape/placement of the brand mark: \"horizontal\" (wide wordmark, default), \"square\" (large centered ~1:1 mark), \"vertical\" (tall stacked lockup), \"banner\" (top image band — full-bleed on mobile, content-column width on desktop; requires logoBannerImage). Pick the value matching the asset. Logo sizing is controlled ONLY by this prop — never by logoClassName or any class name."},"logoBannerImage.src":{"required":false,"note":"Absolute https URL. Only rendered when logoAspect is \"banner\". The image renders at its natural aspect ratio and is never cropped, so artwork with text or labels baked in stays fully readable — full-bleed edge-to-edge on mobile, content-column width on desktop."},"logoBannerAspect":{"required":false,"note":"Reserved pre-load band shape plus the maximum band height — it never crops the image: \"standard\" (~16:7, capped at 60vh, default), \"wide\" (3:1, capped at 50vh), \"ultrawide\" (4:1, capped at 40vh). A very tall image is letterboxed at the cap instead of being cropped. The band is full-bleed edge-to-edge on mobile; on desktop the banner matches the content column width and hugs the image height, so the reserved shape only damps mobile load shift."}},"mediaSlots":{"logo":{"path":"logo.src","roles":["logo"],"disallowedRoles":["favicon","video-thumbnail"],"minPixelClass":"small","required":false,"note":"Brand logo shown at the top of the page. Takes priority over avatar. LOGO IMAGE ONLY. Do not use photos, favicons, or video assets."},"logoBannerImage":{"path":"logoBannerImage.src","roles":["hero","background"],"disallowedRoles":["logo","favicon","video-thumbnail"],"minPixelClass":"large","required":false,"preferredAspect":"3:1","note":"Banner image rendered at the very top of the page at its natural aspect ratio — never cropped, so text or labels inside the artwork stay intact: full-bleed edge-to-edge on mobile, while on desktop the banner matches the content column width and hugs the image height. Wide artwork (~3:1) fills the band best; a very tall image is letterboxed at the logoBannerAspect height cap. Only used when logoAspect is \"banner\". IMAGE MEDIA ONLY. Do not use logos, favicons, or video assets."},"avatar":{"path":"avatar.src","roles":["profile","avatar","logo"],"disallowedRoles":["favicon","video-thumbnail"],"minPixelClass":"small","required":false,"note":"Brand logo or profile photo shown at the top of the page. LOGO OR PROFILE IMAGE ONLY. Do not use favicons or video assets."}},"requiresSiteCapabilities":["media_library"],"notes":["All media src values must be absolute URLs to real assets; relative paths and placeholder media variables are not allowed.","Card labels are short (≤30 chars) because they render in centered small text inside each card.","No featured link concept in this block; use link-tree-block if featured highlighting is needed."]}}},"timestamp":"2026-08-27T08:37:35.039Z"}