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/meter.md

128 lines
7.6 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.

# meter — 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-23 · **Alcance**: **75%** — 9 de 12 knobs por token público
- **Knobs de apariencia**: 12 — público 9 · privado 1 · global 2 · literal 0 · sistema 0 · excepción 2 _(los dos últimos, fuera del ratio)_
- **Contrato hoy** (`lib/recipes/base.ts`): 28 pública(s) — `height-xs`, `height-sm`, `height-md`, `height-lg`, `height-xl`, `radius-xs`, `radius-sm`, `radius-md`, `radius-lg`, `radius-xl`, `ring-size-xs`, `ring-size-sm`, `ring-size-md`, `ring-size-lg`, `ring-size-xl`, `ring-thickness-xs`, `ring-thickness-sm`, `ring-thickness-md`, `ring-thickness-lg`, `ring-thickness-xl`, `track-bg`, `ring-track-bg`, `ring-center-bg`, `indicator-bg-below`, `indicator-bg-optimum`, `indicator-bg-above`, `transition-duration`, `transition-ease`
- **Eje `size`**: sí · **ficheros**: `meter.css`
## 1. Knobs fuera de alcance
### 1.1 Directo a primitivo global (2)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `meter.css:73` | `[data-meter][data-shape='circular']` | `border-radius` | `var(--radius-full)` |
| 2 | `meter.css:94` | `[data-meter][data-shape='circular'] [data-meter-indicator]::before` | `border-radius` | `var(--radius-full)` |
### 1.2 A través de un privado (1)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `meter.css:54` | `[data-meter-indicator]` | `inline-size` | `calc(var(--_meter-value-pct, 0) * 1%)` |
### 1.3 Literales (0)
_Ninguno._
### 1.4 Excepciones firmadas (2) — 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.
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `meter.css:10` | `[data-meter]` | `inline-size` | `100%` |
| 2 | `meter.css:55` | `[data-meter-indicator]` | `block-size` | `100%` |
## 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?
| privado | declaraciones | valor(es) | origen | ¿deriva de un público? |
| --- | ---: | --- | --- | :-: |
| `--_meter-height` | 5 | `var(--meter-height-md)`, `var(--meter-height-xs)`, `var(--meter-height-sm)`, `var(--meter-height-lg)`, `var(--meter-height-xl)` | public | **sí** |
| `--_meter-radius` | 5 | `var(--meter-radius-md)`, `var(--meter-radius-xs)`, `var(--meter-radius-sm)`, `var(--meter-radius-lg)`, `var(--meter-radius-xl)` | public | **sí** |
| `--_meter-ring-size` | 5 | `var(--meter-ring-size-md)`, `var(--meter-ring-size-xs)`, `var(--meter-ring-size-sm)`, `var(--meter-ring-size-lg)`, `var(--meter-ring-size-xl)` | public | **sí** |
| `--_meter-ring-thickness` | 5 | `var(--meter-ring-thickness-md)`, `var(--meter-ring-thickness-xs)`, `var(--meter-ring-thickness-sm)`, `var(--meter-ring-thickness-lg)`, `var(--meter-ring-thickness-xl)` | public | **sí** |
| `--_meter-indicator-bg` | 3 | `var(--meter-indicator-bg-optimum)`, `var(--meter-indicator-bg-below)`, `var(--meter-indicator-bg-above)` | public | **sí** |
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_meter-value-pct`.
## 4. Propuesta de corrección
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (2)
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 (`--meter-…`) | scope TSC | valor propuesto | usos |
| --- | --- | --- | ---: |
| `radius` | `root` | `var(--radius-full)` | 1 |
| `indicator-radius` | `root` | `var(--radius-full)` | 1 |
### 4.2 Sin nombre mecánico (3)
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 2: `inline-size`, `block-size`.
- **⚠ 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** — 1: `inline-size`.
### 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 -->
**ADJUDICADO 2026-08-23 — 64 % → 75 %, y ése es su techo.** CERO claves nuevas:
su contrato de 28 ya cubría todo lo que es suyo. Dos literales firmados, cuatro
adjudicaciones medidas y **tres filas que se quedan fuera a propósito**. Diff de
computed 0 (416 valores, 7 estados), capturas antes/después idénticas.
**Los dos `border-radius: var(--radius-full)` no se acuñan.** Son lo que hace
circular a `shape="circular"`: el exterior del anillo y el agujero del centro.
Un `--meter-circular-radius` dejaría que un tema descirculara una forma que el
consumidor pidió POR NOMBRE — identidad, no knob, la misma lectura que los dos
`50 %` de `cropper`. Nota de coherencia con `badge`, donde SÍ acuñé `dot-radius`
para un `--radius-full`: allí el punto es un adorno cuya forma es estética (y
`knob.indicator-radius` vale `--radius-sm`, que lo prueba); aquí el redondeo ES
el valor del atributo. **La prueba sigue siendo qué DECIDE el token.**
**`--_meter-value-pct` es canal de valor**: el wrapper lo escribe inline con el
porcentaje, y de él salen la anchura de la barra y la parada del
`conic-gradient`. Un público encima lo pisa el inline.
**Los dos `100 %` son identidad** (la barra lineal ES el ancho de su contenedor;
el indicador llena el alto de la pista), firmados en su declaración.
**El guard medía la MITAD del componente.** La demo arranca en `shape='linear'`,
así que los catorce tokens del anillo —doce pasos de tamaño y grosor más su
pista y su centro— no tenían nodo que pintar: 12 de 28. Con el barrido de
`data-shape` sube a **24 de 28**, y los cuatro restantes quedan adjudicados con
su medida: las dos tintas de zona fuera de `optimum` (forzadas, alcanzan) y el
par de transición (medido sin congelar: 0,18s → 11,5s).
**Verificación**: sonda antes/después **0 diffs** · R-5.4 **24/28**, exit 0 ·
`component:audit` PASS · censo 75 % con las tres filas explicadas · `eidos-lint`
4 morfo-backed / **0 invalid, 0 class-hooks** · capturas 2×, miradas.
<!-- veredicto:end -->

Powered by TurnKey Linux.