# Graphs The `.dot` files carry **structure and meaning**. The palette lives in `themes/*.gvpr` and is applied at render time. ```bash ./render.sh # every graph, every theme ./render.sh lucid # one theme ./render.sh dark system_overview ``` Needs graphviz (`sudo apt install graphviz`). The committed SVGs work without it; this is only needed to re-render. ## Why themes, and why gvpr The sources used to hardcode the dark palette inline, which meant one look and no way to get another. `gvpr` rewrites the *parsed* graph, so it overrides whatever a `.dot` set — one source renders in any theme without being edited. Command-line `-G`/`-N`/`-E` flags would not do: those are defaults, and an attribute written in the file beats them. Colour is **baked into each SVG** rather than driven by CSS, because both docs sites embed graphs with ``. That makes the SVG a separate document the page's stylesheet cannot reach. ## Output | Theme | Writes | For | | --- | --- | --- | | `dark` | `.svg` | the docs site — this is the default, and what `docs/data/en/*.md` links to | | `lucid` | `.lucid.svg` | regulated documents, print, and sitting beside a real lucid.app export | ## Classes Nodes, edges, clusters and the graph itself may carry a `class`. Anything untagged gets the theme's neutral treatment. | Class | Means | dark | lucid | | --- | --- | --- | --- | | `accent` | the emphasised thing | amber outline | blue outline, pale blue fill | | `accent-text` | emphasised *label*, not a box | amber text | blue text | | `ok` | live, working | green text | green outline, pale green fill | | `artery` / `atlas` / `station` | belongs to that system | that system's colour | its pale equivalent | | `muted` | present but not the point | grey text | grey fill | `class` survives into the SVG (``), so an **inlined** SVG can also be styled by page CSS. That is not how the docs embed them, but it is there if a page wants it. ## What themes never touch - **`shape`** — a cylinder is a datastore, not a decoration. - **`style=invis`** — layout scaffolding. Filling it would draw it. - **`style=dashed`** — a weaker relationship; the theme preserves it and adds to it. - **`label`, `rankdir`, `rank`, `fontsize`** — content and layout. ## Adding a theme Drop a `themes/.gvpr` in beside the others; `render.sh` picks it up with no edit. Match the palette to `soleprint/common/theme/themes/.css` so a diagram and the page around it are the same visual language. Name fonts that exist on the target. `lucid.gvpr` uses Arial deliberately: it is on every Windows box and fontconfig aliases it to Liberation Sans on Linux, so the SVG measures the same on both and text does not reflow out of its box.