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

15 KiB

month-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-25 · Alcance: 0% — 0 de 5 knobs por token público
  • Knobs de apariencia: 61 — público 0 · privado 0 · global 0 · literal 5 · sistema 49 · excepción 0 · estructural 0 · puente 7 · canal 0 (los cinco últimos, 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: no · ficheros: month-grid.css

1. Knobs fuera de alcance

1.1 Directo a primitivo global (0)

Ninguno.

1.2 A través de un privado (0)

Sólo el residuo: el puente de paleta (§2-ter) y el canal de valor (§2-quater) salen aparte, porque no son deuda ni tienen nombre que acuñar.

Ninguno.

1.3 Literales (5)

# fichero:línea selector propiedad valor
1 month-grid.css:12 [data-month-grid] inline-size max-content
2 month-grid.css:46 [data-month-grid-header] inline-size 100%
3 month-grid.css:103 [data-month-grid-grid] inline-size max-content
4 month-grid.css:111 [data-popover-content] [data-month-grid] inline-size 100%
5 month-grid.css:114 [data-popover-content] [data-month-grid-grid] inline-size 100%

1.4 Excepciones firmadas (0) — 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.

Ninguno.

2. Sistema transversal (49) — 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 month-grid.css:11 [data-month-grid] gap var(--calendar-gap) ⤴ prestado de calendar
2 month-grid.css:15 [data-month-grid] padding var(--calendar-padding)
3 month-grid.css:16 [data-month-grid] border var(--calendar-border-width) solid var(--calendar-border) ⤴ prestado de calendar
4 month-grid.css:17 [data-month-grid] border-radius var(--calendar-radius) ⤴ prestado de calendar
5 month-grid.css:18 [data-month-grid] background var(--calendar-bg) ⤴ prestado de calendar
6 month-grid.css:19 [data-month-grid] box-shadow var(--calendar-shadow) ⤴ prestado de calendar
7 month-grid.css:20 [data-month-grid] color var(--calendar-fg) ⤴ prestado de calendar
8 month-grid.css:21 [data-month-grid] font-family var(--calendar-font-family) ⤴ prestado de calendar
9 month-grid.css:22 [data-month-grid] font-size var(--calendar-font-size)
10 month-grid.css:23 [data-month-grid] line-height var(--calendar-line-height) ⤴ prestado de calendar
11 month-grid.css:27 [data-month-grid][data-variant='outline'] background var(--calendar-outline-bg) ⤴ prestado de calendar
12 month-grid.css:28 [data-month-grid][data-variant='outline'] box-shadow var(--calendar-outline-shadow) ⤴ prestado de calendar
13 month-grid.css:45 [data-month-grid-header] gap var(--calendar-header-gap) ⤴ prestado de calendar
14 month-grid.css:52 [data-month-grid-heading] color var(--calendar-heading-fg) ⤴ prestado de calendar
15 month-grid.css:53 [data-month-grid-heading] font-size var(--calendar-heading-font-size) ⤴ prestado de calendar
16 month-grid.css:54 [data-month-grid-heading] font-weight var(--calendar-heading-font-weight) ⤴ prestado de calendar
17 month-grid.css:64 [data-month-grid-prev-button], [data-month-grid-next-button] inline-size var(--calendar-control-size)
18 month-grid.css:65 [data-month-grid-prev-button], [data-month-grid-next-button] block-size var(--calendar-control-size)
19 month-grid.css:67 [data-month-grid-prev-button], [data-month-grid-next-button] border var(--calendar-control-border-width) solid var(--calendar-control-border) ⤴ prestado de calendar
20 month-grid.css:68 [data-month-grid-prev-button], [data-month-grid-next-button] border-radius var(--calendar-control-radius) ⤴ prestado de calendar
21 month-grid.css:69 [data-month-grid-prev-button], [data-month-grid-next-button] background var(--calendar-control-bg) ⤴ prestado de calendar
22 month-grid.css:70 [data-month-grid-prev-button], [data-month-grid-next-button] color var(--calendar-control-fg) ⤴ prestado de calendar
23 month-grid.css:81 [data-month-grid-prev-button]:hover, [data-month-grid-next-button]:hover border-color var(--calendar-hover-control-border) ⤴ prestado de calendar
24 month-grid.css:82 [data-month-grid-prev-button]:hover, [data-month-grid-next-button]:hover background-image linear-gradient(var(--state-hover), var(--state-hover))
25 month-grid.css:83 [data-month-grid-prev-button]:hover, [data-month-grid-next-button]:hover color var(--calendar-hover-control-fg) ⤴ prestado de calendar
26 month-grid.css:89 [data-month-grid-prev-button]:focus-visible, [data-month-grid-next-button]:focus-visible, [data-month-grid-cell]:focus-visible outline var(--focus-ring-width) solid var(--focus-ring-color)
27 month-grid.css:96 [data-month-grid-prev-button][data-disabled], [data-month-grid-next-button][data-disabled] opacity var(--calendar-disabled-opacity) ⤴ prestado de calendar
28 month-grid.css:102 [data-month-grid-grid] gap var(--calendar-grid-gap) ⤴ prestado de calendar
29 month-grid.css:121 [data-month-grid-cell] min-inline-size calc(var(--calendar-day-size) * 2)
30 month-grid.css:122 [data-month-grid-cell] block-size var(--calendar-day-size)
31 month-grid.css:123 [data-month-grid-cell] padding-inline var(--calendar-select-padding-inline, 8px) ⤴ prestado de calendar
32 month-grid.css:124 [data-month-grid-cell] border var(--calendar-day-border-width) solid var(--calendar-day-border) ⤴ prestado de calendar
33 month-grid.css:125 [data-month-grid-cell] border-radius var(--calendar-day-radius) ⤴ prestado de calendar
34 month-grid.css:126 [data-month-grid-cell] background var(--calendar-day-bg) ⤴ prestado de calendar
35 month-grid.css:127 [data-month-grid-cell] color var(--calendar-day-fg) ⤴ prestado de calendar
36 month-grid.css:129 [data-month-grid-cell] font-weight var(--calendar-day-font-weight) ⤴ prestado de calendar
37 month-grid.css:141 [data-month-grid-cell]:hover border-color var(--calendar-hover-day-border) ⤴ prestado de calendar
38 month-grid.css:142 [data-month-grid-cell]:hover background-image linear-gradient(var(--state-hover), var(--state-hover))
39 month-grid.css:143 [data-month-grid-cell]:hover color var(--calendar-hover-day-fg) ⤴ prestado de calendar
40 month-grid.css:149 [data-month-grid-cell][data-selected] color var(--calendar-day-selected-fg) ⤴ prestado de calendar
41 month-grid.css:164 [data-month-grid-cell][data-current]:not([data-selected]) border-color var(--calendar-day-today-border) ⤴ prestado de calendar
42 month-grid.css:165 [data-month-grid-cell][data-current]:not([data-selected]) color var(--calendar-day-today-fg) ⤴ prestado de calendar
43 month-grid.css:166 [data-month-grid-cell][data-current]:not([data-selected]) font-weight var(--calendar-day-today-font-weight) ⤴ prestado de calendar
44 month-grid.css:171 [data-month-grid-cell][data-disabled] opacity var(--calendar-disabled-opacity) ⤴ prestado de calendar
45 month-grid.css:175 [data-month-grid][data-disabled] opacity var(--calendar-disabled-opacity) ⤴ prestado de calendar
46 month-grid.css:183 [data-month-grid][data-readonly] [data-month-grid-cell]:not([data-selected]):hover background var(--calendar-day-bg) ⤴ prestado de calendar
47 month-grid.css:184 [data-month-grid][data-readonly] [data-month-grid-cell]:not([data-selected]):hover border-color var(--calendar-day-border) ⤴ prestado de calendar
48 month-grid.css:185 [data-month-grid][data-readonly] [data-month-grid-cell]:not([data-selected]):hover color var(--calendar-day-fg) ⤴ prestado de calendar
49 month-grid.css:196 [data-month-grid-cell][data-event] box-shadow var(--calendar-event-shadow)

2-ter. Puente de paleta THM-2 (7) — fuera del ratio

La receta lee var(--_month-grid-palette-{slot}), que lo escribe el forward de la cascada de paleta bajo [data-month-grid]:where([data-color], [data-color-custom]) (renderRecipePaletteForward, firma B′). Es el MECANISMO de la paleta por instancia, y se alcanza dos veces: por la capa compartida --palette-* y por los tonos públicos del propio componente. No se acuña: un público encima dejaría que un tema lo fijara y matara en silencio el color= de cada instancia (veredictos §5 de card, tags-input, avatar).

# fichero:línea selector propiedad valor
1 month-grid.css:147 [data-month-grid-cell][data-selected] border-color var(--_month-grid-palette-solid)
2 month-grid.css:148 [data-month-grid-cell][data-selected] background var(--_month-grid-palette-solid)
3 month-grid.css:153 [data-month-grid-cell][data-selected]:hover border-color var(--_month-grid-palette-solid-hover)
4 month-grid.css:154 [data-month-grid-cell][data-selected]:hover background var(--_month-grid-palette-solid-hover)
5 month-grid.css:158 [data-month-grid-cell][data-focused]:not([data-selected]) border-color var(--_month-grid-palette-border)
6 month-grid.css:159 [data-month-grid-cell][data-focused]:not([data-selected]) background var(--_month-grid-palette-track)
7 month-grid.css:160 [data-month-grid-cell][data-focused]:not([data-selected]) color var(--_month-grid-palette-text)

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

La receta no declara privados propios en su CSS.

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

4. Propuesta de corrección

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

4.1 Tokens a declarar en lib/recipes/base.ts (2)

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 (--month-grid-…) scope TSC valor propuesto usos
width root max-content 1
grid-width root max-content 1

4.2 Sin nombre mecánico (3)

  • ⚠ 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.

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).

Análisis (§1–§3): CORRECTO. Cifras reproducidas (61 · 0 · 13 · 40 · 5 · 3). Los privados propios están BIEN prefijados y derivan ordenadamente… de públicos de calendar (month-grid.css:4-7: --_month-grid-padding: var(--calendar-padding-md) …): préstamo limpio, pero préstamo — los 65 tokens que theming-audit.md §B ya midió. year-grid es su gemelo byte-a-byte (diff = 1 línea de nombre): toda decisión aquí aplica idéntica allí, en el mismo commit.

Propuesta (§4.1): NO IMPLEMENTAR. Las ~40 filas son alias 1:1 de --calendar-* (bg = var(--calendar-bg), font-size-{k} = var(--calendar-font-size-{k}), prev-button-* = var(--calendar-control-size-*)) — el duplicado-con-prefijo-propio que la nota de §4 prohíbe y la purga de alias (§39) mató como clase. Un tema no ganaría alcance: el knob real seguiría siendo de calendar. Las 4 colisiones ⚠ son el estado data-today/hover sin parsear — irrelevante mientras no se acuñe.

Disposición: la decisión de familia calendar (formalizar calendar-surface como capa compartida/arquetipo — theming-audit.md §B, consumidores: calendar · range-calendar · month-grid · year-grid · date-range-picker), y ENTONCES estos dos consumen la capa con la regla var(--_x, var(--x)) sin acuñar. Orden: bloque B7 (D-TH.4), tras esa firma. Accionable ya sólo si el autor lo pide: partir el único border shorthand y anotar los 5 literales.

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

Powered by TurnKey Linux.