` renders as an underlined link with a soft underline that solidifies
on hover and a focus ring on `:focus-visible`. The rule is wrapped in
`:where()` so link component classes (`.button`, `.link-action`, and the like)
override it without a specificity fight, even within the same layer.
**The color adapts to the surface.** A link takes its lightness from the text
around it, nudged a fifth further from mid-grey so it reads as a link rather
than as a tinted word, and its hue and chroma from `--link-c` and `--link-h`.
The result is readable on a white page, on a dark panel and on a saturated
brand hero with no class and no per-surface tokens:
```html
A link here is light, because the text around it is.
```
A fixed color cannot do that. Measured against a dark panel, a pinned accent
lands at 1.21:1 in the default theme, which is invisible.
The default theme leaves `--link-c` and `--link-h` unset, so links render as
the surrounding ink a shade deeper, plus the underline. That is the monochrome
default and it is always legible. Set both to brand your links; see
[branding](theming/branding).
## Focus
Anything focusable shows a ring. Links, buttons, inputs, `summary` and the
interactive components each draw their own; everything else, including an
element you make focusable with `tabindex`, falls back to a 2px `--focus`
outline from the base layer. You cannot ship a focusable control with no
visible focus state by forgetting to style one.
## Forms
A bare form is a stack of labels and controls with no wrapper, so base makes
the form itself a one-column grid and spaces it with a gap: fields are
separated, and a `label` sits tight against the control it names.
The spacing is a gap and not a margin so that it goes away the moment you lay
the form out yourself. Give a form `display: flex` to put an input beside its
button and you get exactly that, with no leftover vertical step under the
button and no class to remember. `form.is-grid` is the same idea in two
columns.
```html
```
For validation states, hints, inline errors and grouped controls, use the form
components in [form](components/form).
## Lists
A bare `ul` gets discs, a bare `ol` gets decimals, both indented, with nested
lists stepping through circle and square. The reset strips markers first so a
nav or a menu built from `` starts clean, and the layout primitives strip
them again for exactly that case: `` is a row of links, not
a bulleted list.
Definition lists render `dt` semibold and `dd` indented in `--ink-soft-flow`.
## Quotes and rules
`blockquote` gets a left rule and italic `--ink-soft-flow` text. `hr` is a single
`--rule` top border.
## Code, pre, kbd
- `code`: monospace, on a `--bg-muted` fill with small padding and
`--radius-xs`.
- `pre`: monospace block on `--bg-inverse` with `--ink-inverse` text,
`--radius-surface`, and horizontal scroll. `pre code` resets its own fill so
nested code doesn't double up.
- `kbd`: a small keycap: monospace, muted fill, a `--rule` border and a subtle
bottom shadow.
`
` uses `--bg-inverse`, so it **flips** with the theme (dark block in light
mode, light block in dark mode). The terminal component is different: it stays
dark in both modes. See [terminal](components/terminal).
## Mark
`mark` is a highlight using the warning tint (`--warning-soft` on
`--warning-ink`).
## Tables
`table` is full-width with small text and collapsed borders. `thead` gets a
bottom rule, body rows get soft top rules between them, `th` is left-aligned
semibold `--ink-soft-flow`, and `td` is top-aligned with comfortable padding.
`figcaption` renders as small `--ink-soft-flow` caption text.
For a more editorial table or long-form content, wrap it in `.prose` (see
[typography](typography)).
## Selection
`::selection` tints the highlight with the accent color, so text selection picks
up your brand once you've branded the app.