You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/docs/audit/theming/heading.md

133 lines
9.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# heading — alcance de tema: análisis y propuesta
> Generado por `node --import tsx/esm scripts/theming-census.ts --report`.
> Lo **medido** y la **propuesta** se regeneran; el **Veredicto** (§5) se conserva.
> Vista de conjunto: [README](./README.md) · método y protocolo:
> [`PLAN-theming.md`](../../process/PLAN-theming.md) §1, §2, §7.
- **Medido**: 2026-08-20 · **Alcance**: **—** — 0 de 0 knobs por token público
- **Knobs de apariencia**: 36 — público 0 · privado 0 · global 0 · literal 0 · sistema 36 _(fuera del ratio)_
- **Contrato hoy** (`lib/recipes/base.ts`): 0 pública(s) · 1 privada(s) forward — `_palette-text`
- **Eje `size`**: no · **ficheros**: `heading.css`
## 1. Knobs fuera de alcance
### 1.1 Directo a primitivo global (0)
_Ninguno._
### 1.2 A través de un privado (0)
_Ninguno._
### 1.3 Literales (0)
_Ninguno._
## 2. Sistema transversal (36) — informativo, fuera del ratio
Un tema los alcanza **a nivel de sistema**, por diseño (recipe-contract §2).
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `heading.css:19` | `[data-heading]` | `font-family` | `var(--_heading-font-family, var(--style-h2-font-family))` |
| 2 | `heading.css:20` | `[data-heading]` | `font-size` | `var(--_heading-font-size, var(--style-h2-font-size))` |
| 3 | `heading.css:21` | `[data-heading]` | `font-weight` | `var(--_heading-font-weight, var(--style-h2-font-weight))` |
| 4 | `heading.css:22` | `[data-heading]` | `line-height` | `var(--_heading-line-height, var(--style-h2-line-height))` |
| 5 | `heading.css:23` | `[data-heading]` | `letter-spacing` | `var(--_heading-letter-spacing, var(--style-h2-letter-spacing))` |
| 6 | `heading.css:24` | `[data-heading]` | `color` | `var(--_heading-color, var(--style-h2-color))` |
| 7 | `heading.css:47` | `[data-heading][data-style='h1']` | `font-family` | `var(--_heading-font-family, var(--style-h1-font-family))` |
| 8 | `heading.css:48` | `[data-heading][data-style='h1']` | `font-size` | `var(--_heading-font-size, var(--style-h1-font-size))` |
| 9 | `heading.css:49` | `[data-heading][data-style='h1']` | `font-weight` | `var(--_heading-font-weight, var(--style-h1-font-weight))` |
| 10 | `heading.css:50` | `[data-heading][data-style='h1']` | `line-height` | `var(--_heading-line-height, var(--style-h1-line-height))` |
| 11 | `heading.css:51` | `[data-heading][data-style='h1']` | `letter-spacing` | `var(--_heading-letter-spacing, var(--style-h1-letter-spacing))` |
| 12 | `heading.css:52` | `[data-heading][data-style='h1']` | `color` | `var(--_heading-color, var(--style-h1-color))` |
| 13 | `heading.css:56` | `[data-heading][data-style='h3']` | `font-family` | `var(--_heading-font-family, var(--style-h3-font-family))` |
| 14 | `heading.css:57` | `[data-heading][data-style='h3']` | `font-size` | `var(--_heading-font-size, var(--style-h3-font-size))` |
| 15 | `heading.css:58` | `[data-heading][data-style='h3']` | `font-weight` | `var(--_heading-font-weight, var(--style-h3-font-weight))` |
| 16 | `heading.css:59` | `[data-heading][data-style='h3']` | `line-height` | `var(--_heading-line-height, var(--style-h3-line-height))` |
| 17 | `heading.css:60` | `[data-heading][data-style='h3']` | `letter-spacing` | `var(--_heading-letter-spacing, var(--style-h3-letter-spacing))` |
| 18 | `heading.css:61` | `[data-heading][data-style='h3']` | `color` | `var(--_heading-color, var(--style-h3-color))` |
| 19 | `heading.css:65` | `[data-heading][data-style='h4']` | `font-family` | `var(--_heading-font-family, var(--style-h4-font-family))` |
| 20 | `heading.css:66` | `[data-heading][data-style='h4']` | `font-size` | `var(--_heading-font-size, var(--style-h4-font-size))` |
| 21 | `heading.css:67` | `[data-heading][data-style='h4']` | `font-weight` | `var(--_heading-font-weight, var(--style-h4-font-weight))` |
| 22 | `heading.css:68` | `[data-heading][data-style='h4']` | `line-height` | `var(--_heading-line-height, var(--style-h4-line-height))` |
| 23 | `heading.css:69` | `[data-heading][data-style='h4']` | `letter-spacing` | `var(--_heading-letter-spacing, var(--style-h4-letter-spacing))` |
| 24 | `heading.css:70` | `[data-heading][data-style='h4']` | `color` | `var(--_heading-color, var(--style-h4-color))` |
| 25 | `heading.css:74` | `[data-heading][data-style='h5']` | `font-family` | `var(--_heading-font-family, var(--style-h5-font-family))` |
| 26 | `heading.css:75` | `[data-heading][data-style='h5']` | `font-size` | `var(--_heading-font-size, var(--style-h5-font-size))` |
| 27 | `heading.css:76` | `[data-heading][data-style='h5']` | `font-weight` | `var(--_heading-font-weight, var(--style-h5-font-weight))` |
| 28 | `heading.css:77` | `[data-heading][data-style='h5']` | `line-height` | `var(--_heading-line-height, var(--style-h5-line-height))` |
| 29 | `heading.css:78` | `[data-heading][data-style='h5']` | `letter-spacing` | `var(--_heading-letter-spacing, var(--style-h5-letter-spacing))` |
| 30 | `heading.css:79` | `[data-heading][data-style='h5']` | `color` | `var(--_heading-color, var(--style-h5-color))` |
| 31 | `heading.css:83` | `[data-heading][data-style='h6']` | `font-family` | `var(--_heading-font-family, var(--style-h6-font-family))` |
| 32 | `heading.css:84` | `[data-heading][data-style='h6']` | `font-size` | `var(--_heading-font-size, var(--style-h6-font-size))` |
| 33 | `heading.css:85` | `[data-heading][data-style='h6']` | `font-weight` | `var(--_heading-font-weight, var(--style-h6-font-weight))` |
| 34 | `heading.css:86` | `[data-heading][data-style='h6']` | `line-height` | `var(--_heading-line-height, var(--style-h6-line-height))` |
| 35 | `heading.css:87` | `[data-heading][data-style='h6']` | `letter-spacing` | `var(--_heading-letter-spacing, var(--style-h6-letter-spacing))` |
| 36 | `heading.css:88` | `[data-heading][data-style='h6']` | `color` | `var(--_heading-color, var(--style-h6-color))` |
## 3. Privados de la receta — ¿de dónde sale su valor?
| privado | declaraciones | valor(es) | origen | ¿deriva de un público? |
| --- | ---: | --- | --- | :-: |
| `--_heading-color` | 1 | `var(--_heading-palette-text)` | private | no |
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_heading-align`, `--_heading-clamp`, `--_heading-font-family`, `--_heading-font-feature`, `--_heading-font-size`, `--_heading-font-weight`, `--_heading-letter-spacing`, `--_heading-line-height`, `--_heading-measure`, `--_heading-palette-text`, `--_heading-wrap`.
## 4. Propuesta de corrección
_Nada que proponer: no hay knobs fuera de alcance._
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
- [ ] **Privado que no deriva de un público** — §3 lo marca; el privado debe leer el público o desaparecer.
- [ ] **Velo o acento en el nodo equivocado** (`archetype: 'item'` en un envoltorio, un `background` en shorthand que mata la capa de estado) — se mide desde el píxel hacia arriba.
- [ ] **Doble animación** al mover un sello a una superficie con animación propia — registro de `animationstart`/`animationend`.
- [ ] **Diff de computed = 0** en reposo · hover · abierto · disabled · foco, por talla, antes y después.
- [ ] **Centinela por token nuevo**: valor imposible en el root → el nodo lo sigue. Si no, el token miente.
## 5. Veredicto
<!-- veredicto:start -->
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**EJECUTADO 2026-08-20**: D-TH.2-b firmada e implementada — el censo clasifica
`--style-*` como SISTEMA para los seis primitivos tipográficos (`heading`,
`text`, `s-text`, `code`, `display`, `label`). heading pasa de «36 privados,
0 %» a «36 sistema, alcance —»: no tenía deuda, tenía una lectura equivocada.
Gate verificado: los otros 156 componentes, idénticos al knob.
**Análisis: cifras correctas (36 · 0 · 36 · 0 · 0), lectura EQUIVOCADA.** El
0 % de heading no es deuda: es el **primitivo tipográfico funcionando como la
doctrina manda**. Su receta es un selector de named styles — cada eje resuelve
`var(--_heading-{eje}, var(--style-h{n}-{eje}))` por `data-style`, con el
override por instancia inline (cabecera de `heading.css`). La capa semántica
`--style-h{1..6}-*` ES la superficie de theming de los headings
(`architecture/eidos.md` §Typographic vertebration: los primitivos consumen los
named styles; `applyTypeScale` y `styles` del config los retunean en vivo), y
la misma doctrina RECHAZA explícitamente acoplar componentes a golpe de
duplicado («Coupling everything to the semantic layer is not the dominant
practice»).
**Propuesta: NO IMPLEMENTAR.**
- Acuñar `--heading-*` espejando `--style-h{n}-*` sería un alias por eje×nivel
(36+) de una capa que ya es pública y viva — la clase de alias que §39 mató.
- La única fila propuesta (`fg = var(--_heading-palette-text)`) es el forward
de paleta THM-2 — se queda privado, como en todo el catálogo.
**Disposición**: excepción R-5 por diseño — «primitivo tipográfico: su
contrato de tema es la capa de named styles». Dos formas de materializarla,
decide el autor en D-TH.2: (a) `R-5.1 exception:` en el README de heading (y
de `text`, `display`, `s-text`, `prose`, `code`… — toda la familia B5 comparte
el patrón; verificar cada uno antes de copiar la excepción), o (b) añadir
`--style-*` a la lista SYSTEM del censo PARA los primitivos tipográficos, con
lo que su alcance pasa a medirse como sistema transversal (mi propuesta: (b),
porque es verdad estructural, no excepción caso a caso).
**Bloqueos de firma**: D-TH.2 (perímetro del knob / lista SYSTEM).
<!-- veredicto:end -->

Powered by TurnKey Linux.