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

8.5 KiB

knob — 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 · método y protocolo: PLAN-theming.md §1, §2, §7.

  • Medido: 2026-08-20 · Alcance: 29% — 7 de 24 knobs por token público
  • Knobs de apariencia: 27 — público 7 · privado 4 · global 9 · literal 4 · sistema 3 (fuera del ratio)
  • Contrato hoy (lib/recipes/base.ts): sin entrada en base.ts
  • Eje size: sí · ficheros: knob.css

1. Knobs fuera de alcance

1.1 Directo a primitivo global (9)

# fichero:línea selector propiedad valor
1 knob.css:59 [data-knob-control] border-radius var(--radius-full, 9999px)
2 knob.css:67 [data-knob-control] box-shadow var(--shadow-2)
3 knob.css:92 [data-knob-value-text] color var(--color-neutral-text)
4 knob.css:141 [data-knob-value-field] [data-spin-field-input] color var(--color-neutral-text)
5 knob.css:147 [data-knob-value-field] [data-spin-field-input]:focus-visible border-radius var(--radius-sm)
6 knob.css:168 [data-knob-indicator]::before border-radius var(--radius-sm)
7 knob.css:187 [data-knob][data-dragging] [data-knob-control] box-shadow var(--shadow-3)
8 knob.css:227 [data-knob-label] line-height var(--leading-ui)
9 knob.css:228 [data-knob-label] color var(--color-neutral-text)

1.2 A través de un privado (4)

# fichero:línea selector propiedad valor
1 knob.css:90 [data-knob-value-text] font-size var(--_knob-value-font)
2 knob.css:134 [data-knob-value-field] [data-spin-field-input] inline-size calc(var(--_knob-value-digits, 3) * 1ch)
3 knob.css:139 [data-knob-value-field] [data-spin-field-input] font-size var(--_knob-value-font)
4 knob.css:226 [data-knob-label] font-size var(--_knob-label-font)

1.3 Literales (4)

# fichero:línea selector propiedad valor
1 knob.css:91 [data-knob-value-text] line-height 1
2 knob.css:140 [data-knob-value-field] [data-spin-field-input] line-height 1
3 knob.css:167 [data-knob-indicator]::before block-size 28%
4 knob.css:177 [data-knob-control]:hover filter brightness(1.08)

2. Sistema transversal (3) — 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 knob.css:145 [data-knob-value-field] [data-spin-field-input]:focus-visible outline var(--focus-ring-width) solid var(--focus-ring-color)
2 knob.css:181 [data-knob-control]:focus-visible outline var(--focus-ring-width) solid var(--focus-ring-color)
3 knob.css:192 [data-knob][data-disabled] [data-knob-control] opacity var(--opacity-disabled)

3. Privados de la receta — ¿de dónde sale su valor?

privado declaraciones valor(es) origen ¿deriva de un público?
--_knob-gap 4 var(--size-md-gap), var(--size-sm-gap), var(--size-lg-gap), var(--size-xl-gap) global no
--_knob-diameter 4 calc(var(--size-md-control-height) * 2), calc(var(--size-sm-control-height) * 2), calc(var(--size-lg-control-height) * 2), calc(var(--size-xl-control-height) * 2) global no
--_knob-label-font 4 var(--size-md-font-size), var(--size-sm-font-size), var(--size-lg-font-size), var(--size-xl-font-size) global no
--_knob-value-font 4 var(--size-md-font-size), var(--size-sm-font-size), var(--size-lg-font-size), var(--size-xl-font-size) global no

Consumidos y no declarados en el CSS (vienen de base.ts o de un estilo inline del wrapper): --_knob-value-digits.

4. Propuesta de corrección

  • Consume la capa compartida spin-field. Un eje que la capa posee se consume como var(--_x, var(--x)); el consumidor no acuña --knob-{eje} para él — sería un vocabulario paralelo (README de eidos/components, «Capas compartidas» regla 2).
  • 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 (22)

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 (--knob-…) scope TSC valor propuesto usos
control-shadow root ⚠ var(--shadow-2) / var(--shadow-3) 2
control-radius root var(--radius-full, 9999px) 1
value-text-font-size-md size:md var(--size-md-font-size) 1
value-text-font-size-sm size:sm var(--size-sm-font-size) 1
value-text-font-size-lg size:lg var(--size-lg-font-size) 1
value-text-font-size-xl size:xl var(--size-xl-font-size) 1
value-text-fg root var(--color-neutral-text) 1
value-field-font-size-md size:md var(--size-md-font-size) 1
value-field-font-size-sm size:sm var(--size-sm-font-size) 1
value-field-font-size-lg size:lg var(--size-lg-font-size) 1
value-field-font-size-xl size:xl var(--size-xl-font-size) 1
value-field-fg root var(--color-neutral-text) 1
value-field-radius root var(--radius-sm) 1
indicator-height root 28% 1
indicator-radius root var(--radius-sm) 1
hover-control-filter root brightness(1.08) 1
label-font-size-md size:md var(--size-md-font-size) 1
label-font-size-sm size:sm var(--size-sm-font-size) 1
label-font-size-lg size:lg var(--size-lg-font-size) 1
label-font-size-xl size:xl var(--size-xl-font-size) 1
label-line-height root var(--leading-ui) 1
label-fg root var(--color-neutral-text) 1

4.2 Sin nombre mecánico (3)

  • ⚠ 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 — 2: line-height.
  • ⚠ 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.3 Avisos sobre los tokens propuestos (2)

  • el privado --_knob-value-font debe pasar a leer este público (o desaparecer) — --knob-value-text-font-size-md, --knob-value-text-font-size-sm, --knob-value-text-font-size-lg, --knob-value-text-font-size-xl, --knob-value-field-font-size-md, --knob-value-field-font-size-sm, --knob-value-field-font-size-lg, --knob-value-field-font-size-xl
  • el privado --_knob-label-font debe pasar a leer este público (o desaparecer) — --knob-label-font-size-md, --knob-label-font-size-sm, --knob-label-font-size-lg, --knob-label-font-size-xl

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

(pendiente — lo escribe el autor; se conserva al regenerar)

Powered by TurnKey Linux.