8.1 KiB
picker-shell — 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-21 · Alcance: 76% — 16 de 21 knobs por token público
- Knobs de apariencia: 21 — público 16 · privado 4 · global 1 · literal 0 · sistema 0 (fuera del ratio)
- Contrato hoy (
lib/recipes/base.ts): 31 pública(s) —section-gap-xs,section-gap-sm,section-gap-md,section-gap-lg,row-spacing-xs,row-spacing-sm,row-spacing-lg,footer-gap-xs,footer-gap-sm,footer-gap-lg,header-font-size-xs,header-font-size-sm,header-font-size-md,header-font-size-lg,border-width,border,header-gap,header-fg,header-font-weight,header-line-height,body-gap,time-row-gap,time-row-padding-block-start,time-row-padding-inline,time-row-border-width,time-row-border,time-label-fg,time-label-font-size-xs,time-label-font-size-sm,time-label-font-size-md,time-label-font-size-lg - Eje
size: sí · ficheros:picker-shell.css,picker-time-row.css
1. Knobs fuera de alcance
1.1 Directo a primitivo global (1)
| # | fichero:línea | selector | propiedad | valor |
|---|---|---|---|---|
| 1 | picker-time-row.css:34 |
.picker-time-label |
font-size |
var(--_picker-time-label-font) |
1.2 A través de un privado (4)
| # | fichero:línea | selector | propiedad | valor |
|---|---|---|---|---|
| 1 | picker-shell.css:20 |
[data-picker-shell] |
gap |
var(--_picker-shell-section-gap) |
| 2 | picker-shell.css:33 |
[data-picker-header] |
padding-block-end |
var(--_picker-shell-row-spacing) |
| 3 | picker-shell.css:59 |
[data-picker-footer] |
gap |
var(--_picker-shell-gap) |
| 4 | picker-shell.css:60 |
[data-picker-footer] |
padding-block-start |
var(--_picker-shell-row-spacing) |
1.3 Literales (0)
Ninguno.
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? |
|---|---|---|---|---|
--_picker-shell-section-gap |
4 | var(--picker-shell-section-gap-sm), var(--picker-shell-section-gap-xs), var(--picker-shell-section-gap-md), var(--picker-shell-section-gap-lg) |
public | sí |
--_picker-shell-row-spacing |
6 | var(--picker-shell-row-spacing-sm), var(--picker-shell-row-spacing-xs), var(--picker-shell-row-spacing-lg) |
public | sí |
--_picker-shell-gap |
3 | var(--picker-shell-footer-gap-sm), var(--picker-shell-footer-gap-xs), var(--picker-shell-footer-gap-lg) |
public | sí |
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 guardrecipe-css-contractprohíbe el primitivo).
4.1 Tokens a declarar en lib/recipes/base.ts (1)
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 (--picker-shell-…) |
scope TSC | valor propuesto | usos |
|---|---|---|---|
font-size |
root |
var(--_picker-time-label-font) |
1 |
4.2 Sin nombre mecánico (4)
- ya alcanzable: el privado
--_picker-shell-section-gapderiva de un público (var(--picker-shell-section-gap-sm),var(--picker-shell-section-gap-xs),var(--picker-shell-section-gap-md),var(--picker-shell-section-gap-lg)) — sin acción; el censo lo cuenta como no alcanzable por el límite del regex — 1:gap. - ya alcanzable: el privado
--_picker-shell-row-spacingderiva de un público (var(--picker-shell-row-spacing-sm),var(--picker-shell-row-spacing-xs),var(--picker-shell-row-spacing-lg)) — sin acción; el censo lo cuenta como no alcanzable por el límite del regex — 2:padding-block-end,padding-block-start. - ya alcanzable: el privado
--_picker-shell-gapderiva de un público (var(--picker-shell-footer-gap-sm),var(--picker-shell-footer-gap-xs),var(--picker-shell-footer-gap-lg)) — sin acción; el censo lo cuenta como no alcanzable por el límite del regex — 1:gap.
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, unbackgrounden 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
Medido 2026-08-21. La cola avisaba «es CAPA de los pickers: mirar antes qué posee y qué presta», y mirarlo cambió tres cosas del encargo.
- NO es una capa compartida al estilo
list-surface/calendar-surface: es un COMPONENTE cuyos.svelteimportan directamente color-picker, date-picker y chronos (import PickerShellRoot from '../picker-shell/picker-shell.svelte'). No hay hook de capa ni vocabulario prestado, así que no tocaLAYER_VOCABULARYy el censo lo puntúa bien. Se tokeniza como un componente normal, y sus consumidores lo COMPONEN. - Su eje de talla NO es
data-size: esdata-picker-sizesobre[data-popover-content], un ancestro PORTALADO. Los selectores son[data-popover-content][data-picker-size='X'] [data-picker-shell], y el TSC no puede emitirlos (suscope: 'size:xs'genera[data-picker-shell][data-size='xs'], que no existe). Consecuencia: las coordenadas por talla se declaran como públicos PLANOS y la receta las consume desde sus propios selectores — el único componente del eje donde el patrón de nombres resueltos del TSC no aplica. El default de la regla base essm, ymdsólo re-declara lo que cambia. - El instrumento del eje NO SIRVE aquí, y por dos razones a la vez. La
sonda genérica dio 0 nodos (el antipatrón registrado: comparar cero
valores y pasar): no sabe abrir el popover de un picker, y filtra por
data-picker-shell*cuando las partes se llamandata-picker-header/-body/-footer/-clear/-cancel/-close— nombres genéricos a propósito, dice la receta, «so every picker gets the same visual contract for free», pero que rompendata-{component}-{kebab}y con ello todo el instrumental. Verificado con sonda dirigida: abriendo el popover deldate-pickeraparecen 6 nodos ydata-picker-size='md'. picker-time-row.cssusa hooks por CLASE (.picker-time-row,.picker-time-label), queeidos-lintcuenta comoclass-hooksy ningún instrumento que filtre por atributo puede ver — misma deuda quegradient-picker(§13). Y lleva un TERCER eje:[data-size]sobre la propia clase, con default md y xs/sm/lg re-declarando.- Header y footer comparten anchura y color de borde (
--border-width+--color-border-subtle), así que es UN par de knobs, no dos.
Lo que la demo no monta: el date-picker no renderiza [data-picker-header]
ni la fila de tiempo, así que esos knobs se verifican forzando el nodo, no
observándolo. Queda registrado: picker-shell no tiene ruta de demo propia
(404) y se mide prestado.