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/year-grid.md

19 KiB

year-grid — 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 58 knobs por token público
  • Knobs de apariencia: 61 — público 0 · privado 13 · global 40 · literal 5 · sistema 3 (fuera del ratio)
  • Contrato hoy (lib/recipes/base.ts): 0 pública(s) · 5 privada(s) forward — _palette-solid, _palette-solid-hover, _palette-track, _palette-border, _palette-text
  • Eje size: sí · ficheros: year-grid.css

1. Knobs fuera de alcance

1.1 Directo a primitivo global (40)

# fichero:línea selector propiedad valor
1 year-grid.css:11 [data-year-grid] gap var(--calendar-gap) ⤴ prestado de calendar
2 year-grid.css:16 [data-year-grid] border var(--calendar-border-width) solid var(--calendar-border) ⤴ prestado de calendar
3 year-grid.css:17 [data-year-grid] border-radius var(--calendar-radius) ⤴ prestado de calendar
4 year-grid.css:18 [data-year-grid] background var(--calendar-bg) ⤴ prestado de calendar
5 year-grid.css:19 [data-year-grid] box-shadow var(--calendar-shadow) ⤴ prestado de calendar
6 year-grid.css:20 [data-year-grid] color var(--calendar-fg) ⤴ prestado de calendar
7 year-grid.css:21 [data-year-grid] font-family var(--calendar-font-family) ⤴ prestado de calendar
8 year-grid.css:23 [data-year-grid] line-height var(--calendar-line-height) ⤴ prestado de calendar
9 year-grid.css:48 [data-year-grid][data-variant='outline'] background var(--calendar-outline-bg) ⤴ prestado de calendar
10 year-grid.css:49 [data-year-grid][data-variant='outline'] box-shadow var(--calendar-outline-shadow) ⤴ prestado de calendar
11 year-grid.css:66 [data-year-grid-header] gap var(--calendar-header-gap) ⤴ prestado de calendar
12 year-grid.css:73 [data-year-grid-heading] color var(--calendar-heading-fg) ⤴ prestado de calendar
13 year-grid.css:74 [data-year-grid-heading] font-size var(--calendar-heading-font-size) ⤴ prestado de calendar
14 year-grid.css:75 [data-year-grid-heading] font-weight var(--calendar-heading-font-weight) ⤴ prestado de calendar
15 year-grid.css:88 [data-year-grid-prev-button], [data-year-grid-next-button] border var(--calendar-control-border-width) solid var(--calendar-control-border) ⤴ prestado de calendar
16 year-grid.css:89 [data-year-grid-prev-button], [data-year-grid-next-button] border-radius var(--calendar-control-radius) ⤴ prestado de calendar
17 year-grid.css:90 [data-year-grid-prev-button], [data-year-grid-next-button] background var(--calendar-control-bg) ⤴ prestado de calendar
18 year-grid.css:91 [data-year-grid-prev-button], [data-year-grid-next-button] color var(--calendar-control-fg) ⤴ prestado de calendar
19 year-grid.css:102 [data-year-grid-prev-button]:hover, [data-year-grid-next-button]:hover border-color var(--calendar-hover-control-border) ⤴ prestado de calendar
20 year-grid.css:104 [data-year-grid-prev-button]:hover, [data-year-grid-next-button]:hover color var(--calendar-hover-control-fg) ⤴ prestado de calendar
21 year-grid.css:117 [data-year-grid-prev-button][data-disabled], [data-year-grid-next-button][data-disabled] opacity var(--calendar-disabled-opacity) ⤴ prestado de calendar
22 year-grid.css:123 [data-year-grid-grid] gap var(--calendar-grid-gap) ⤴ prestado de calendar
23 year-grid.css:144 [data-year-grid-cell] padding-inline var(--calendar-select-padding-inline, 8px) ⤴ prestado de calendar
24 year-grid.css:145 [data-year-grid-cell] border var(--calendar-day-border-width) solid var(--calendar-day-border) ⤴ prestado de calendar
25 year-grid.css:146 [data-year-grid-cell] border-radius var(--calendar-day-radius) ⤴ prestado de calendar
26 year-grid.css:147 [data-year-grid-cell] background var(--calendar-day-bg) ⤴ prestado de calendar
27 year-grid.css:148 [data-year-grid-cell] color var(--calendar-day-fg) ⤴ prestado de calendar
28 year-grid.css:150 [data-year-grid-cell] font-weight var(--calendar-day-font-weight) ⤴ prestado de calendar
29 year-grid.css:162 [data-year-grid-cell]:hover border-color var(--calendar-hover-day-border) ⤴ prestado de calendar
30 year-grid.css:164 [data-year-grid-cell]:hover color var(--calendar-hover-day-fg) ⤴ prestado de calendar
31 year-grid.css:170 [data-year-grid-cell][data-selected] color var(--calendar-day-selected-fg) ⤴ prestado de calendar
32 year-grid.css:185 [data-year-grid-cell][data-current]:not([data-selected]) border-color var(--calendar-day-today-border) ⤴ prestado de calendar
33 year-grid.css:186 [data-year-grid-cell][data-current]:not([data-selected]) color var(--calendar-day-today-fg) ⤴ prestado de calendar
34 year-grid.css:187 [data-year-grid-cell][data-current]:not([data-selected]) font-weight var(--calendar-day-today-font-weight) ⤴ prestado de calendar
35 year-grid.css:192 [data-year-grid-cell][data-disabled] opacity var(--calendar-disabled-opacity) ⤴ prestado de calendar
36 year-grid.css:196 [data-year-grid][data-disabled] opacity var(--calendar-disabled-opacity) ⤴ prestado de calendar
37 year-grid.css:204 [data-year-grid][data-readonly] [data-year-grid-cell]:not([data-selected]):hover background var(--calendar-day-bg) ⤴ prestado de calendar
38 year-grid.css:205 [data-year-grid][data-readonly] [data-year-grid-cell]:not([data-selected]):hover border-color var(--calendar-day-border) ⤴ prestado de calendar
39 year-grid.css:206 [data-year-grid][data-readonly] [data-year-grid-cell]:not([data-selected]):hover color var(--calendar-day-fg) ⤴ prestado de calendar
40 year-grid.css:215 [data-year-grid-cell][data-event] box-shadow var(--calendar-event-shadow) ⤴ prestado de calendar

1.2 A través de un privado (13)

# fichero:línea selector propiedad valor
1 year-grid.css:15 [data-year-grid] padding var(--_year-grid-padding)
2 year-grid.css:22 [data-year-grid] font-size var(--_year-grid-font-size)
3 year-grid.css:85 [data-year-grid-prev-button], [data-year-grid-next-button] inline-size var(--_year-grid-control-size)
4 year-grid.css:86 [data-year-grid-prev-button], [data-year-grid-next-button] block-size var(--_year-grid-control-size)
5 year-grid.css:142 [data-year-grid-cell] min-inline-size calc(var(--_year-grid-cell-size) * 1.8)
6 year-grid.css:143 [data-year-grid-cell] block-size var(--_year-grid-cell-size)
7 year-grid.css:168 [data-year-grid-cell][data-selected] border-color var(--_year-grid-palette-solid)
8 year-grid.css:169 [data-year-grid-cell][data-selected] background var(--_year-grid-palette-solid)
9 year-grid.css:174 [data-year-grid-cell][data-selected]:hover border-color var(--_year-grid-palette-solid-hover)
10 year-grid.css:175 [data-year-grid-cell][data-selected]:hover background var(--_year-grid-palette-solid-hover)
11 year-grid.css:179 [data-year-grid-cell][data-focused]:not([data-selected]) border-color var(--_year-grid-palette-border)
12 year-grid.css:180 [data-year-grid-cell][data-focused]:not([data-selected]) background var(--_year-grid-palette-track)
13 year-grid.css:181 [data-year-grid-cell][data-focused]:not([data-selected]) color var(--_year-grid-palette-text)

1.3 Literales (5)

# fichero:línea selector propiedad valor
1 year-grid.css:12 [data-year-grid] inline-size max-content
2 year-grid.css:67 [data-year-grid-header] inline-size 100%
3 year-grid.css:124 [data-year-grid-grid] inline-size max-content
4 year-grid.css:132 [data-popover-content] [data-year-grid] inline-size 100%
5 year-grid.css:135 [data-popover-content] [data-year-grid-grid] inline-size 100%

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 year-grid.css:103 [data-year-grid-prev-button]:hover, [data-year-grid-next-button]:hover background-image linear-gradient(var(--state-hover), var(--state-hover))
2 year-grid.css:110 [data-year-grid-prev-button]:focus-visible, [data-year-grid-next-button]:focus-visible, [data-year-grid-cell]:focus-visible outline var(--focus-ring-width) solid var(--focus-ring-color)
3 year-grid.css:163 [data-year-grid-cell]:hover background-image linear-gradient(var(--state-hover), var(--state-hover))

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

privado declaraciones valor(es) origen ¿deriva de un público?
--_year-grid-padding 4 var(--calendar-padding-md), var(--calendar-padding-xs), var(--calendar-padding-sm), var(--calendar-padding-lg) global no
--_year-grid-control-size 4 var(--calendar-control-size-md), var(--calendar-control-size-xs), var(--calendar-control-size-sm), var(--calendar-control-size-lg) global no
--_year-grid-cell-size 4 var(--calendar-day-size-md), var(--calendar-day-size-xs), var(--calendar-day-size-sm), var(--calendar-day-size-lg) global no
--_year-grid-font-size 4 var(--calendar-font-size-md), var(--calendar-font-size-xs), var(--calendar-font-size-sm), var(--calendar-font-size-lg) global no

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

4. Propuesta de corrección

  • Consume la capa compartida picker-shell. Un eje que la capa posee se consume como var(--_x, var(--x)); el consumidor no acuña --year-grid-{eje} para él — sería un vocabulario paralelo (README de eidos/components, «Capas compartidas» regla 2).
  • Consume tokens públicos de calendar. Un token prestado importa la semántica de su dueño: la corrección no es duplicarlo con prefijo propio, sino la decisión de familia que la auditoría de fase 1 dejó registrada (theming-audit.md §B, familia calendar).
  • 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 (55)

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 (--year-grid-…) scope TSC valor propuesto usos
cell-fg root ⚠ var(--calendar-day-fg) / var(--calendar-day-today-fg) 2
cell-font-weight root ⚠ var(--calendar-day-font-weight) / var(--calendar-day-today-font-weight) 2
hover-cell-border root ⚠ var(--calendar-hover-day-border) / var(--calendar-day-border) 2
hover-cell-fg root ⚠ var(--calendar-hover-day-fg) / var(--calendar-day-fg) 2
gap root var(--calendar-gap) 1
width root max-content 1
radius root var(--calendar-radius) 1
bg root var(--calendar-bg) 1
shadow root var(--calendar-shadow) 1
fg root var(--calendar-fg) 1
font-family root var(--calendar-font-family) 1
font-size-md size:md var(--calendar-font-size-md) 1
font-size-xs size:xs var(--calendar-font-size-xs) 1
font-size-sm size:sm var(--calendar-font-size-sm) 1
font-size-lg size:lg var(--calendar-font-size-lg) 1
line-height root var(--calendar-line-height) 1
outline-bg root var(--calendar-outline-bg) 1
outline-shadow root var(--calendar-outline-shadow) 1
header-gap root var(--calendar-header-gap) 1
heading-fg root var(--calendar-heading-fg) 1
heading-font-size root var(--calendar-heading-font-size) 1
heading-font-weight root var(--calendar-heading-font-weight) 1
prev-button-width-md size:md var(--calendar-control-size-md) 1
prev-button-width-xs size:xs var(--calendar-control-size-xs) 1
prev-button-width-sm size:sm var(--calendar-control-size-sm) 1
prev-button-width-lg size:lg var(--calendar-control-size-lg) 1
prev-button-height-md size:md var(--calendar-control-size-md) 1
prev-button-height-xs size:xs var(--calendar-control-size-xs) 1
prev-button-height-sm size:sm var(--calendar-control-size-sm) 1
prev-button-height-lg size:lg var(--calendar-control-size-lg) 1
prev-button-radius root var(--calendar-control-radius) 1
prev-button-bg root var(--calendar-control-bg) 1
prev-button-fg root var(--calendar-control-fg) 1
hover-prev-button-border root var(--calendar-hover-control-border) 1
hover-prev-button-fg root var(--calendar-hover-control-fg) 1
disabled-prev-button-opacity root var(--calendar-disabled-opacity) 1
grid-gap root var(--calendar-grid-gap) 1
grid-width root max-content 1
cell-width-md size:md var(--calendar-day-size-md) 1
cell-width-xs size:xs var(--calendar-day-size-xs) 1
cell-width-sm size:sm var(--calendar-day-size-sm) 1
cell-width-lg size:lg var(--calendar-day-size-lg) 1
cell-height-md size:md var(--calendar-day-size-md) 1
cell-height-xs size:xs var(--calendar-day-size-xs) 1
cell-height-sm size:sm var(--calendar-day-size-sm) 1
cell-height-lg size:lg var(--calendar-day-size-lg) 1
cell-padding-inline root var(--calendar-select-padding-inline, 8px) 1
cell-radius root var(--calendar-day-radius) 1
cell-bg root var(--calendar-day-bg) 1
selected-cell-fg root var(--calendar-day-selected-fg) 1
cell-border root var(--calendar-day-today-border) 1
disabled-cell-opacity root var(--calendar-disabled-opacity) 1
disabled-opacity root var(--calendar-disabled-opacity) 1
hover-cell-bg root var(--calendar-day-bg) 1
cell-shadow root var(--calendar-event-shadow) 1

4.2 Sin nombre mecánico (14)

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

4.3 Avisos sobre los tokens propuestos (3)

  • el privado --_year-grid-font-size debe pasar a leer este público (o desaparecer) — --year-grid-font-size-md, --year-grid-font-size-xs, --year-grid-font-size-sm, --year-grid-font-size-lg
  • el privado --_year-grid-control-size debe pasar a leer este público (o desaparecer) — --year-grid-prev-button-width-md, --year-grid-prev-button-width-xs, --year-grid-prev-button-width-sm, --year-grid-prev-button-width-lg, --year-grid-prev-button-height-md, --year-grid-prev-button-height-xs, --year-grid-prev-button-height-sm, --year-grid-prev-button-height-lg
  • el privado --_year-grid-cell-size debe pasar a leer este público (o desaparecer) — --year-grid-cell-width-md, --year-grid-cell-width-xs, --year-grid-cell-width-sm, --year-grid-cell-width-lg, --year-grid-cell-height-md, --year-grid-cell-height-xs, --year-grid-cell-height-sm, --year-grid-cell-height-lg

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

Revisión 2026-08-20 — verificación previa a implementación (Opus).

Gemelo byte-a-byte de month-grid (diff de recetas = 1 línea, el nombre; cifras idénticas 61 · 0 · 13 · 40 · 5 · 3, reproducidas). El veredicto entero vive en month-grid.md: análisis CORRECTO, propuesta §4.1 NO IMPLEMENTAR (~40 alias 1:1 de --calendar-*, prohibidos por la propia nota de §4 y por la purga de alias §39); la corrección es la decisión de familia calendar (theming-audit.md §B) y consumir esa capa sin acuñar. Se ejecuta en el mismo commit que month-grid, nunca por separado.

Bloqueos de firma: decisión de familia calendar · D-TH.4 · D-TH.2.

Powered by TurnKey Linux.