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/nav-tree.md

118 lines
5.7 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.

# nav-tree — 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**: **96%** — 22 de 23 knobs por token público
- **Knobs de apariencia**: 24 — público 22 · privado 0 · global 0 · literal 1 · sistema 1 · excepción 1 _(los dos últimos, fuera del ratio)_
- **Contrato hoy** (`lib/recipes/base.ts`): 18 pública(s) — `indent`, `font-size`, `line-height`, `row-gap`, `row-padding-block`, `row-padding-inline-end`, `row-radius`, `row-fg`, `hover-row-fg`, `active-row-fg`, `active-row-font-weight`, `disabled-row-fg`, `trail-row-fg`, `trigger-min-inline-size`, `trigger-padding-inline`, `badge-padding-inline-start`, `chevron-size`, `chevron-stroke`
- **Eje `size`**: no · **ficheros**: `nav-tree.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 (1)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `nav-tree.css:66` | `[data-nav-tree-link], [data-nav-tree-trigger]` | `inline-size` | `100%` |
### 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 | `nav-tree.css:114` | `[data-nav-tree-trigger]::after` | `opacity` | `0.55` |
## 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 | `nav-tree.css:164` | `[data-nav-tree-link]:focus-visible, [data-nav-tree-trigger]:focus-visible` | `outline` | `var(--focus-ring-width) solid var(--focus-ring-color)` |
## 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): `--_nav-tree-depth`.
## 4. Propuesta de corrección
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (1)
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 (`--nav-tree-…`) | scope TSC | valor propuesto | usos |
| --- | --- | --- | ---: |
| `trigger-opacity` | `root` | `0.55` | 1 |
### 4.2 Sin nombre mecánico (1)
- **⚠ 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** — 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 -->
**EJECUTADO 2026-08-22 — 4 % → 96 %**, 17 claves nuevas (1 → 18). Tenía UNA
sola clave pública (`indent`) y todo lo demás iba a primitivo crudo.
**La FILA es link + trigger a la vez**: las reglas los tratan juntos —mismo
padding, misma tinta, mismo radio, mismo hover— así que el knob es de la fila
(`row-*`), no de cada parte. Es una pseudo-parte, como las regiones de
`waveform`. Sus estados llevan el modificador DELANTE, que es lo que la
gramática firmada pide para lo interactivo: `hover-row-fg`, `active-row-fg`,
`disabled-row-fg`. La estela —los ancestros de la página actual— es
contextual y va detrás: `trail-row-fg`.
**El disparador sí tiene lo suyo**: el suelo de 24 px del blanco táctil
(WCAG 2.5.8) y su padding.
**El galón es una escuadra dibujada con dos bordes** —`::after` con
`border-inline-end` y `border-block-end` girado 45°—: su lado es un knob y el
grosor del trazo otro. Mismo molde que la esquina de `text-focus`.
**La suite cazó un incumplimiento heredado**: el contrato copió
`var(--font-size-sm)` verbatim del CSS, y esa es la coordenada CRUDA que
`recipe-css-contract` prohíbe en un token de receta. Corregido al bundle
(`var(--size-sm-font-size)`), que computa idéntico. Es la tercera vez que el
«valor verbatim» arrastra el defecto del CSS de partida.
**Dos cegueras más del instrumento, medidas y arregladas**: la fila es un
`<div>` pelado sin atributo propio (su `gap` leía muerto) y el guard no leía
el ANCHO de un borde que no fuera el de arriba —el galón tiñe los de
inline-end y block-end—. Con las dos: **18/18 en vivo, sin una sola
excepción**.
Lo que queda fuera: el `100%` de la fila (identidad) y el anillo de foco
(sistema). Sonda antes/después: **0 diffs en 22.140 valores** (102 nodos × 8
estados).
<!-- veredicto:end -->

Powered by TurnKey Linux.