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/code-block.md

133 lines
7.5 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.

# code-block — 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-21 · **Alcance**: **81%** — 21 de 26 knobs por token público
- **Knobs de apariencia**: 26 — público 21 · privado 2 · global 3 · literal 0 · sistema 0 _(fuera del ratio)_
- **Contrato hoy** (`lib/recipes/base.ts`): 20 pública(s) — `radius`, `fg`, `border-width`, `border`, `surface-bg`, `header-gap`, `header-padding-inline`, `header-padding-block`, `header-bg`, `title-font-family`, `title-font-size`, `title-fg`, `lang-font-family`, `lang-font-size`, `lang-fg`, `lang-letter-spacing`, `copy-gap`, `copy-font-size`, `copy-fg`, `pre-padding`
- **Eje `size`**: no · **ficheros**: `code-block.css`
## 1. Knobs fuera de alcance
### 1.1 Directo a primitivo global (3)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `code-block.css:102` | `[data-code-block-code]` | `font-family` | `var(--style-code-font-family)` |
| 2 | `code-block.css:104` | `[data-code-block-code]` | `font-weight` | `var(--style-code-font-weight)` |
| 3 | `code-block.css:106` | `[data-code-block-code]` | `letter-spacing` | `var(--style-code-letter-spacing)` |
### 1.2 A través de un privado (2)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `code-block.css:103` | `[data-code-block-code]` | `font-size` | `var(--_code-block-font-size, var(--style-code-font-size))` |
| 2 | `code-block.css:105` | `[data-code-block-code]` | `line-height` | `var(--_code-block-line-height, var(--style-code-line-height))` |
### 1.3 Literales (0)
_Ninguno._
## 2. Sistema transversal (0) — informativo, fuera del ratio
Un tema los alcanza **a nivel de sistema**, por diseño (recipe-contract §2).
_Ninguno._
## 3. Privados de la receta — ¿de dónde sale su valor?
_La receta no declara privados propios en su CSS._
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_code-block-font-size`, `--_code-block-line-height`.
## 4. Propuesta de corrección
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (3)
Valor **verbatim** del CSS de hoy: el default no se mueve, sólo cambia quién
puede moverlo. Nombres derivados de recipe-contract §1 (ejes lógicos, talla
al final) y theming §6.7 (slots de color, modificador delante). Un token con
DOS valores distintos es una colisión de nombre: son dos knobs, o el nombre
no distingue lo que debería — se marca `⚠`.
| token (`--code-block-…`) | scope TSC | valor propuesto | usos |
| --- | --- | --- | ---: |
| `code-font-family` | `root` | `var(--style-code-font-family)` | 1 |
| `code-font-weight` | `root` | `var(--style-code-font-weight)` | 1 |
| `code-letter-spacing` | `root` | `var(--style-code-letter-spacing)` | 1 |
### 4.2 Sin nombre mecánico (2)
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 2: `font-size`, `line-height`.
### 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 -->
**Medido 2026-08-21** (sonda ×2 sobre el mismo código = 0 diffs en 1.305
valores · 7 estados). El handoff lo llamaba «el más mecánico de los que
quedan»: **no lo es**. Sus 26 knobs se parten en dos grupos con doctrinas
distintas, y la §4 propone acuñar los cinco del segundo, que es justo lo que la
regla de capas prohíbe.
1. **El bloque `[data-code-block-code]` consume la CAPA tipográfica
`--style-code-*`, y no debe acuñar nada.** Sus cinco declaraciones
(`font-family`, `font-size`, `font-weight`, `line-height`,
`letter-spacing`) leen `var(--style-code-…)`, y las dos que pasan por
privado lo hacen con la forma canónica de la escotilla por instancia:
`var(--_code-block-font-size, var(--style-code-font-size))`, donde el
privado lo escribe el WRAPPER desde la prop `size`
(`code-block.svelte:50-51`, sólo si se pasa) y el nombre de estilo ES la
superficie de tema. Es literalmente el patrón que D-TH.2-b describió para
`heading` / `text` / `code`. Acuñar `code-font-family` y compañía, como pide
la §4.1, sería el vocabulario paralelo que la regla 2 de capas compartidas
prohíbe: **no se acuñan**.
2. **Consecuencia en la métrica, y una decisión que NO es mía.** El censo
cuenta esas cinco como `global` porque `code-block` no está en
`TYPOGRAPHIC_PRIMITIVES` (`theming-census.ts:153`) — es un componente
COMPUESTO que contiene un primitivo tipográfico, no uno de ellos. Así que el
alcance se queda en **~81 %** en vez del ~100 % que da el trabajo hecho. Es
exactamente el techo que el registro ya tiene abierto: «extender la clase
`system` del censo a las capas compartidas», **pendiente de firma**. La
métrica penaliza hacer lo correcto, otra vez, y no se toca de oficio.
3. **Los shorthand se parten**: los dos `border` (surface / outline) y el
`border-bottom` de la cabecera comparten anchura y color → un
`border-width` + un `border`; el `padding` uniforme del `<pre>` →
`pre-padding` (precedente `command.viewport-padding`). El `background:
transparent` de outline/ghost y el `border: 0` de ghost son IDENTIDAD de
variante, no knobs.
4. **No hay eje `size` que cascadear.** El wrapper escribe la talla como
ESTILO INLINE (`--_code-block-font-size`) y sólo cuando la prop llega; sin
ella manda la capa. No hay `data-size` en el CSS y no hay cascada TSC que
emitir — la ficha acierta al decir «Eje size: no».
5. **`copy-fg` es del INDICADOR, no del botón.** El comentario de la receta lo
dice: el cromo del trigger viene de `button.css`, y esta regla sólo coloca y
tiñe el texto transitorio «Copied». El nombre se queda, pero conviene no
leerlo como el color del botón de copiar.
6. **Los tres `font-size` van al BUNDLE, no al primitivo crudo** — y esto lo
cazó un guard, no yo: la §4.1 propone `var(--font-size-xs)` /
`var(--font-size-xxs)` verbatim, y `recipe-css-contract` («recipes consume
the size bundle, not the raw size-coordinate primitives») falló con los tres
(`title-font-size`, `lang-font-size`, `copy-font-size`). Corregidos a
`var(--size-{k}-font-size)`; los alias son 1:1, así que el cambio preserva
el valor — 0 diffs de computed tras aplicarlo. Vale como aviso general: la
propuesta generada copia el valor del CSS **verbatim**, y cuando ese valor
era ya una violación del contrato, la copia la hereda.
Quedan **20 claves**. Nada más de la propuesta cambia: los nombres del chasis,
cabecera, título, lengua y copia son correctos tal como los deriva la §4.1.
<!-- veredicto:end -->

Powered by TurnKey Linux.