Files
astro-website/openspec/specs/card-layout-system/spec.md
Santhosh Janardhanan 57ad560b01
Some checks failed
ci / site (push) Has been cancelled
publish-image / publish (push) Has been cancelled
fix for SR
2026-02-10 17:54:13 -05:00

3.1 KiB

Purpose

Define a standardized card layout so content cards across surfaces look consistent.

Requirements

Requirement: Standard card information architecture

All content cards rendered by the site MUST use a standardized layout so cards across different surfaces look consistent.

The standard card layout MUST be:

  • featured image displayed prominently at the top (when available), with a shimmer placeholder visible while the image loads
  • title
  • summary/excerpt text, trimmed to a fixed maximum length
  • footer row showing:
    • publish date on the left
    • views when available (if omitted, the footer MUST still render cleanly)
    • the content source label (e.g., youtube, podcast, blog)

If a field is not available (for example, views for some sources), the card MUST still render cleanly with that field omitted.

For content cards with source youtube or podcast, the card MUST render as a clickable element that opens a media modal dialog instead of navigating to an external URL. The card MUST NOT render as an outbound <a> link for these sources.

For content cards with other sources (e.g., blog, instagram), the card MUST continue to render as a navigational link (the existing behavior).

The card element for modal-trigger cards MUST carry the content item's data (id, source, url, title, summary, publishedAt, thumbnailUrl, views) as data-* attributes so the modal script can access them.

Scenario: Card renders with all fields

  • WHEN a content item has an image, title, summary, publish date, views, and source
  • THEN the card renders those fields in the standard card layout order

Scenario: Card renders without views

  • WHEN a content item has no views data
  • THEN the card renders the footer bar with date + source and omits views without breaking the layout
  • WHEN a content item has no featured image
  • THEN the card renders a placeholder media area and still renders the remaining fields

Scenario: Card image shows shimmer while loading

  • WHEN a content item has an image URL and the image has not yet loaded
  • THEN the card media area displays an animated shimmer placeholder until the image loads and fades in

Scenario: Card image load failure shows static placeholder

  • WHEN a content item has an image URL but the image fails to load
  • THEN the card media area displays a static placeholder (no broken image icon) and the card remains visually intact

Scenario: YouTube video card opens modal

  • WHEN a user clicks a content card with source youtube
  • THEN a media modal dialog opens with the video's embedded player and metadata instead of navigating to YouTube

Scenario: Podcast card opens modal

  • WHEN a user clicks a content card with source podcast
  • THEN a media modal dialog opens with the episode's embedded player (or metadata link) instead of navigating to the podcast platform

Scenario: Blog card still navigates

  • WHEN a user clicks a content card with source blog
  • THEN the card navigates to the blog post as an internal link (existing behavior, unaffected)