docs(theming): revisadas las fichas 11-20 — veredicto verificado y corregido en cada una

Segunda tanda de revisión del eje theme-reach: command, table, media-player,
tree-grid, field-langs, gradient-picker, listbox, carousel, heading y feed.
Cifras reproducidas en las diez; la corrección va escrita en el bloque de
veredicto de cada ficha, que sobrevive a la regeneración.

Lo que la verificación cambió del plan mecánico:

- Tres «colisiones» no eran colisiones: el radio de command es ADAPTACIÓN al
  Dialog que lo hospeda (lee un público de dialog, legítimo); el ancho del
  panel de gradient-picker es POR TALLA (20/18/22rem); y el título de feed son
  las redeclaraciones por talla de su propio privado.
- Dos nombres mecánicos estaban mal: el `root-height` de table es la FILA
  (row-height, al bundle), y el `root-bg-image` de tree-grid son las GUÍAS de
  indentación — el knob es un color (`guide-color`), los cinco gradientes son
  de la receta.
- Dos prefijos más de la misma plaga: media-player declara `--_mp-*` (el censo
  lo cuenta global) y field-langs `--_fls-*` — que además lee un privado DE
  FIELD con la fórmula del label un paso por debajo, sólo resoluble anidado:
  eso va al mandato field-composition, no se copia congelado. Y gradient-picker
  estampa `--gp-current-gradient` inline: mismo renombrado que gb.
- Una regla de capa a punto de romperse: la propuesta de listbox acuñaba
  `font-size = var(--list-font-size)`, que es un público DE LA CAPA
  list-surface — duplicarlo es el vocabulario paralelo que la propia nota
  prohíbe. Retirada.
- Y una lectura equivocada del 0 %: heading NO tiene deuda — es el primitivo
  tipográfico consumiendo la capa de named styles, que ES su superficie de
  tema (applyTypeScale la retunea en vivo). Acuñar --heading-* sería el alias
  por eje×nivel que la purga del §39 mató. Disposición propuesta: medir
  --style-* como sistema transversal para los primitivos tipográficos —
  decisión D-TH.2, y aplica a toda la familia B5.

media-player trae además contexto que la propuesta ignoraba: su acento ya está
firmado en el propio bloque de recetas como theme-stable (una escala cruda a
propósito, para leerse sobre cualquier vídeo) — no se «corrige» a un rol.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alpha-0.1-background
dev 2 months ago
parent 07778b597a
commit 3bfe0d4130

@ -164,6 +164,29 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO** (36 · 0 · 14 · 12 · 5 · 5). Privados propios bien
prefijados; `data-size` en el root ✓.
**Propuesta: APTA CON TRES PUNTOS.**
1. **Los `indicator-width-{k}` en rem son geometría PROPIA** (los puntos del
paginador: 0.375–0.75rem): coordenadas verbatim + resuelto
`host`+`size:{k}` — como las alturas de gradient-builder, ni bundle ni
desviación que marcar (el bundle no tiene coordenada de punto).
2. **`height: 16rem`** es el alto por defecto del viewport del carrusel:
token verbatim (`height`), y comprobar con el centinela que el consumidor
real es el viewport (no un envoltorio).
3. **El ⚠ de `item-group-gap`** (space-2 / space-1): dos selectores distintos
— resolver mirando el selector real (¿orientación? ¿grupo anidado?) y
separar por lo que el selector diga, no fundir. Si es por talla, son
coordenadas.
Botones prev/next: si componen `<Button>` (consumer pattern), su cromo NO se
acuña aquí — verificar en el wrapper antes de copiar filas de trigger.
`indicator-group-width: max-content` es layout, fuera del knob (D-TH.2).
**Bloqueos de firma**: ninguno duro.
<!-- veredicto:end -->

@ -200,6 +200,33 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO** (52 · 0 · 9 · 35 · 6 · 2, reproducido). La nota de capa
compartida es real: consume `list-surface` (ritmo de filas) — nada de lo que la
capa posee se acuña.
**Propuesta: APTA CON TRES CORRECCIONES.**
1. **El ⚠ de `radius` no es colisión — es CONTEXTO**: la receta adapta el radio
cuando vive dentro de un Dialog (`command.css:71`:
`[data-dialog-content] [data-command] { --_command-radius:
var(--dialog-content-radius) }` — el modo `<Command.Dialog>`). Se acuña
`radius` con el valor suelto (`--radius-lg`); la regla de contexto se queda
como está — lee un PÚBLICO de dialog, que es legítimo (el panel ES un
dialog ahí). No partir en dos tokens.
2. **El ⚠ de `list-padding-inline` es el hueco del scrollbar** (base +
`calc(base + space-3-5)`), el mismo caso que combobox resolvió con
`scrollbar-inset`: acuñar `list-padding-inline` + `scrollbar-inset` y la
regla del overflow compone.
3. **Forma por talla**: coordenadas en `root` + nombre RESUELTO con default
`host` (patrón Sidebar); `data-size` vive en el root ✓, sin `parts`.
Alturas/tipografías por la coordenada del bundle donde casen 1:1.
Los privados: verificar en §3 cuáles derivan ya y pasar el resto a leer el
público resuelto o morir. Sonda §7.2 con el palette ABIERTO (si el modo Dialog
portala, medir dentro).
**Bloqueos de firma**: ninguno duro — ejecutable como combobox.
<!-- veredicto:end -->

@ -162,6 +162,30 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO** (33 · 0 · 13 · 16 · 3 · 1). Privado propio bien
prefijado (`--_feed-font-size` redeclarado por talla, `feed.css:22-65`);
`data-size` vive en `[data-feed-root]`; ya existe el forward de paleta en
`base.ts` (`_palette-solid`/`_palette-element` con `parts: ['root']`).
**Propuesta: APTA CON DOS CORRECCIONES.**
1. **El ⚠ de `article-title-font-size` es POR TALLA, no colisión**: los
valores md/sm/xs son las redeclaraciones del privado por `data-size`.
Forma correcta: coordenadas `font-size-{xs..lg}` (verbatim — OJO: el feed
tipa por debajo del 1:1, `md → font-size-sm`; desviación visible, no
«corregir» al bundle) + resuelto `font-size` con `parts: ['root']` y
default `host`; el privado lo lee o muere. El título del artículo toma su
token propio sólo si su valor difiere del resuelto.
2. **El ⚠ de `sentinel-height`** (space-6 / 0.75rem): el centinela de scroll
infinito — dos usos distintos o un default+compacto; resolver por selector
y, si son dos, dos tokens (`sentinel-height` + el que el selector nombre).
Resto (radius, familia, gaps de artículo): verbatim válido. Los knobs que
lean `--_feed-palette-*` se quedan en THM-2. Sonda §7.2: el feed carga
artículos async — esperar el contenido antes de medir.
**Bloqueos de firma**: ninguno duro.
<!-- veredicto:end -->

@ -132,6 +132,36 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO en cifras** (41 · 0 · 0 · 31 · 8 · 2), y el «privado 0»
vuelve a ser falso de nombre: la receta declara `--_fls-*` — prefijo ABREVIADO
(regla 5) — y además su fórmula lee un privado DE FIELD:
`--_fls-font: calc(var(--_field-control-font-size) − (md − sm))`
(`field-langs.css:25-28`) — la fórmula canónica del label un paso por debajo,
que sólo resuelve ANIDADO en un Field. **Pasos previos: renombrar `--_fls-*` →
`--_field-langs-*`**, y el consumo del privado ajeno queda ANOTADO como parte
del mandato field-composition (`theming-audit.md` §5.3-3) — no se «arregla»
aquí ni se copia el valor congelado.
**Propuesta: APTA EN SU MAYOR PARTE, con tres correcciones:**
1. `switcher-font-size = var(--_fls-font)` y `textarea-padding-block =
var(--_fls-bar)` **no se copian con ese valor**: tras el renombrado, o el
privado deriva de un público propio (`switcher-font-size` como token cuya
fórmula vive en el VALOR) o queda en el lote field-composition. El ⚠ de
`textarea-padding-block` son dos knobs (el hueco de la barra vs el padding
normal) — separar.
2. Los ⚠ de `menu-gap` / `menu-fg` son estados/partes sin parsear (item normal
vs seleccionado): separar por estado (`selected-menu-item-fg`…) leyendo el
selector real.
3. `menu-line-height: 1.2` y `menu-width: 9rem` — literales: token con valor
verbatim (y el line-height, mirar si `--leading-ui` computa igual; si no,
verbatim y desviación visible).
Sin eje `size` (nada estampa `data-size`) — scope `root` para todo.
**Bloqueos de firma**: el lote field-composition (§5.3-3) para los dos knobs
que leen el privado de Field.
<!-- veredicto:end -->

@ -164,6 +164,31 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO** (38 · 0 · 7 · 23 · 5 · 3). Consume `picker-shell` ✓ (no
acuñar lo que la capa posee). Hallazgo de prefijo, cuarto de la familia: el
trigger estampa **`--gp-current-gradient` inline** desde el wrapper
(`gradient-picker-trigger.svelte:4`) — abreviatura contra la regla 5.
**Renombrar a `--_gradient-picker-current-gradient`** (wrapper + receta), el
mismo tratamiento que `--gb-stop-fill` en gradient-builder.
**Propuesta: APTA CON DOS CORRECCIONES.**
1. **El ⚠ de `content-width` NO es colisión — es POR TALLA** (20/18/22rem son
md/sm/lg): coordenadas `content-width-{sm,md,lg}` verbatim + resuelto
`content-width` (si el content viaja por portal, con `parts` — verificar
dónde estampa la talla el panel; el root sí la lleva).
2. **Forma por talla en el trigger**: `trigger-height-{k}` a la coordenada del
bundle (`--size-{k}-control-height`, computed idéntico);
`trigger-padding-inline-{k}` VERBATIM (sm=space-2 casa con el bundle pero
md=2-5 y lg=3 DESVÍAN — mantener el valor de hoy, desviación visible);
`trigger-font-size-{k}` al bundle. Todo con su resuelto `host`+`size:{k}`.
Gemelo funcional de `gradient-builder` (el piloto): puede seguir su commit
paso a paso, incluido el guard de claves duplicadas en `base.ts` y el
centinela con el popup abierto.
**Bloqueos de firma**: ninguno duro.
<!-- veredicto:end -->

@ -109,6 +109,36 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: cifras correctas (36 · 0 · 36 · 0 · 0), lectura EQUIVOCADA.** El
0 % de heading no es deuda: es el **primitivo tipográfico funcionando como la
doctrina manda**. Su receta es un selector de named styles — cada eje resuelve
`var(--_heading-{eje}, var(--style-h{n}-{eje}))` por `data-style`, con el
override por instancia inline (cabecera de `heading.css`). La capa semántica
`--style-h{1..6}-*` ES la superficie de theming de los headings
(`architecture/eidos.md` §Typographic vertebration: los primitivos consumen los
named styles; `applyTypeScale` y `styles` del config los retunean en vivo), y
la misma doctrina RECHAZA explícitamente acoplar componentes a golpe de
duplicado («Coupling everything to the semantic layer is not the dominant
practice»).
**Propuesta: NO IMPLEMENTAR.**
- Acuñar `--heading-*` espejando `--style-h{n}-*` sería un alias por eje×nivel
(36+) de una capa que ya es pública y viva — la clase de alias que §39 mató.
- La única fila propuesta (`fg = var(--_heading-palette-text)`) es el forward
de paleta THM-2 — se queda privado, como en todo el catálogo.
**Disposición**: excepción R-5 por diseño — «primitivo tipográfico: su
contrato de tema es la capa de named styles». Dos formas de materializarla,
decide el autor en D-TH.2: (a) `R-5.1 exception:` en el README de heading (y
de `text`, `display`, `s-text`, `prose`, `code`… — toda la familia B5 comparte
el patrón; verificar cada uno antes de copiar la excepción), o (b) añadir
`--style-*` a la lista SYSTEM del censo PARA los primitivos tipográficos, con
lo que su alcance pasa a medirse como sistema transversal (mi propuesta: (b),
porque es verdad estructural, no excepción caso a caso).
**Bloqueos de firma**: D-TH.2 (perímetro del knob / lista SYSTEM).
<!-- veredicto:end -->

@ -157,6 +157,31 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO** (38 · 0 · 9 · 23 · 3 · 3). Consume DOS capas
compartidas: `list-surface` y `menu-indicator`.
**Propuesta: APTA CON UNA CORRECCIÓN QUE ES LA REGLA DE ORO DE LAS CAPAS.**
1. **La fila `font-size = var(--list-font-size)` NO se acuña**: ese token es
PÚBLICO DE LA CAPA `list-surface` (`lib/list-surface.css:24-44`, por
talla). Duplicarlo como `--listbox-font-size` es exactamente el
«vocabulario paralelo» que la nota de arriba prohíbe — la capa posee el
eje, el consumidor escribe la RANURA privada si diverge
(`var(--_x, var(--x))`). Revisar el resto de la tabla contra los tokens de
la capa (`--list-item-height/-padding-*/-gap` y `--list-font-size`): toda
fila cuyo valor sea uno de ellos se RETIRA de la propuesta.
2. El resto (bg, radius, borde de la superficie, checkmark del indicador si
no es de `menu-indicator`): verbatim válido, scope `root`.
**Sin eje `size`** (nada estampa `data-size` — la talla del listbox la lleva
la capa list-surface por contexto): no inventar coordenadas por talla aquí.
Estados de opción (highlighted/checked): el hover/highlight viene del
arquetipo — verificar con el píxel-arriba que ningún `hover-*` propuesto
duplique la capa de estado antes de acuñarlo.
**Bloqueos de firma**: ninguno duro.
<!-- veredicto:end -->

@ -142,6 +142,42 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO en cifras** (45 · 0 · 37 · 8 · 0), con el hallazgo de
prefijo ya visto en los pickers: el «privado 0» es falso de nombre — la receta
declara y consume `--_mp-*` (`fg`, `fg-muted`, `accent`, `accent-strong`,
`border`, `scrim`, `pad-inline`, `captions-*`…), prefijo ABREVIADO que viola
theming §6 regla 5 y que el censo cuenta como `global`. **Paso previo:
renombrar `--_mp-*` → `--_media-player-*`** (`git ls-files` antes — el skin
puede tocarlos).
**Contexto que la propuesta ignora**: el componente YA tiene contrato — 2
claves (`accent: var(--scale-amber-9)`, `accent-strong`), con doctrina escrita
en `base.ts:4060`: acento de proyector **theme-stable** (debe leerse sobre
cualquier vídeo en claro Y oscuro), deliberadamente una escala cruda, y el
scrubber lo consume re-tintando los tokens del Slider compuesto. NO «corregir»
ese `--scale-amber-9` a un rol: es decisión firmada en el propio bloque.
**Propuesta: APTA EN PARTE, con tres correcciones:**
1. **El ⚠ de `bg` son DOS knobs**: la superficie (`--color-surface-default`)
y el velo de controles (`linear-gradient(to top, scrim, transparent)`).
Acuñar `bg` y `controls-scrim` (o promover el privado `scrim` a público y
que ambos gradientes lo lean — mejor: UN color de scrim, dos gradientes en
la receta).
2. **El ⚠ de `time-fg` son dos estados** (tinta plena vs atenuada): tras el
renombrado, esos privados deben derivar de públicos `fg` / `fg-muted`, y
las filas colisionadas desaparecen.
3. **Las filas cuyo valor es `var(--_mp-*)` no se copian tal cual**: primero
el renombrado, luego el privado lee el público nuevo (o muere). El resto
(title, captions, buffering, radius) verbatim válido.
`data-size` en el root ✓; los sliders compuestos traen su receta (no acuñar
sus ejes). El rojo conocido de la suite es `skin-media-player` — comparar por
fichero, no por cifra.
**Bloqueos de firma**: ninguno duro (el acento theme-stable ya está firmado en
el propio bloque).
<!-- veredicto:end -->

@ -195,6 +195,33 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO** (46 · 0 · 23 · 14 · 5 · 4). Los 23 privados están BIEN
prefijados (`--_table-*`), sólo que ninguno deriva de un público — el caso
limpio del eje.
**Propuesta: APTA CON DOS CORRECCIONES DE NOMBRE.**
1. **`root-height-{k}` está mal nombrado: es la FILA.** El valor real es
`--_table-row-block-size: var(--control-height-{k})` (`table.css:32,86-104`)
— la altura de fila por talla, no del root. Nombre canónico:
`row-height-{k}` apuntando a la coordenada del bundle
(`var(--size-{k}-control-height)`, computed idéntico) + resuelto
`row-height` con `parts: ['root']` (el `data-size` vive en
`[data-table-root]`), default `host`.
2. **El prefijo `root-` sobra en el resto** (`root-bg`, `root-radius`,
`root-fg`…): la parte `root` ES el anfitrión del recipe; el token se llama
por el eje (`bg`, `radius`, `fg`) — recipe-contract §1 no antepone la parte
cuando la parte es el propio componente. `surface-root-bg` → variante:
`surface-bg`.
El resto de la tabla (cabecera, celdas, franjas, selección — verificar los
estados `data-selected`/hover contra la capa del sistema antes de acuñar
ningún `hover-*`): valores verbatim válidos. Patrón de ejecución = combobox
(quitar los bloques por talla del CSS al emitirlos el TSC — y comprobarlo con
el centinela, que fue quien cazó ese fallo allí).
**Bloqueos de firma**: ninguno duro.
<!-- veredicto:end -->

@ -194,6 +194,33 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Revisión 2026-08-20 — verificación previa a implementación (Opus).**
**Análisis: CORRECTO** (42 · 0 · 29 · 8 · 2 · 3). Los 29 privados están bien
prefijados; ninguno deriva de un público.
**Propuesta: APTA CON TRES CORRECCIONES.**
1. **`root-bg-image` está mal nombrado: son las GUÍAS DE INDENTACIÓN.** Los 5
usos son `background-image: linear-gradient(var(--_tree-grid-guide), …)`
pintando la guía vertical por `aria-level` (`tree-grid.css:243+`). El knob
real es UN color: acuñar `guide-color` y que el privado
`--_tree-grid-guide` lo lea; los 5 gradientes se quedan en la receta (el
patrón damero de gradient-builder: el color es el token, la construcción es
de la receta).
2. **El prefijo `root-` sobra** en `root-radius`/`root-font-family`/
`root-font-size-*` — la parte es el anfitrión; el token se llama por el eje.
3. **Forma por talla**: `row-padding-inline-{k}` (×8 usos — buen candidato) y
`font-size-{k}` como coordenadas + resueltos con `parts: ['root']` (el
`data-size` vive en `[data-tree-grid-root]`), default `host`. OJO:
`font-size-md = var(--font-size-sm)` — el grid tipa UN paso por debajo
(como table); es su default real → valor VERBATIM, desviación visible del
1:1, no «corregirla» al bundle.
Estados de fila (selección/hover): verificar contra la capa del sistema antes
de acuñar `hover-*` — si el hover es el velo de `archetypes.css`, no hay token
que crear.
**Bloqueos de firma**: ninguno duro.
<!-- veredicto:end -->

Loading…
Cancel
Save

Powered by TurnKey Linux.