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/text-gradient.md

110 lines
5.3 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.

# text-gradient — 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-24 · **Alcance**: **100%** — 10 de 10 knobs por token público
- **Knobs de apariencia**: 10 — público 10 · privado 0 · global 0 · literal 0 · sistema 0 · excepción 0 _(los dos últimos, fuera del ratio)_
- **Contrato hoy** (`lib/recipes/base.ts`): 7 pública(s) — `radius`, `font-weight`, `blur`, `border-padding-block`, `border-padding-inline`, `border-width`, `border-inner-bg`
- **Eje `size`**: no · **ficheros**: `text-gradient.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._
### 1.4 Excepciones firmadas (0) — fuera del ratio
Literales que llevan su anotación `/* literal: <razón> */` en la propia
declaración: la válvula de recipe-contract §3, la misma que honra
`component-audit`. **Una desviación firmada no es deuda** — se listan para que la
razón se lea, no para acuñarlas.
_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): `--_text-gradient-play-direction`.
## 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 -->
**EJECUTADO 2026-08-22 — 67 % → 100 %**, 7 claves en una entrada NUEVA.
Tercero de la familia text-* con la misma forma que `text-circular` y
`text-focus`: cuatro públicos consumidos a través de un fallback y **ninguno
declarado**, más tres literales. Sin eje `size` y sin privados propios, así
que declarar no puede matar una escala.
Lo que la propuesta §4 generada NO acertaba, y se decidió midiendo:
- **`weight` era deriva de nombre.** El catálogo tiene 77 claves
`font-weight` contra 4 `weight` a secas —y dos de esas cuatro las escribió
la sesión del 22 en esta misma familia—. El público de facto
`--text-gradient-weight` pasa a `font-weight`, y su valor al paso de la
escala que ya pintaba: `500` **es** `var(--font-weight-medium)`.
- **El `calc(100% - 2px)` del hueco no son dos knobs de eje físico** (que es
lo que la propuesta marcaba con ⚠), sino UNO: los 2 px son el trazo del
marco asomando a cada lado. El knob es `border-width` —con
`var(--border-width)`, el paso `thin` de la escala, no un literal `1px`
igual a un paso— y el hueco se deriva:
`calc(100% - var(--text-gradient-border-width) * 2)`.
- **El `blur(4px)` va a la escala de blur, no a un literal.** `blur` es
familia MÉTRICA del eje `scaling` (theming §23): un literal es ciego al zoom
global. `var(--blur-sm)` = `calc(4px * var(--scaling))` — idéntico a
scaling 100, correcto al 90 y al 110. Precedente: `dialog`/`drawer`
`overlay-blur`, que también alimentan un `backdrop-filter`.
- **El shorthand físico `padding: var(--space-1) var(--space-2)` se parte en
ejes lógicos** (`border-padding-block` / `-inline`), que es la normalización
firmada el 2026-07-06; el público de facto `border-padding` era un knob con
dos ejes dentro.
**Fuera del contrato por naturaleza — canal de valor, no superficie de tema**:
`--text-gradient-duration` y `--_text-gradient-play-direction` los escribe el
wrapper INLINE desde `animationSpeed` y `yoyo`, y ningún token gana a un
estilo inline. Misma clase que los cuatro ausentes de `knob`, el `item-gap` de
`carousel` y el `preview-z` de `drag-drop`. (No entran en el ratio: el censo
no cuenta `animation-*` como knob de apariencia.)
**Instrumento — dos puntos ciegos arreglados antes de medir**, porque un gate
verde sobre dos nodos no prueba nada: la demo arranca con `showBorder=false`,
así que sonda y centinela veían 2 nodos y NINGUNO de los tres tokens del marco;
y la sonda no leía `backdropFilter` (el censo sí lo cuenta como knob). Con el
chip de variante encendido y la propiedad añadida: **4 nodos**, 720 valores
× 7 estados, **0 diffs**, y el centinela **7/7 sin una sola excepción**.
Hover: 0 nodos medidos y es correcto — las cuatro partes son `<span>` y el
único efecto de hover del componente es `animation-play-state`, que no es knob.
<!-- veredicto:end -->

Powered by TurnKey Linux.