Visual Identity v2
Purpose
This is the contributor-facing reference for visual decisions across the aDNA documentation surface. If you are authoring an asset — a hero image, a section icon, an inline diagram, an OG card — this document tells you which palette to draw from, which typography scale to use, what stroke-width matches the existing vocabulary, and how to prompt the image generator so the result does not look like marketing.
The guidelines crystallize the decisions ratified during M5.3 D11 (Visual Identity v2 + Image Regen; cycles 101–110). The shorter version: philosophy-before-feature minimalism + geometric restraint + currentColor inheritance + 1.6 stroke-width + abstract over figurative.
Companion documents:
- The aDNA Universal Standard — what to build.
- The Design Rationale — why it is built that way.
- This document — what it should look like and how to make it match.
1. Color palette
aDNA uses a restrained two-color brand palette (teal + amber) on a neutral light/dark foundation. All colors are defined as CSS custom properties in src/styles/branding.css; consume them via var(--color-*) rather than hex literals.
Brand tokens
| Token | Hex | Use | WCAG AA |
|---|---|---|---|
--brand-primary | #0D7377 | Primary teal — links, button backgrounds, hero accents | 5.0:1 ✓ |
--brand-primary-dark | #0A4F52 | Hover states, dark-mode primary | 7.8:1 ✓ |
--brand-primary-light | #14919B | Mid-tone teal — dark-mode link color | 6.1:1 (dark bg) ✓ |
--brand-accent | #D4A017 | Accent amber — sparingly; large text only on white | 3.1:1 (large text ok) |
--brand-accent-light | #F0D060 | Soft amber — dark-mode accent | varies |
Semantic mappings
| Semantic token | Resolves to |
|---|---|
--color-primary | --brand-primary (light) / --brand-primary-light (dark) |
--color-link | Same as primary |
--color-link-hover | --brand-primary-dark (light) / #5FC4C8 (dark) |
Neutrals
Defined in src/styles/tokens.css. The neutrals are pure HSL with no hue, which lets the brand teal carry all the color signal:
| Token | Light | Dark |
|---|---|---|
--color-bg | hsl(0 0% 100%) | hsl(0 0% 8%) |
--color-bg-alt | hsl(0 0% 97%) | hsl(0 0% 12%) |
--color-surface | hsl(0 0% 100%) | hsl(0 0% 14%) |
--color-text | hsl(0 0% 12%) | hsl(0 0% 92%) |
--color-text-muted | hsl(0 0% 40%) | hsl(0 0% 60%) |
--color-text-heading | hsl(0 0% 8%) | hsl(0 0% 96%) |
--color-border | hsl(0 0% 88%) | hsl(0 0% 25%) |
Rules
- Consume tokens, not hex. New components MUST reference
var(--color-*)so dark-mode and brand changes propagate. - Brand teal carries the signal. Amber is reserved for sparing accent — never large surface areas, never body text.
- Status colors (
--color-error,--color-success,--color-warning,--color-info) are pre-defined and tuned for both modes; do not introduce new status hues without operator gate.
2. Typography
Font stack
| Role | Family | Fallback |
|---|---|---|
| Display (headings) | Space Grotesk | system-ui, sans-serif |
| Body (prose) | Inter | system-ui, sans-serif |
| Mono (code) | JetBrains Mono Variable | 'JetBrains Mono', 'Fira Code', monospace |
Variables: --font-display, --font-body, --font-mono. JetBrains Mono is loaded font-display: optional so a slow first-paint never blocks rendering — system monospace is acceptable until cached.
Scale (modular 1.25 ratio with viewport fluidity via clamp)
| Token | Range |
|---|---|
--text-xs | 0.7rem → 0.8rem |
--text-sm | 0.8rem → 0.9rem |
--text-base | 1rem → 1.1rem |
--text-lg | 1.125rem → 1.3rem |
--text-xl | 1.25rem → 1.6rem |
--text-2xl | 1.5rem → 2rem |
--text-3xl | 1.875rem → 2.8rem |
--text-4xl | 2.25rem → 3.6rem |
Rules
- Never hard-code font-size. Always consume from the scale.
- Display font for headings; body for prose. Mono only for code, file paths, and identifiers.
- Weight discipline. Display headings use 600. Body prose uses 400 with 600 for emphasis.
3. Spacing
A 4px-base scale exposed as CSS custom properties.
| Token | Value |
|---|---|
--space-1 | 0.25rem (4px) |
--space-2 | 0.5rem (8px) |
--space-3 | 0.75rem |
--space-4 | 1rem |
--space-6 | 1.5rem |
--space-8 | 2rem |
--space-12 | 3rem |
--space-16 | 4rem |
--space-24 | 6rem |
--space-32 | 8rem |
Layout constants:
| Token | Purpose |
|---|---|
--content-width | 72rem — outer max-width |
--prose-width | 65ch — narrow reading column |
--sidebar-width | 16rem |
--toc-width | 14rem |
Border-radius scale: --radius-sm through --radius-xl plus --radius-full (9999px for pills). Default for cards is --radius-md; default for buttons is --radius-sm.
4. Image-prompt conventions
aDNA is a methodology project. Image generators default toward illustrative / aspirational output (people-on-laptops; gradient skies; abstract data streams). That entire register is wrong for this surface — see M5.1 D11 AVOID-2 (“marketing-style hero imagery”). The prompt discipline below keeps generated imagery in the philosophy-before-feature minimalism register established by M5.1 D11 LIFT-1.
Hard guardrails
- No text inside images. Generators (Imagen 4 Ultra included) hallucinate glyphs at small sizes; text inside hero PNGs degrades to gibberish at OG-card scale. Strip the prompt of any words that ask for typography, captions, labels, or titles. If text is needed, composite it with PIL after generation.
- No figurative people. No hands, faces, silhouettes, or postures. Diagrams and abstractions only.
- No marketing gradients. Flat tones, geometric shapes, line art. No sunsets, no horizons, no data-streaks.
- Restraint over richness. A single geometric motif with 3–5 elements outperforms a busy composition every time at thumbnail scale.
Prompt skeleton (Imagen 4 Ultra)
A minimalist geometric composition featuring [SINGLE_MOTIF]
in [PRIMARY_COLOR] on a [BACKGROUND], abstract structural
diagram style, line art with [STROKE_WEIGHT] strokes, no text,
no people, no gradients, restrained palette, 16:9 wide format.
[SINGLE_MOTIF]— one of: connected nodes, nested rectangles, layered bands, concentric arcs, hexagonal tessellation, grid with callouts. Pick one. Do not list two.[PRIMARY_COLOR]—teal #0D7377ordark teal #0A4F52. Amber sparingly.[BACKGROUND]—clean off-white,neutral light gray, ordark charcoalfor dark-mode variants.[STROKE_WEIGHT]—thin,medium, orbold(avoid pixel widths in prompts; generators interpret loosely).
Post-generation pipeline
- Imagen 4 Ultra background generation at full resolution (16:9 hero; 1:1 OG card).
- PIL text overlay for any text required (OG card titles, hero captions). Done out-of-band per asset.
- Astro
<Image>fromastro:assetsproduces responsive.webpvariants at build time at widths matching layout breakpoints (640 / 960 / 1280 / 1408 for heroes).
Cost discipline
Imagen 4 Ultra is $0.04/call. Per-cycle budgets are recorded in each mission’s Image-Gen Budget Tracker; cumulative spend is tracked at the campaign master + STATE.md. Hard cap at $50 per phase (set at v8 P5 entry).
5. Icon vocabulary
The site uses a 6-icon set covering the canonical section taxonomy. Each icon is a hand-designed SVG at site/src/assets/icons/icon_{name}.svg. The set was authored at cycle 103 and refined at cycle 106.
Set inventory
| Icon | Motif | File |
|---|---|---|
icon_learn | Stacked rounded paths (book / leaves) | icon_learn.svg |
icon_how | 3 rectangles + 2 horizontal shafts with chevron arrowheads (process / transformation) | icon_how.svg |
icon_patterns | Hexagonal tessellation (7-hex cluster) | icon_patterns.svg |
icon_reference | Blueprint grid with dimensional callouts | icon_reference.svg |
icon_community | 5 circles connected by lines (network) | icon_community.svg |
icon_use_cases | Concentric rectangles (containment) | icon_use_cases.svg |
Motif rules
- Stroke-width 1.6. Matches diagram-component vocabulary (TriadDiagram + ConvergenceFunnel use the same width).
stroke="currentColor"+ no fill. The icon inherits the parent text color; that lets nav active-states and dark-mode parity work automatically.fill="none"on outlines. Solid fills create visual heaviness at 14–16px nav scale.- Straight shafts + explicit chevron arrowheads (NOT curved Bézier arrows or partial arrowheads) — discovered at cycle 103, validated at cycle 106. Curves lose detail below 16px.
Wiring discipline
Icons are imported as raw SVG strings via Vite’s ?raw query and embedded via set:html:
import iconLearn from '../../assets/icons/icon_learn.svg?raw';
// ...
<span class="group-icon" aria-hidden="true" set:html={iconLearn} />
aria-hidden="true"because the adjacent text label carries the semantic meaning; the icon is a redundant recognition signal.- Sized via wrapper span (
.group-icon16×16,.section-icon14×14) — not inline<svg width=...>attributes. - Spot-check the built
dist/HTML after wiring —grepfor the icon class name to confirm all consumers actually render the icon (catches missed mappings, per cycle 106 finding).
6. Diagram component vocabulary
The site/src/components/diagrams/ library exists for build-time-rendered SVG diagrams of canonical aDNA structural concepts. Two components are live:
TriadDiagram— WHAT / HOW / WHO triangle. Symmetric relationships; undirected edges.ConvergenceFunnel— Vault → Campaign → Mission → Objective top-down funnel. Asymmetric flow; directional arrows via SVGmarker-end.
Live examples
Component contract
Every diagram component MUST:
- Use inline SVG directly in the Astro template (not
?raw-imported) when labels or geometry depend on Props. Use?raw-imported SVG when the asset is static (icons). - Set
role="img"and anaria-labelledbyattribute pointing to per-instance random-suffix<title>+<desc>IDs to prevent collision when multiple diagrams render on a page. - Provide
<title>(short alt) +<desc>(sequential structural description) inside the SVG. - Inherit
currentColorfor strokes and text fills; usevar(--color-bg)for node backgrounds. - Match the 1.6 stroke-width vocabulary (consistency with the icon set).
- Define all Props as optional with safe canonical defaults — the minimum-viable consumption is
<DiagramName />with no props. - Match the Vault → Campaign → Mission → Objective convergence labeling (when applicable; per project CLAUDE.md Convergence Model table) and the WHAT / HOW / WHO triad labeling for the triad case.
- Use
<figure>wrapper + optional<figcaption>for caption. - Set viewBox to round multiples (320 wide is the established baseline; height adjusts to content).
When to use diagrams vs Mermaid
- Use a diagram component when (a) the concept is canonical aDNA (triad, convergence, OODA, lattice graph), (b) the diagram will recur across multiple pages, (c) you want zero runtime JS, or (d) you need precise control over the visual.
- Use
MermaidDiagramwhen the diagram is one-off content-specific (a particular workflow, a particular relationship graph for one example), or when contributor velocity benefits from Mermaid’s text-based syntax.
7. Dark mode parity
Every visual decision MUST work in both light and dark mode. The mechanisms:
- CSS custom properties switch on
.darkclass (toggled byDarkModeToggle.astro). All--color-*tokens have light + dark resolutions. - SVG
currentColorinheritance means a single SVG renders correctly in either mode automatically. - Image assets are not theme-switched. Hero PNGs are tuned to read on both backgrounds; OG cards use a single neutral-friendly composition.
- Avoid hard-coded hex in components. A
#0D7377literal will not switch correctly;var(--brand-primary)will.
8. Accessibility minima
| Requirement | Mechanism |
|---|---|
| Text contrast ≥ 4.5:1 (body), ≥ 3:1 (large text) | All token combinations above pass WCAG AA |
| Decorative icons | aria-hidden="true" on the wrapper |
| Semantic diagrams | role="img" + aria-labelledby pointing to <title> + <desc> |
| Focus visible | Native browser default + token-driven outline (defined in global.css) |
| Reduced motion | tokens.css zeros all --transition-* values under @media (prefers-reduced-motion: reduce) |
| Alt text on raster images | Astro <Image> alt prop required by component contract |
9. Change discipline
This document is the canonical visual identity reference. Changes go through:
- Persona Q&A in a D11 (or D18) decadal cycle.
- Operator ratification at phase gate or mission-spec amendment.
- Update to the relevant CSS tokens / Astro components / this document in the same commit batch.
For one-off asset additions (a new hero variant, a new icon for a future section), follow the prompt skeleton + post-generation pipeline above; record the image-gen log per ADR-026.
See also
- The Triad — the WHAT / HOW / WHO ontology this site IS organized around.
- The Convergence Model — the decomposition model the documentation surface IS built to enable.
- Design Rationale — why aDNA is structured the way it is.
- aDNA Universal Standard — the normative spec this surface demonstrates.