# Interaction Specification — Wedding Newspaper Generator > Component-level specifications following the design-agent component template. > Covers the two surfaces: the CLI authoring flow and the generated newspaper > page. Per confirmed decisions: CLI-first (Q1=A), content/config input (Q2=A), > per-article review page (Q3=A), no print preview step (Q4=B), funnies > generated from content (Q5=X), no formal a11y target (Q6=C), guided empty > state (Q7=A). --- ## CLI: `generate` command | Field | Value | |---|---| | Component | `generate` CLI command | | Description | Reads config + content, optionally drafts via local Ollama, emits `newspaper.html` | | Category | navigation (entry point) | ### States | State | Description | Trigger | |---|---|---| | ready | Prints usage / config guidance | run with no valid input | | generating | Parses content, builds layout | valid config + content present | | drafting | Calls local Ollama for lead/fillers | `--draft` flag present | | reviewing | Hands to review page (US9) | AI draft produced | | printed | Writes `newspaper.html`, prints success path | render complete | | error | Content/config/model failure | validation failure | ### Props / Inputs | Prop | Type | Required | Default | Description | |---|---|---|---|---| | `--draft` | boolean | no | — | Whether to run the local Ollama AI draft (US8) | | `config` | path | no | `config.json` | Masthead metadata + options | | `content` | path | no | `content/` | Markdown/txt articles + funnies source | ### Responsive behaviour N/A (CLI). Terminal width-wrapping of help text only. ### Accessibility | Requirement | Implementation | |---|---| | Error clarity | One-line message naming the problem + the exact fix path | | Reversibility | Generate is idempotent/regenerable; never destroys the couple's content files | --- ## Per-article review page | Field | Value | |---|---| | Component | Article review card | | Description | Per-article approve / edit / replace control before final render | | Category | feedback | ### States | State | Description | Trigger | |---|---|---| | pending | Draft ready, not yet decided | AI draft returned | | approved | Copy kept as-is | user clicks Approve | | editing | Copy being revised | user clicks Edit | | replacing | New copy supplied | user clicks Replace | ### Props / Inputs | Prop | Type | Required | Default | Description | |---|---|---|---|---| | `articleId` | string | yes | — | Stable per-article key (the article-level data boundary, US9/AC9.1.5) | | `status` | pending\|approved\|editing\|replaced | yes | pending | Current review state | | `copy` | string | yes | — | The article's text | | `onApprove` | fn | no | — | Keep as-is | | `onEdit` | fn | no | — | Open inline edit | | `onReplace` | fn | no | — | Supply replacement copy | ### Responsive behaviour Stacked cards on narrow; grid of cards on wide. The newspaper is printed, so this page is on-screen only. ### Accessibility | Requirement | Implementation | |---|---| | Keyboard | Buttons focusable; Enter/Space activate (on-screen tool) | | Clear status | Each card visibly labelled with its state (pending/approved/…) | --- ## Masthead component (newspaper page) | Field | Value | |---|---| | Component | Masthead | | Description | Front-page title banner + date / issue / volume (US2/FR2) | | Category | display / layout | ### States | State | Description | Trigger | |---|---|---| | default | Classic broadsheet masthead | page render | ### Props / Inputs | Prop | Type | Required | Default | Description | |---|---|---|---|---| | `title` | string | yes | — | Newspaper / couple name | | `dateLine` | string | yes | — | Issue date | | `issue` | string | yes | — | Issue number | | `volume` | string | yes | — | "Volume X" | | `titleStyle` | object | no | serif | Masthead typography | ### Responsive behaviour Masthead spans the full sheet width on print; on very narrow screen the title sizes down but the line stays intact (does not wrap awkwardly). ### Accessibility | Requirement | Implementation | |---|---| | Document structure | Masthead is the page's `
` / H1 (semantic, matches Q6=C baseline) | --- ## Funnies: crossword & find-a-word | Field | Value | |---|---| | Component | Funnies section | | Description | Crossword + find-a-word + comics generated from content (US3/FR4/Q5=X) | | Category | display | ### States | State | Description | Trigger | |---|---|---| | default | Renders crossword grid, clues, solution; find-a-word grid; comic panels | page render | ### Props / Inputs | Prop | Type | Required | Default | Description | |---|---|---|---|---| | `grid` | array | yes | — | Crossword grid (built from content theme words) | | `cluesAcross` | array | yes | — | Across clues (derived from content) | | `cluesDown` | array | yes | — | Down clues (derived from content) | | `findWords` | array | yes | — | Word list for find-a-word (content terms) | | `comics` | array | no | — | Comic panels + captions | | `cartoonAlt` | string | no | — | Context note for the xkcd-style cartoon | ### Responsive behaviour Each puzzle bounded to its column width and an A4-printable height; no overflow. ### Accessibility | Requirement | Implementation | |---|---| | Clarity | Grid cells have clear borders and legible type (printed keepsake; Q6=C) | --- ## Photo embed (auto-balanced) | Field | Value | |---|---| | Component | Embedded photo | | Description | Photo embedded in the column layout with caption (FR6/US4) | | Category | display | ### States | State | Description | Trigger | |---|---|---| | default | Photo + caption fit the column | photo supplied | | absent | No placeholder; layout renders clean, text-only | no photo supplied (FR7.4) | ### Props / Inputs | Prop | Type | Required | Default | Description | |---|---|---|---|---| | `src` | data/blob | no | — | Locally embedded image | | `caption` | string | no | — | Caption text | | `credit` | string | no | — | Credit/byline line | ### Responsive behaviour Auto-balances into the column structure; falls back to full-width or natural size if it cannot fit (R-02 from requirements review), never overflowing the A4 sheet (NFR2). ### Accessibility | Requirement | Implementation | |---|---| | Text alternative | Caption present; decorative `alt` when purely decorative |