`.
- **Allowed variants**: inherits all `card` variants. The `.section-title` may carry a small
inline gold "★ KEY" marker **only** via the predefined `.keyword-gold` class (never an inline
`style="color:…"` — the posterly originals did this; the ARIS fork replaces it with the class).
- **Required data attributes**: same as `card` (`data-measure-role="card"`). The number itself
carries no data attribute.
- **Token usage**: `.section-title` → `--accent-deep` (text), `--font-sans`; `.num` →
`--accent` background, white text. Font-size via `--fs-7` (section title) and `--fs-5` (.num).
- **Inspected by**: `measure`, `preflight`, `style` (font pairing rule 6 — section title must be
the sans stack; rule 8 — font-size via `--fs-*`).
- **Allowed fix operations**: (a), (b), (c), (e), (f). Renumbering is content rebalance (c).
- **Anti-patterns**: section title rendered in the serif body stack (rule 6 HARD); a per-title
font-size override in px (rule 8 HARD); decorative inline SVG icon next to the number instead
of the `.num` circle (rule 11 HARD — no homemade decorative SVG).
## figure-card (`.card` containing `.figure`)
- **Purpose**: A card whose payload is a paper figure: `.figure > img + .caption`. The primary
carrier of real, paper-sourced images (the thing `asset_check` exists to enforce).
- **Allowed variants**: `.figure--wide` (predefined, image spans full card width — fix (f));
the `` width is set with the utility classes `.w-45 … .w-100` (5% steps), never inline,
**except** the one sanctioned inline exception below.
- **Required data attributes**:
- On the ``: `data-source="paper"` **and** `data-asset-id=""` (both HARD,
style rule 10 + asset_check). The asset id must exist in `FIGURE_MANIFEST.json` with
`from_paper:true`.
- Optional `data-fig-layout="beside-text"` on the `` to opt the figure out of the
AR-width gate when it legitimately shares its card with a meaningful text column
(DESIGN_FINAL §10 (g) territory; polish honors it).
- Sanctioned inline style: `data-source="paper"` `` may carry **only**
`style="width: NN%"` for aspect-ratio width tuning (B-contract exception); prefer the
`.w-NN` utility class when the value lands on a 5% step.
- **Token usage**: `.figure img` border → `--border-soft`; `.caption` → `--text-secondary`,
`--accent-deep` (caption ``); caption font-size `--fs-3`/`--fs-2`.
- **Inspected by**: `asset` (≥2 paper figures, per-figure area ≥1.5% poster, total ≥12% body,
natural_px ≥1.5× rendered, manifest fields + sha256), `polish` (figure AR sizing:
FIG/WIDE / FIG/SQUARE / FIG/TALL / FIG/BROKEN), `style` (rule 10 contract attrs; rule 4
exempts paper images from hue clustering), `measure` (card geometry).
- **Allowed fix operations**: (c) AR-bandwidth width adjust, (f) `.figure--wide`, (g) asset fix
(re-crop, swap for a sharper figure from the *same* paper, re-run preprocess). Width changes
via `.w-NN` utility (b/e) or the sanctioned `style="width:NN%"`.
- **Anti-patterns**: `` without `data-source`/`data-asset-id` (rule 10 HARD; also invisible
to asset_check so it doesn't count toward the ≥2 quota); a wide figure shrunk into a gray
margin below 65% width (polish FIG/WIDE); a low-res crop where natural_px < 1.5× rendered
(asset WARN→FAIL); fabricating/“illustrating” a figure not in the paper (rubric ≤3 cap,
manifest `from_paper` must be false → fails the paper-figure quota).
## hero-figure (`.hero` + `.hero-stage` > img, `landscape_hero` template only)
- **Purpose**: The single dominant visual on the hero template — one large figure / system
diagram / table that *is* the poster's message. Replaces the framework banner.
- **Allowed variants**: optional `.hero-caption` and one optional `.hero-aside` text block; a
`.stage-placeholder` is shown only while authoring (must be removed once the real img drops
in). The hero `` has **no border** (the `.hero-stage` frames it).
- **Required data attributes**: `data-measure-role="hero"` on the `.hero` panel (mutually
exclusive with `data-measure-role="banner"`). The hero `` carries the same
`data-source="paper"` + `data-asset-id` contract as any paper figure (asset_check probes the
hero centerpiece too — the worst image to silently lose).
- **Token usage**: `--bg-card`, `--border-soft`, `--accent` (8u left-bar), `--bg-card-tint`
(stage gradient → flattened in the ARIS fork), `--bg-emphasis` (`.hero-aside`). Section title
font-size `calc(var(--fs-7) * …)` is a predefined hero variant (rule 8 calc exception).
- **Inspected by**: `asset` (counts as a paper figure; FIG/BROKEN on the hero img is fatal),
`polish` (hero img BROKEN check), `measure` (hero bottom must bottom-align with the supporting
column's last card, spread < 5px), `preflight`, `style`.
- **Allowed fix operations**: (c), (d) (switch templates if hero is the wrong frame),
(f) hero variants, (g) asset fix.
- **Anti-patterns**: padding the hero with empty space to fill the row (rubric "large empty
card/column" ≤5 cap; measure spread); putting a border on the hero img; leaving the
`.stage-placeholder` in the final poster (preflight/polish residue); a hero img that is not
paper-sourced (asset quota + rubric ≤3).
## eqn (`.eqn`, optional `.eqn .label`)
- **Purpose**: A display-equation block — MathJax-rendered math with an optional uppercase label
("CORE EQUATION"). The only sanctioned home for math.
- **Allowed variants**: `.eqn--large` (predefined `font-size: calc(var(--fs-5) * 1.25)` — the
one calc-on-token variant blessed by IMPLEMENTATION_CONVENTIONS §E.9 and style rule 8/§12.5
nit 1). No other size variant.
- **Required data attributes**: none. (Math is found by gate via the rendered MathJax SVG, not a
data attribute.)
- **Token usage**: `--bg-emphasis` (block fill, flat in the fork), `--accent` (3u left-bar),
`--accent` (`.label` text), `--font-sans` (label). Block font-size `--fs-5`.
- **Inspected by**: equation gate (DESIGN_FINAL §5): `EQN/BROKEN` (MathJax did not render) =
HARD; `EQN/UNDERSIZED` (inner box > 80px tall but math bbox < 15% area) = HARD, < 25% or
bottom whitespace > 35% = WARN. Also `preflight` (bare `<` inside `$…$`, LaTeX residue),
`style` (label is sans, size via `--fs-*`).
- **Allowed fix operations**: (a) token retune, (c) shorten/split the equation (content
rebalance), (f) `.eqn--large` to fill an undersized box, (e) global eqn stylesheet (tokens).
- **Anti-patterns**: raw `<` inside math (preflight — MathJax parses it as an HTML tag);
embedding the equation as a screenshot image instead of MathJax (defeats EQN gate, inflates
PDF, fails the "real text" expectation); a per-equation px font-size override (rule 8 HARD);
an `.eqn` box left mostly empty (EQN/UNDERSIZED).
## callout (`.callout`, variant `.callout.gold`)
- **Purpose**: An accent-filled emphasis strip for a question, theorem, or one-line takeaway —
the "read this even if you read nothing else" line inside a card.
- **Allowed variants**: `.callout` (solid `--accent`, white text, `` in gold) and
`.callout.gold` (solid `--gold`, `--accent-deep` text — the ARIS fork flattens the original
gold *gradient* to a flat fill per §E.2). No third variant.
- **Required data attributes**: none.
- **Token usage**: `.callout` → `--accent` bg, white text, `--gold` (``); `.callout.gold`
→ `--gold` bg, `--accent-deep` text. Font-size `--fs-4`.
- **Inspected by**: `style` (rule 5 — `.callout.gold` must be a flat fill, no `linear-gradient`;
rule 4 — its accent/gold are the two allowed hue families; rule 1/3 — colors via var),
`measure` (counts toward card height).
- **Allowed fix operations**: (a), (b) add/remove a callout instance, (c) reword from paper
source, (f) toggle `.callout` ↔ `.callout.gold`.
- **Anti-patterns**: `linear-gradient` fill (rule 5 HARD — this is the single most common
de-gradient regression); a third color on a callout (rule 4 — >2 hue clusters); using a
callout to introduce a claim not in the paper (Phase 6 final-HTML overclaim audit).
## result-table (`table.result-table`)
- **Purpose**: A benchmark / comparison table with the "ours" row highlighted in gold and group
rows / best cells marked. The quantitative payload of a results card.
- **Allowed variants**: row classes `tr.group-row` (section divider row), `tr.ours` (gold
highlight for our method), cell classes `.method` (left-aligned method name), `.best`
(accent-colored winning number). These are the defined row/cell modifiers — no others.
- **Required data attributes**: none (it lives inside a `card` which carries the measure role).
- **Token usage**: `thead th` → `--accent` bg / white; `tr.group-row td` → `--bg-emphasis`,
`--accent-deep`, `--accent` bottom border; `tr.ours td` → `--gold-soft`; `.best` → `--accent`;
borders → `--border-soft`. Font is the **sans** stack (tables/headers are sans per rule 6),
size `--fs-3`/`--fs-2`.
- **Inspected by**: `style` (rule 6 — table uses sans; rule 4 — gold-soft + accent are within
the two hue families; rule 8 — sizes via token), `measure` (height in card), `preflight`.
- **Allowed fix operations**: (a), (c) add/remove rows or edit numbers from the paper/results
(content rebalance), (e) global table stylesheet (tokens). Switching which row is `.ours` is (c).
- **Anti-patterns**: per-cell inline `style="color:#888"` for the reference row (the posterly
originals did this; the ARIS fork replaces with `.text-muted`) — rule 2 HARD; numbers that do
not match the paper/results files (Phase 1 claim→evidence audit + Phase 6); a third highlight
color beyond gold-soft/accent (rule 4).
## keybox (`.keybox` > `.kb-item` × N)
- **Purpose**: A compact 2–4-up strip of headline statistics ("3.2× faster", "92% acc"),
each a big number over a small caption. The at-a-glance numeric hook.
- **Allowed variants**: count is set by content (2–4 items); no separate variant classes.
Each item is `.kb-item > .kb-num + .kb-label`.
- **Required data attributes**: none.
- **Token usage**: `.kb-item` → `--bg-emphasis` bg, `--accent` top-border; `.kb-num` →
`--accent` (`--fs-6`, sans); `.kb-label` → `--text-secondary` (`--fs-1`, sans).
- **Inspected by**: `style` (rule 6 sans, rule 8 token sizes, rule 4 single accent family),
`polish` (Gate B typography orphans — a trailing `↑ × % ↓` glyph on `.kb-num` that could wrap
alone must carry `.nowrap`), `measure`.
- **Allowed fix operations**: (a), (b) add/remove the strip, (c) edit stats from results,
(f) `.nowrap` on an orphan-prone number.
- **Anti-patterns**: a lone trailing glyph wrapping to its own line (polish Gate B → add
`.nowrap`); fabricated stats (claim audit); a per-number color/size override (rules 8/4).
## takeaways-strip (`.takeaways-strip`, landscape templates)
- **Purpose**: A full-width bottom strip of 3–4 one-line takeaways ("Idea / Method / Result /
Practical") — the 60-second narrative exit. Portrait templates drop it (final card carries
the conclusion instead).
- **Allowed variants**: title via `.ts-title` (+ `.num` circle), items via `.ts-item` >
`.ts-key` + `.ts-text`. Item count 3–4. No other variant.
- **Required data attributes**: `data-measure-role="footer-strip"` (measure positions it between
body and footer; footer-gap band 30–50 is measured to this strip when present).
- **Token usage**: `--bg-emphasis` (strip bg — flattened from the posterly gradient per §E.2),
`--border-soft`, `--accent`/`--accent-deep` (title, `.num`, item left-bar, `.ts-key`),
`--font-sans` (keys), `--font-serif` (text). Sizes `--fs-6`/`--fs-4`/`--fs-3`.
- **Inspected by**: `measure` (footer-gap band, full-width span), `style` (rule 5 — strip bg
must be flat, rule 6 font pairing), `preflight`.
- **Allowed fix operations**: (a), (b) add/remove the whole strip, (c) reword takeaways from the
paper, (e) global strip stylesheet (tokens).
- **Anti-patterns**: `linear-gradient` strip background (rule 5 HARD — the de-gradient target);
using it on a portrait template where it competes for scarce vertical space (use the final
conclusion card instead); inventing a takeaway not supported by the poster body (Phase 6).
## qr-block (`.qr-block` > img + `.qr-label`)
- **Purpose**: A scannable QR pointing at the paper / arXiv / code / project page, with a small
label. Lives in the header right-block.
- **Allowed variants**: none. The img is either a **local raster** QR or, as a last-resort
authoring placeholder, an inline SVG QR (one of the two sanctioned inline-SVG uses).
- **Required data attributes**: none for the raster QR. If the QR is the inline-SVG fallback, it
is exempt from hue clustering (rule 4 exempts QR) but must still be a **local** asset in the
final poster.
- **Token usage**: `--accent` (border), white background, `--accent` (`.qr-label`, sans).
- **Inspected by**: `style` (rule 4 QR exemption; rule 11 — inline SVG allowed only for
logo / QR fallback / catalogued structural diagram), `preflight` (no remote `src` — a remote
QR-service URL hangs `measure`'s networkidle wait and link-rots), verify-final (no remote
asset, ≤20MB).
- **Allowed fix operations**: (a) token retune (border color), (g) asset fix (regenerate the QR
locally at ≥2× rendered px).
- **Anti-patterns**: a remote QR-service `src` (preflight/verify-final — networkidle hang +
link rot); a homemade decorative SVG that is not actually a QR (rule 11); a blurry QR below
2× rendered px (asset/polish).
## venue-badge (`.venue-badge`, default text identity)
- **Purpose**: The default, logo-free venue identity in the header left slot — venue / year /
"POSTER" tag as text. ARIS default is a **text** badge (DESIGN_FINAL §2: "venue identity
默认文字 badge"); a venue logo is opt-in and goes in `.logo-slot`, not here.
- **Allowed variants**: `.vb-venue`, `.vb-year`, `.vb-tag` sub-lines. No image variant — if the
venue permits a logo, use `.logo-slot` with the logo contract instead.
- **Required data attributes**: none. (If ever replaced by a logo SVG, that SVG needs
`data-color-exempt="logo"` — but that is the `.logo-slot` path, not the badge.)
- **Token usage**: `--accent-deep` (`.vb-venue`), `--text-secondary` (`.vb-year`), `--accent`
(`.vb-tag`), `--border-soft` (right divider), `--font-sans`. Sizes `--fs-9`/`--fs-5`/`--fs-1`.
- **Inspected by**: `style` (rule 6 sans, rule 8 token sizes, rule 1 colors as tokens),
`measure` (header geometry), `preflight`.
- **Allowed fix operations**: (a), (c) edit venue/year text. Switching to a logo is a (b)
component swap into `.logo-slot` (requires the logo contract, see below).
- **Anti-patterns**: hardcoding a venue's brand hex inline to "match their logo" (rule 1/2 HARD —
venue color comes from the opt-in token pack, not inline hex); putting a raster logo inside
the badge without the `.logo-slot` `data-color-exempt` path (rule 1 — un-exempted foreign
colors trip hue clustering).
## logo-slot (`.logo-slot` > img/svg, optional)
- **Purpose**: Optional lab/affiliation logo in the header right-block. The **only** place an
off-palette color is allowed, via explicit exemption.
- **Allowed variants**: a raster `` logo, or an inline `