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/password-field.md

143 lines
9.8 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.

# password-field — 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**: **62%** — 21 de 34 knobs por token público
- **Knobs de apariencia**: 35 — público 21 · privado 2 · global 2 · literal 9 · sistema 1 · excepción 1 _(los dos últimos, fuera del ratio)_
- **Contrato hoy** (`lib/recipes/base.ts`): 30 pública(s) — `input-letter-spacing`, `caps-radius`, `caps-font-weight`, `strength-1-bg`, `strength-2-bg`, `strength-3-bg`, `strength-4-bg`, `placeholder-fg`, `trigger-radius`, `trigger-bg`, `trigger-fg`, `icon-size-xs`, `icon-size-sm`, `icon-size-md`, `icon-size-lg`, `icon-size-xl`, `caps-fg`, `caps-bg`, `caps-font-size-xs`, `caps-font-size-sm`, `caps-font-size-md`, `caps-font-size-lg`, `caps-font-size-xl`, `strength-segment-bg`, `strength-segment-gap`, `strength-segment-height`, `strength-radius`, `transition-duration`, `transition-ease`, `disabled-opacity`
- **Eje `size`**: sí · **ficheros**: `password-field.css`
## 1. Knobs fuera de alcance
### 1.1 Directo a primitivo global (2)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `password-field.css:161` | `[data-password-field-strength-meter]` | `padding-inline` | `var(--_field-control-padding-inline)` |
| 2 | `password-field.css:195` | `[data-password-field-strength-meter-label]` | `font-size` | `calc(var(--_field-control-font-size) * 0.85)` |
### 1.2 A través de un privado (2)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `password-field.css:103` | `[data-password-field-visibility-trigger]:hover:not([data-disabled])` | `background` | `var(--_password-field-accent-track)` |
| 2 | `password-field.css:104` | `[data-password-field-visibility-trigger]:hover:not([data-disabled])` | `color` | `var(--_password-field-accent-text)` |
### 1.3 Literales (9)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `password-field.css:118` | `[data-password-field-visibility-trigger] svg` | `inline-size` | `65%` |
| 2 | `password-field.css:119` | `[data-password-field-visibility-trigger] svg` | `block-size` | `65%` |
| 3 | `password-field.css:127` | `[data-password-field-caps-lock-indicator]` | `gap` | `0.25em` |
| 4 | `password-field.css:128` | `[data-password-field-caps-lock-indicator]` | `padding-inline` | `0.4em` |
| 5 | `password-field.css:129` | `[data-password-field-caps-lock-indicator]` | `padding-block` | `0.2em` |
| 6 | `password-field.css:148` | `[data-password-field-caps-lock-glyph]` | `line-height` | `1` |
| 7 | `password-field.css:151` | `[data-password-field-caps-lock-glyph] svg` | `inline-size` | `1em` |
| 8 | `password-field.css:152` | `[data-password-field-caps-lock-glyph] svg` | `block-size` | `1em` |
| 9 | `password-field.css:160` | `[data-password-field-strength-meter]` | `gap` | `0.25em` |
### 1.4 Excepciones firmadas (1) — 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 | `password-field.css:147` | `[data-password-field-caps-lock-glyph]` | `font-size` | `1em` |
## 2. Sistema transversal (1) — 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 | `password-field.css:108` | `[data-password-field-visibility-trigger]:focus-visible` | `outline` | `var(--focus-ring-width) solid var(--focus-ring-color)` |
## 3. Privados de la receta — ¿de dónde sale su valor?
| privado | declaraciones | valor(es) | origen | ¿deriva de un público? |
| --- | ---: | --- | --- | :-: |
| `--_password-field-accent-track` | 8 | `var(--color-secondary-track)`, `var(--color-neutral-track)`, `var(--color-affirm-track)`, `var(--color-fulfill-track)`, `var(--color-risk-track)`, `var(--color-threat-track)` …(+2) | global | no |
| `--_password-field-accent-text` | 8 | `var(--color-secondary-text)`, `var(--color-neutral-text)`, `var(--color-affirm-text)`, `var(--color-fulfill-text)`, `var(--color-risk-text)`, `var(--color-threat-text)` …(+2) | global | no |
| `--_password-field-trigger-size` | 5 | `var(--password-field-icon-size-md)`, `var(--password-field-icon-size-xs)`, `var(--password-field-icon-size-sm)`, `var(--password-field-icon-size-lg)`, `var(--password-field-icon-size-xl)` | public | **sí** |
| `--_password-field-caps-font-size` | 5 | `var(--password-field-caps-font-size-md)`, `var(--password-field-caps-font-size-xs)`, `var(--password-field-caps-font-size-sm)`, `var(--password-field-caps-font-size-lg)`, `var(--password-field-caps-font-size-xl)` | public | **sí** |
## 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` (13)
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 (`--password-field-…`) | scope TSC | valor propuesto | usos |
| --- | --- | --- | ---: |
| `hover-visibility-trigger-bg` | `root` | ⚠ `var(--color-secondary-track)` / `var(--color-neutral-track)` / `var(--color-affirm-track)` / `var(--color-fulfill-track)` / `var(--color-risk-track)` / `var(--color-threat-track)` / `var(--color-loss-track)` / `var(--color-primary-track)` | 8 |
| `hover-visibility-trigger-fg` | `root` | ⚠ `var(--color-secondary-text)` / `var(--color-neutral-text)` / `var(--color-affirm-text)` / `var(--color-fulfill-text)` / `var(--color-risk-text)` / `var(--color-threat-text)` / `var(--color-loss-text)` / `var(--color-primary-text)` | 8 |
| `visibility-trigger-width` | `root` | `65%` | 1 |
| `visibility-trigger-height` | `root` | `65%` | 1 |
| `caps-lock-indicator-gap` | `root` | `0.25em` | 1 |
| `caps-lock-indicator-padding-inline` | `root` | `0.4em` | 1 |
| `caps-lock-indicator-padding-block` | `root` | `0.2em` | 1 |
| `caps-lock-glyph-font-size` | `root` | `1em` | 1 |
| `caps-lock-glyph-width` | `root` | `1em` | 1 |
| `caps-lock-glyph-height` | `root` | `1em` | 1 |
| `strength-meter-gap` | `root` | `0.25em` | 1 |
| `strength-meter-padding-inline` | `root` | `var(--_field-control-padding-inline)` | 1 |
| `strength-meter-label-font-size` | `root` | `calc(var(--_field-control-font-size) * 0.85)` | 1 |
### 4.2 Sin nombre mecánico (1)
- **⚠ decisión: `1` 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** — 1: `line-height`.
### 4.3 Avisos sobre los tokens propuestos (3)
- **el privado `--_password-field-accent-track` debe pasar a leer este público (o desaparecer)** — `--password-field-hover-visibility-trigger-bg`
- **el privado `--_password-field-accent-text` debe pasar a leer este público (o desaparecer)** — `--password-field-hover-visibility-trigger-fg`
- **⚠ decisión: el valor es una expresión — el token puede llevar la expresión entera o sólo su término variable** — `--password-field-strength-meter-label-font-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 -->
**EJECUTADO 2026-08-22 — 41 % → 62 %**, 7 claves, y el guard queda **en verde
con las siete adjudicaciones medidas** (antes arrastraba tres sin medir).
Cosido: el tracking del input enmascarado —los puntos leen mejor algo
sueltos—, el chip de bloq-mayús (radio y peso; su peso llevaba un `500` muerto
detrás de un token que ya vale 500) y **los cuatro peldaños del medidor de
fuerza**. Éstos son una ESCALA DE INTENCIÓN, no cuatro colores sueltos: cada
uno lee su rol —pérdida, riesgo, cumplimiento, afirmación— y ahora un tema
puede recorrer la escala entera sin tocar los roles del sistema.
**Lo que NO se acuña, y es composición**: el `padding-inline` del medidor y el
`font-size` de su rótulo leen privados de FIELD (`--_field-control-*`), porque
este componente monta un Field. Se teman en la ficha del dueño — mandato de
composición, `theming-audit` §5.3-3.
**Siete adjudicaciones, todas medidas**: los cuatro peldaños sólo pintan bajo
su `data-strength` y la demo arranca con el campo vacío (fuerza 0, ningún
segmento activo); las dos de transición las congela el guard, y la opacidad
deshabilitada vive en el disparador de visibilidad. Forzadas una a una.
Sonda antes/después: **0 diffs en 3.060 valores** (14 nodos × 8 estados).
<!-- veredicto:end -->

Powered by TurnKey Linux.