deploy without node
This commit is contained in:
62
openspec/changes/archive/2026-02-10-card-layout/design.md
Normal file
62
openspec/changes/archive/2026-02-10-card-layout/design.md
Normal file
@@ -0,0 +1,62 @@
|
||||
## Context
|
||||
|
||||
The site renders multiple card-like UI elements today:
|
||||
- videos/podcast listings use `site/src/components/ContentCard.astro`
|
||||
- blog listings use `site/src/components/BlogPostCard.astro`
|
||||
|
||||
These cards have different layouts and metadata placement. This change standardizes the card information architecture so all cards feel consistent.
|
||||
|
||||
The site is statically generated (Astro). Card layout consistency should be enforced primarily through shared components and shared CSS rather than copy/paste per page.
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
|
||||
- Define and implement a single, consistent card structure:
|
||||
- media (image/placeholder) at top
|
||||
- title
|
||||
- trimmed summary/excerpt
|
||||
- meta row: date (left) + views (right, if available)
|
||||
- footer: source label (youtube/podcast/blog/etc.)
|
||||
- Apply to all existing card surfaces:
|
||||
- `/videos` listing cards
|
||||
- `/podcast` listing cards
|
||||
- `/blog` post cards (and category listings)
|
||||
- Keep the layout resilient when fields are missing (no views, no image, no summary).
|
||||
|
||||
**Non-Goals:**
|
||||
|
||||
- Redesigning non-card list links (e.g., simple navigation links) into cards unless needed for consistency.
|
||||
- Changing Umami tracking taxonomy (attributes stay intact).
|
||||
- Large typographic or theme redesign beyond card structure/spacing.
|
||||
|
||||
## Decisions
|
||||
|
||||
- **Decision: Implement a shared Card component used by existing card components.**
|
||||
- Rationale: Centralizes markup and ensures layout stays consistent across surfaces.
|
||||
- Approach:
|
||||
- Create a new component (e.g., `Card.astro`) with props for:
|
||||
- `href`, `title`, `summary`, `imageUrl`, `dateLabel`, `viewsLabel`, `sourceLabel`
|
||||
- optional tracking attributes pass-through (keep existing `data-umami-*` behavior)
|
||||
- Update `ContentCard.astro` and `BlogPostCard.astro` to render the shared Card component.
|
||||
|
||||
- **Decision: Add an optional `summary` field to normalized items.**
|
||||
- Rationale: Enables the standard card layout to show trimmed summaries for videos/podcast, similar to blog excerpts.
|
||||
- Approach:
|
||||
- Extend the normalized content schema/types with `summary?: string`.
|
||||
- Populate it during ingestion where available (YouTube description snippet; podcast episode summary/description).
|
||||
|
||||
- **Decision: Views are optional and shown only when available.**
|
||||
- Rationale: Not all sources provide views; the layout should be consistent without forcing synthetic values.
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- [Risk] Ingestion sources may provide very long summaries.
|
||||
- Mitigation: Standardize trimming logic in the card component (single truncation helper).
|
||||
|
||||
- [Risk] CSS regressions across multiple pages.
|
||||
- Mitigation: Add tests that assert key card structure/classes exist; verify build outputs for `/videos`, `/podcast`, `/blog`.
|
||||
|
||||
- [Risk] Blog post cards and content cards have different link targets (internal vs outbound).
|
||||
- Mitigation: Shared Card component should be able to render both internal links and external links (target/rel configurable).
|
||||
|
||||
Reference in New Issue
Block a user