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

12 KiB

spinner — 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: 0% — 0 de 23 knobs por token público
  • Knobs de apariencia: 23 — público 0 · privado 15 · global 4 · literal 4 · sistema 0 (fuera del ratio)
  • Contrato hoy (lib/recipes/base.ts): 0 pública(s) · 2 privada(s) forward — _palette-text, _palette-track
  • Eje size: sí · ficheros: spinner.css

1. Knobs fuera de alcance

1.1 Directo a primitivo global (4)

# fichero:línea selector propiedad valor
1 spinner.css:108 [data-spinner][data-variant='bars'] [data-spinner-bar] border-radius var(--radius-sm)
2 spinner.css:129 [data-spinner-label] font-size var(--font-size-sm)
3 spinner.css:130 [data-spinner-label] color var(--color-content-muted)
4 spinner.css:176 [data-spinner][data-variant='ring'] [data-spinner-track] opacity var(--opacity-60)

1.2 A través de un privado (15)

# fichero:línea selector propiedad valor
1 spinner.css:22 [data-spinner] gap var(--_spinner-gap)
2 spinner.css:23 [data-spinner] color var(--_spinner-color)
3 spinner.css:62 [data-spinner][data-variant='ring'] [data-spinner-track] inline-size var(--_spinner-size)
4 spinner.css:63 [data-spinner][data-variant='ring'] [data-spinner-track] block-size var(--_spinner-size)
5 spinner.css:65 [data-spinner][data-variant='ring'] [data-spinner-track] border var(--_spinner-thickness) solid var(--_spinner-track)
6 spinner.css:75 [data-spinner][data-variant='dots'] [data-spinner-track] gap calc(var(--_spinner-size) * 0.2)
7 spinner.css:76 [data-spinner][data-variant='dots'] [data-spinner-track] block-size var(--_spinner-size)
8 spinner.css:81 [data-spinner][data-variant='dots'] [data-spinner-dot] inline-size calc(var(--_spinner-size) * 0.3)
9 spinner.css:82 [data-spinner][data-variant='dots'] [data-spinner-dot] block-size calc(var(--_spinner-size) * 0.3)
10 spinner.css:84 [data-spinner][data-variant='dots'] [data-spinner-dot] background var(--_spinner-color)
11 spinner.css:100 [data-spinner][data-variant='bars'] [data-spinner-track] gap calc(var(--_spinner-size) * 0.12)
12 spinner.css:101 [data-spinner][data-variant='bars'] [data-spinner-track] block-size var(--_spinner-size)
13 spinner.css:106 [data-spinner][data-variant='bars'] [data-spinner-bar] inline-size calc(var(--_spinner-size) * 0.18)
14 spinner.css:107 [data-spinner][data-variant='bars'] [data-spinner-bar] block-size var(--_spinner-size)
15 spinner.css:109 [data-spinner][data-variant='bars'] [data-spinner-bar] background var(--_spinner-color)

1.3 Literales (4)

# fichero:línea selector propiedad valor
1 spinner.css:64 [data-spinner][data-variant='ring'] [data-spinner-track] border-radius 50%
2 spinner.css:83 [data-spinner][data-variant='dots'] [data-spinner-dot] border-radius 50%
3 spinner.css:148 0%, 80%, 100% opacity 0.5
4 spinner.css:152 40% opacity 1

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?

privado declaraciones valor(es) origen ¿deriva de un público?
--_spinner-size 6 1.25rem, 0.75rem, 1rem, 1.75rem, 2.5rem literal no
--_spinner-thickness 6 2px, 1.5px, 3px, 4px literal no
--_spinner-duration 1 0.9s literal no
--_spinner-color 2 var(--_spinner-palette-text), currentColor literal, private no
--_spinner-track 2 color-mix(in srgb, var(--_spinner-palette-track) 60%, transparent), color-mix(in srgb, currentColor 25%, transparent) literal, private no
--_spinner-gap 1 var(--space-2) global no

Consumidos y no declarados en el CSS (vienen de base.ts o de un estilo inline del wrapper): --_spinner-palette-text, --_spinner-palette-track.

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 (71)

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 (--spinner-…) scope TSC valor propuesto usos
fg root ⚠ var(--_spinner-palette-text) / currentColor 2
dots-dot-bg root ⚠ var(--_spinner-palette-text) / currentColor 2
bars-bar-bg root ⚠ var(--_spinner-palette-text) / currentColor 2
gap root var(--space-2) 1
ring-track-width root 1.25rem 1
ring-track-width-xs size:xs 0.75rem 1
ring-track-width-sm size:sm 1rem 1
ring-track-width-md size:md 1.25rem 1
ring-track-width-lg size:lg 1.75rem 1
ring-track-width-xl size:xl 2.5rem 1
ring-track-height root 1.25rem 1
ring-track-height-xs size:xs 0.75rem 1
ring-track-height-sm size:sm 1rem 1
ring-track-height-md size:md 1.25rem 1
ring-track-height-lg size:lg 1.75rem 1
ring-track-height-xl size:xl 2.5rem 1
ring-track-radius root 50% 1
dots-track-gap root 1.25rem 1
dots-track-gap-xs size:xs 0.75rem 1
dots-track-gap-sm size:sm 1rem 1
dots-track-gap-md size:md 1.25rem 1
dots-track-gap-lg size:lg 1.75rem 1
dots-track-gap-xl size:xl 2.5rem 1
dots-track-height root 1.25rem 1
dots-track-height-xs size:xs 0.75rem 1
dots-track-height-sm size:sm 1rem 1
dots-track-height-md size:md 1.25rem 1
dots-track-height-lg size:lg 1.75rem 1
dots-track-height-xl size:xl 2.5rem 1
dots-dot-width root 1.25rem 1
dots-dot-width-xs size:xs 0.75rem 1
dots-dot-width-sm size:sm 1rem 1
dots-dot-width-md size:md 1.25rem 1
dots-dot-width-lg size:lg 1.75rem 1
dots-dot-width-xl size:xl 2.5rem 1
dots-dot-height root 1.25rem 1
dots-dot-height-xs size:xs 0.75rem 1
dots-dot-height-sm size:sm 1rem 1
dots-dot-height-md size:md 1.25rem 1
dots-dot-height-lg size:lg 1.75rem 1
dots-dot-height-xl size:xl 2.5rem 1
dots-dot-radius root 50% 1
bars-track-gap root 1.25rem 1
bars-track-gap-xs size:xs 0.75rem 1
bars-track-gap-sm size:sm 1rem 1
bars-track-gap-md size:md 1.25rem 1
bars-track-gap-lg size:lg 1.75rem 1
bars-track-gap-xl size:xl 2.5rem 1
bars-track-height root 1.25rem 1
bars-track-height-xs size:xs 0.75rem 1
bars-track-height-sm size:sm 1rem 1
bars-track-height-md size:md 1.25rem 1
bars-track-height-lg size:lg 1.75rem 1
bars-track-height-xl size:xl 2.5rem 1
bars-bar-width root 1.25rem 1
bars-bar-width-xs size:xs 0.75rem 1
bars-bar-width-sm size:sm 1rem 1
bars-bar-width-md size:md 1.25rem 1
bars-bar-width-lg size:lg 1.75rem 1
bars-bar-width-xl size:xl 2.5rem 1
bars-bar-height root 1.25rem 1
bars-bar-height-xs size:xs 0.75rem 1
bars-bar-height-sm size:sm 1rem 1
bars-bar-height-md size:md 1.25rem 1
bars-bar-height-lg size:lg 1.75rem 1
bars-bar-height-xl size:xl 2.5rem 1
bars-bar-radius root var(--radius-sm) 1
label-font-size root var(--font-size-sm) 1
label-fg root var(--color-content-muted) 1
opacity root 0.5 1
ring-track-opacity root var(--opacity-60) 1

4.2 Sin nombre mecánico (2)

  • ⚠ decisión: border es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4) — 1: border.
  • ⚠ 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: opacity.

4.3 Avisos sobre los tokens propuestos (3)

  • el privado --_spinner-gap debe pasar a leer este público (o desaparecer) — --spinner-gap
  • el privado --_spinner-color debe pasar a leer este público (o desaparecer) — --spinner-fg, --spinner-dots-dot-bg, --spinner-bars-bar-bg
  • el privado --_spinner-size debe pasar a leer este público (o desaparecer) — --spinner-ring-track-width, --spinner-ring-track-width-xs, --spinner-ring-track-width-sm, --spinner-ring-track-width-md, --spinner-ring-track-width-lg, --spinner-ring-track-width-xl, --spinner-ring-track-height, --spinner-ring-track-height-xs, --spinner-ring-track-height-sm, --spinner-ring-track-height-md, --spinner-ring-track-height-lg, --spinner-ring-track-height-xl, --spinner-dots-track-gap, --spinner-dots-track-gap-xs, --spinner-dots-track-gap-sm, --spinner-dots-track-gap-md, --spinner-dots-track-gap-lg, --spinner-dots-track-gap-xl, --spinner-dots-track-height, --spinner-dots-track-height-xs, --spinner-dots-track-height-sm, --spinner-dots-track-height-md, --spinner-dots-track-height-lg, --spinner-dots-track-height-xl, --spinner-dots-dot-width, --spinner-dots-dot-width-xs, --spinner-dots-dot-width-sm, --spinner-dots-dot-width-md, --spinner-dots-dot-width-lg, --spinner-dots-dot-width-xl, --spinner-dots-dot-height, --spinner-dots-dot-height-xs, --spinner-dots-dot-height-sm, --spinner-dots-dot-height-md, --spinner-dots-dot-height-lg, --spinner-dots-dot-height-xl, --spinner-bars-track-gap, --spinner-bars-track-gap-xs, --spinner-bars-track-gap-sm, --spinner-bars-track-gap-md, --spinner-bars-track-gap-lg, --spinner-bars-track-gap-xl, --spinner-bars-track-height, --spinner-bars-track-height-xs, --spinner-bars-track-height-sm, --spinner-bars-track-height-md, --spinner-bars-track-height-lg, --spinner-bars-track-height-xl, --spinner-bars-bar-width, --spinner-bars-bar-width-xs, --spinner-bars-bar-width-sm, --spinner-bars-bar-width-md, --spinner-bars-bar-width-lg, --spinner-bars-bar-width-xl, --spinner-bars-bar-height, --spinner-bars-bar-height-xs, --spinner-bars-bar-height-sm, --spinner-bars-bar-height-md, --spinner-bars-bar-height-lg, --spinner-bars-bar-height-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.