Visual Identity v3
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.
v3 register pivot (ADR-032, ratified 2026-06-04). aDNA.network has evolved from the minimalist teal/amber “Rust/Tauri” register (v2) to the Science-Stanley “Ghibli-pixel” / Tokyo Night warm register — cozy bio-digital retro-futurism: warm, hand-crafted, hopeful, dense narrative detail. The shift carries the project’s public-good ethos through warmth + craft rather than cold restraint. What stays constant: purpose over decoration, currentColor inheritance, AA contrast, reduced-motion, honest affordances. What changes: the palette (Tokyo Night, dark-first — §1) and the imagery register (illustrative SS-Ghibli pixel art is now allowed — §4). The v2 baseline crystallized M5.3 D11 (cycles 101–110); this v3 supersedes its palette + imagery sections.
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.network draws from the Tokyo Night palette, dark-first — a deep navy base carrying a purple brand accent, cyan links/data, and a warm amber for lighting. All colors are CSS custom properties in src/styles/branding.css (brand) + src/styles/tokens.css (neutrals); consume them via var(--color-*) rather than hex literals. Token names are preserved from v2; their values were repointed (ADR-032).
Brand tokens
| Token | Hex | Use | Contrast |
|---|---|---|---|
--brand-primary | #9d7cd8 | Purple — brand, large text / UI accents, glow | ~6.9:1 on base ✓ (large/UI; not white body text) |
--brand-primary-dark | #6d4bb8 | Light-mode primary + dark-mode button bg | 5.8:1 with white text ✓ |
--brand-primary-light | #bb9af7 | Lighter purple — dark-mode hover / accent | — |
--brand-link | #7dcfff | Cyan — links, data, connections (dark) | ~10.3:1 on base ✓ |
--brand-link-dark | #1f6f9e | Deep cyan-blue — light-mode link | 5.4:1 on white ✓ |
--brand-accent | #e0a84c | Warm amber — accent / lighting, sparing | large/decorative only, never body text |
Semantic mappings
| Semantic token | Light (secondary) | Dark (default) |
|---|---|---|
--color-primary | --brand-primary-dark #6d4bb8 | --brand-primary #9d7cd8 |
--color-link | --brand-link-dark #1f6f9e | --brand-link #7dcfff |
--color-link-hover | #14567c | --brand-link-light #a9d8ff |
--color-accent | --brand-accent #e0a84c | --brand-accent #e0a84c |
Neutrals (Tokyo Night, dark-first)
Defined in src/styles/tokens.css. Dark is the default register (ADR-032); light mode keeps near-white neutrals so the secondary register stays usable.
| Token | Dark (default) | Light |
|---|---|---|
--color-bg | #1a1b26 | hsl(0 0% 100%) |
--color-bg-alt | #1f2335 | hsl(0 0% 97%) |
--color-surface | #24283b | hsl(0 0% 100%) |
--color-text | #c0caf5 | hsl(0 0% 12%) |
--color-text-muted | #9aa5ce | hsl(0 0% 40%) |
--color-text-heading | #ffffff | hsl(0 0% 8%) |
--color-border | #2f334d | hsl(0 0% 88%) |
Rules
- Consume tokens, not hex. New components MUST reference
var(--color-*)so dark/light and brand changes propagate. (Illustrative image assets are the deliberate exception — §4.) - Two signals, one warm accent. Purple carries brand/identity; cyan carries links/data/connections. Amber is reserved for sparing warm lighting — never large surface areas, never body text.
- Dark-first. Dark is the default; light mode is the supported secondary. Verify AA contrast in both modes for every text/link pairing.
- 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.network is a methodology project, and under v3 it carries the Science-Stanley “Ghibli-pixel” register (ADR-032): cozy bio-digital retro-futurism — warm, hopeful, hand-crafted, dense narrative detail. This relaxes the v2 abstract-only guardrail: illustrative pixel-art scenes (lab desks, node-maps, connected vaults, helices) are now in-scope. What does not relax: no baked text, no human faces, purpose over decoration, and AA contrast on any composited text.
Hard guardrails
- No text inside images. Generators (Imagen included) hallucinate glyphs; text inside hero PNGs degrades to gibberish at OG-card scale. Strip the prompt of typography, captions, labels, titles. Composite any title as live SVG/CSS text (responsive + carries the accessible name) or via PIL after generation — never baked into the gen.
- No human faces. The runner sets
person_generation="dont_allow". Use scene-level / bird’s-eye framing (desks, maps, vaults, helices), not portraits. - Hopeful, not dystopian. Warm task lighting + cool monitor glow; intellectually curious mood. No sterile empty sci-fi, no dark dystopia, no photographic stock-photo aesthetic, no marketing gradients on content.
- Dual-resolution craft. Human/physical elements = high-fidelity 32-bit painterly pixel; AI/digital constructs = chunky 16-bit sprites; DNA/active-science motifs = sharp glow-emission vector pixels. No uniform pixel scaling, no flat vector UI.
Prompt skeleton (Imagen 4)
The canonical style tail lives in the runner (GHIBLI_TAIL in runners/e1_hero_adna_network_gen.py) — reuse it; do not re-derive. A prompt = [SCENE_MOTIF] + GHIBLI_TAIL:
[SCENE_MOTIF — one bird's-eye / isometric scene: a cozy lab desk with a
glowing node-map; a constellation of connected nodes; a DNA-helix resolving
into a network; an isometric town of connected vault-buildings]
+ GHIBLI_TAIL (detailed 32-bit pixel art, cozy studio-ghibli aesthetic,
soft dithered shading; Tokyo Night palette — base #1a1b26 / #24283b, purple
#9d7cd8, cyan #7dcfff, warm amber #e0a84c lighting; dual-resolution rule;
hopeful mood; ABSOLUTELY NO TEXT / NO LETTERS / NO LOGOS; no human faces;
wide 16:9; anti-patterns: no flat vector UI, no sterile sci-fi, no dystopia)
- Palette in-prompt — base navy
#1a1b26/#24283b; purple#9d7cd8; cyan#7dcfff; warm amber#e0a84c(lighting only). - One scene, not a checklist — a single coherent motif beats a busy collage at hero / thumbnail scale.
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; Imagen 4 Fast ($0.02) is the exploration / fallback tier when Ultra returns transient 429/503 capacity errors (the runner retries with backoff, then you pass --model imagen-4.0-fast-generate-001). 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 modes. aDNA.network is dark-first (ADR-032): dark is the default register; light mode is the supported secondary. The mechanisms:
- CSS custom properties switch on
.darkclass. Dark is applied by default for every visitor (<html class="dark">+ the inline theme script inBaseLayout.astro— dark unless the user toggled light); the toggle (DarkModeToggle.astro) persists the choice. The Tokyo Night register is the experience newcomers see; light is opt-in. All--color-*tokens have dark (default) + light resolutions. - SVG
currentColorinheritance means a single SVG renders correctly in either mode automatically. - Illustrative image assets are not theme-switched. Hero / section PNGs are Tokyo-Night scenes tuned to read on the dark default; a top-down navy scrim guarantees AA title contrast independent of the asset. OG cards use a single dark composition.
- Avoid hard-coded hex in components. A
#9d7cd8literal will not switch correctly;var(--brand-primary)/var(--color-*)will. (Image assets are the deliberate exception — §4.)
Brand-system v3 — dark-first + image-led hero (M5.10 / E1, ADR-032)
The homepage hero is image-led: a Tokyo-Night SS-Ghibli scene leads the fold with the title composited as live Space-Grotesk-Bold text over a darkened upper band (reverses the E1 c2 words-below demote). Rules:
- Scrim guarantees contrast. A top-down
#1a1b26navy scrim over the image’s upper band keeps the live<h1>at AA regardless of the underlying art; the title is real text (responsive + accessible name), never baked into the gen. - Dark-first body. The whole page now defaults dark, so the hero no longer needs to self-scope
.darkfor a light body — the calm dark stage is the site default. Light mode remains a supported parity register below. - Surface treatment, not marketing. A quiet purple/cyan glow (
color-mix(... var(--brand-primary) …, transparent)) gives the stage depth — within the §1 palette, not a marketing gradient on content.
§2 type, the icon / diagram vocabularies, and the toggle mechanism are unchanged; §1 palette + §4 imagery are the v3 deltas.
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.