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/navigation-menu.md

9.2 KiB

navigation-menu — 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-23 · Alcance: 44% — 15 de 34 knobs por token público
  • Knobs de apariencia: 38 — público 15 · privado 1 · global 13 · literal 5 · sistema 4 · excepción 0 (los dos últimos, fuera del ratio)
  • Contrato hoy (lib/recipes/base.ts): 26 pública(s) — content-z, indicator-w, indicator-x, trigger-height-sm, trigger-height-md, trigger-height-lg, trigger-font-size-sm, trigger-font-size-md, trigger-font-size-lg, trigger-line-height-sm, trigger-line-height-md, trigger-line-height-lg, trigger-padding-inline-sm, trigger-padding-inline-md, trigger-padding-inline-lg, trigger-radius-sm, trigger-radius-md, trigger-radius-lg, trigger-height, trigger-font-size, trigger-line-height, trigger-padding-inline, trigger-radius, trigger-fg, active-trigger-fg, active-trigger-bg
  • Eje size: sí · ficheros: navigation-menu.css

1. Knobs fuera de alcance

1.1 Directo a primitivo global (13)

# fichero:línea selector propiedad valor
1 navigation-menu.css:41 [data-navigation-menu] font-family var(--style-label-font-family)
2 navigation-menu.css:90 [data-navigation-menu-trigger], [data-navigation-menu-link] gap var(--space-1)
3 navigation-menu.css:146 [data-navigation-menu-trigger][data-disabled], [data-navigation-menu-link][data-disabled] color var(--color-content-muted)
4 navigation-menu.css:158 [data-navigation-menu-trigger]::after border-block-end var(--border-width-medium) solid currentColor
5 navigation-menu.css:159 [data-navigation-menu-trigger]::after border-inline-end var(--border-width-medium) solid currentColor
6 navigation-menu.css:198 [data-navigation-menu] [data-navigation-menu-content] padding var(--space-2)
7 navigation-menu.css:201 [data-navigation-menu] [data-navigation-menu-content] border-radius var(--radius-lg)
8 navigation-menu.css:202 [data-navigation-menu] [data-navigation-menu-content] color var(--color-content-primary)
9 navigation-menu.css:229 [data-navigation-menu-content] :is(a, [data-navigation-menu-link]) padding-block var(--space-2)
10 navigation-menu.css:230 [data-navigation-menu-content] :is(a, [data-navigation-menu-link]) padding-inline var(--space-3)
11 navigation-menu.css:231 [data-navigation-menu-content] :is(a, [data-navigation-menu-link]) border-radius var(--radius-md)
12 navigation-menu.css:356 [data-navigation-menu] [data-navigation-menu-indicator] background var(--color-primary-solid)
13 navigation-menu.css:357 [data-navigation-menu] [data-navigation-menu-indicator] border-radius var(--radius-full)

1.2 A través de un privado (1)

# fichero:línea selector propiedad valor
1 navigation-menu.css:61 [data-navigation-menu-list] gap var(--_navigation-menu-list-gap)

1.3 Literales (5)

# fichero:línea selector propiedad valor
1 navigation-menu.css:155 [data-navigation-menu-trigger]::after inline-size 0.5rem
2 navigation-menu.css:156 [data-navigation-menu-trigger]::after block-size 0.5rem
3 navigation-menu.css:197 [data-navigation-menu] [data-navigation-menu-content] min-inline-size 14rem
4 navigation-menu.css:354 [data-navigation-menu] [data-navigation-menu-indicator] block-size 2px
5 navigation-menu.css:370 [data-navigation-menu-indicator][data-state='open'] opacity 1

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 (4) — 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 navigation-menu.css:140 [data-navigation-menu-trigger]:focus-visible, [data-navigation-menu-link]:focus-visible outline var(--focus-ring-width) solid var(--focus-ring-color)
2 navigation-menu.css:161 [data-navigation-menu-trigger]::after opacity var(--opacity-muted)
3 navigation-menu.css:242 [data-navigation-menu-content] :is(a, [data-navigation-menu-link]):hover background-image linear-gradient(var(--state-hover), var(--state-hover))
4 navigation-menu.css:246 [data-navigation-menu-content] :is(a, [data-navigation-menu-link]):focus-visible outline var(--focus-ring-width) solid var(--focus-ring-color)

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

privado declaraciones valor(es) origen ¿deriva de un público?
--_navigation-menu-list-gap 3 var(--space-1), 0, var(--space-2) global, literal no

4. Propuesta de corrección

  • Consume la capa compartida menu-indicator. Un eje que la capa posee se consume como var(--_x, var(--x)); el consumidor no acuña --navigation-menu-{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 (16)

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 (--navigation-menu-…) scope TSC valor propuesto usos
content-radius root ⚠ var(--radius-lg) / var(--radius-md) 2
font-family root var(--style-label-font-family) 1
list-gap-md size:md var(--space-1) 1
list-gap-sm size:sm 0 1
list-gap-lg size:lg var(--space-2) 1
trigger-gap root var(--space-1) 1
disabled-trigger-fg root var(--color-content-muted) 1
trigger-width root 0.5rem 1
trigger-height (ya existe) root 0.5rem 1
content-width root 14rem 1
content-fg root var(--color-content-primary) 1
content-padding-block root var(--space-2) 1
content-padding-inline root var(--space-3) 1
indicator-height root 2px 1
indicator-bg root var(--color-primary-solid) 1
indicator-radius root var(--radius-full) 1

4.2 Sin nombre mecánico (4)

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

  • el privado --_navigation-menu-list-gap debe pasar a leer este público (o desaparecer) — --navigation-menu-list-gap-md, --navigation-menu-list-gap-sm, --navigation-menu-list-gap-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

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

Powered by TurnKey Linux.