# Quote Card — `quote-card@1.0.0`

A pull quote with a giant opening mark, words rising into place under a mask, a rule that draws itself and the author's name beneath.

A pull quote that arrives like a magazine spread: a giant opening quotation mark scales in, the words rise into place a few at a time under a mask, a short rule draws itself and the author's name and role fade in beneath. The quote wraps by itself into lines that fit and picks the largest type size that suits. Type the quote, the author and the role, choose a theme (ink, rose, paper or mint), left or centred alignment and the backdrop colour.

- Kind: text; status: published; digest sha256:d3c1ee965f6e5149418f4de3ad43c0428cf4aae196134b6cd3905925ca077760
- Role: Text scene (Canvas 2D): testimonials, quotes and social-proof posts.
- Implementation: canvas2d; entry `src/quote-card.js`
- Files: https://aipixelwizard.com/registry/quote-card/1.0.0/<path> (`LICENSE`, `asset.json`, `demo.js`, `index.html`, `src/quote-card.js`)
- Manifest JSON: https://aipixelwizard.com/api/v1/visuals/quote-card/versions/1.0.0
- Runnable demo: https://aipixelwizard.com/registry/quote-card/1.0.0/index.html (open over http; it imports sibling packages by relative path)
- Dependencies (exact): `apw-runtime@1.0.0` (demo) — Demo harness. The reusable source has no dependencies.

## Exports
- `createQuoteCard({ quote?, author?, role?, theme?, align?, start?, fontFamily? }) => { draw(ctx, info, width, height), revealDuration }` — Canvas 2D text layer driven by info.time (seconds); draws on top of the canvas.
- `THEMES: { ink, rose, paper, mint }` — Quote, accent and muted colours.

## Parameters
- `quote` (text, default "Make it move, then make it matter.") — Quote
- `author` (text, default "Ada Lowe") — Author
- `role` (text, default "Motion designer") — Role
- `theme` (select one of ink | rose | paper | mint, default "ink") — Theme
- `align` (select one of left | center, default "left") — Alignment
- `background` (color, default "#14161c") — Backdrop

## Composition
- Inputs: Canvas 2D context, info.time (seconds), width, height.
- Outputs: Draws the quote on top of the canvas; does not clear it.
- Coordinates: The quote block is centred and 76% of the width wide; type size is chosen so it fits in at most five lines and half the height.
- Lighting: None; the demo adds a soft accent glow and vignette.
- Timing: Pure function of time; words rise 0.09 s apart; revealDuration says when everything has arrived.
- Works with: kinetic-title, gradient-background
- Text is treated as private: it is not stored in shared packs unless you choose to include it.
- Very short quotes use the largest size, long ones step down to fit.

## Output and loop
- 1080×1080, 30 fps, 7 s, procedural
- Seamless loop: no — Not a loop: the card arrives and holds on the finished quote.
- Verified 2026-10-08 in Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0 (Canvas 2D); deterministic: yes

## Use it
New project: Create the card once, then each frame draw your backdrop and call card.draw(ctx, { time: frame / fps }, width, height).

Existing project: Copy src/quote-card.js. Call draw on your existing 2D canvas after the rest of the frame.

Reuse ideas:
- Testimonial: Ink and gold.
- Editorial: Paper.
- Social post: Rose, centred.

## Limitations
- System fonts differ between computers; pass fontFamily and load the font first for identical renders.
- There is no hyphenation: a very long word can overflow the line.

## License
MIT. Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.

Provenance: Original code written for AI Pixel Wizard in October 2026, to the catalog quality bar (docs/QUALITY.md).

