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

112 lines
5.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.

# separator — 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-25 · **Alcance**: **100%** — 4 de 4 knobs por token público
- **Knobs de apariencia**: 4 — público 4 · privado 0 · global 0 · literal 0 · sistema 0 · excepción 2 · estructural 0 · puente 0 · canal 0 _(los cinco últimos, fuera del ratio)_
- **Contrato hoy** (`lib/recipes/base.ts`): 3 pública(s) — `thickness`, `fg`, `min-length`
- **Eje `size`**: no · **ficheros**: `separator.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 (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 | `separator.css:26` | `[data-separator][data-orientation='horizontal']` | `inline-size` | `100%` |
| 2 | `separator.css:32` | `[data-separator][data-orientation='vertical']` | `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?
_La receta no declara privados propios en su CSS._
## 4. Propuesta de corrección
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (0)
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 (`--separator-…`) | scope TSC | valor propuesto | usos |
| --- | --- | --- | ---: |
### 4.2 Sin nombre mecánico (2)
- **⚠ 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`.
### 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-24 · 67 % → 100 %, y SIN ACUÑAR UNA SOLA CLAVE.** Contrato
**3 → 3**. Censo: público 4, global 0, literal **2 → 0** (los dos pasan a
`exception`, fuera del ratio), privado 0, sistema 0. Diff de computed **VACÍO**
(448 valores, 7 estados); capturas 2× antes/después idénticas. Centinela
**3/3**, **cero adjudicadas**.
**El techo de este componente ES el 100 %, y se alcanza firmando, no acuñando.**
Los dos knobs que faltaban eran `inline-size: 100%` en el horizontal y
`block-size: 100%` en el vertical: no son knobs, son la IDENTIDAD del primitivo.
Una regla ocupa el contenedor; un separador que no lo hiciera sería otro
componente, y su propio README ya lo decía en la fila «Decorative + horizontal
default min-length» de sus Gaps («Horizontal already fills 100%»). Llevan su
`/* literal: … */` (recipe-contract §3) y salen del ratio. Acuñar
`--separator-length` habría sido inventar un eje que nadie pidió y que ninguna
composición del catálogo usa.
**Las tres claves que ya tenía son TODA su apariencia**, y ninguna es prestada:
`thickness` (el grosor, que cambia de eje con la orientación — el mismo token
alimenta `block-size` en horizontal e `inline-size` en vertical), `fg` (la
tinta, en el slot 6 `--color-neutral-separator`, que existe precisamente para
que un tema retoque los divisores sin tocar los bordes de control) y
`min-length` (el suelo del vertical cuando el eje cruzado colapsa al contenido).
El `border: 0` y el `flex-shrink: 0` no son apariencia: son la puesta a cero y
la defensa contra el colapso en un padre flex.
**Lo que costó una medición, y es del INSTRUMENTO, no del componente**:
`min-length` leía MUERTO (2/3). No era un token que miente — es que la demo
arranca en el ejemplo `stacked`, que monta sólo reglas horizontales, y la mitad
de la receta cuelga de `[data-orientation='vertical']`. Se arregla midiendo, no
adjudicando: un `sweepAttr` sobre `data-orientation` en `COMPONENT_OVERRIDES`
recorre las DOS orientaciones sobre los mismos nodos. Cambiar el chip de la demo
al ejemplo `toolbar` no habría servido: cambia una orientación por la otra en
vez de sumarlas — la trampa de «montar MÁS puede medir MENOS», otra vez.
<!-- veredicto:end -->

Powered by TurnKey Linux.