> ## Documentation Index
> Fetch the complete documentation index at: https://invoca-5bd45748-mintlify-6c3474a6.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Typography

> Divergences, open decisions, and undocumented gaps for Typography.

See [Typography](/invoca-design-system/foundations/typography) for the decided part of this page.

## Known issues

Divergences are where code and design intent disagree; open decisions are where nothing
has been decided yet. Neither is resolvable by inference.

| ID                                                                                | Kind          | What                                                      |
| --------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------- |
| [**TITAN-DIV-04**](/invoca-design-system/foundations/divergences#titan-div-04)    | Divergence    | three typography surfaces, three counts                   |
| [**TITAN-DIV-09**](/invoca-design-system/foundations/divergences#titan-div-09)    | Divergence    | the naming specification and shipped tokens have diverged |
| [**TITAN-GAP-03**](/invoca-design-system/foundations/open-decisions#titan-gap-03) | Open decision | the vocabulary was specified but never surfaced           |
| [**TITAN-GAP-18**](/invoca-design-system/foundations/open-decisions#titan-gap-18) | Open decision | typography redundancy and no responsive scale             |

## Gaps in the current rules

* **`button` is the one variant not on the shared metrics.** It uses `0.875rem` and a
  unitless line height of `1.75`, while every other variant is set in explicit `px`.
  Whether that is deliberate or an unfinished migration is not recorded. It is the one
  variant whose rendered line height changes with the root font size.
* **`subtitle1`/`body1` and `subtitle2`/`body2` are metrically identical**, and moot for
  what to build today since only `body1` (as `base`) is reachable. If the scale's
  unreachable steps are ever exposed, no rule yet says which of each pair to prefer.
* **No responsive type scale exists.** Sizes are fixed across all breakpoints. Whether a
  24px `h1` is intended for a 1536px viewport is undecided.
* **Weight non-monotonicity is undocumented upstream.** `h3` at 700 sitting between `h2`
  at 400 and `h4` at 600 is either a considered emphasis decision or an accident. This
  page describes the behavior; the intent is not recorded anywhere.

## Constraints Titan should enforce

These are real, currently-true rules. Nothing in code stops a builder from violating them today — each is a placeholder for a guardrail Titan hasn't built, not a decision still being made.

| ID               | Constraint                                                                                                | Would be enforced by                                                                                                             |
| ---------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| **TITAN-TYP-01** | Text always renders through a Typography variant, never a raw `<p>`/`<span>`/`<h1>`–`<h6>` tag.           | An ESLint rule (`no-restricted-syntax`) banning raw heading/paragraph JSX outside the Typography component's own implementation. |
| **TITAN-TYP-03** | At most one `h1` per view.                                                                                | A lint/runtime check counting `variant="h1"` occurrences per view.                                                               |
| **TITAN-TYP-05** | `fontSize`, `fontWeight`, and `lineHeight` are never overridden on a themed variant.                      | A lint rule flagging style overrides of those properties on `<Typography>`.                                                      |
| **TITAN-TYP-06** | Uppercase text comes from the variant, never a `text-transform` override or a hand-typed all-caps string. | A lint rule banning `text-transform` overrides, plus a content check for redundant all-caps string literals.                     |
