# Quality checklist

Run this before delivering any deck. P0 items block delivery. P1/P2/P3 are
strong recommendations.

## How to use

```bash
# Quick audit: list all slides and their hero/body classification
grep -E 'class="slide' examples/my-talk/index.html

# Check for pure white/black violations in inline styles
grep -E '#ffffff|#000000|#fff[^a-f0-9]|#000[^a-f0-9]' examples/my-talk/index.html
```

---

## P0 — Blocks delivery (fix before sending)

### Typography

- [ ] **Serif font on all display titles.** If a big title renders in sans-serif,
  the class is missing or overridden. `h1`, `.h1`, `.h-hero`, `.h-xl` must
  resolve to Noto Serif SC / Playfair Display.
- [ ] **No emoji in slide content.** Use Lucide SVG icons. Emoji render
  inconsistently across OS and projectors.
- [ ] **Chinese titles ≤ 6 characters per line with `white-space: nowrap`.**
  Long Chinese titles wrap to 1-char-per-line in some browsers.

### Layout / visual

- [ ] **Theme rhythm: no 3+ consecutive slides of the same visual weight.**
  Check hero / body alternation. Write out the sequence and eyeball it.
- [ ] **No images overflowing their container.** Grid images use `height: Nvh`
  (not `aspect-ratio`). Full-bleed images use `object-fit: cover`.
- [ ] **No `align-self: end` on images.** Images slip behind browser toolbar.
  Use `align-items: start` on the grid container instead.
- [ ] **Image aspect ratios are standard.** 16:9, 16:10, 4:3, 3:2, 1:1, 3:4.
  Never copy raw pixel dimensions from the source file.
- [ ] **No pure `#ffffff` or `#000000`.** All colors go through CSS token
  variables (`var(--paper)`, `var(--ink)`, `var(--accent)`, `var(--text-1)` etc.).

### Content

- [ ] **No presenter-facing text on slide surface.** Any narration cues, "Speaker:
  note X here", or explanatory captions for the presenter go in
  `<div class="notes">` — never as visible `<p>` / `<span>` elements.
- [ ] **Every slide has `data-title`** (used by Overview grid, press O).
- [ ] **`<title>` tag is not the placeholder** "[必填] 替換為 PPT 標題". Replace
  with the real deck title.

### Structure

- [ ] **`runtime.js` is included.** Without it, keyboard nav / S / O / T are dead.
- [ ] **Image paths are relative.** `images/01-cover.jpg` not `/Users/…/`.
- [ ] **Image files actually exist.** Broken images are invisible on projectors.

---

## P1 — Fix before the user sees it (strong recommendation)

- [ ] **Monospace font for all metadata.** Slide numbers, chapter labels,
  dates, page footers → IBM Plex Mono. Never sans-serif for system info.
- [ ] **No two consecutive slides with the same layout type.** Two `kpi-grid`
  back-to-back is visual repetition. Vary it.
- [ ] **Decks ≥ 8 slides: at least 1 dark hero AND 1 light hero.**
- [ ] **Speaker notes on every slide.** Even a one-liner helps during rehearsal.
- [ ] **At least one `hero` slide every 3-4 content slides.** Sustained body
  pages without a breathing hero = audience fatigue.
- [ ] **Images min 1600px wide.** Blurry images on a 4K projector = embarrassing.

---

## P2 — Polish (do if time allows)

- [ ] **Image names are zero-padded and semantic.** `01-cover.jpg` not `image1.jpg`.
  Enables clean same-filename swaps later.
- [ ] **One accent animation per slide max.** `rise-in` on the hero, calm
  everywhere else. Multiple animations on one slide = carnival.
- [ ] **Data slides have a one-line takeaway in `<div class="notes">`.** Forces
  the author to have a point, not just data.
- [ ] **Slide count matches the stated talk length.** 15 min / 10 slides /
  ~90 sec per slide is the rule of thumb.
- [ ] **Theme T-cycle works.** Press T in browser — all slides should look
  coherent in at least 2-3 themes (check `data-themes` on `<body>`).

---

## P3 — Nice to have

- [ ] **Export smoke test.** Run `scripts/render.sh` on at least the first and
  last slide. Catches font-load failures and layout clipping at 1920×1080.
- [ ] **Narrative arc is explicit.** Hook → Context → Core → Shift → Takeaway
  is traceable in the slide titles. The deck tells a story, not just presents info.
- [ ] **No layout repeated more than twice in the whole deck.**
- [ ] **Section dividers are `hero dark`**, not body pages — they reset visual
  rhythm and signal chapter breaks.
- [ ] **Final slide is not a generic "Thanks".** End on the takeaway, a call
  to action, or an open question. "Thank you" slides are wasted real estate.
