# Type specimen

- URL: https://aip.treeso.net/articles/specimen/
- Published: 2026-08-17
- Author: Michal Frdlik

> Every element the templates render, on one page. Once the real articles land, set hidden = true rather than deleting it -- it is the page you check a CSS change against.

This page exists to be looked at, not read. It exercises every element the
templates render, so a change to `sass/style.scss` can be checked against one
page instead of against a memory of what the site used to look like.

The palette is **Bonfire**, committed in the Thylacine tree at
`docs/UTOPIA-VISUAL.md` §1. Its background is `#0e0c0c` -- not red, not warm
grey, but near-black with a barely perceptible red cast, the way darkness looks
when a fire a few hundred metres away cannot illuminate anything and only
shifts the colour temperature of the air.

## Prose

Body text is `fg`, `#e4ddd8`. *Emphasis* and **strong** carry the usual weight.
Inline code such as `burrow_attach` sits on the lifted `surface` tone. Links
[look like this](https://www.getzola.org/) and underline on hover.

> A blockquote takes the ember rule on its left edge. The shell yields commands
> to the kernel; every invocation is a derivation, which is what the mark means.

Footnotes work and land at the bottom of the article.[^1]

[^1]: Like so. The return arrow is generated by the markdown renderer.

### A third-level heading

Every heading gets an anchor link, so a paragraph deep in a long article stays
addressable. Hover a heading to see it.

1. Ordered lists number themselves.
2. And nest:
   - like this,
   - and this.

## Code

Highlighting comes from a Bonfire theme in `extra/bonfire.json`, rendered as CSS
classes rather than inline styles. The colours are the committed palette, so a
code block here and the same code in `nora` are the same colours -- not an
approximation of them.

```rust
/// The client half of the graphics protocol.
pub struct Surface {
    weave: Fd,
    slots: usize,
    generation: u32,
}

impl Surface {
    pub fn present(&mut self, rect: Rect) -> Result<(), TapError> {
        let tag = self.ring.submit(Op::Present { rect, slot: self.slot })?;
        loop {
            match self.ring.reap()? {
                Some(cqe) if cqe.tag == tag => break,
                Some(cqe) => self.pending.push(cqe),
                None => continue,
            }
        }
        self.slot = (self.slot + 1) % self.slots;
        Ok(())
    }
}
```

```c
/* Extinction Level Event -- the thematic name for a kernel panic. */
void
extinction(const char *msg)
{
    int cpu = cpu_id();

    if (g_extinction_depth[cpu]++ > 0)
        _hang();

    uart_puts("\nEXTINCTION: ");
    uart_puts(msg);
    uart_puts("\n");

    halls_dump();
    _hang();
}
```

```toml
[markdown.highlighting]
style = "class"
theme = "bonfire"
extra_themes = ["extra/bonfire.json"]
```

```sh
# The SMP soundness gate. Single boots lie.
tools/ci-smp-gate.sh
SMP_GATE_CONFIGS="default-smp4 ubsan-smp4" tools/ci-smp-gate.sh
```

A block with no language declared falls back to plain text:

```
Thylacine v0.1-dev booting...
  arch: arm64
  cpus: 4
Thylacine boot OK
```

## Tables

| Role | Hex | Use |
|---|---|---|
| `bg` | `#0e0c0c` | Warm near-black |
| `fg` | `#e4ddd8` | Primary text |
| `ember` | `#e07840` | The prompt glyph, the cursor, the fire |
| `slate` | `#8a9ac8` | Keywords, control flow |
| `dusk` | `#a898c8` | String literals |
| `smoke` | `#7a8a7a` | Comments |

Wide tables scroll inside their own container rather than pushing the page
sideways.

---

A horizontal rule above. Below it, the end of the specimen.
