# Template gallery — paper-poster-html
Three neutral HTML scaffolds, forked from the posterly templates (MIT, © 2026 Ruishuo Chen —
see `../NOTICE.md`) and adapted for ARIS: flat de-gradient, `--fs-*` token scale, zero
inline-style utility classes, and the `data-source` / `data-color-exempt` contracts. Class
names are unchanged, so `COMPONENTS.md` (the component contract catalog) applies to all three.
Each template is **self-contained and neutral**: no lab branding, no paper content — only
`TODO` placeholders. The authoring loop is: copy one to your working dir as `poster.html` →
apply a token pack → fill `TODO`s with paper content + real figures → run the gates
(`run_gates.py`) and balance until they pass.
Every layout-critical element carries `data-measure-role` so the measurement gate can locate
columns / hero / footer regions across templates. **Do not remove these attributes** — the
measure gate depends on them.
## Picking a template
| Template | Canvas | Layout | Use when |
|----------|--------|--------|----------|
| **landscape_4col.html** | 60 × 36 in landscape | header → optional banner → **4 columns** → optional takeaways → footer | The default. Standard ML conference poster (ICML / NeurIPS / generic landscape) with ~3–5 content cards per column; mix of figures, equations, and tables. |
| **landscape_hero.html** | 60 × 36 in landscape | header → **hero panel (~60%)** + supporting column (~40%) → takeaways → footer | ONE figure / table / system diagram is the main message. One big illustration left, 3–4 short cards right. No framework banner — the hero *is* the banner. |
| **portrait_2col.html** | 24 × 36 in portrait | header → **2 columns** → footer (no banner, no takeaways strip) | Portrait venues / sub-A0 sizes. Vertical space is precious, so banner + takeaways are dropped; the final card in the right column carries the conclusion/takeaways. |
(File names follow DESIGN_FINAL §1: the ARIS forks drop the posterly `_neutral` suffix.)
## Scaffolds, not finished posters
A template is a **scaffold**, not a poster. Figures are commented out and copy is `TODO`
stubs, so each column only fills the top of the canvas. That has gate consequences you should
expect — do not "fix" them on a fresh scaffold:
- **`preflight` passes out of the box.** It checks structure (valid `data-measure-role` values,
no LaTeX residue, no bare `<` inside `$…$` math, the root `data-measure-role="poster"`),
which the scaffold already satisfies.
- **`style_check` source rules (1–3, 5–11) pass on the *forked* scaffold.** The ARIS fork has
no inline styles, no `linear-gradient`, no stray hex outside the token block — so the static
source gate is green on the empty template. (The upstream posterly *originals* keep inline
styles and would FAIL `style_check` — that is expected; the fork exists precisely to fix
that.)
- **`measure` and `polish` are gates for your *finished* poster.** They check that columns
bottom-align to within 5 px, that the gap to the footer sits in a tight band (30–50), that
intercard gaps stay in [12, 50], and that the canvas fills 95–101% — properties only a
*filled* poster can have. An unfilled scaffold is **expected to fail them** (huge
column-bottom spread, a large gap to the footer). That is the gate telling you the poster is
not finished, not a bug in the template.
- **`asset_check` fails until you embed ≥2 real paper figures.** A scaffold has none.
So the loop is: copy → apply token pack → fill content + drop in real figures → run
`run_gates.py` and balance until `measure`/`polish`/`asset` go green. See DESIGN_FINAL §8 for
the full phase structure and the worked ICLR 2026 acceptance case (§13).
## Applying a token pack (`tokens/*.json` → `:root`)
The palette lives in two synchronized places: the `tokens/*.json` packs (machine-readable, what
`style_check`/`run_gates` read for the accent/gold `hue_centers`) and the `:root` DESIGN TOKENS
block in each template's `