refactor(words): prune 55 orphan recipe tokens — eidos suite green (Phase A)

The words recipe declared a token vocabulary the CSS never used (the root of
the drift). Pruned 55 declared-but-unused tokens: 38 direct (gap-*, toolbar-*
×9, button-size-*, command-*-hover, content-px-*, status-*, rail-*,
selection-color, _accent-* ×5, line-height, max-inline-size, heading-font-size,
content-py-after-placeholder) + 17 cascaded (the intent palette *-solid/
*-solid-hover/secondary-* slots that only fed _accent-* — callouts use the
tinted track/border/text slots, kept). No wire candidates (rail had no
consumer; ::selection already uses wash-soft). The recipe contract now matches
actual usage → the orphan test goes green; full eidos suite 197/197 (all 3
words failures now fixed across increments 1/3/A). Visually inert: words.css
references nothing removed (the "declares every var" test guarantees it).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
active-uix
dev 4 months ago
parent d208f1dcd1
commit ec77ec5a0b

@ -73,5 +73,13 @@ verificar en navegador, y con el enfoque validado → generalizar tokens + barre
- [x] **D — fixes API** (2026-06-06): quitado el `<style>` vacío de `words-inspector.svelte`;
`onMount → $effect` en `words.svelte` (corre una vez, sin import de lifecycle). →
`component-api-contract` **verde**. Eidos suite 196/197 (solo queda el test de huérfanos).
- [ ] A — triar los 41 huérfanos → último test (orphans) verde, eidos suite 197/197
- [ ] E — verificación final + README
- [x] **A — huérfanos podados** (2026-06-06): 55 tokens declarados-sin-usar eliminados del recipe
(38 directos: `gap-*`, `toolbar-*` ×9, `button-size-*`, `command-*-hover`, `content-px-*`,
`status-*`, `rail-*`, `selection-color`, `_accent-*` ×5, etc. + 17 en cascada — la paleta de
intents `*-solid`/`*-solid-hover`/secondary-* que solo alimentaba `_accent-*`; los callouts
usan los slots *tintados* track/border/text, que se quedan). Sin candidatos a cablear (rail
sin consumidor, `::selection` ya usa `wash-soft`). **Eidos suite 197/197 verde** — el contrato
del recipe ya coincide con el uso real. Poda visualmente inerte (el test "declares" garantiza
que words.css no referenciaba ninguno).
- [ ] B (resto) — tamaños bespoke (swatch/checkbox/anchos/sidebar 16rem×3)→tokens, padding `--space-*`
- [ ] E — verificación final (build + navegador) + README

@ -2382,14 +2382,10 @@
--editable-affirm-border: var(--color-affirm-border);
--editable-risk-border: var(--color-risk-border);
--editable-threat-border: var(--color-threat-border);
--words-gap-sm: var(--space-2);
--words-gap-md: var(--space-2-5);
--words-gap-lg: var(--space-3);
--words-radius-xs: var(--radius-sm);
--words-radius-sm: var(--radius-md);
--words-radius-md: var(--radius-lg);
--words-radius-lg: var(--radius-xl);
--words-max-inline-size: 52rem;
--words-border-width: var(--border-width);
--words-border: var(--color-border-subtle);
--words-border-hover: var(--color-border-default);
@ -2400,7 +2396,6 @@
--words-font-size-sm: var(--font-size-xs);
--words-font-size-md: var(--font-size-sm);
--words-font-size-lg: var(--font-size-md);
--words-line-height: var(--leading-ui);
--words-focus-shadow: 0 0 0 var(--focus-ring-offset) var(--color-surface-default), 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color);
--words-invalid-border: var(--color-risk-border);
--words-disabled-opacity: 0.5;
@ -2410,47 +2405,23 @@
--words-wash-soft: 30%;
--words-wash-strong: 44%;
--words-swatch: var(--words-bg);
--words-toolbar-gap: var(--space-1);
--words-toolbar-px-sm: var(--space-2);
--words-toolbar-px-md: var(--space-2-5);
--words-toolbar-px-lg: var(--space-3);
--words-toolbar-py-sm: var(--space-1);
--words-toolbar-py-md: var(--space-1-5);
--words-toolbar-py-lg: var(--space-2);
--words-toolbar-border: var(--color-border-subtle);
--words-toolbar-bg: var(--color-surface-default);
--words-button-size-sm: var(--control-height-xs);
--words-button-size-md: var(--control-height-sm);
--words-button-size-lg: var(--control-height-md);
--words-command-gap: var(--space-1);
--words-command-px: var(--space-2);
--words-command-radius: var(--radius-md);
--words-command-color: var(--color-content-secondary);
--words-command-border-hover: var(--color-border-default);
--words-command-bg-hover: var(--color-surface-overlay);
--words-command-color-hover: var(--color-content-primary);
--words-command-solid-color: var(--color-content-on-solid);
--words-placeholder-color: var(--color-content-muted);
--words-content-color: var(--color-content-primary);
--words-content-px-sm: var(--space-3);
--words-content-px-md: var(--space-4);
--words-content-px-lg: var(--space-5);
--words-content-py-sm: var(--space-2-5);
--words-content-py-md: var(--space-3);
--words-content-py-lg: var(--space-4);
--words-content-py-after-placeholder: var(--space-1);
--words-content-min-block-size-sm: 10rem;
--words-content-min-block-size-md: 13rem;
--words-content-min-block-size-lg: 16rem;
--words-content-max-block-size-sm: 50vh;
--words-content-max-block-size-md: 60vh;
--words-content-max-block-size-lg: 70vh;
--words-rail-bg: #f5f5f5;
--words-rail-border: #e3e3e3;
--words-selection-color: var(--color-content-primary);
--words-block-gap: var(--space-3);
--words-heading-color: var(--color-content-primary);
--words-heading-font-size: var(--font-size-lg);
--words-heading-h1-font-size: var(--font-size-xl);
--words-heading-h2-font-size: calc(var(--font-size-lg) + 4px);
--words-heading-h3-font-size: var(--font-size-lg);
@ -2467,44 +2438,23 @@
--words-quote-border-width: var(--border-width-thick);
--words-quote-color: var(--color-content-secondary);
--words-list-padding-inline-start: var(--space-5);
--words-status-py: var(--space-2);
--words-status-color: var(--color-content-muted);
--words-status-font-size: var(--font-size-xs);
--words-status-error-color: var(--color-risk-text);
--words-transition-duration: var(--duration-fast);
--words-transition-ease: var(--ease-default);
--words-primary-solid: var(--color-primary-solid);
--words-primary-solid-hover: var(--color-primary-solid-hover);
--words-primary-text: var(--color-primary-text);
--words-secondary-solid: var(--color-secondary-solid);
--words-secondary-solid-hover: var(--color-secondary-solid-hover);
--words-secondary-text: var(--color-secondary-text);
--words-neutral-solid: var(--color-neutral-solid);
--words-neutral-solid-hover: var(--color-neutral-solid-hover);
--words-neutral-text: var(--color-neutral-text);
--words-affirm-solid: var(--color-affirm-solid);
--words-affirm-solid-hover: var(--color-affirm-solid-hover);
--words-affirm-text: var(--color-affirm-text);
--words-fulfill-solid: var(--color-fulfill-solid);
--words-fulfill-solid-hover: var(--color-fulfill-solid-hover);
--words-fulfill-track: var(--color-fulfill-track);
--words-fulfill-border: var(--color-fulfill-border);
--words-fulfill-text: var(--color-fulfill-text);
--words-risk-solid: var(--color-risk-solid);
--words-risk-solid-hover: var(--color-risk-solid-hover);
--words-risk-text: var(--color-risk-text);
--words-threat-solid: var(--color-threat-solid);
--words-threat-solid-hover: var(--color-threat-solid-hover);
--words-threat-text: var(--color-threat-text);
--words-loss-solid: var(--color-loss-solid);
--words-loss-solid-hover: var(--color-loss-solid-hover);
--words-loss-track: var(--color-loss-track);
--words-loss-border: var(--color-loss-border);
--words-loss-text: var(--color-loss-text);
--words-primary-track: var(--color-primary-track);
--words-primary-border: var(--color-primary-border);
--words-secondary-track: var(--color-secondary-track);
--words-secondary-border: var(--color-secondary-border);
--words-neutral-track: var(--color-neutral-track);
--words-neutral-border: var(--color-neutral-border);
--words-affirm-track: var(--color-affirm-track);
@ -4027,70 +3977,6 @@
--_editable-accent-solid-hover: var(--color-threat-solid-hover);
}
[data-words] {
--_words-accent-solid: var(--words-primary-solid);
--_words-accent-solid-hover: var(--words-primary-solid-hover);
--_words-accent-track: var(--words-primary-track);
--_words-accent-border: var(--words-primary-border);
--_words-accent-text: var(--words-primary-text);
}
[data-words][data-color='secondary'] {
--_words-accent-solid: var(--words-secondary-solid);
--_words-accent-solid-hover: var(--words-secondary-solid-hover);
--_words-accent-track: var(--words-secondary-track);
--_words-accent-border: var(--words-secondary-border);
--_words-accent-text: var(--words-secondary-text);
}
[data-words][data-color='neutral'] {
--_words-accent-solid: var(--words-neutral-solid);
--_words-accent-solid-hover: var(--words-neutral-solid-hover);
--_words-accent-track: var(--words-neutral-track);
--_words-accent-border: var(--words-neutral-border);
--_words-accent-text: var(--words-neutral-text);
}
[data-words][data-color='affirm'] {
--_words-accent-solid: var(--words-affirm-solid);
--_words-accent-solid-hover: var(--words-affirm-solid-hover);
--_words-accent-track: var(--words-affirm-track);
--_words-accent-border: var(--words-affirm-border);
--_words-accent-text: var(--words-affirm-text);
}
[data-words][data-color='fulfill'] {
--_words-accent-solid: var(--words-fulfill-solid);
--_words-accent-solid-hover: var(--words-fulfill-solid-hover);
--_words-accent-track: var(--words-fulfill-track);
--_words-accent-border: var(--words-fulfill-border);
--_words-accent-text: var(--words-fulfill-text);
}
[data-words][data-color='risk'] {
--_words-accent-solid: var(--words-risk-solid);
--_words-accent-solid-hover: var(--words-risk-solid-hover);
--_words-accent-track: var(--words-risk-track);
--_words-accent-border: var(--words-risk-border);
--_words-accent-text: var(--words-risk-text);
}
[data-words][data-color='threat'] {
--_words-accent-solid: var(--words-threat-solid);
--_words-accent-solid-hover: var(--words-threat-solid-hover);
--_words-accent-track: var(--words-threat-track);
--_words-accent-border: var(--words-threat-border);
--_words-accent-text: var(--words-threat-text);
}
[data-words][data-color='loss'] {
--_words-accent-solid: var(--words-loss-solid);
--_words-accent-solid-hover: var(--words-loss-solid-hover);
--_words-accent-track: var(--words-loss-track);
--_words-accent-border: var(--words-loss-border);
--_words-accent-text: var(--words-loss-text);
}
[data-tags-input] {
--_tags-input-accent-track: var(--tags-input-primary-track);
--_tags-input-accent-border: var(--tags-input-primary-border);

@ -2654,9 +2654,6 @@ export const THEME_BASE_RECIPE_TOKENS = {
}
},
words: {
'gap-sm': 'var(--space-2)',
'gap-md': 'var(--space-2-5)',
'gap-lg': 'var(--space-3)',
// xs is the small-control tier (inspector fields, swatches, chips, steppers):
// one step under `sm`. Replaces the ad-hoc 4px / var(--radius-2,4px) / 3px /
// var(--space-1) soup the inspector used for the same thing.
@ -2664,7 +2661,6 @@ export const THEME_BASE_RECIPE_TOKENS = {
'radius-sm': 'var(--radius-md)',
'radius-md': 'var(--radius-lg)',
'radius-lg': 'var(--radius-xl)',
'max-inline-size': '52rem',
'border-width': 'var(--border-width)',
border: 'var(--color-border-subtle)',
'border-hover': 'var(--color-border-default)',
@ -2675,7 +2671,6 @@ export const THEME_BASE_RECIPE_TOKENS = {
'font-size-sm': 'var(--font-size-xs)',
'font-size-md': 'var(--font-size-sm)',
'font-size-lg': 'var(--font-size-md)',
'line-height': 'var(--leading-ui)',
'focus-shadow':
'0 0 0 var(--focus-ring-offset) var(--color-surface-default), 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color)',
'invalid-border': 'var(--color-risk-border)',
@ -2693,55 +2688,26 @@ export const THEME_BASE_RECIPE_TOKENS = {
// Per-swatch hue, set inline by the bubble/inspector color grids; the
// declared default is the surface bg (an unset swatch reads as empty).
swatch: 'var(--words-bg)',
'toolbar-gap': 'var(--space-1)',
'toolbar-px-sm': 'var(--space-2)',
'toolbar-px-md': 'var(--space-2-5)',
'toolbar-px-lg': 'var(--space-3)',
'toolbar-py-sm': 'var(--space-1)',
'toolbar-py-md': 'var(--space-1-5)',
'toolbar-py-lg': 'var(--space-2)',
'toolbar-border': 'var(--color-border-subtle)',
'toolbar-bg': 'var(--color-surface-default)',
'button-size-sm': 'var(--control-height-xs)',
'button-size-md': 'var(--control-height-sm)',
'button-size-lg': 'var(--control-height-md)',
'command-gap': 'var(--space-1)',
'command-px': 'var(--space-2)',
'command-radius': 'var(--radius-md)',
'command-color': 'var(--color-content-secondary)',
'command-border-hover': 'var(--color-border-default)',
'command-bg-hover': 'var(--color-surface-overlay)',
'command-color-hover': 'var(--color-content-primary)',
'command-solid-color': 'var(--color-content-on-solid)',
'placeholder-color': 'var(--color-content-muted)',
'content-color': 'var(--color-content-primary)',
'content-px-sm': 'var(--space-3)',
'content-px-md': 'var(--space-4)',
'content-px-lg': 'var(--space-5)',
'content-py-sm': 'var(--space-2-5)',
'content-py-md': 'var(--space-3)',
'content-py-lg': 'var(--space-4)',
'content-py-after-placeholder': 'var(--space-1)',
'content-min-block-size-sm': '10rem',
'content-min-block-size-md': '13rem',
'content-min-block-size-lg': '16rem',
'content-max-block-size-sm': '50vh',
'content-max-block-size-md': '60vh',
'content-max-block-size-lg': '70vh',
// Soft silver gutter band — fixed tone, intentionally NOT
// theme-aware. Looks like the physical margin of a notebook
// regardless of the editor theme. Very light: `rail-bg` is a
// barely-there silver; `rail-border` is a touch stronger for
// the 1px edge.
'rail-bg': '#f5f5f5',
'rail-border': '#e3e3e3',
'selection-color': 'var(--color-content-primary)',
// Document rhythm: airier than the default UI gap so blocks read
// as paragraphs in a document, not stacked form rows. Headings
// derive 1.5x of this for their top margin.
'block-gap': 'var(--space-3)',
'heading-color': 'var(--color-content-primary)',
'heading-font-size': 'var(--font-size-lg)',
'heading-h1-font-size': 'var(--font-size-xl)',
'heading-h2-font-size': 'calc(var(--font-size-lg) + 4px)',
'heading-h3-font-size': 'var(--font-size-lg)',
@ -2758,46 +2724,25 @@ export const THEME_BASE_RECIPE_TOKENS = {
'quote-border-width': 'var(--border-width-thick)',
'quote-color': 'var(--color-content-secondary)',
'list-padding-inline-start': 'var(--space-5)',
'status-py': 'var(--space-2)',
'status-color': 'var(--color-content-muted)',
'status-font-size': 'var(--font-size-xs)',
'status-error-color': 'var(--color-risk-text)',
'transition-duration': 'var(--duration-fast)',
'transition-ease': 'var(--ease-default)',
'primary-solid': 'var(--color-primary-solid)',
'primary-solid-hover': 'var(--color-primary-solid-hover)',
'primary-text': 'var(--color-primary-text)',
'secondary-solid': 'var(--color-secondary-solid)',
'secondary-solid-hover': 'var(--color-secondary-solid-hover)',
'secondary-text': 'var(--color-secondary-text)',
'neutral-solid': 'var(--color-neutral-solid)',
'neutral-solid-hover': 'var(--color-neutral-solid-hover)',
'neutral-text': 'var(--color-neutral-text)',
'affirm-solid': 'var(--color-affirm-solid)',
'affirm-solid-hover': 'var(--color-affirm-solid-hover)',
'affirm-text': 'var(--color-affirm-text)',
'fulfill-solid': 'var(--color-fulfill-solid)',
'fulfill-solid-hover': 'var(--color-fulfill-solid-hover)',
'fulfill-track': 'var(--color-fulfill-track)',
'fulfill-border': 'var(--color-fulfill-border)',
'fulfill-text': 'var(--color-fulfill-text)',
'risk-solid': 'var(--color-risk-solid)',
'risk-solid-hover': 'var(--color-risk-solid-hover)',
'risk-text': 'var(--color-risk-text)',
'threat-solid': 'var(--color-threat-solid)',
'threat-solid-hover': 'var(--color-threat-solid-hover)',
'threat-text': 'var(--color-threat-text)',
'loss-solid': 'var(--color-loss-solid)',
'loss-solid-hover': 'var(--color-loss-solid-hover)',
'loss-track': 'var(--color-loss-track)',
'loss-border': 'var(--color-loss-border)',
'loss-text': 'var(--color-loss-text)',
// Restored after accidental sed-removal during switch migration.
// Consumed by words.css for code/link/blockquote color cues.
'primary-track': 'var(--color-primary-track)',
'primary-border': 'var(--color-primary-border)',
'secondary-track': 'var(--color-secondary-track)',
'secondary-border': 'var(--color-secondary-border)',
'neutral-track': 'var(--color-neutral-track)',
'neutral-border': 'var(--color-neutral-border)',
'affirm-track': 'var(--color-affirm-track)',
@ -2806,67 +2751,6 @@ export const THEME_BASE_RECIPE_TOKENS = {
'risk-border': 'var(--color-risk-border)',
'threat-track': 'var(--color-threat-track)',
'threat-border': 'var(--color-threat-border)',
// Private accent palette (TSC v2.1). 8 colors, 5 slots.
'_accent-solid': {
declarations: [
{ value: 'var(--words-primary-solid)', scope: 'host' },
{ value: 'var(--words-secondary-solid)', scope: 'color:secondary' },
{ value: 'var(--words-neutral-solid)', scope: 'color:neutral' },
{ value: 'var(--words-affirm-solid)', scope: 'color:affirm' },
{ value: 'var(--words-fulfill-solid)', scope: 'color:fulfill' },
{ value: 'var(--words-risk-solid)', scope: 'color:risk' },
{ value: 'var(--words-threat-solid)', scope: 'color:threat' },
{ value: 'var(--words-loss-solid)', scope: 'color:loss' }
]
},
'_accent-solid-hover': {
declarations: [
{ value: 'var(--words-primary-solid-hover)', scope: 'host' },
{ value: 'var(--words-secondary-solid-hover)', scope: 'color:secondary' },
{ value: 'var(--words-neutral-solid-hover)', scope: 'color:neutral' },
{ value: 'var(--words-affirm-solid-hover)', scope: 'color:affirm' },
{ value: 'var(--words-fulfill-solid-hover)', scope: 'color:fulfill' },
{ value: 'var(--words-risk-solid-hover)', scope: 'color:risk' },
{ value: 'var(--words-threat-solid-hover)', scope: 'color:threat' },
{ value: 'var(--words-loss-solid-hover)', scope: 'color:loss' }
]
},
'_accent-track': {
declarations: [
{ value: 'var(--words-primary-track)', scope: 'host' },
{ value: 'var(--words-secondary-track)', scope: 'color:secondary' },
{ value: 'var(--words-neutral-track)', scope: 'color:neutral' },
{ value: 'var(--words-affirm-track)', scope: 'color:affirm' },
{ value: 'var(--words-fulfill-track)', scope: 'color:fulfill' },
{ value: 'var(--words-risk-track)', scope: 'color:risk' },
{ value: 'var(--words-threat-track)', scope: 'color:threat' },
{ value: 'var(--words-loss-track)', scope: 'color:loss' }
]
},
'_accent-border': {
declarations: [
{ value: 'var(--words-primary-border)', scope: 'host' },
{ value: 'var(--words-secondary-border)', scope: 'color:secondary' },
{ value: 'var(--words-neutral-border)', scope: 'color:neutral' },
{ value: 'var(--words-affirm-border)', scope: 'color:affirm' },
{ value: 'var(--words-fulfill-border)', scope: 'color:fulfill' },
{ value: 'var(--words-risk-border)', scope: 'color:risk' },
{ value: 'var(--words-threat-border)', scope: 'color:threat' },
{ value: 'var(--words-loss-border)', scope: 'color:loss' }
]
},
'_accent-text': {
declarations: [
{ value: 'var(--words-primary-text)', scope: 'host' },
{ value: 'var(--words-secondary-text)', scope: 'color:secondary' },
{ value: 'var(--words-neutral-text)', scope: 'color:neutral' },
{ value: 'var(--words-affirm-text)', scope: 'color:affirm' },
{ value: 'var(--words-fulfill-text)', scope: 'color:fulfill' },
{ value: 'var(--words-risk-text)', scope: 'color:risk' },
{ value: 'var(--words-threat-text)', scope: 'color:threat' },
{ value: 'var(--words-loss-text)', scope: 'color:loss' }
]
}
},
'tags-input': {
'gap-xs': 'var(--space-1)',

Loading…
Cancel
Save

Powered by TurnKey Linux.