feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
import type {
|
|
|
|
|
|
RecipeTokenSet,
|
|
|
|
|
|
RecipeTokenMap,
|
|
|
|
|
|
RecipeTokenMultiDeclaration,
|
|
|
|
|
|
RecipeTokenDeclaration
|
|
|
|
|
|
} from '../config-types';
|
|
|
|
|
|
|
|
|
|
|
|
export const THEME_BASE_RECIPE_TOKENS = {
|
|
|
|
|
|
accordion: {
|
|
|
|
|
|
'provider-border-width': 'var(--border-width)',
|
|
|
|
|
|
'provider-radius': 'var(--radius-lg)',
|
|
|
|
|
|
'outline-provider-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'outline-provider-border': 'var(--color-border-default)',
|
|
|
|
|
|
'outline-item-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'outline-content-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'surface-provider-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'surface-provider-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'surface-provider-shadow': 'var(--shadow-subtle)',
|
|
|
|
|
|
'surface-item-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'surface-content-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'ghost-provider-bg': 'transparent',
|
|
|
|
|
|
'ghost-provider-border': 'transparent',
|
|
|
|
|
|
'ghost-item-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'ghost-content-bg': 'transparent',
|
|
|
|
|
|
'item-border-width': 'var(--border-width)',
|
|
|
|
|
|
'trigger-min-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'trigger-min-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'trigger-min-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'trigger-min-height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'trigger-min-height-full': 'var(--control-height-xl)',
|
|
|
|
|
|
'trigger-px-xs': 'var(--space-2-5)',
|
|
|
|
|
|
'trigger-px-sm': 'var(--space-3)',
|
|
|
|
|
|
'trigger-px-md': 'var(--space-4)',
|
|
|
|
|
|
'trigger-px-lg': 'var(--space-5)',
|
|
|
|
|
|
'trigger-px-full': 'var(--space-6)',
|
|
|
|
|
|
'trigger-py-xs': 'var(--space-2)',
|
|
|
|
|
|
'trigger-py-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'trigger-py-md': 'var(--space-3)',
|
|
|
|
|
|
'trigger-py-lg': 'var(--space-3-5)',
|
|
|
|
|
|
'trigger-py-full': 'var(--space-4)',
|
|
|
|
|
|
'trigger-gap': 'var(--space-3)',
|
|
|
|
|
|
'trigger-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'trigger-font-size-xs': 'var(--text-2-size)',
|
|
|
|
|
|
'trigger-font-size-sm': 'var(--text-3-size)',
|
|
|
|
|
|
'trigger-font-size-md': 'var(--text-4-size)',
|
|
|
|
|
|
'trigger-font-size-lg': 'var(--text-5-size)',
|
|
|
|
|
|
'trigger-font-size-full': 'var(--text-6-size)',
|
|
|
|
|
|
'trigger-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'trigger-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'trigger-color': 'var(--color-content-primary)',
|
|
|
|
|
|
// Open state: keep the trigger text in the primary content tone.
|
|
|
|
|
|
// The chevron rotation + revealed content already signal openness;
|
|
|
|
|
|
// recoloring the heading adds noise without information (matches
|
|
|
|
|
|
// shadcn/Radix/Ark).
|
|
|
|
|
|
'trigger-color-open': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-color-disabled': 'var(--color-content-disabled)',
|
|
|
|
|
|
'trigger-hover-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'trigger-hover-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'trigger-transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'trigger-focus-ring-offset': 'var(--focus-ring-offset)',
|
|
|
|
|
|
'trigger-focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'trigger-focus-ring-color': 'var(--focus-ring-color)',
|
|
|
|
|
|
'content-px-xs': 'var(--space-2-5)',
|
|
|
|
|
|
'content-px-sm': 'var(--space-3)',
|
|
|
|
|
|
'content-px-md': 'var(--space-4)',
|
|
|
|
|
|
'content-px-lg': 'var(--space-5)',
|
|
|
|
|
|
'content-px-full': 'var(--space-6)',
|
|
|
|
|
|
'content-py-xs': 'var(--space-2)',
|
|
|
|
|
|
'content-py-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'content-py-md': 'var(--space-3)',
|
|
|
|
|
|
'content-py-lg': 'var(--space-4)',
|
|
|
|
|
|
'content-py-full': 'var(--space-5)',
|
|
|
|
|
|
'content-font-family': 'var(--font-prose)',
|
|
|
|
|
|
'content-font-size': 'var(--text-4-size)',
|
|
|
|
|
|
'content-line-height': 'var(--leading-prose)',
|
|
|
|
|
|
'content-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'content-open-duration': 'var(--duration-normal)',
|
|
|
|
|
|
'content-close-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'content-open-ease': 'var(--ease-out)',
|
|
|
|
|
|
'content-close-ease': 'var(--ease-in)',
|
|
|
|
|
|
'indicator-size-xs': 'var(--icon-size-xs)',
|
|
|
|
|
|
'indicator-size-sm': 'var(--icon-size-sm)',
|
|
|
|
|
|
'indicator-size-md': 'var(--icon-size-sm)',
|
|
|
|
|
|
'indicator-size-lg': 'var(--icon-size-md)',
|
|
|
|
|
|
'indicator-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
// Indicator turns to the primary content tone when open — a subtle
|
|
|
|
|
|
// emphasis without the loud accent recolor.
|
|
|
|
|
|
'indicator-color-open': 'var(--color-content-primary)',
|
|
|
|
|
|
'indicator-rotation': '180deg',
|
|
|
|
|
|
'indicator-transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'indicator-transition-ease': 'var(--ease-default)'
|
|
|
|
|
|
},
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
avatar: ((): RecipeTokenMap => {
|
|
|
|
|
|
// TSC v2.2 — 2D matrix (variant × color) cascade.
|
|
|
|
|
|
//
|
|
|
|
|
|
// Avatar's per-instance palette varies across 8 colors × 3
|
|
|
|
|
|
// variants. Each variant flavor (solid/soft/outline) reads
|
|
|
|
|
|
// different slots from the same color block. Encoding 24
|
|
|
|
|
|
// composite scopes by hand for 6 tokens (3 on the root, 3 on the
|
|
|
|
|
|
// badge part) is 144 lines of boilerplate; this small helper
|
|
|
|
|
|
// generates them with the same intent.
|
|
|
|
|
|
//
|
|
|
|
|
|
// Helper consumed only here — explicit declarations would obscure
|
|
|
|
|
|
// the variant logic. Keep the helper local to the entry to avoid
|
|
|
|
|
|
// polluting the recipes module surface.
|
|
|
|
|
|
const COLORS = [
|
|
|
|
|
|
'primary',
|
|
|
|
|
|
'secondary',
|
|
|
|
|
|
'neutral',
|
|
|
|
|
|
'affirm',
|
|
|
|
|
|
'fulfill',
|
|
|
|
|
|
'risk',
|
|
|
|
|
|
'threat',
|
|
|
|
|
|
'loss'
|
|
|
|
|
|
] as const;
|
|
|
|
|
|
type AvatarColor = (typeof COLORS)[number];
|
|
|
|
|
|
type AvatarVariant = 'solid' | 'soft' | 'outline';
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
|
|
|
|
|
|
/** Build (variant × color) declarations for a slot getter. */
|
|
|
|
|
|
function matrix(
|
|
|
|
|
|
pick: (color: AvatarColor, variant: AvatarVariant) => string | undefined,
|
|
|
|
|
|
parts?: readonly string[]
|
|
|
|
|
|
): RecipeTokenMultiDeclaration {
|
|
|
|
|
|
const declarations: RecipeTokenDeclaration[] = [];
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
for (const variant of ['solid', 'soft', 'outline'] as const) {
|
|
|
|
|
|
for (const color of COLORS) {
|
|
|
|
|
|
const value = pick(color, variant);
|
|
|
|
|
|
if (value === undefined) continue;
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations.push({
|
|
|
|
|
|
value,
|
|
|
|
|
|
scope: [`variant:${variant}`, `color:${color}`]
|
|
|
|
|
|
});
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return parts ? { parts, declarations } : { declarations };
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
'size-xs': '24px',
|
|
|
|
|
|
'size-sm': '32px',
|
|
|
|
|
|
'size-md': '40px',
|
|
|
|
|
|
'size-lg': '48px',
|
|
|
|
|
|
'size-xl': '64px',
|
|
|
|
|
|
'size-xxl': '96px',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size-xs': '10px',
|
|
|
|
|
|
'font-size-sm': '12px',
|
|
|
|
|
|
'font-size-md': '14px',
|
|
|
|
|
|
'font-size-lg': '16px',
|
|
|
|
|
|
'font-size-xl': '20px',
|
|
|
|
|
|
'font-size-xxl': '28px',
|
|
|
|
|
|
'font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'radius-full': 'var(--radius-full)',
|
|
|
|
|
|
'radius-md': 'var(--radius-md)',
|
|
|
|
|
|
'radius-sm': 'var(--radius-sm)',
|
|
|
|
|
|
'radius-none': '0',
|
|
|
|
|
|
'border-width': '2px',
|
|
|
|
|
|
'primary-solid-bg': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-solid-fg': 'var(--color-primary-contrast)',
|
|
|
|
|
|
'primary-soft-bg': 'var(--color-primary-surface)',
|
|
|
|
|
|
'primary-soft-fg': 'var(--color-primary-text)',
|
|
|
|
|
|
'primary-outline-border': 'var(--color-primary-border)',
|
|
|
|
|
|
'primary-outline-fg': 'var(--color-primary-text)',
|
|
|
|
|
|
'secondary-solid-bg': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-solid-fg': 'var(--color-secondary-contrast)',
|
|
|
|
|
|
'secondary-soft-bg': 'var(--color-secondary-surface)',
|
|
|
|
|
|
'secondary-soft-fg': 'var(--color-secondary-text)',
|
|
|
|
|
|
'secondary-outline-border': 'var(--color-secondary-border)',
|
|
|
|
|
|
'secondary-outline-fg': 'var(--color-secondary-text)',
|
|
|
|
|
|
'neutral-solid-bg': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-solid-fg': 'var(--color-neutral-contrast)',
|
|
|
|
|
|
'neutral-soft-bg': 'var(--color-neutral-surface)',
|
|
|
|
|
|
'neutral-soft-fg': 'var(--color-neutral-text)',
|
|
|
|
|
|
'neutral-outline-border': 'var(--color-neutral-border)',
|
|
|
|
|
|
'neutral-outline-fg': 'var(--color-neutral-text)',
|
|
|
|
|
|
'affirm-solid-bg': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-solid-fg': 'var(--color-affirm-contrast)',
|
|
|
|
|
|
'affirm-soft-bg': 'var(--color-affirm-surface)',
|
|
|
|
|
|
'affirm-soft-fg': 'var(--color-affirm-text)',
|
|
|
|
|
|
'affirm-outline-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'affirm-outline-fg': 'var(--color-affirm-text)',
|
|
|
|
|
|
'fulfill-solid-bg': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'fulfill-solid-fg': 'var(--color-fulfill-contrast)',
|
|
|
|
|
|
'fulfill-soft-bg': 'var(--color-fulfill-surface)',
|
|
|
|
|
|
'fulfill-soft-fg': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'fulfill-outline-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-outline-fg': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'risk-solid-bg': 'var(--color-risk-solid)',
|
|
|
|
|
|
'risk-solid-fg': 'var(--color-risk-contrast)',
|
|
|
|
|
|
'risk-soft-bg': 'var(--color-risk-surface)',
|
|
|
|
|
|
'risk-soft-fg': 'var(--color-risk-text)',
|
|
|
|
|
|
'risk-outline-border': 'var(--color-risk-border)',
|
|
|
|
|
|
'risk-outline-fg': 'var(--color-risk-text)',
|
|
|
|
|
|
'threat-solid-bg': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-solid-fg': 'var(--color-threat-contrast)',
|
|
|
|
|
|
'threat-soft-bg': 'var(--color-threat-surface)',
|
|
|
|
|
|
'threat-soft-fg': 'var(--color-threat-text)',
|
|
|
|
|
|
'threat-outline-border': 'var(--color-threat-border)',
|
|
|
|
|
|
'threat-outline-fg': 'var(--color-threat-text)',
|
|
|
|
|
|
'loss-solid-bg': 'var(--color-loss-solid)',
|
|
|
|
|
|
'loss-solid-fg': 'var(--color-loss-contrast)',
|
|
|
|
|
|
'loss-soft-bg': 'var(--color-loss-surface)',
|
|
|
|
|
|
'loss-soft-fg': 'var(--color-loss-text)',
|
|
|
|
|
|
'loss-outline-border': 'var(--color-loss-border)',
|
|
|
|
|
|
'loss-outline-fg': 'var(--color-loss-text)',
|
|
|
|
|
|
// ── Ring (outline halo around the avatar) ────────────────────────
|
|
|
|
|
|
'ring-width-sm': '1.5px',
|
|
|
|
|
|
'ring-width-md': '2px',
|
|
|
|
|
|
'ring-width-lg': '3px',
|
|
|
|
|
|
// ── Custom color (consumer-provided CSS color string) ────────────
|
|
|
|
|
|
// Set inline by the Svelte file via `style="--avatar-color-custom: …"`.
|
|
|
|
|
|
// Declared here so the recipe-css-contract test sees a declaration.
|
|
|
|
|
|
'color-custom': 'currentColor',
|
|
|
|
|
|
'color-custom-contrast': 'white',
|
|
|
|
|
|
'ring-color-custom': 'currentColor',
|
|
|
|
|
|
// ── Badge ─────────────────────────────────────────────────────────
|
|
|
|
|
|
'badge-border-width': '2px',
|
|
|
|
|
|
'badge-color-custom': 'currentColor',
|
|
|
|
|
|
'badge-color-custom-contrast': 'white',
|
|
|
|
|
|
// ── AvatarGroup ──────────────────────────────────────────────────
|
|
|
|
|
|
'group-gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'group-gap-sm': 'var(--space-2)',
|
|
|
|
|
|
'group-gap-md': 'var(--space-3)',
|
|
|
|
|
|
'group-gap-lg': 'var(--space-4)',
|
|
|
|
|
|
'group-overlap': '-0.6em',
|
|
|
|
|
|
'group-carve-width': '2px',
|
|
|
|
|
|
'group-carve-color': 'var(--color-surface-default)',
|
|
|
|
|
|
'group-reverse-z-max': '20',
|
|
|
|
|
|
'group-max': '99',
|
|
|
|
|
|
'overflow-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
// ── TSC v2.2 — composite (variant × color) cascade ────────────────
|
|
|
|
|
|
// 8 colors × 3 variants = 24 composite scopes per slot, applied
|
|
|
|
|
|
// to the root for {_bg, _fg, _border} and to the badge part for
|
|
|
|
|
|
// {_badge-bg, _badge-fg, _badge-border} (matrix helper above
|
|
|
|
|
|
// generates the declarations[] from the slot pickers).
|
|
|
|
|
|
//
|
|
|
|
|
|
// Defaults at `host` match the legacy CSS base rule (avatar:
|
|
|
|
|
|
// neutral-soft; badge: affirm-solid). Outline is the only variant
|
|
|
|
|
|
// that touches `_border` / `_badge-border`; solid+soft keep the
|
|
|
|
|
|
// transparent / surface-default defaults.
|
|
|
|
|
|
_bg: {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--avatar-neutral-soft-bg)', scope: 'host' },
|
|
|
|
|
|
...matrix((color, variant) =>
|
|
|
|
|
|
variant === 'outline' ? 'transparent' : `var(--avatar-${color}-${variant}-bg)`
|
|
|
|
|
|
).declarations
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_fg: {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--avatar-neutral-soft-fg)', scope: 'host' },
|
|
|
|
|
|
...matrix((color, variant) => `var(--avatar-${color}-${variant}-fg)`).declarations
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_border: {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'transparent', scope: 'host' },
|
|
|
|
|
|
...matrix((color, variant) =>
|
|
|
|
|
|
variant === 'outline' ? `var(--avatar-${color}-outline-border)` : undefined
|
|
|
|
|
|
).declarations
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_badge-bg': {
|
|
|
|
|
|
parts: ['badge'],
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--avatar-affirm-solid-bg)', scope: 'host' },
|
|
|
|
|
|
...matrix((color, variant) =>
|
|
|
|
|
|
variant === 'outline'
|
|
|
|
|
|
? 'var(--color-surface-default)'
|
|
|
|
|
|
: `var(--avatar-${color}-${variant}-bg)`
|
|
|
|
|
|
).declarations
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_badge-fg': {
|
|
|
|
|
|
parts: ['badge'],
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--avatar-affirm-solid-fg)', scope: 'host' },
|
|
|
|
|
|
...matrix((color, variant) => `var(--avatar-${color}-${variant}-fg)`).declarations
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_badge-border': {
|
|
|
|
|
|
parts: ['badge'],
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--color-surface-default)', scope: 'host' },
|
|
|
|
|
|
...matrix((color, variant) =>
|
|
|
|
|
|
variant === 'outline' ? `var(--avatar-${color}-outline-border)` : undefined
|
|
|
|
|
|
).declarations
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
})(),
|
feat(eidos): Card, Avatar ext, Image, SText, Badge, service components + dates engine fixes
Sprint completo:
- Card (eidos + sema): elevation/intent/interactive, eventos select+activate.
- Avatar: ring, AvatarBadge, AvatarGroup separados; demo Avatar standalone.
- Image: status surface (idle/loading/loaded/error) consumiendo soma ImageProvider.
- SText + STextVirtualList: canvas-text engine portado de morfo-driven-soma como
componentes separados para optimizar bundle (no se importa canvas si no se usa).
- Badge: primitivo eidos puro.
- Trans, FormatNumber, FormatDate, RelativeTime: 4 service components greppables
alrededor de uix.langs y uix.format. Nav group "Utilities".
Bugs fix arts/format/dates (engine-dates.ts):
1. Preset / per-axis conflict: Intl.DateTimeFormat rechaza dateStyle/timeStyle
con cualquier per-axis (weekday/era/year/month/day/dayPeriod/hour/minute/
second/fractionalSecondDigits) o con timeZoneName. Engine drop-ea ambos
presets por defecto cuando detecta conflict (regla estricta — un solo
per-axis hace ilegales los dos presets).
2. Per-call locale override: formatDate/Time/DateTime aceptan tercer arg
locale?: string. No muta engine state. Cache (getCachedDateFormat) keyea
por (locale x options). resolveCallHourCycle: cuando hay locale override
y pref auto, el ciclo horario se resuelve desde el locale OVERRIDE.
3. withHourCycle precedence: caller hourCycle/hour12 ahora gana sobre
preferencia del engine. Antes spread mal ordenado sobrescribia 'h12' del
caller con 'h23' del engine cuando locale resolvia a 24h.
FormatDate component vuelve a rutear siempre por uix.format.dates
(cache + hourCycle + locale reactivo), pasando locale como tercer arg.
Demos service components autonomos del toolbar global: cada uno owns su
demoLocale state con 7 chips (es-ES/en-US/en-GB/de-DE/fr-FR/ja-JP/ar-EG).
FormatDate stage filtra dateStyle/timeStyle por mode + chip hourCycle anadido.
Tests: 14/14 passing en engine-dates.test.ts (+6 nuevos: conflict handling,
locale override, hourCycle precedence).
Docs: arts/format/README.md (handoff 2026-05-25 con las 3 reglas),
README.md por service component, project_service_components_sprint_2026-05-25.md,
feedback_service_demos_own_locale.md (pattern reusable).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
badge: {
|
|
|
|
|
|
// ── Padding scale ────────────────────────────────────────────────
|
|
|
|
|
|
'px-xs': 'var(--space-1-5)',
|
|
|
|
|
|
'px-sm': 'var(--space-2)',
|
|
|
|
|
|
'px-md': 'var(--space-2-5)',
|
|
|
|
|
|
'px-lg': 'var(--space-3)',
|
|
|
|
|
|
'py-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'py-sm': 'var(--space-0-5)',
|
|
|
|
|
|
'py-md': 'var(--space-1)',
|
|
|
|
|
|
'py-lg': 'var(--space-1-5)',
|
|
|
|
|
|
// ── Gap between dot / icon / label / remove ───────────────────────
|
|
|
|
|
|
'gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
|
|
|
|
|
// ── Typography ────────────────────────────────────────────────────
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-md)',
|
|
|
|
|
|
'font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'letter-spacing': '0.01em',
|
|
|
|
|
|
// ── Borders + radii ───────────────────────────────────────────────
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
'radius-sm': 'var(--radius-sm)',
|
|
|
|
|
|
'radius-md': 'var(--radius-md)',
|
|
|
|
|
|
'radius-lg': 'var(--radius-lg)',
|
|
|
|
|
|
'radius-full': 'var(--radius-full)',
|
|
|
|
|
|
// ── Inner slots ───────────────────────────────────────────────────
|
|
|
|
|
|
// Use em so internal parts scale with the badge's resolved font-size.
|
|
|
|
|
|
'dot-size': '0.5em',
|
|
|
|
|
|
'icon-size': '1em',
|
|
|
|
|
|
'remove-size': '1.25em',
|
|
|
|
|
|
'remove-margin-start': '0.125em',
|
|
|
|
|
|
// ── Color palette (mirrors the canonical 8-color matrix) ──────────
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'primary-contrast': 'var(--color-primary-contrast)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'secondary-contrast': 'var(--color-secondary-contrast)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-text': 'var(--color-neutral-text)',
|
|
|
|
|
|
'neutral-contrast': 'var(--color-neutral-contrast)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'affirm-contrast': 'var(--color-affirm-contrast)',
|
|
|
|
|
|
'fulfill-track': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'fulfill-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-solid': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'fulfill-text': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'fulfill-contrast': 'var(--color-fulfill-contrast)',
|
|
|
|
|
|
'risk-solid': 'var(--color-risk-solid)',
|
|
|
|
|
|
'risk-text': 'var(--color-risk-text)',
|
|
|
|
|
|
'risk-contrast': 'var(--color-risk-contrast)',
|
|
|
|
|
|
'threat-solid': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-text': 'var(--color-threat-text)',
|
|
|
|
|
|
'threat-contrast': 'var(--color-threat-contrast)',
|
|
|
|
|
|
'loss-track': 'var(--color-loss-track)',
|
|
|
|
|
|
'loss-border': 'var(--color-loss-border)',
|
|
|
|
|
|
'loss-solid': 'var(--color-loss-solid)',
|
|
|
|
|
|
'loss-text': 'var(--color-loss-text)',
|
|
|
|
|
|
'loss-contrast': 'var(--color-loss-contrast)',
|
|
|
|
|
|
// Restored after accidental sed-removal during switch migration.
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'risk-track': 'var(--color-risk-track)',
|
|
|
|
|
|
'risk-border': 'var(--color-risk-border)',
|
|
|
|
|
|
'threat-track': 'var(--color-threat-track)',
|
|
|
|
|
|
'threat-border': 'var(--color-threat-border)',
|
|
|
|
|
|
// Private palette (TSC v2.1). 8 colors, 5 slots.
|
|
|
|
|
|
_track: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--badge-primary-track)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--badge-secondary-track)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--badge-neutral-track)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--badge-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--badge-fulfill-track)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--badge-risk-track)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--badge-threat-track)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--badge-loss-track)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_border: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--badge-primary-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--badge-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--badge-neutral-border)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--badge-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--badge-fulfill-border)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--badge-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--badge-threat-border)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--badge-loss-border)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_solid: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--badge-primary-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--badge-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--badge-neutral-solid)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--badge-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--badge-fulfill-solid)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--badge-risk-solid)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--badge-threat-solid)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--badge-loss-solid)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_text: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--badge-primary-text)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--badge-secondary-text)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--badge-neutral-text)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--badge-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--badge-fulfill-text)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--badge-risk-text)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--badge-threat-text)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--badge-loss-text)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_contrast: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--badge-primary-contrast)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--badge-secondary-contrast)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--badge-neutral-contrast)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--badge-affirm-contrast)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--badge-fulfill-contrast)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--badge-risk-contrast)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--badge-threat-contrast)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--badge-loss-contrast)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
breadcrumb: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
color: 'var(--color-content-secondary)',
|
|
|
|
|
|
'link-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'link-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'link-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'link-color-current': 'var(--color-content-primary)',
|
|
|
|
|
|
'link-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'link-font-weight-current': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'separator-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'ellipsis-size': 'var(--control-height-xs)',
|
|
|
|
|
|
'ellipsis-radius': 'var(--radius-md)',
|
|
|
|
|
|
'ellipsis-border-width': 'var(--border-width)',
|
|
|
|
|
|
'ellipsis-border': 'transparent',
|
|
|
|
|
|
'ellipsis-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'ellipsis-bg': 'transparent',
|
|
|
|
|
|
'ellipsis-bg-hover': 'var(--color-surface-raised)',
|
|
|
|
|
|
'ellipsis-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'ellipsis-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)'
|
|
|
|
|
|
},
|
feat(eidos): Card, Avatar ext, Image, SText, Badge, service components + dates engine fixes
Sprint completo:
- Card (eidos + sema): elevation/intent/interactive, eventos select+activate.
- Avatar: ring, AvatarBadge, AvatarGroup separados; demo Avatar standalone.
- Image: status surface (idle/loading/loaded/error) consumiendo soma ImageProvider.
- SText + STextVirtualList: canvas-text engine portado de morfo-driven-soma como
componentes separados para optimizar bundle (no se importa canvas si no se usa).
- Badge: primitivo eidos puro.
- Trans, FormatNumber, FormatDate, RelativeTime: 4 service components greppables
alrededor de uix.langs y uix.format. Nav group "Utilities".
Bugs fix arts/format/dates (engine-dates.ts):
1. Preset / per-axis conflict: Intl.DateTimeFormat rechaza dateStyle/timeStyle
con cualquier per-axis (weekday/era/year/month/day/dayPeriod/hour/minute/
second/fractionalSecondDigits) o con timeZoneName. Engine drop-ea ambos
presets por defecto cuando detecta conflict (regla estricta — un solo
per-axis hace ilegales los dos presets).
2. Per-call locale override: formatDate/Time/DateTime aceptan tercer arg
locale?: string. No muta engine state. Cache (getCachedDateFormat) keyea
por (locale x options). resolveCallHourCycle: cuando hay locale override
y pref auto, el ciclo horario se resuelve desde el locale OVERRIDE.
3. withHourCycle precedence: caller hourCycle/hour12 ahora gana sobre
preferencia del engine. Antes spread mal ordenado sobrescribia 'h12' del
caller con 'h23' del engine cuando locale resolvia a 24h.
FormatDate component vuelve a rutear siempre por uix.format.dates
(cache + hourCycle + locale reactivo), pasando locale como tercer arg.
Demos service components autonomos del toolbar global: cada uno owns su
demoLocale state con 7 chips (es-ES/en-US/en-GB/de-DE/fr-FR/ja-JP/ar-EG).
FormatDate stage filtra dateStyle/timeStyle por mode + chip hourCycle anadido.
Tests: 14/14 passing en engine-dates.test.ts (+6 nuevos: conflict handling,
locale override, hourCycle precedence).
Docs: arts/format/README.md (handoff 2026-05-25 con las 3 reglas),
README.md por service component, project_service_components_sprint_2026-05-25.md,
feedback_service_demos_own_locale.md (pattern reusable).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
card: {
|
|
|
|
|
|
// ── Padding scale ────────────────────────────────────────────────
|
|
|
|
|
|
'px-xs': 'var(--space-3)',
|
|
|
|
|
|
'px-sm': 'var(--space-4)',
|
|
|
|
|
|
'px-md': 'var(--space-5)',
|
|
|
|
|
|
'px-lg': 'var(--space-6)',
|
|
|
|
|
|
'px-xl': 'var(--space-8)',
|
|
|
|
|
|
'py-xs': 'var(--space-3)',
|
|
|
|
|
|
'py-sm': 'var(--space-4)',
|
|
|
|
|
|
'py-md': 'var(--space-5)',
|
|
|
|
|
|
'py-lg': 'var(--space-6)',
|
|
|
|
|
|
'py-xl': 'var(--space-8)',
|
|
|
|
|
|
// ── Gap between header / body / footer slots ─────────────────────
|
|
|
|
|
|
'gap-xs': 'var(--space-2)',
|
|
|
|
|
|
'gap-sm': 'var(--space-3)',
|
|
|
|
|
|
'gap-md': 'var(--space-4)',
|
|
|
|
|
|
'gap-lg': 'var(--space-5)',
|
|
|
|
|
|
'gap-xl': 'var(--space-6)',
|
|
|
|
|
|
// ── Typography ────────────────────────────────────────────────────
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'title-font-family': 'var(--font-heading)',
|
|
|
|
|
|
'title-font-size-xs': 'var(--font-size-sm)',
|
|
|
|
|
|
'title-font-size-sm': 'var(--font-size-md)',
|
|
|
|
|
|
'title-font-size-md': 'var(--font-size-lg)',
|
|
|
|
|
|
'title-font-size-lg': 'var(--font-size-xl)',
|
|
|
|
|
|
'title-font-size-xl': 'var(--font-size-2xl)',
|
|
|
|
|
|
'title-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'title-line-height': 'var(--leading-heading)',
|
|
|
|
|
|
'title-letter-spacing': 'var(--tracking-tight)',
|
|
|
|
|
|
'description-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'description-font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'description-font-size-sm': 'var(--font-size-sm)',
|
|
|
|
|
|
'description-font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'description-font-size-lg': 'var(--font-size-md)',
|
|
|
|
|
|
'description-font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'description-line-height': 'var(--leading-prose)',
|
|
|
|
|
|
'description-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'body-font-size-xs': 'var(--font-size-sm)',
|
|
|
|
|
|
'body-font-size-sm': 'var(--font-size-sm)',
|
|
|
|
|
|
'body-font-size-md': 'var(--font-size-md)',
|
|
|
|
|
|
'body-font-size-lg': 'var(--font-size-md)',
|
|
|
|
|
|
'body-font-size-xl': 'var(--font-size-lg)',
|
|
|
|
|
|
'body-line-height': 'var(--leading-prose)',
|
|
|
|
|
|
// ── Borders + radii ───────────────────────────────────────────────
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
'radius-sm': 'var(--radius-md)',
|
|
|
|
|
|
'radius-md': 'var(--radius-lg)',
|
|
|
|
|
|
'radius-lg': 'var(--radius-xl)',
|
|
|
|
|
|
// ── Inner slot spacing ────────────────────────────────────────────
|
|
|
|
|
|
'header-gap': 'var(--space-1-5)',
|
|
|
|
|
|
'footer-gap': 'var(--space-3)',
|
|
|
|
|
|
'footer-padding-start': 'var(--space-3)',
|
|
|
|
|
|
'footer-border-color': 'var(--color-border-subtle)',
|
|
|
|
|
|
// ── Animations ────────────────────────────────────────────────────
|
|
|
|
|
|
'emerge-duration': '320ms',
|
|
|
|
|
|
'emerge-ease': 'var(--ease-out)',
|
|
|
|
|
|
'emerge-distance': '8px',
|
|
|
|
|
|
'hover-lift': '-2px',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'hover-shadow': 'var(--depth-overlay-shadow), var(--depth-overlay-halo)',
|
feat(eidos): Card, Avatar ext, Image, SText, Badge, service components + dates engine fixes
Sprint completo:
- Card (eidos + sema): elevation/intent/interactive, eventos select+activate.
- Avatar: ring, AvatarBadge, AvatarGroup separados; demo Avatar standalone.
- Image: status surface (idle/loading/loaded/error) consumiendo soma ImageProvider.
- SText + STextVirtualList: canvas-text engine portado de morfo-driven-soma como
componentes separados para optimizar bundle (no se importa canvas si no se usa).
- Badge: primitivo eidos puro.
- Trans, FormatNumber, FormatDate, RelativeTime: 4 service components greppables
alrededor de uix.langs y uix.format. Nav group "Utilities".
Bugs fix arts/format/dates (engine-dates.ts):
1. Preset / per-axis conflict: Intl.DateTimeFormat rechaza dateStyle/timeStyle
con cualquier per-axis (weekday/era/year/month/day/dayPeriod/hour/minute/
second/fractionalSecondDigits) o con timeZoneName. Engine drop-ea ambos
presets por defecto cuando detecta conflict (regla estricta — un solo
per-axis hace ilegales los dos presets).
2. Per-call locale override: formatDate/Time/DateTime aceptan tercer arg
locale?: string. No muta engine state. Cache (getCachedDateFormat) keyea
por (locale x options). resolveCallHourCycle: cuando hay locale override
y pref auto, el ciclo horario se resuelve desde el locale OVERRIDE.
3. withHourCycle precedence: caller hourCycle/hour12 ahora gana sobre
preferencia del engine. Antes spread mal ordenado sobrescribia 'h12' del
caller con 'h23' del engine cuando locale resolvia a 24h.
FormatDate component vuelve a rutear siempre por uix.format.dates
(cache + hourCycle + locale reactivo), pasando locale como tercer arg.
Demos service components autonomos del toolbar global: cada uno owns su
demoLocale state con 7 chips (es-ES/en-US/en-GB/de-DE/fr-FR/ja-JP/ar-EG).
FormatDate stage filtra dateStyle/timeStyle por mode + chip hourCycle anadido.
Tests: 14/14 passing en engine-dates.test.ts (+6 nuevos: conflict handling,
locale override, hourCycle precedence).
Docs: arts/format/README.md (handoff 2026-05-25 con las 3 reglas),
README.md por service component, project_service_components_sprint_2026-05-25.md,
feedback_service_demos_own_locale.md (pattern reusable).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'press-scale': '0.985',
|
|
|
|
|
|
'press-duration': '80ms',
|
|
|
|
|
|
'selected-ring-width': '2px',
|
|
|
|
|
|
'disabled-opacity': '0.6',
|
|
|
|
|
|
// ── Custom color (set inline by consumer via style) ───────────────
|
|
|
|
|
|
// The Svelte file emits `style="--card-color-custom: <value>;"`
|
|
|
|
|
|
// when the consumer passes a non-canonical CSS color. Declared
|
|
|
|
|
|
// here so the recipe-css-contract test sees a declaration.
|
|
|
|
|
|
'color-custom': 'currentColor',
|
|
|
|
|
|
'color-custom-contrast': 'white',
|
|
|
|
|
|
// ── Color palette (canonical 8-color × 5 slots) ──────────────────
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'primary-contrast': 'var(--color-primary-contrast)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'secondary-contrast': 'var(--color-secondary-contrast)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-text': 'var(--color-neutral-text)',
|
|
|
|
|
|
'neutral-contrast': 'var(--color-neutral-contrast)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'affirm-contrast': 'var(--color-affirm-contrast)',
|
|
|
|
|
|
'fulfill-track': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'fulfill-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-solid': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'fulfill-text': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'fulfill-contrast': 'var(--color-fulfill-contrast)',
|
|
|
|
|
|
'risk-solid': 'var(--color-risk-solid)',
|
|
|
|
|
|
'risk-text': 'var(--color-risk-text)',
|
|
|
|
|
|
'risk-contrast': 'var(--color-risk-contrast)',
|
|
|
|
|
|
'threat-solid': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-text': 'var(--color-threat-text)',
|
|
|
|
|
|
'threat-contrast': 'var(--color-threat-contrast)',
|
|
|
|
|
|
'loss-track': 'var(--color-loss-track)',
|
|
|
|
|
|
'loss-border': 'var(--color-loss-border)',
|
|
|
|
|
|
'loss-solid': 'var(--color-loss-solid)',
|
|
|
|
|
|
'loss-text': 'var(--color-loss-text)',
|
|
|
|
|
|
'loss-contrast': 'var(--color-loss-contrast)',
|
|
|
|
|
|
// Restored after accidental sed-removal during switch migration.
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'risk-track': 'var(--color-risk-track)',
|
|
|
|
|
|
'risk-border': 'var(--color-risk-border)',
|
|
|
|
|
|
'threat-track': 'var(--color-threat-track)',
|
|
|
|
|
|
'threat-border': 'var(--color-threat-border)',
|
|
|
|
|
|
// Private palette (TSC v2.1). 8 colors, 5 slots. Default = neutral.
|
|
|
|
|
|
_track: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--card-neutral-track)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--card-primary-track)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--card-secondary-track)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--card-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--card-fulfill-track)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--card-risk-track)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--card-threat-track)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--card-loss-track)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_border: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--card-neutral-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--card-primary-border)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--card-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--card-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--card-fulfill-border)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--card-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--card-threat-border)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--card-loss-border)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_solid: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--card-neutral-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--card-primary-solid)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--card-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--card-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--card-fulfill-solid)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--card-risk-solid)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--card-threat-solid)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--card-loss-solid)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_text: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--card-neutral-text)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--card-primary-text)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--card-secondary-text)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--card-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--card-fulfill-text)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--card-risk-text)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--card-threat-text)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--card-loss-text)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
_contrast: {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--card-neutral-contrast)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--card-primary-contrast)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--card-secondary-contrast)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--card-affirm-contrast)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--card-fulfill-contrast)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--card-risk-contrast)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--card-threat-contrast)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--card-loss-contrast)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
feat(eidos): Card, Avatar ext, Image, SText, Badge, service components + dates engine fixes
Sprint completo:
- Card (eidos + sema): elevation/intent/interactive, eventos select+activate.
- Avatar: ring, AvatarBadge, AvatarGroup separados; demo Avatar standalone.
- Image: status surface (idle/loading/loaded/error) consumiendo soma ImageProvider.
- SText + STextVirtualList: canvas-text engine portado de morfo-driven-soma como
componentes separados para optimizar bundle (no se importa canvas si no se usa).
- Badge: primitivo eidos puro.
- Trans, FormatNumber, FormatDate, RelativeTime: 4 service components greppables
alrededor de uix.langs y uix.format. Nav group "Utilities".
Bugs fix arts/format/dates (engine-dates.ts):
1. Preset / per-axis conflict: Intl.DateTimeFormat rechaza dateStyle/timeStyle
con cualquier per-axis (weekday/era/year/month/day/dayPeriod/hour/minute/
second/fractionalSecondDigits) o con timeZoneName. Engine drop-ea ambos
presets por defecto cuando detecta conflict (regla estricta — un solo
per-axis hace ilegales los dos presets).
2. Per-call locale override: formatDate/Time/DateTime aceptan tercer arg
locale?: string. No muta engine state. Cache (getCachedDateFormat) keyea
por (locale x options). resolveCallHourCycle: cuando hay locale override
y pref auto, el ciclo horario se resuelve desde el locale OVERRIDE.
3. withHourCycle precedence: caller hourCycle/hour12 ahora gana sobre
preferencia del engine. Antes spread mal ordenado sobrescribia 'h12' del
caller con 'h23' del engine cuando locale resolvia a 24h.
FormatDate component vuelve a rutear siempre por uix.format.dates
(cache + hourCycle + locale reactivo), pasando locale como tercer arg.
Demos service components autonomos del toolbar global: cada uno owns su
demoLocale state con 7 chips (es-ES/en-US/en-GB/de-DE/fr-FR/ja-JP/ar-EG).
FormatDate stage filtra dateStyle/timeStyle por mode + chip hourCycle anadido.
Tests: 14/14 passing en engine-dates.test.ts (+6 nuevos: conflict handling,
locale override, hourCycle precedence).
Docs: arts/format/README.md (handoff 2026-05-25 con las 3 reglas),
README.md por service component, project_service_components_sprint_2026-05-25.md,
feedback_service_demos_own_locale.md (pattern reusable).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
},
|
|
|
|
|
|
checkbox: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'size-xs-box-size': '14px',
|
|
|
|
|
|
'size-xs-indicator-size': '8px',
|
|
|
|
|
|
'size-xs-indicator-stroke': '2px',
|
|
|
|
|
|
'size-sm-box-size': '16px',
|
|
|
|
|
|
'size-sm-indicator-size': '10px',
|
|
|
|
|
|
'size-sm-indicator-stroke': '2px',
|
|
|
|
|
|
'size-md-box-size': '18px',
|
|
|
|
|
|
'size-md-indicator-size': '12px',
|
|
|
|
|
|
'size-md-indicator-stroke': '2px',
|
|
|
|
|
|
'size-lg-box-size': '22px',
|
|
|
|
|
|
'size-lg-indicator-size': '14px',
|
|
|
|
|
|
'size-lg-indicator-stroke': '2px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'size-xl-box-size': '26px',
|
|
|
|
|
|
'size-xl-indicator-size': '16px',
|
|
|
|
|
|
'size-xl-indicator-stroke': '2px',
|
|
|
|
|
|
radius: 'var(--radius-sm)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
'focus-ring-offset': 'var(--focus-ring-offset)',
|
|
|
|
|
|
'focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'focus-ring-color': 'var(--focus-ring-color)',
|
|
|
|
|
|
'focus-ring-surface': 'var(--color-surface-default)',
|
|
|
|
|
|
'focus-ring':
|
|
|
|
|
|
'0 0 0 var(--checkbox-focus-ring-offset) var(--checkbox-focus-ring-surface), 0 0 0 calc(var(--checkbox-focus-ring-offset) + var(--checkbox-focus-ring-width)) var(--checkbox-focus-ring-color)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
// Checkmark stroke draw — synced with the box transition (--duration-fast).
|
|
|
|
|
|
// Was a hardcoded 220ms, which read as laggy next to the 120ms box fill.
|
|
|
|
|
|
'stroke-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'stroke-ease': 'cubic-bezier(0.4, 0, 0.2, 1)',
|
|
|
|
|
|
'bg-off': 'var(--color-surface-default)',
|
|
|
|
|
|
'bg-off-hover':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-default) 82%, var(--color-surface-overlay) )',
|
|
|
|
|
|
'border-off': 'var(--color-border-default)',
|
|
|
|
|
|
'border-off-hover': 'var(--color-border-strong)',
|
|
|
|
|
|
'bg-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 78%, var(--color-surface-default) )',
|
|
|
|
|
|
'border-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-border-default) 72%, var(--color-border-subtle) )',
|
|
|
|
|
|
'disabled-opacity': '0.72',
|
|
|
|
|
|
'indicator-color': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'indicator-color-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-content-on-solid) 82%, var(--color-surface-default) )',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-solid-hover': 'var(--color-primary-solid-hover)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-solid-hover': 'var(--color-neutral-solid-hover)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-solid-hover': 'var(--color-secondary-solid-hover)',
|
|
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-solid-hover': 'var(--color-affirm-solid-hover)',
|
|
|
|
|
|
// Private palette (TSC v2.1 `_` prefix → emits `--_checkbox-palette-*`).
|
|
|
|
|
|
// Recipe-internal cascade: host default = primary, plus overrides
|
|
|
|
|
|
// for the 3 supported color values. Migrated from manual blocks
|
|
|
|
|
|
// in checkbox.css.
|
|
|
|
|
|
'_palette-solid': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--checkbox-primary-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--checkbox-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--checkbox-neutral-solid)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--checkbox-affirm-solid)', scope: 'color:affirm' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_palette-solid-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--checkbox-primary-solid-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--checkbox-secondary-solid-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--checkbox-neutral-solid-hover)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--checkbox-affirm-solid-hover)', scope: 'color:affirm' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_palette-text': { value: 'var(--checkbox-indicator-color)', scope: 'host' },
|
|
|
|
|
|
'group-gap': 'var(--space-3)',
|
|
|
|
|
|
'group-label-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'group-label-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'group-label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'group-label-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'group-label-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'group-label-color-disabled': 'var(--color-content-secondary)'
|
|
|
|
|
|
},
|
|
|
|
|
|
collapsible: {
|
|
|
|
|
|
'trigger-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'trigger-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'trigger-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'trigger-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-bg-hover': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'trigger-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'trigger-padding': 'var(--space-2) var(--space-3)',
|
|
|
|
|
|
'content-padding': 'var(--space-3)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-normal)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.5'
|
|
|
|
|
|
},
|
|
|
|
|
|
dialog: {
|
|
|
|
|
|
'trigger-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'overlay-bg': 'var(--color-overlay)',
|
|
|
|
|
|
'overlay-opacity': '62%',
|
|
|
|
|
|
'overlay-blur': '10px',
|
|
|
|
|
|
'overlay-z': '70',
|
|
|
|
|
|
'content-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'content-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'content-border': 'var(--color-border-default)',
|
|
|
|
|
|
'content-border-width': 'var(--border-width)',
|
|
|
|
|
|
'content-radius': 'var(--radius-xl)',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'content-shadow': 'var(--depth-overlay-shadow), var(--depth-overlay-halo)',
|
|
|
|
|
|
'content-max-height': 'calc(100dvh - var(--space-8))',
|
|
|
|
|
|
'content-max-height-sheet': '85dvh',
|
|
|
|
|
|
'content-width-sm': '420px',
|
|
|
|
|
|
'content-width-md': '560px',
|
|
|
|
|
|
'content-width-lg': '760px',
|
|
|
|
|
|
'content-width-xl': '1024px',
|
|
|
|
|
|
'content-width-inset': 'var(--space-6)',
|
|
|
|
|
|
'content-full-inset': 'var(--space-3)',
|
|
|
|
|
|
'content-full-radius': 'var(--radius-xxl)',
|
|
|
|
|
|
'content-position-inset': 'var(--space-4)',
|
|
|
|
|
|
'content-padding-sm': 'var(--space-4)',
|
|
|
|
|
|
'content-padding-md': 'var(--space-5)',
|
|
|
|
|
|
'content-padding-lg': 'var(--space-6)',
|
|
|
|
|
|
'content-padding-full': 'var(--space-6)',
|
|
|
|
|
|
'stack-gap': 'var(--space-4)',
|
|
|
|
|
|
'header-gap': 'var(--space-3)',
|
|
|
|
|
|
'footer-gap': 'var(--space-3)',
|
|
|
|
|
|
'footer-margin-top': 'var(--space-2)',
|
|
|
|
|
|
'title-font-family': 'var(--font-heading)',
|
|
|
|
|
|
'title-font-size': 'var(--font-size-lg)',
|
|
|
|
|
|
'title-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'title-line-height': 'var(--leading-heading)',
|
|
|
|
|
|
'title-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'description-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'description-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'description-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'description-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'close-size': 'var(--control-height-sm)',
|
|
|
|
|
|
'close-px': 'var(--space-2)',
|
|
|
|
|
|
'close-radius': 'var(--radius-md)',
|
|
|
|
|
|
'close-inset': 'var(--space-3)',
|
|
|
|
|
|
'close-bg': 'transparent',
|
|
|
|
|
|
'close-bg-hover': 'color-mix(in srgb, var(--color-neutral-track) 72%, transparent)',
|
|
|
|
|
|
'close-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'close-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'close-border': 'transparent',
|
|
|
|
|
|
'close-border-width': 'var(--border-width)',
|
|
|
|
|
|
'close-transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'close-transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'close-focus-ring-offset': '1px',
|
|
|
|
|
|
'close-focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'close-focus-ring-color': 'var(--focus-ring-color)'
|
|
|
|
|
|
},
|
|
|
|
|
|
field: {
|
|
|
|
|
|
'gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-2)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-3)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'label-gap': 'var(--space-1)',
|
|
|
|
|
|
'label-font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'label-font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'label-font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'label-font-size-lg': 'var(--font-size-sm)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'label-font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'label-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'label-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'label-color-invalid': 'var(--color-risk-text)',
|
|
|
|
|
|
'label-color-disabled': 'var(--color-content-disabled)',
|
|
|
|
|
|
'layout-column-gap': 'var(--space-4)',
|
|
|
|
|
|
'required-color': 'var(--color-risk-text)',
|
|
|
|
|
|
'control-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'control-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'control-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'control-height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'control-px-xs': 'var(--space-2)',
|
|
|
|
|
|
'control-px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'control-px-md': 'var(--space-3)',
|
|
|
|
|
|
'control-px-lg': 'var(--space-3-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-px-xl': 'var(--space-4)',
|
|
|
|
|
|
'control-gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'control-gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'control-gap-md': 'var(--space-2)',
|
|
|
|
|
|
'control-gap-lg': 'var(--space-2-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-gap-xl': 'var(--space-3)',
|
|
|
|
|
|
'control-font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'control-font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'control-font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'control-font-size-lg': 'var(--font-size-sm)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'control-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'control-radius': 'var(--radius-md)',
|
|
|
|
|
|
'control-border-width': 'var(--border-width)',
|
|
|
|
|
|
'control-border': 'var(--color-border-default)',
|
|
|
|
|
|
'control-border-hover': 'var(--color-border-strong)',
|
|
|
|
|
|
'control-border-focus': 'var(--color-focus-ring)',
|
|
|
|
|
|
'control-border-invalid': 'var(--color-risk-border)',
|
|
|
|
|
|
'control-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'control-ghost-border': 'transparent',
|
|
|
|
|
|
'control-ghost-bg': 'transparent',
|
|
|
|
|
|
'control-bg-readonly': 'var(--color-surface-muted)',
|
|
|
|
|
|
'control-bg-disabled': 'var(--color-surface-muted)',
|
|
|
|
|
|
'control-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'control-placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'control-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)',
|
|
|
|
|
|
'affix-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'message-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'message-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'helper-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'error-color': 'var(--color-risk-text)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
form: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-3)',
|
|
|
|
|
|
'gap-sm': 'var(--space-4)',
|
|
|
|
|
|
'gap-md': 'var(--space-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-6)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-7)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
radius: 'var(--radius-lg)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
'panel-padding': 'var(--space-5)',
|
|
|
|
|
|
'panel-border': 'var(--color-border-default)',
|
|
|
|
|
|
'panel-bg': 'var(--color-surface-raised)',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'panel-shadow': 'var(--depth-raised-shadow), var(--depth-raised-halo)',
|
|
|
|
|
|
'grid-min': '18rem',
|
|
|
|
|
|
'grid-column-gap': 'var(--space-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'action-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'action-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'action-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'action-height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'action-height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'action-px-xs': 'var(--space-2-5)',
|
|
|
|
|
|
'action-px-sm': 'var(--space-3)',
|
|
|
|
|
|
'action-px-md': 'var(--space-3-5)',
|
|
|
|
|
|
'action-px-lg': 'var(--space-4)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'action-px-xl': 'var(--space-4-5)',
|
|
|
|
|
|
'action-font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'action-font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'action-font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'action-font-size-lg': 'var(--font-size-sm)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'action-font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'action-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'action-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'action-gap': 'var(--space-2)',
|
|
|
|
|
|
'action-radius': 'var(--radius-md)',
|
|
|
|
|
|
'action-border-width': 'var(--border-width)',
|
|
|
|
|
|
'error-summary-padding': 'var(--space-3)',
|
|
|
|
|
|
'error-summary-border-width': 'var(--border-width)',
|
|
|
|
|
|
'error-summary-radius': 'var(--radius-md)',
|
|
|
|
|
|
'error-summary-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'error-summary-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'error-summary-list-indent': 'var(--space-4)',
|
|
|
|
|
|
'link-underline-offset': '0.18em',
|
|
|
|
|
|
'auto-fields-gap': 'var(--space-3)',
|
|
|
|
|
|
'auto-fields-array-padding': 'var(--space-3)',
|
|
|
|
|
|
'auto-fields-border-width': 'var(--border-width)',
|
|
|
|
|
|
'auto-fields-radius': 'var(--radius-md)',
|
|
|
|
|
|
'auto-fields-item-gap': 'var(--space-2)',
|
|
|
|
|
|
'auto-fields-item-padding': 'var(--space-3)',
|
|
|
|
|
|
'widget-px': 'var(--space-3)',
|
|
|
|
|
|
'widget-radius': 'var(--radius-md)',
|
|
|
|
|
|
'widget-border-width': 'var(--border-width)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
drawer: {
|
|
|
|
|
|
'overlay-bg': 'var(--color-overlay)',
|
|
|
|
|
|
'overlay-blur': '10px',
|
|
|
|
|
|
'overlay-opacity': '62%',
|
|
|
|
|
|
'overlay-z': '72',
|
|
|
|
|
|
'inline-z': '64',
|
|
|
|
|
|
'handle-bg': 'var(--color-neutral-track)',
|
|
|
|
|
|
'handle-bg-active': 'var(--color-content-secondary)',
|
|
|
|
|
|
'handle-radius': 'var(--radius-full)',
|
|
|
|
|
|
'handle-length': '36px',
|
|
|
|
|
|
'handle-thickness': '4px',
|
|
|
|
|
|
'handle-active-scale': '1.18',
|
|
|
|
|
|
'handle-transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'handle-transition-ease': 'var(--ease-out)',
|
|
|
|
|
|
'content-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'content-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'content-border': 'var(--color-border-default)',
|
|
|
|
|
|
'content-border-width': 'var(--border-width)',
|
|
|
|
|
|
'content-radius': 'var(--radius-xl)',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'content-shadow': 'var(--depth-overlay-shadow), var(--depth-overlay-halo)',
|
|
|
|
|
|
'content-shadow-dragging':
|
|
|
|
|
|
'var(--shadow-overlay-strong, var(--depth-overlay-shadow)), var(--depth-overlay-halo)',
|
|
|
|
|
|
'content-ring-dragging-width': '2px',
|
|
|
|
|
|
'content-ring-dragging-color':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-content-secondary) 32%, transparent )',
|
|
|
|
|
|
'content-ring-dragging-offset': '2px',
|
|
|
|
|
|
'content-inset': 'var(--space-3)',
|
|
|
|
|
|
'content-width-sm': '360px',
|
|
|
|
|
|
'content-width-md': '440px',
|
|
|
|
|
|
'content-width-lg': '560px',
|
|
|
|
|
|
'content-height-sm': '260px',
|
|
|
|
|
|
'content-height-md': '360px',
|
|
|
|
|
|
'content-height-lg': '480px',
|
|
|
|
|
|
'content-padding-sm': 'var(--space-4)',
|
|
|
|
|
|
'content-padding-md': 'var(--space-5)',
|
|
|
|
|
|
'content-padding-lg': 'var(--space-6)',
|
|
|
|
|
|
'content-padding-full': 'var(--space-6)',
|
|
|
|
|
|
'stack-gap': 'var(--space-4)',
|
|
|
|
|
|
'header-gap': 'var(--space-3)',
|
|
|
|
|
|
'footer-gap': 'var(--space-3)',
|
|
|
|
|
|
'footer-margin-top': 'var(--space-2)',
|
|
|
|
|
|
'title-font-family': 'var(--font-heading)',
|
|
|
|
|
|
'title-font-size': 'var(--font-size-lg)',
|
|
|
|
|
|
'title-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'title-line-height': 'var(--leading-heading)',
|
|
|
|
|
|
'title-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'description-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'description-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'description-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'description-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'close-size': 'var(--control-height-sm)',
|
|
|
|
|
|
'close-px': 'var(--space-2)',
|
|
|
|
|
|
'close-radius': 'var(--radius-md)',
|
|
|
|
|
|
'close-bg': 'transparent',
|
|
|
|
|
|
'close-bg-hover': 'color-mix(in srgb, var(--color-neutral-track) 72%, transparent)',
|
|
|
|
|
|
'close-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'close-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'close-border': 'transparent',
|
|
|
|
|
|
'close-border-width': 'var(--border-width)',
|
|
|
|
|
|
'close-transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'close-transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'close-focus-ring-offset': '1px',
|
|
|
|
|
|
'close-focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'close-focus-ring-color': 'var(--focus-ring-color)',
|
|
|
|
|
|
'close-disabled-opacity': '0.5'
|
|
|
|
|
|
},
|
|
|
|
|
|
icon: {
|
|
|
|
|
|
size: 'var(--icon-size-md)',
|
|
|
|
|
|
'stroke-width': 'var(--icon-stroke-width-md)'
|
|
|
|
|
|
},
|
feat(eidos): Card, Avatar ext, Image, SText, Badge, service components + dates engine fixes
Sprint completo:
- Card (eidos + sema): elevation/intent/interactive, eventos select+activate.
- Avatar: ring, AvatarBadge, AvatarGroup separados; demo Avatar standalone.
- Image: status surface (idle/loading/loaded/error) consumiendo soma ImageProvider.
- SText + STextVirtualList: canvas-text engine portado de morfo-driven-soma como
componentes separados para optimizar bundle (no se importa canvas si no se usa).
- Badge: primitivo eidos puro.
- Trans, FormatNumber, FormatDate, RelativeTime: 4 service components greppables
alrededor de uix.langs y uix.format. Nav group "Utilities".
Bugs fix arts/format/dates (engine-dates.ts):
1. Preset / per-axis conflict: Intl.DateTimeFormat rechaza dateStyle/timeStyle
con cualquier per-axis (weekday/era/year/month/day/dayPeriod/hour/minute/
second/fractionalSecondDigits) o con timeZoneName. Engine drop-ea ambos
presets por defecto cuando detecta conflict (regla estricta — un solo
per-axis hace ilegales los dos presets).
2. Per-call locale override: formatDate/Time/DateTime aceptan tercer arg
locale?: string. No muta engine state. Cache (getCachedDateFormat) keyea
por (locale x options). resolveCallHourCycle: cuando hay locale override
y pref auto, el ciclo horario se resuelve desde el locale OVERRIDE.
3. withHourCycle precedence: caller hourCycle/hour12 ahora gana sobre
preferencia del engine. Antes spread mal ordenado sobrescribia 'h12' del
caller con 'h23' del engine cuando locale resolvia a 24h.
FormatDate component vuelve a rutear siempre por uix.format.dates
(cache + hourCycle + locale reactivo), pasando locale como tercer arg.
Demos service components autonomos del toolbar global: cada uno owns su
demoLocale state con 7 chips (es-ES/en-US/en-GB/de-DE/fr-FR/ja-JP/ar-EG).
FormatDate stage filtra dateStyle/timeStyle por mode + chip hourCycle anadido.
Tests: 14/14 passing en engine-dates.test.ts (+6 nuevos: conflict handling,
locale override, hourCycle precedence).
Docs: arts/format/README.md (handoff 2026-05-25 con las 3 reglas),
README.md por service component, project_service_components_sprint_2026-05-25.md,
feedback_service_demos_own_locale.md (pattern reusable).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
image: {
|
|
|
|
|
|
// ── Size presets (square boxes) ──────────────────────────────────
|
|
|
|
|
|
'size-xs': '64px',
|
|
|
|
|
|
'size-sm': '96px',
|
|
|
|
|
|
'size-md': '160px',
|
|
|
|
|
|
'size-lg': '240px',
|
|
|
|
|
|
'size-xl': '360px',
|
|
|
|
|
|
// ── Radius scale ──────────────────────────────────────────────────
|
|
|
|
|
|
'radius-none': '0',
|
|
|
|
|
|
'radius-sm': 'var(--radius-sm)',
|
|
|
|
|
|
'radius-md': 'var(--radius-md)',
|
|
|
|
|
|
'radius-lg': 'var(--radius-lg)',
|
|
|
|
|
|
'radius-full': 'var(--radius-full)',
|
|
|
|
|
|
// ── Fade-in transition for the inner <img> ───────────────────────
|
|
|
|
|
|
'fade-duration': 'var(--duration-normal)',
|
|
|
|
|
|
'fade-ease': 'var(--ease-out)',
|
|
|
|
|
|
// ── Skeleton placeholder shimmer ──────────────────────────────────
|
|
|
|
|
|
'placeholder-base': 'var(--color-surface-raised)',
|
|
|
|
|
|
'placeholder-highlight':
|
|
|
|
|
|
'color-mix(in srgb, var(--color-surface-default) 70%, var(--color-surface-overlay))',
|
|
|
|
|
|
'shimmer-duration': '1.8s',
|
|
|
|
|
|
// ── Custom placeholder color (set inline by Svelte file) ─────────
|
|
|
|
|
|
'placeholder-color-custom': 'var(--color-neutral-track)',
|
|
|
|
|
|
// ── Fallback typography (for text-only fallback content) ─────────
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'fallback-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'fallback-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'fallback-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
// ── Error state ──────────────────────────────────────────────────
|
|
|
|
|
|
'error-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'error-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'error-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'error-line-height': 'var(--leading-ui)'
|
|
|
|
|
|
},
|
|
|
|
|
|
meter: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xs': '2px',
|
|
|
|
|
|
'height-sm': '4px',
|
|
|
|
|
|
'height-md': '6px',
|
|
|
|
|
|
'height-lg': '8px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xl': '12px',
|
|
|
|
|
|
'radius-xs': 'var(--radius-full)',
|
|
|
|
|
|
'radius-sm': 'var(--radius-full)',
|
|
|
|
|
|
'radius-md': 'var(--radius-full)',
|
|
|
|
|
|
'radius-lg': 'var(--radius-full)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'radius-xl': 'var(--radius-full)',
|
|
|
|
|
|
'ring-size-xs': '2rem',
|
|
|
|
|
|
'ring-size-sm': '2.5rem',
|
|
|
|
|
|
'ring-size-md': '3rem',
|
|
|
|
|
|
'ring-size-lg': '3.5rem',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'ring-size-xl': '4rem',
|
|
|
|
|
|
'ring-thickness-xs': '3px',
|
|
|
|
|
|
'ring-thickness-sm': '4px',
|
|
|
|
|
|
'ring-thickness-md': '6px',
|
|
|
|
|
|
'ring-thickness-lg': '8px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'ring-thickness-xl': '10px',
|
|
|
|
|
|
'track-bg': 'var(--color-neutral-track)',
|
|
|
|
|
|
'ring-track-bg':
|
|
|
|
|
|
'color-mix(in srgb, var(--color-content-primary) 12%, var(--color-surface-default))',
|
|
|
|
|
|
'ring-center-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'indicator-bg-below': 'var(--color-risk-solid)',
|
|
|
|
|
|
'indicator-bg-optimum': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'indicator-bg-above': 'var(--color-threat-solid)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-normal)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)'
|
|
|
|
|
|
},
|
|
|
|
|
|
'number-field': {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'px-md': 'var(--space-3)',
|
|
|
|
|
|
'px-lg': 'var(--space-3-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'px-xl': 'var(--space-4)',
|
|
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
|
|
|
|
|
'gap-xl': 'var(--space-2-5)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-default)',
|
|
|
|
|
|
'border-focus': 'var(--color-focus-ring)',
|
|
|
|
|
|
'border-invalid': 'var(--color-risk-border)',
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'control-radius': 'var(--radius-md)',
|
|
|
|
|
|
'control-border-width': 'var(--border-width)',
|
|
|
|
|
|
'control-border': 'transparent',
|
|
|
|
|
|
'control-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'control-border-active': 'var(--color-primary-border)',
|
|
|
|
|
|
'control-bg': 'transparent',
|
|
|
|
|
|
'control-bg-hover': 'var(--color-surface-raised)',
|
|
|
|
|
|
'control-bg-active': 'var(--color-primary-track)',
|
|
|
|
|
|
'control-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'control-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'control-color-active': 'var(--color-primary-text)',
|
|
|
|
|
|
'control-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)',
|
|
|
|
|
|
'control-disabled-opacity': '0.48',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
'css-field': {
|
|
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'px-md': 'var(--space-3)',
|
|
|
|
|
|
'px-lg': 'var(--space-3-5)',
|
|
|
|
|
|
'px-xl': 'var(--space-4)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-2-5)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-default)',
|
|
|
|
|
|
'border-focus': 'var(--color-focus-ring)',
|
|
|
|
|
|
'border-invalid': 'var(--color-risk-border)',
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'control-radius': 'var(--radius-md)',
|
|
|
|
|
|
'control-border-width': 'var(--border-width)',
|
|
|
|
|
|
'control-border': 'transparent',
|
|
|
|
|
|
'control-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'control-border-active': 'var(--color-primary-border)',
|
|
|
|
|
|
'control-bg': 'transparent',
|
|
|
|
|
|
'control-bg-hover': 'var(--color-surface-raised)',
|
|
|
|
|
|
'control-bg-active': 'var(--color-primary-track)',
|
|
|
|
|
|
'control-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'control-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'control-color-active': 'var(--color-primary-text)',
|
|
|
|
|
|
'control-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)',
|
|
|
|
|
|
'control-disabled-opacity': '0.48',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
'float-panel': {
|
|
|
|
|
|
bg: 'var(--color-surface-overlay)',
|
|
|
|
|
|
border: 'var(--color-border-default)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
radius: 'var(--radius-lg)',
|
|
|
|
|
|
shadow: 'var(--shadow-4)',
|
|
|
|
|
|
'shadow-topmost': 'var(--shadow-5)',
|
|
|
|
|
|
// Elevation worn WHILE grabbed (drag/resize): the panel LIFTS to the
|
|
|
|
|
|
// theme's highest elevation. Applied on pointerdown so the lift transition
|
|
|
|
|
|
// finishes before the move; the shadow is then static during the drag, so
|
|
|
|
|
|
// the GPU layer just moves (no per-frame shadow repaint). See float-panel.css.
|
|
|
|
|
|
'shadow-active': 'var(--shadow-6)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'header-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'header-px': 'var(--space-3)',
|
|
|
|
|
|
'header-py': 'var(--space-2)',
|
|
|
|
|
|
'header-gap': 'var(--space-2)',
|
|
|
|
|
|
'controls-gap': 'var(--space-1)',
|
|
|
|
|
|
'title-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'title-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'title-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'body-px': 'var(--space-3)',
|
|
|
|
|
|
'body-py': 'var(--space-3)',
|
|
|
|
|
|
'resize-size': 'var(--space-3-5)',
|
|
|
|
|
|
'resize-edge': 'var(--space-1-5)',
|
|
|
|
|
|
// Header icon-button (close / action / stage-trigger) hit target, and the
|
|
|
|
|
|
// se-corner resize grip — sized for comfort, not the tiny resize-handle.
|
|
|
|
|
|
'button-size': 'var(--space-7)',
|
|
|
|
|
|
'grip-size': 'var(--space-5)',
|
|
|
|
|
|
accent: 'var(--color-neutral-border)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)'
|
|
|
|
|
|
},
|
feat(uix): cropper, image-picker, image-adjustments + reusable zoom-pan layer
Three new components across all 4 layers (morfo/soma/sema/eidos) + demos + langs + READMEs:
- ImageAdjustments — reusable image-filter sliders subcomponent.
- ImagePicker — composes file-upload + image + image-adjustments (fill modes, rotation).
- Cropper — Ark image-cropper anatomy: normalized 0-1 crop rect, rect + round shapes,
8 resize handles, fixedSize move-only (avatar), canvas Blob output (5-arg drawImage
for SVG safety), wheel/pan zoom, two-zone gesture (selection moves the area, the
background pans to set focus; img draggable=false guards native DnD per zag).
New reusable soma/layers/zoom-pan: cursor-centered zoom, clamped pan, transform +
viewport-frac-to-content-frac mapping. Image-viewer / diagram-pan / map can reuse it.
sema: add 'zoom' verb to the handle family (direct manipulation, documented extension).
slider: track visible at zero (gray, not white), thumb lifts on drag.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'image-adjustments': {
|
|
|
|
|
|
// Vertical rhythm: gap between adjustment rows, and within a row
|
|
|
|
|
|
// (label/value line → slider).
|
|
|
|
|
|
gap: 'var(--space-3)',
|
|
|
|
|
|
'row-gap': 'var(--space-1-5)',
|
|
|
|
|
|
'label-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'label-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
// Read-out: tabular numerals so the value doesn't jitter while dragging.
|
|
|
|
|
|
'value-color': 'var(--color-content-tertiary)',
|
|
|
|
|
|
'value-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'value-font-family': 'var(--font-mono)',
|
|
|
|
|
|
'reset-gap': 'var(--space-2)',
|
|
|
|
|
|
'reset-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'reset-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
// The `hue` row paints its slider track as a hue wheel so the control
|
|
|
|
|
|
// reads as a hue picker. A literal rainbow (the hues ARE the value) — kept
|
|
|
|
|
|
// as a token so it's themeable and stays out of the component CSS.
|
|
|
|
|
|
'hue-track':
|
|
|
|
|
|
'linear-gradient(to right, hsl(0 85% 60%), hsl(60 85% 60%), hsl(120 85% 60%), hsl(180 85% 60%), hsl(240 85% 60%), hsl(300 85% 60%), hsl(360 85% 60%))'
|
|
|
|
|
|
},
|
|
|
|
|
|
'image-picker': {
|
|
|
|
|
|
// Vertical stack: preview → adjustments.
|
|
|
|
|
|
gap: 'var(--space-3)',
|
|
|
|
|
|
// Preview box (ready state). The composed <Image> fills it.
|
|
|
|
|
|
'preview-radius': 'var(--radius-lg)',
|
|
|
|
|
|
'preview-bg': 'var(--color-surface-muted)',
|
|
|
|
|
|
'preview-border': 'var(--color-border-default)',
|
|
|
|
|
|
'preview-aspect': '4 / 3',
|
|
|
|
|
|
// Toolbar floats over the preview's top-right corner.
|
|
|
|
|
|
'toolbar-gap': 'var(--space-1-5)',
|
|
|
|
|
|
'toolbar-inset': 'var(--space-2)',
|
|
|
|
|
|
// Icon buttons (rotate / remove).
|
|
|
|
|
|
'button-size': 'var(--space-8)',
|
|
|
|
|
|
'button-bg': 'color-mix(in srgb, var(--color-surface-default) 88%, transparent)',
|
|
|
|
|
|
'button-fg': 'var(--color-content-primary)',
|
|
|
|
|
|
'button-border': 'var(--color-border-default)',
|
|
|
|
|
|
'button-radius': 'var(--radius-md)',
|
|
|
|
|
|
'button-font-size': 'var(--font-size-md)'
|
|
|
|
|
|
},
|
|
|
|
|
|
cropper: {
|
|
|
|
|
|
'viewport-bg': 'var(--color-surface-muted)',
|
|
|
|
|
|
'viewport-radius': 'var(--radius-lg)',
|
|
|
|
|
|
// The darken-outside mask + the thirds grid carry literal rgba/rgb (an
|
|
|
|
|
|
// overlay tint, not a theme color) — kept as tokens so they stay out of
|
|
|
|
|
|
// the component CSS (raw-color contract) and remain themeable.
|
|
|
|
|
|
'mask-bg': 'rgb(0 0 0 / 0.55)',
|
|
|
|
|
|
'grid-line': 'rgb(255 255 255 / 0.4)',
|
|
|
|
|
|
'selection-border': 'var(--color-surface-default)',
|
|
|
|
|
|
'selection-border-width': 'var(--border-width)',
|
|
|
|
|
|
'handle-size': 'var(--space-3-5)',
|
|
|
|
|
|
'handle-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'handle-border': 'var(--color-primary-solid)',
|
|
|
|
|
|
'handle-border-width': 'var(--border-width)',
|
|
|
|
|
|
'zoom-gap': 'var(--space-2)',
|
|
|
|
|
|
'zoom-btn-size': 'var(--space-7)',
|
|
|
|
|
|
'zoom-btn-bg': 'var(--color-surface-muted)',
|
|
|
|
|
|
'zoom-btn-fg': 'var(--color-content-primary)',
|
|
|
|
|
|
'zoom-btn-border': 'var(--color-border-default)'
|
|
|
|
|
|
},
|
|
|
|
|
|
'date-field': {
|
|
|
|
|
|
'stack-gap': 'var(--space-1-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'px-md': 'var(--space-3)',
|
|
|
|
|
|
'px-lg': 'var(--space-3-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'px-xl': 'var(--space-4)',
|
|
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-1)',
|
|
|
|
|
|
'gap-lg': 'var(--space-1-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-2)',
|
|
|
|
|
|
'segment-px-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'segment-px-sm': 'var(--space-0-5)',
|
|
|
|
|
|
'segment-px-md': 'var(--space-1)',
|
|
|
|
|
|
'segment-px-lg': 'var(--space-1-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'segment-px-xl': 'var(--space-2)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-default)',
|
|
|
|
|
|
'border-invalid': 'var(--color-risk-border)',
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'label-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'literal-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'segment-min-width': '1.5ch',
|
|
|
|
|
|
'segment-height': 'calc(var(--_date-field-height) - var(--space-2))',
|
|
|
|
|
|
'segment-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'segment-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'segment-invalid-color': 'var(--color-risk-text)',
|
|
|
|
|
|
'segment-readonly-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'segment-readonly-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'segment-readonly-decoration': 'underline dotted var(--color-content-muted)',
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'segment-hover-bg': 'color-mix(in srgb, var(--color-content-primary) 6%, transparent)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
'time-field': {
|
|
|
|
|
|
'stack-gap': 'var(--space-1-5)',
|
|
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'px-md': 'var(--space-3)',
|
|
|
|
|
|
'px-lg': 'var(--space-3-5)',
|
|
|
|
|
|
'px-xl': 'var(--space-4)',
|
|
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-1)',
|
|
|
|
|
|
'gap-lg': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-xl': 'var(--space-2)',
|
|
|
|
|
|
'segment-px-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'segment-px-sm': 'var(--space-0-5)',
|
|
|
|
|
|
'segment-px-md': 'var(--space-1)',
|
|
|
|
|
|
'segment-px-lg': 'var(--space-1-5)',
|
|
|
|
|
|
'segment-px-xl': 'var(--space-2)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-default)',
|
|
|
|
|
|
'border-invalid': 'var(--color-risk-border)',
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'label-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'literal-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'segment-min-width': '1.5ch',
|
|
|
|
|
|
'segment-height': 'calc(var(--_time-field-height) - var(--space-2))',
|
|
|
|
|
|
'segment-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'segment-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'segment-invalid-color': 'var(--color-risk-text)',
|
|
|
|
|
|
'segment-readonly-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'segment-readonly-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'segment-readonly-decoration': 'underline dotted var(--color-content-muted)',
|
|
|
|
|
|
'segment-focus-shadow': 'inset 0 0 0 var(--border-width) var(--_time-field-accent-border)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
'color-field': {
|
|
|
|
|
|
'stack-gap': 'var(--space-1-5)',
|
|
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'px-md': 'var(--space-3)',
|
|
|
|
|
|
'px-lg': 'var(--space-3-5)',
|
|
|
|
|
|
'px-xl': 'var(--space-4)',
|
|
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-1)',
|
|
|
|
|
|
'gap-lg': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-xl': 'var(--space-2)',
|
|
|
|
|
|
'segment-px-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'segment-px-sm': 'var(--space-0-5)',
|
|
|
|
|
|
'segment-px-md': 'var(--space-1)',
|
|
|
|
|
|
'segment-px-lg': 'var(--space-1-5)',
|
|
|
|
|
|
'segment-px-xl': 'var(--space-2)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-default)',
|
|
|
|
|
|
'border-invalid': 'var(--color-risk-border)',
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'label-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'literal-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'segment-min-width': '1.5ch',
|
|
|
|
|
|
'segment-height': 'calc(var(--_color-field-height) - var(--space-2))',
|
|
|
|
|
|
'segment-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'segment-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'segment-invalid-color': 'var(--color-risk-text)',
|
|
|
|
|
|
'segment-readonly-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'segment-readonly-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'segment-readonly-decoration': 'underline dotted var(--color-content-muted)',
|
|
|
|
|
|
'segment-focus-shadow': 'inset 0 0 0 var(--border-width) var(--_color-field-accent-border)',
|
|
|
|
|
|
'swatch-size-xs': 'calc(var(--control-height-xs) - var(--space-2))',
|
|
|
|
|
|
'swatch-size-sm': 'calc(var(--control-height-sm) - var(--space-2))',
|
|
|
|
|
|
'swatch-size-md': 'calc(var(--control-height-md) - var(--space-2))',
|
|
|
|
|
|
'swatch-size-lg': 'calc(var(--control-height-lg) - var(--space-2))',
|
|
|
|
|
|
'swatch-size-xl': 'calc(var(--control-height-xl) - var(--space-2))',
|
|
|
|
|
|
'format-select-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'format-select-bg': 'transparent',
|
|
|
|
|
|
'format-select-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'format-select-px': 'var(--space-1)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
'color-picker': {
|
|
|
|
|
|
// Popover content shell
|
|
|
|
|
|
'content-gap': 'var(--space-3)',
|
|
|
|
|
|
'content-padding-sm': 'var(--space-3)',
|
|
|
|
|
|
'content-padding-md': 'var(--space-3-5)',
|
|
|
|
|
|
'content-padding-lg': 'var(--space-4)',
|
refactor(color-picker): channel slider composes generic SliderProvider + N-8 norm
Drops ColorPickerChannelSliderProvider / TrackProvider / ThumbProvider
(~200 lines of duplicated pointer/keyboard/ARIA handling) and rewrites
`components/color-picker-channel-slider.svelte` to compose
SliderProvider underneath. The channel slider now keeps only the
channel-aware bridge: setChannel writes the value, channelGradient
paints the track.
What the picker gains by reusing Slider
---------------------------------------
- sema events: `slider:handle-pick`, `slider:handle-drag`,
`slider:commit-set` now flow through the channel sliders (they were
silent before — the Sema layer had no perceptual hook on channel
drag/commit).
- single pointer/keyboard implementation: Arrow/Home/End/PageUp/PageDown,
multi-touch, focus trap, RTL, step-snap — all from SliderProvider.
- ARIA: role=slider, aria-valuenow/min/max, aria-orientation, tabindex
managed by the slider's thumb provider.
- recipe tokens: channel sliders consume `--slider-*` (sizes, radii,
shadows) so they stay in lockstep with the standalone Slider and
with TimePicker.HourSlider / .MinuteSlider / .SecondSlider. The
`--color-picker-channel-slider-*` tokens are removed.
Public API impact
-----------------
- `<ColorPicker.ChannelSliderTrack>` and `<ColorPicker.ChannelSliderThumb>`
remain as part names but now re-export `Slider.Range` /
`Slider.Thumb`. Consumers that compose them inline keep working.
- The inner DOM changes: `[data-slider]` / `[data-slider-thumb]` /
`[data-slider-range]` (governed by the slider morfo) replace
`[data-color-picker-channel-slider-track]` /
`[data-color-picker-channel-slider-thumb]`. The wrapper still emits
`[data-color-picker-channel-slider][data-channel]` so per-channel
CSS targeting works; the gradient is exposed via
`--cp-channel-gradient` and routed onto the slider's track ::before.
- Morfo: drops `channel-slider-track` and `channel-slider-thumb` parts
(the slider morfo owns those contracts now). `channel-slider`
remains as the wrapper marker with `data-channel`.
- Eidos: deletes `color-picker-channel-slider-track.svelte` and
`color-picker-channel-slider-thumb.svelte`; `index.ts` re-points
`ChannelSliderTrack` / `ChannelSliderThumb` at the slider eidos
components.
New norm N-8 added to PENDIENTES.md
-----------------------------------
"Reutilizar componentes ya definidos en componentes complejos siempre
que no supongan una pérdida de características demostrable." Documented
with this refactor as the worked example.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'content-width-sm': '17rem',
|
|
|
|
|
|
'content-width-md': '19.5rem',
|
|
|
|
|
|
'content-width-lg': '22rem',
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
|
|
|
|
|
|
// Trigger button (compact field-shaped pill with a swatch dot)
|
|
|
|
|
|
'trigger-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'trigger-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'trigger-height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'trigger-px-sm': 'var(--space-2)',
|
|
|
|
|
|
'trigger-px-md': 'var(--space-2-5)',
|
|
|
|
|
|
'trigger-px-lg': 'var(--space-3)',
|
|
|
|
|
|
'trigger-gap': 'var(--space-2)',
|
|
|
|
|
|
'trigger-radius': 'var(--radius-md)',
|
|
|
|
|
|
'trigger-border-width': 'var(--border-width)',
|
|
|
|
|
|
'trigger-border': 'var(--color-border-default)',
|
|
|
|
|
|
'trigger-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'trigger-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-hover-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'trigger-hover-border': 'var(--color-border-strong)',
|
refactor(color-picker): channel slider composes generic SliderProvider + N-8 norm
Drops ColorPickerChannelSliderProvider / TrackProvider / ThumbProvider
(~200 lines of duplicated pointer/keyboard/ARIA handling) and rewrites
`components/color-picker-channel-slider.svelte` to compose
SliderProvider underneath. The channel slider now keeps only the
channel-aware bridge: setChannel writes the value, channelGradient
paints the track.
What the picker gains by reusing Slider
---------------------------------------
- sema events: `slider:handle-pick`, `slider:handle-drag`,
`slider:commit-set` now flow through the channel sliders (they were
silent before — the Sema layer had no perceptual hook on channel
drag/commit).
- single pointer/keyboard implementation: Arrow/Home/End/PageUp/PageDown,
multi-touch, focus trap, RTL, step-snap — all from SliderProvider.
- ARIA: role=slider, aria-valuenow/min/max, aria-orientation, tabindex
managed by the slider's thumb provider.
- recipe tokens: channel sliders consume `--slider-*` (sizes, radii,
shadows) so they stay in lockstep with the standalone Slider and
with TimePicker.HourSlider / .MinuteSlider / .SecondSlider. The
`--color-picker-channel-slider-*` tokens are removed.
Public API impact
-----------------
- `<ColorPicker.ChannelSliderTrack>` and `<ColorPicker.ChannelSliderThumb>`
remain as part names but now re-export `Slider.Range` /
`Slider.Thumb`. Consumers that compose them inline keep working.
- The inner DOM changes: `[data-slider]` / `[data-slider-thumb]` /
`[data-slider-range]` (governed by the slider morfo) replace
`[data-color-picker-channel-slider-track]` /
`[data-color-picker-channel-slider-thumb]`. The wrapper still emits
`[data-color-picker-channel-slider][data-channel]` so per-channel
CSS targeting works; the gradient is exposed via
`--cp-channel-gradient` and routed onto the slider's track ::before.
- Morfo: drops `channel-slider-track` and `channel-slider-thumb` parts
(the slider morfo owns those contracts now). `channel-slider`
remains as the wrapper marker with `data-channel`.
- Eidos: deletes `color-picker-channel-slider-track.svelte` and
`color-picker-channel-slider-thumb.svelte`; `index.ts` re-points
`ChannelSliderTrack` / `ChannelSliderThumb` at the slider eidos
components.
New norm N-8 added to PENDIENTES.md
-----------------------------------
"Reutilizar componentes ya definidos en componentes complejos siempre
que no supongan una pérdida de características demostrable." Documented
with this refactor as the worked example.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'trigger-swatch-size-sm': 'calc(var(--control-height-sm) - var(--space-2))',
|
|
|
|
|
|
'trigger-swatch-size-md': 'calc(var(--control-height-md) - var(--space-2))',
|
|
|
|
|
|
'trigger-swatch-size-lg': 'calc(var(--control-height-lg) - var(--space-2))',
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'trigger-swatch-radius': 'var(--radius-full)',
|
|
|
|
|
|
'trigger-swatch-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'trigger-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)',
|
|
|
|
|
|
|
|
|
|
|
|
// 2D area
|
refactor(color-picker): channel slider composes generic SliderProvider + N-8 norm
Drops ColorPickerChannelSliderProvider / TrackProvider / ThumbProvider
(~200 lines of duplicated pointer/keyboard/ARIA handling) and rewrites
`components/color-picker-channel-slider.svelte` to compose
SliderProvider underneath. The channel slider now keeps only the
channel-aware bridge: setChannel writes the value, channelGradient
paints the track.
What the picker gains by reusing Slider
---------------------------------------
- sema events: `slider:handle-pick`, `slider:handle-drag`,
`slider:commit-set` now flow through the channel sliders (they were
silent before — the Sema layer had no perceptual hook on channel
drag/commit).
- single pointer/keyboard implementation: Arrow/Home/End/PageUp/PageDown,
multi-touch, focus trap, RTL, step-snap — all from SliderProvider.
- ARIA: role=slider, aria-valuenow/min/max, aria-orientation, tabindex
managed by the slider's thumb provider.
- recipe tokens: channel sliders consume `--slider-*` (sizes, radii,
shadows) so they stay in lockstep with the standalone Slider and
with TimePicker.HourSlider / .MinuteSlider / .SecondSlider. The
`--color-picker-channel-slider-*` tokens are removed.
Public API impact
-----------------
- `<ColorPicker.ChannelSliderTrack>` and `<ColorPicker.ChannelSliderThumb>`
remain as part names but now re-export `Slider.Range` /
`Slider.Thumb`. Consumers that compose them inline keep working.
- The inner DOM changes: `[data-slider]` / `[data-slider-thumb]` /
`[data-slider-range]` (governed by the slider morfo) replace
`[data-color-picker-channel-slider-track]` /
`[data-color-picker-channel-slider-thumb]`. The wrapper still emits
`[data-color-picker-channel-slider][data-channel]` so per-channel
CSS targeting works; the gradient is exposed via
`--cp-channel-gradient` and routed onto the slider's track ::before.
- Morfo: drops `channel-slider-track` and `channel-slider-thumb` parts
(the slider morfo owns those contracts now). `channel-slider`
remains as the wrapper marker with `data-channel`.
- Eidos: deletes `color-picker-channel-slider-track.svelte` and
`color-picker-channel-slider-thumb.svelte`; `index.ts` re-points
`ChannelSliderTrack` / `ChannelSliderThumb` at the slider eidos
components.
New norm N-8 added to PENDIENTES.md
-----------------------------------
"Reutilizar componentes ya definidos en componentes complejos siempre
que no supongan una pérdida de características demostrable." Documented
with this refactor as the worked example.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'area-height': '11rem',
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'area-radius': 'var(--radius-md)',
|
|
|
|
|
|
'area-border-width': 'var(--border-width)',
|
|
|
|
|
|
'area-border': 'var(--color-border-subtle)',
|
refactor(color-picker): channel slider composes generic SliderProvider + N-8 norm
Drops ColorPickerChannelSliderProvider / TrackProvider / ThumbProvider
(~200 lines of duplicated pointer/keyboard/ARIA handling) and rewrites
`components/color-picker-channel-slider.svelte` to compose
SliderProvider underneath. The channel slider now keeps only the
channel-aware bridge: setChannel writes the value, channelGradient
paints the track.
What the picker gains by reusing Slider
---------------------------------------
- sema events: `slider:handle-pick`, `slider:handle-drag`,
`slider:commit-set` now flow through the channel sliders (they were
silent before — the Sema layer had no perceptual hook on channel
drag/commit).
- single pointer/keyboard implementation: Arrow/Home/End/PageUp/PageDown,
multi-touch, focus trap, RTL, step-snap — all from SliderProvider.
- ARIA: role=slider, aria-valuenow/min/max, aria-orientation, tabindex
managed by the slider's thumb provider.
- recipe tokens: channel sliders consume `--slider-*` (sizes, radii,
shadows) so they stay in lockstep with the standalone Slider and
with TimePicker.HourSlider / .MinuteSlider / .SecondSlider. The
`--color-picker-channel-slider-*` tokens are removed.
Public API impact
-----------------
- `<ColorPicker.ChannelSliderTrack>` and `<ColorPicker.ChannelSliderThumb>`
remain as part names but now re-export `Slider.Range` /
`Slider.Thumb`. Consumers that compose them inline keep working.
- The inner DOM changes: `[data-slider]` / `[data-slider-thumb]` /
`[data-slider-range]` (governed by the slider morfo) replace
`[data-color-picker-channel-slider-track]` /
`[data-color-picker-channel-slider-thumb]`. The wrapper still emits
`[data-color-picker-channel-slider][data-channel]` so per-channel
CSS targeting works; the gradient is exposed via
`--cp-channel-gradient` and routed onto the slider's track ::before.
- Morfo: drops `channel-slider-track` and `channel-slider-thumb` parts
(the slider morfo owns those contracts now). `channel-slider`
remains as the wrapper marker with `data-channel`.
- Eidos: deletes `color-picker-channel-slider-track.svelte` and
`color-picker-channel-slider-thumb.svelte`; `index.ts` re-points
`ChannelSliderTrack` / `ChannelSliderThumb` at the slider eidos
components.
New norm N-8 added to PENDIENTES.md
-----------------------------------
"Reutilizar componentes ya definidos en componentes complejos siempre
que no supongan una pérdida de características demostrable." Documented
with this refactor as the worked example.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'area-thumb-size': '16px',
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'area-thumb-radius': 'var(--radius-full)',
|
|
|
|
|
|
'area-thumb-border-width': '2px',
|
|
|
|
|
|
'area-thumb-border': 'var(--color-surface-default)',
|
|
|
|
|
|
'area-thumb-shadow':
|
refactor(color-picker): channel slider composes generic SliderProvider + N-8 norm
Drops ColorPickerChannelSliderProvider / TrackProvider / ThumbProvider
(~200 lines of duplicated pointer/keyboard/ARIA handling) and rewrites
`components/color-picker-channel-slider.svelte` to compose
SliderProvider underneath. The channel slider now keeps only the
channel-aware bridge: setChannel writes the value, channelGradient
paints the track.
What the picker gains by reusing Slider
---------------------------------------
- sema events: `slider:handle-pick`, `slider:handle-drag`,
`slider:commit-set` now flow through the channel sliders (they were
silent before — the Sema layer had no perceptual hook on channel
drag/commit).
- single pointer/keyboard implementation: Arrow/Home/End/PageUp/PageDown,
multi-touch, focus trap, RTL, step-snap — all from SliderProvider.
- ARIA: role=slider, aria-valuenow/min/max, aria-orientation, tabindex
managed by the slider's thumb provider.
- recipe tokens: channel sliders consume `--slider-*` (sizes, radii,
shadows) so they stay in lockstep with the standalone Slider and
with TimePicker.HourSlider / .MinuteSlider / .SecondSlider. The
`--color-picker-channel-slider-*` tokens are removed.
Public API impact
-----------------
- `<ColorPicker.ChannelSliderTrack>` and `<ColorPicker.ChannelSliderThumb>`
remain as part names but now re-export `Slider.Range` /
`Slider.Thumb`. Consumers that compose them inline keep working.
- The inner DOM changes: `[data-slider]` / `[data-slider-thumb]` /
`[data-slider-range]` (governed by the slider morfo) replace
`[data-color-picker-channel-slider-track]` /
`[data-color-picker-channel-slider-thumb]`. The wrapper still emits
`[data-color-picker-channel-slider][data-channel]` so per-channel
CSS targeting works; the gradient is exposed via
`--cp-channel-gradient` and routed onto the slider's track ::before.
- Morfo: drops `channel-slider-track` and `channel-slider-thumb` parts
(the slider morfo owns those contracts now). `channel-slider`
remains as the wrapper marker with `data-channel`.
- Eidos: deletes `color-picker-channel-slider-track.svelte` and
`color-picker-channel-slider-thumb.svelte`; `index.ts` re-points
`ChannelSliderTrack` / `ChannelSliderThumb` at the slider eidos
components.
New norm N-8 added to PENDIENTES.md
-----------------------------------
"Reutilizar componentes ya definidos en componentes complejos siempre
que no supongan una pérdida de características demostrable." Documented
with this refactor as the worked example.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'0 0 0 1px color-mix(in srgb, var(--color-neutral-contrast) 45%, transparent), 0 1px 2px color-mix(in srgb, var(--color-neutral-contrast) 20%, transparent)',
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
|
refactor(color-picker): channel slider composes generic SliderProvider + N-8 norm
Drops ColorPickerChannelSliderProvider / TrackProvider / ThumbProvider
(~200 lines of duplicated pointer/keyboard/ARIA handling) and rewrites
`components/color-picker-channel-slider.svelte` to compose
SliderProvider underneath. The channel slider now keeps only the
channel-aware bridge: setChannel writes the value, channelGradient
paints the track.
What the picker gains by reusing Slider
---------------------------------------
- sema events: `slider:handle-pick`, `slider:handle-drag`,
`slider:commit-set` now flow through the channel sliders (they were
silent before — the Sema layer had no perceptual hook on channel
drag/commit).
- single pointer/keyboard implementation: Arrow/Home/End/PageUp/PageDown,
multi-touch, focus trap, RTL, step-snap — all from SliderProvider.
- ARIA: role=slider, aria-valuenow/min/max, aria-orientation, tabindex
managed by the slider's thumb provider.
- recipe tokens: channel sliders consume `--slider-*` (sizes, radii,
shadows) so they stay in lockstep with the standalone Slider and
with TimePicker.HourSlider / .MinuteSlider / .SecondSlider. The
`--color-picker-channel-slider-*` tokens are removed.
Public API impact
-----------------
- `<ColorPicker.ChannelSliderTrack>` and `<ColorPicker.ChannelSliderThumb>`
remain as part names but now re-export `Slider.Range` /
`Slider.Thumb`. Consumers that compose them inline keep working.
- The inner DOM changes: `[data-slider]` / `[data-slider-thumb]` /
`[data-slider-range]` (governed by the slider morfo) replace
`[data-color-picker-channel-slider-track]` /
`[data-color-picker-channel-slider-thumb]`. The wrapper still emits
`[data-color-picker-channel-slider][data-channel]` so per-channel
CSS targeting works; the gradient is exposed via
`--cp-channel-gradient` and routed onto the slider's track ::before.
- Morfo: drops `channel-slider-track` and `channel-slider-thumb` parts
(the slider morfo owns those contracts now). `channel-slider`
remains as the wrapper marker with `data-channel`.
- Eidos: deletes `color-picker-channel-slider-track.svelte` and
`color-picker-channel-slider-thumb.svelte`; `index.ts` re-points
`ChannelSliderTrack` / `ChannelSliderThumb` at the slider eidos
components.
New norm N-8 added to PENDIENTES.md
-----------------------------------
"Reutilizar componentes ya definidos en componentes complejos siempre
que no supongan una pérdida de características demostrable." Documented
with this refactor as the worked example.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
// Channel sliders consume the generic `--slider-*` recipe tokens.
|
|
|
|
|
|
// Only the picker-specific decoration (gradient on track) lives
|
|
|
|
|
|
// in the picker CSS; sizes, shadows and radii come from the
|
|
|
|
|
|
// slider recipe so they stay in lockstep with the standalone
|
|
|
|
|
|
// Slider and the time-picker sliders.
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
|
|
|
|
|
|
// Transparency checker (alpha background)
|
|
|
|
|
|
'transparency-cell': 'var(--color-content-muted)',
|
|
|
|
|
|
'transparency-cell-alt': 'var(--color-surface-default)',
|
|
|
|
|
|
|
|
|
|
|
|
// Swatches
|
refactor(color-picker): channel slider composes generic SliderProvider + N-8 norm
Drops ColorPickerChannelSliderProvider / TrackProvider / ThumbProvider
(~200 lines of duplicated pointer/keyboard/ARIA handling) and rewrites
`components/color-picker-channel-slider.svelte` to compose
SliderProvider underneath. The channel slider now keeps only the
channel-aware bridge: setChannel writes the value, channelGradient
paints the track.
What the picker gains by reusing Slider
---------------------------------------
- sema events: `slider:handle-pick`, `slider:handle-drag`,
`slider:commit-set` now flow through the channel sliders (they were
silent before — the Sema layer had no perceptual hook on channel
drag/commit).
- single pointer/keyboard implementation: Arrow/Home/End/PageUp/PageDown,
multi-touch, focus trap, RTL, step-snap — all from SliderProvider.
- ARIA: role=slider, aria-valuenow/min/max, aria-orientation, tabindex
managed by the slider's thumb provider.
- recipe tokens: channel sliders consume `--slider-*` (sizes, radii,
shadows) so they stay in lockstep with the standalone Slider and
with TimePicker.HourSlider / .MinuteSlider / .SecondSlider. The
`--color-picker-channel-slider-*` tokens are removed.
Public API impact
-----------------
- `<ColorPicker.ChannelSliderTrack>` and `<ColorPicker.ChannelSliderThumb>`
remain as part names but now re-export `Slider.Range` /
`Slider.Thumb`. Consumers that compose them inline keep working.
- The inner DOM changes: `[data-slider]` / `[data-slider-thumb]` /
`[data-slider-range]` (governed by the slider morfo) replace
`[data-color-picker-channel-slider-track]` /
`[data-color-picker-channel-slider-thumb]`. The wrapper still emits
`[data-color-picker-channel-slider][data-channel]` so per-channel
CSS targeting works; the gradient is exposed via
`--cp-channel-gradient` and routed onto the slider's track ::before.
- Morfo: drops `channel-slider-track` and `channel-slider-thumb` parts
(the slider morfo owns those contracts now). `channel-slider`
remains as the wrapper marker with `data-channel`.
- Eidos: deletes `color-picker-channel-slider-track.svelte` and
`color-picker-channel-slider-thumb.svelte`; `index.ts` re-points
`ChannelSliderTrack` / `ChannelSliderThumb` at the slider eidos
components.
New norm N-8 added to PENDIENTES.md
-----------------------------------
"Reutilizar componentes ya definidos en componentes complejos siempre
que no supongan una pérdida de características demostrable." Documented
with this refactor as the worked example.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'swatch-size-sm': '1.25rem',
|
|
|
|
|
|
'swatch-size-md': '1.5rem',
|
|
|
|
|
|
'swatch-size-lg': '1.75rem',
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'swatch-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'swatch-border': 'var(--color-border-subtle)',
|
refactor(color-picker): channel slider composes generic SliderProvider + N-8 norm
Drops ColorPickerChannelSliderProvider / TrackProvider / ThumbProvider
(~200 lines of duplicated pointer/keyboard/ARIA handling) and rewrites
`components/color-picker-channel-slider.svelte` to compose
SliderProvider underneath. The channel slider now keeps only the
channel-aware bridge: setChannel writes the value, channelGradient
paints the track.
What the picker gains by reusing Slider
---------------------------------------
- sema events: `slider:handle-pick`, `slider:handle-drag`,
`slider:commit-set` now flow through the channel sliders (they were
silent before — the Sema layer had no perceptual hook on channel
drag/commit).
- single pointer/keyboard implementation: Arrow/Home/End/PageUp/PageDown,
multi-touch, focus trap, RTL, step-snap — all from SliderProvider.
- ARIA: role=slider, aria-valuenow/min/max, aria-orientation, tabindex
managed by the slider's thumb provider.
- recipe tokens: channel sliders consume `--slider-*` (sizes, radii,
shadows) so they stay in lockstep with the standalone Slider and
with TimePicker.HourSlider / .MinuteSlider / .SecondSlider. The
`--color-picker-channel-slider-*` tokens are removed.
Public API impact
-----------------
- `<ColorPicker.ChannelSliderTrack>` and `<ColorPicker.ChannelSliderThumb>`
remain as part names but now re-export `Slider.Range` /
`Slider.Thumb`. Consumers that compose them inline keep working.
- The inner DOM changes: `[data-slider]` / `[data-slider-thumb]` /
`[data-slider-range]` (governed by the slider morfo) replace
`[data-color-picker-channel-slider-track]` /
`[data-color-picker-channel-slider-thumb]`. The wrapper still emits
`[data-color-picker-channel-slider][data-channel]` so per-channel
CSS targeting works; the gradient is exposed via
`--cp-channel-gradient` and routed onto the slider's track ::before.
- Morfo: drops `channel-slider-track` and `channel-slider-thumb` parts
(the slider morfo owns those contracts now). `channel-slider`
remains as the wrapper marker with `data-channel`.
- Eidos: deletes `color-picker-channel-slider-track.svelte` and
`color-picker-channel-slider-thumb.svelte`; `index.ts` re-points
`ChannelSliderTrack` / `ChannelSliderThumb` at the slider eidos
components.
New norm N-8 added to PENDIENTES.md
-----------------------------------
"Reutilizar componentes ya definidos en componentes complejos siempre
que no supongan una pérdida de características demostrable." Documented
with this refactor as the worked example.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'swatch-checked-ring': 'var(--color-primary-solid)',
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'swatch-gap': 'var(--space-1-5)',
|
|
|
|
|
|
|
|
|
|
|
|
// Eye-dropper button
|
|
|
|
|
|
'eye-dropper-size': 'var(--control-height-sm)',
|
|
|
|
|
|
'eye-dropper-radius': 'var(--radius-md)',
|
|
|
|
|
|
'eye-dropper-bg': 'transparent',
|
|
|
|
|
|
'eye-dropper-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'eye-dropper-hover-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'eye-dropper-hover-color': 'var(--color-content-primary)',
|
|
|
|
|
|
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
// Hue spectrum — drives the hue ring + saturation overlay. These
|
|
|
|
|
|
// sit in a sidecar file (color-picker-spectrum.css) so the raw
|
|
|
|
|
|
// hsl literals stay out of the main recipe; declaring them here
|
|
|
|
|
|
// keeps the recipe contract whole.
|
|
|
|
|
|
'hue-0': 'hsl(0, 100%, 50%)',
|
|
|
|
|
|
'hue-60': 'hsl(60, 100%, 50%)',
|
|
|
|
|
|
'hue-120': 'hsl(120, 100%, 50%)',
|
|
|
|
|
|
'hue-180': 'hsl(180, 100%, 50%)',
|
|
|
|
|
|
'hue-240': 'hsl(240, 100%, 50%)',
|
|
|
|
|
|
'hue-300': 'hsl(300, 100%, 50%)',
|
|
|
|
|
|
'hue-360': 'hsl(360, 100%, 50%)',
|
|
|
|
|
|
'saturation-floor': 'hsl(0, 0%, 50%)',
|
|
|
|
|
|
|
feat(eidos): add ColorPicker wrapper + demo
Composite popover: 2D saturation/brightness area, hue + alpha channel
sliders, preset swatches, eye-dropper, and a segmented channel input
composed from ColorField. Builds on the existing soma color-picker
(23 parts) — eidos layer is mostly thin pass-throughs adding visual
chrome.
What landed
-----------
- New `src/uix/eidos/components/color-picker/`:
- Root visual (Provider) + visual-context (size/variant/color)
- Trigger with a default swatch dot tinted from
`--cp-trigger-color` (the air pattern from morfo-runtime)
- Content (popover wrapper), Area (+ Background + Thumb),
TransparencyGrid
- ChannelSlider (+ Track + Thumb) — generic per-channel slider;
default-composes Track+Thumb when no children
- SwatchGroup + SwatchTrigger + Swatch + SwatchIndicator
- EyeDropper (Pipette icon by default)
- ChannelInput + ChannelSegment + FormatSelect (composed from
ColorField parts; same provider injected automatically)
- Label, Control, ValueSwatch, ValueText, HiddenInput
- Recipe section `color-picker` in `recipes/base.ts` (regenerated
`generated/base.css`) — trigger, content, area, channel slider,
swatches, eye-dropper tokens.
- CSS reuses color-field tokens for the segmented input portion and
adds picker-specific visuals. Transparency checker on trigger swatch
+ value swatch + alpha slider track via conic-gradient pattern.
- Morfo updates: scope `['soma','sema']`, `apg: dialog-modal`, added
`commit-set` event so audit classifies it as interactive.
- Soma exports: ColorPickerProvider class so eidos Trigger can read
the current value for the swatch tint.
- Demo at `/uix/components/color-picker` with the standard 6 tabs;
live stage exercises area drag + channel sliders + preset swatches
+ eye-dropper + format switch.
- README documents the surface, comparativa vs air/Ark/Chakra, and
flags the picker contract (mode/Footer/commit/cancel) as gap to
align with date/time-picker in a follow-up.
Checks
------
- 67/67 component-audit PASS
- 40/40 morfo:check PASS (new color-picker demo validates against
morfo DOM)
- svelte-check 0 errors / 0 warnings
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
// Misc
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
feat(eidos): Button + 9 demo rebuilds + picker recipe polish
Build:
- New <Button> compound (morfo + soma + sema + eidos): 6 variants
(solid/soft/surface/outline/ghost/plain), 8 colors, 5 sizes, optional
icon/endIcon snippets, loading state with built-in Spinner, asChild
Slot pattern, intent-driven sema (commit-action with fromProp:intent).
Demo rebuilds (canonical depth per DEMO_AUTHORING_GUIDE):
- context-menu, dropdown-menu, pin-input, alert-dialog, toggle-group:
full per-part Morfo contracts, reference-parity tables, ARIA contract
tables, keyboard tables, composition controls.
- color-field, time-field, time-picker, time-range-picker, color-picker,
month-grid, year-grid: same canonical treatment; per-part data/aria/
keyboard iteration of raw morfo, reference parity vs react-aria/
ark-ui/Chakra/bits-ui/Mantine.
Picker recipe polish:
- PickerShell.Clear/Cancel/Close refactored to use <Button size="xs">
(affects 5 pickers — date / date-range / time / time-range / color).
- TimePicker + TimeRangePicker: popover condensed (min-width 18rem -> 14
/ 32 -> 28), per-channel accent (hour=primary, minute=secondary,
second=neutral; end variant muted), ruler off by default, hour ruler
cleaned to 0/6/12/18/23.
- ColorPicker: typography token --_color-picker-trigger-font-size that
scales with data-size (10/12/14px); autoFormat default true; Area
recipe override for [data-x-channel='hue'] with rainbow gradient +
saturation/brightness Y overlays.
- ValueText eidos wrapper: fix children snippet bug that suppressed
soma's displayValue fallback.
- date-field.css: segment editing affordance (cursor + hover + active
ring) via new --_date-field-accent-element token across 8 color
cascades.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
button: {
|
|
|
|
|
|
// Size tokens
|
|
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-3)',
|
|
|
|
|
|
'px-md': 'var(--space-4)',
|
|
|
|
|
|
'px-lg': 'var(--space-5)',
|
|
|
|
|
|
'px-xl': 'var(--space-6)',
|
|
|
|
|
|
'gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-2)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2-5)',
|
|
|
|
|
|
'gap-xl': 'var(--space-3)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'letter-spacing': 'var(--tracking-normal)',
|
|
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-md)',
|
|
|
|
|
|
'font-size-xl': 'var(--font-size-lg)',
|
|
|
|
|
|
'font-weight-xs': 'var(--font-weight-medium)',
|
|
|
|
|
|
'font-weight-sm': 'var(--font-weight-medium)',
|
|
|
|
|
|
'font-weight-md': 'var(--font-weight-medium)',
|
|
|
|
|
|
'font-weight-lg': 'var(--font-weight-medium)',
|
|
|
|
|
|
'font-weight-xl': 'var(--font-weight-medium)',
|
|
|
|
|
|
'icon-size-xs': '14px',
|
|
|
|
|
|
'icon-size-sm': '14px',
|
|
|
|
|
|
'icon-size-md': '16px',
|
|
|
|
|
|
'icon-size-lg': '18px',
|
|
|
|
|
|
'icon-size-xl': '20px',
|
|
|
|
|
|
'radius-sm': 'var(--radius-sm)',
|
|
|
|
|
|
'radius-md': 'var(--radius-md)',
|
|
|
|
|
|
'radius-lg': 'var(--radius-lg)',
|
|
|
|
|
|
'radius-xl': 'var(--radius-xl)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
shadow: 'none',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'spinner-duration': '720ms',
|
|
|
|
|
|
'disabled-opacity': '0.5',
|
|
|
|
|
|
// Per-color palettes (8 system tokens)
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-element': 'var(--color-primary-element)',
|
|
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-solid-hover': 'var(--color-primary-solid-hover)',
|
|
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'primary-contrast': 'var(--color-primary-contrast)',
|
|
|
|
|
|
'secondary-element': 'var(--color-secondary-element)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-solid-hover': 'var(--color-secondary-solid-hover)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'secondary-contrast': 'var(--color-secondary-contrast)',
|
|
|
|
|
|
'neutral-element': 'var(--color-neutral-element)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-solid-hover': 'var(--color-neutral-solid-hover)',
|
|
|
|
|
|
'neutral-text': 'var(--color-neutral-text)',
|
|
|
|
|
|
'neutral-contrast': 'var(--color-neutral-contrast)',
|
|
|
|
|
|
'affirm-element': 'var(--color-affirm-element)',
|
|
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-solid-hover': 'var(--color-affirm-solid-hover)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'affirm-contrast': 'var(--color-affirm-contrast)',
|
|
|
|
|
|
'fulfill-track': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'fulfill-element': 'var(--color-fulfill-element)',
|
|
|
|
|
|
'fulfill-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-solid': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'fulfill-solid-hover': 'var(--color-fulfill-solid-hover)',
|
|
|
|
|
|
'fulfill-text': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'fulfill-contrast': 'var(--color-fulfill-contrast)',
|
|
|
|
|
|
'risk-element': 'var(--color-risk-element)',
|
|
|
|
|
|
'risk-solid': 'var(--color-risk-solid)',
|
|
|
|
|
|
'risk-solid-hover': 'var(--color-risk-solid-hover)',
|
|
|
|
|
|
'risk-text': 'var(--color-risk-text)',
|
|
|
|
|
|
'risk-contrast': 'var(--color-risk-contrast)',
|
|
|
|
|
|
'threat-element': 'var(--color-threat-element)',
|
|
|
|
|
|
'threat-solid': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-solid-hover': 'var(--color-threat-solid-hover)',
|
|
|
|
|
|
'threat-text': 'var(--color-threat-text)',
|
|
|
|
|
|
'threat-contrast': 'var(--color-threat-contrast)',
|
|
|
|
|
|
'loss-track': 'var(--color-loss-track)',
|
|
|
|
|
|
'loss-element': 'var(--color-loss-element)',
|
|
|
|
|
|
'loss-border': 'var(--color-loss-border)',
|
|
|
|
|
|
'loss-solid': 'var(--color-loss-solid)',
|
|
|
|
|
|
'loss-solid-hover': 'var(--color-loss-solid-hover)',
|
|
|
|
|
|
'loss-text': 'var(--color-loss-text)',
|
|
|
|
|
|
'loss-contrast': 'var(--color-loss-contrast)',
|
|
|
|
|
|
// Active palette — 8 custom properties, each declared with 8
|
|
|
|
|
|
// declarations (host default = primary, plus per-color overrides
|
|
|
|
|
|
// for the 7 other supported values). Single source of truth via
|
|
|
|
|
|
// TSC v2 `declarations[]`. Replaces the per-color blocks that
|
|
|
|
|
|
// used to live in `button.css`.
|
|
|
|
|
|
'palette-track': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--button-primary-track)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--button-secondary-track)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--button-neutral-track)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--button-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--button-fulfill-track)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--button-risk-track)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--button-threat-track)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--button-loss-track)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-element': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--button-primary-element)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--button-secondary-element)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--button-neutral-element)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--button-affirm-element)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--button-fulfill-element)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--button-risk-element)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--button-threat-element)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--button-loss-element)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-border': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--button-primary-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--button-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--button-neutral-border)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--button-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--button-fulfill-border)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--button-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--button-threat-border)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--button-loss-border)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-solid': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--button-primary-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--button-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--button-neutral-solid)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--button-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--button-fulfill-solid)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--button-risk-solid)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--button-threat-solid)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--button-loss-solid)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-solid-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--button-primary-solid-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--button-secondary-solid-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--button-neutral-solid-hover)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--button-affirm-solid-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--button-fulfill-solid-hover)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--button-risk-solid-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--button-threat-solid-hover)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--button-loss-solid-hover)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-text': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--button-primary-text)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--button-secondary-text)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--button-neutral-text)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--button-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--button-fulfill-text)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--button-risk-text)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--button-threat-text)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--button-loss-text)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-contrast': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--button-primary-contrast)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--button-secondary-contrast)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--button-neutral-contrast)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--button-affirm-contrast)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--button-fulfill-contrast)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--button-risk-contrast)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--button-threat-contrast)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--button-loss-contrast)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
feat(eidos): Button + 9 demo rebuilds + picker recipe polish
Build:
- New <Button> compound (morfo + soma + sema + eidos): 6 variants
(solid/soft/surface/outline/ghost/plain), 8 colors, 5 sizes, optional
icon/endIcon snippets, loading state with built-in Spinner, asChild
Slot pattern, intent-driven sema (commit-action with fromProp:intent).
Demo rebuilds (canonical depth per DEMO_AUTHORING_GUIDE):
- context-menu, dropdown-menu, pin-input, alert-dialog, toggle-group:
full per-part Morfo contracts, reference-parity tables, ARIA contract
tables, keyboard tables, composition controls.
- color-field, time-field, time-picker, time-range-picker, color-picker,
month-grid, year-grid: same canonical treatment; per-part data/aria/
keyboard iteration of raw morfo, reference parity vs react-aria/
ark-ui/Chakra/bits-ui/Mantine.
Picker recipe polish:
- PickerShell.Clear/Cancel/Close refactored to use <Button size="xs">
(affects 5 pickers — date / date-range / time / time-range / color).
- TimePicker + TimeRangePicker: popover condensed (min-width 18rem -> 14
/ 32 -> 28), per-channel accent (hour=primary, minute=secondary,
second=neutral; end variant muted), ruler off by default, hour ruler
cleaned to 0/6/12/18/23.
- ColorPicker: typography token --_color-picker-trigger-font-size that
scales with data-size (10/12/14px); autoFormat default true; Area
recipe override for [data-x-channel='hue'] with rainbow gradient +
saturation/brightness Y overlays.
- ValueText eidos wrapper: fix children snippet bug that suppressed
soma's displayValue fallback.
- date-field.css: segment editing affordance (cursor + hover + active
ring) via new --_date-field-accent-element token across 8 color
cascades.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
},
|
|
|
|
|
|
calendar: {
|
|
|
|
|
|
gap: 'var(--space-3)',
|
|
|
|
|
|
'padding-xs': 'var(--space-2)',
|
|
|
|
|
|
'padding-sm': 'var(--space-3)',
|
|
|
|
|
|
'padding-md': 'var(--space-4)',
|
|
|
|
|
|
'padding-lg': 'var(--space-5)',
|
|
|
|
|
|
radius: 'var(--radius-lg)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-subtle)',
|
|
|
|
|
|
'invalid-border': 'var(--color-risk-border)',
|
|
|
|
|
|
bg: 'var(--color-surface-raised)',
|
|
|
|
|
|
'outline-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'outline-shadow': 'none',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
shadow: 'var(--depth-raised-shadow), var(--depth-raised-halo)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'header-gap': 'var(--space-2)',
|
|
|
|
|
|
'heading-color': 'var(--color-content-primary)',
|
uix: date-picker + date-range-picker components + component audit infra
Two new Eidos components shipped end-to-end (wrapper + recipe + demo +
Soma provider hardening) plus a checklist-driven audit pipeline that
scores all 67 morfo components against doctrinal completion criteria.
New components:
- date-picker: full popover-anchored picker over date-field + calendar,
with calendar/content/trigger parts and demo route.
- date-range-picker: standalone wrapper with own calendar/grid/segment
surface, demo route, and recipe CSS.
- Both wrappers follow Option C disciplined (root + parts attached via
explicit assignment, no Object.assign).
Supporting Soma changes:
- range-calendar provider tightened (211 LOC of behavior, 167 LOC of
tests), README brought up to component doctrine.
- date-field, date-picker, date-range-field, date-range-picker Soma
providers + READMEs updated for new wrappers.
- popover provider/close gain props needed by the picker wrappers.
Morfo updates:
- date-picker / date-range-picker / range-calendar morfos refined for
the new APIs (parts, events, ARIA).
Audit infrastructure (new):
- src/uix/COMPONENT_COMPLETION_CHECKLIST.md — 81 doctrinal rules across
morfo / eidos wrapper / recipe CSS / demo / README / cross-layer
scripts. Each rule keyed to active_architecture.md, GUIA_IMPLEMENTACION
and DEMO_AUTHORING_GUIDE.
- scripts/component-audit.ts + `npm run component:audit` — regex parser
over all 67 components, emits tmp/component-audit.md with summary
scoreboard + per-component findings. Validates against canonical
SEMA_FAMILIES / SEMA_VERBS / ARCHETYPE_VOCABULARY / INTENTS.
- Initial baseline: 1 PASS, 64 NEEDS-WORK, 2 BROKEN (tooltip,
date-range-picker). Top systemic gaps: translations.label (49),
README Gaps/Comparativa/Baseline sections (87 combined), keyboard
/event ratio under-declaration (15), apg URL absent (19).
Misc:
- src/uix/kimi-audit-eidos.md — supplementary audit notes.
- .gitignore: ignore .codex-* agent scratch artifacts at repo root.
- continue.md + READMEs updated through the migration.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'heading-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'heading-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'control-size-xs': 'var(--control-height-xxs)',
|
|
|
|
|
|
'control-size-sm': 'var(--control-height-xs)',
|
|
|
|
|
|
'control-size-md': 'var(--control-height-sm)',
|
|
|
|
|
|
'control-size-lg': 'var(--control-height-md)',
|
|
|
|
|
|
'control-radius': 'var(--radius-md)',
|
|
|
|
|
|
'control-border-width': 'var(--border-width)',
|
|
|
|
|
|
'control-border': 'transparent',
|
|
|
|
|
|
'control-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'control-bg': 'transparent',
|
|
|
|
|
|
'control-bg-hover': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'control-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'control-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'select-min-width': '8ch',
|
|
|
|
|
|
'select-px': 'var(--space-2)',
|
|
|
|
|
|
'grid-gap': 'var(--space-0-5)',
|
|
|
|
|
|
'weekday-size': 'var(--space-5)',
|
|
|
|
|
|
'weekday-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'weekday-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'weekday-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'day-size-xs': 'var(--control-height-xxs)',
|
|
|
|
|
|
'day-size-sm': 'var(--control-height-xs)',
|
|
|
|
|
|
'day-size-md': 'var(--control-height-sm)',
|
|
|
|
|
|
'day-size-lg': 'var(--control-height-md)',
|
|
|
|
|
|
'day-radius': 'var(--radius-md)',
|
|
|
|
|
|
'day-border-width': 'var(--border-width)',
|
|
|
|
|
|
'day-border': 'transparent',
|
|
|
|
|
|
'day-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'day-bg': 'transparent',
|
|
|
|
|
|
'day-bg-hover': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'day-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'day-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'day-font-weight': 'var(--font-weight-regular)',
|
|
|
|
|
|
'day-selected-color': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'day-today-border': 'var(--color-border-strong)',
|
|
|
|
|
|
'day-today-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'day-today-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'day-outside-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'day-outside-opacity': '0.62',
|
|
|
|
|
|
'day-weekend-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'day-holiday-shadow': 'inset 0 -2px 0 var(--_calendar-accent-border)',
|
|
|
|
|
|
'day-unavailable-decoration': 'var(--color-risk-border)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'event-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(--_calendar-accent-border)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.52'
|
|
|
|
|
|
},
|
|
|
|
|
|
pagination: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-size-xs': 'var(--control-height-xxs)',
|
|
|
|
|
|
'control-size-sm': 'var(--control-height-xs)',
|
|
|
|
|
|
'control-size-md': 'var(--control-height-sm)',
|
|
|
|
|
|
'control-size-lg': 'var(--control-height-md)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-px-xs': 'var(--space-1-5)',
|
|
|
|
|
|
'control-px-sm': 'var(--space-2)',
|
|
|
|
|
|
'control-px-md': 'var(--space-2-5)',
|
|
|
|
|
|
'control-px-lg': 'var(--space-3)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'control-radius': 'var(--radius-md)',
|
|
|
|
|
|
'control-border-width': 'var(--border-width)',
|
|
|
|
|
|
'control-border': 'transparent',
|
|
|
|
|
|
'control-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'control-bg': 'transparent',
|
|
|
|
|
|
'control-bg-hover': 'var(--color-surface-raised)',
|
|
|
|
|
|
'control-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'control-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'selected-border': 'var(--color-primary-border)',
|
|
|
|
|
|
'selected-border-hover': 'var(--color-primary-border)',
|
|
|
|
|
|
'selected-bg': 'var(--color-primary-solid)',
|
|
|
|
|
|
'selected-bg-hover': 'var(--color-primary-solid-hover)',
|
|
|
|
|
|
'selected-color': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'ellipsis-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
popover: {
|
|
|
|
|
|
'content-z': '75',
|
|
|
|
|
|
'overlay-z': '60',
|
|
|
|
|
|
'overlay-bg': 'var(--color-overlay)',
|
|
|
|
|
|
'trigger-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
gap: 'var(--space-3)',
|
|
|
|
|
|
'max-width': '32rem',
|
|
|
|
|
|
'min-width-sm': '14rem',
|
|
|
|
|
|
'min-width-md': '18rem',
|
|
|
|
|
|
'min-width-lg': '22rem',
|
|
|
|
|
|
'min-width-xl': '28rem',
|
|
|
|
|
|
'padding-y-sm': 'var(--space-2)',
|
|
|
|
|
|
'padding-x-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'padding-y-md': 'var(--space-3)',
|
|
|
|
|
|
'padding-x-md': 'var(--space-3)',
|
|
|
|
|
|
'padding-y-lg': 'var(--space-3-5)',
|
|
|
|
|
|
'padding-x-lg': 'var(--space-4)',
|
|
|
|
|
|
'padding-y-xl': 'var(--space-4)',
|
|
|
|
|
|
'padding-x-xl': 'var(--space-5)',
|
|
|
|
|
|
'font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-weight': 'var(--font-weight-regular)',
|
|
|
|
|
|
'line-height': 'var(--leading-text)',
|
|
|
|
|
|
'title-font-family': 'var(--font-heading)',
|
|
|
|
|
|
'title-font-size': 'var(--font-size-md)',
|
|
|
|
|
|
'title-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'title-line-height': 'var(--leading-heading)',
|
|
|
|
|
|
'title-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'description-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'description-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'description-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'description-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
radius: 'var(--radius-lg)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
bg: 'var(--color-surface-overlay)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
border: 'color-mix( in srgb, var(--color-border-default) 82%, var(--popover-bg) )',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
shadow: 'var(--depth-overlay-shadow), var(--depth-overlay-halo)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'close-size': 'var(--control-height-xs)',
|
|
|
|
|
|
'close-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'close-radius': 'var(--radius-md)',
|
|
|
|
|
|
'close-border-width': 'var(--border-width)',
|
|
|
|
|
|
'close-bg': 'transparent',
|
|
|
|
|
|
'close-bg-hover': 'color-mix( in srgb, var(--color-neutral-track) 72%, var(--popover-bg) )',
|
|
|
|
|
|
'close-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'close-border': 'color-mix(in srgb, var(--color-border-default) 72%, transparent)',
|
|
|
|
|
|
'close-border-hover': 'var(--color-border-strong)'
|
|
|
|
|
|
},
|
|
|
|
|
|
progress: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xs': '2px',
|
|
|
|
|
|
'height-sm': '4px',
|
|
|
|
|
|
'height-md': '6px',
|
|
|
|
|
|
'height-lg': '8px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xl': '12px',
|
|
|
|
|
|
'vertical-height': '10rem',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'radius-xs': 'var(--radius-full)',
|
|
|
|
|
|
'radius-sm': 'var(--radius-full)',
|
|
|
|
|
|
'radius-md': 'var(--radius-full)',
|
|
|
|
|
|
'radius-lg': 'var(--radius-full)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'radius-xl': 'var(--radius-full)',
|
|
|
|
|
|
'ring-size-xs': '2rem',
|
|
|
|
|
|
'ring-size-sm': '2.5rem',
|
|
|
|
|
|
'ring-size-md': '3rem',
|
|
|
|
|
|
'ring-size-lg': '3.5rem',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'ring-size-xl': '4rem',
|
|
|
|
|
|
'ring-thickness-xs': '3px',
|
|
|
|
|
|
'ring-thickness-sm': '4px',
|
|
|
|
|
|
'ring-thickness-md': '6px',
|
|
|
|
|
|
'ring-thickness-lg': '8px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'ring-thickness-xl': '10px',
|
|
|
|
|
|
'label-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'label-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'label-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'label-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'value-text-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'value-text-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'value-text-font-weight': 'var(--font-weight-regular)',
|
|
|
|
|
|
'value-text-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'value-text-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'track-bg':
|
|
|
|
|
|
'color-mix(in srgb, var(--color-content-primary) 12%, var(--color-surface-default))',
|
|
|
|
|
|
'ring-track-bg':
|
|
|
|
|
|
'color-mix(in srgb, var(--color-content-primary) 12%, var(--color-surface-default))',
|
|
|
|
|
|
'ring-center-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'indicator-bg': 'var(--color-primary-solid)',
|
|
|
|
|
|
'indicator-bg-loaded': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-normal)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'indeterminate-width': '35%',
|
|
|
|
|
|
'indeterminate-duration': '1.1s',
|
|
|
|
|
|
'indeterminate-ease': 'var(--ease-default)'
|
|
|
|
|
|
},
|
|
|
|
|
|
'radio-group': {
|
|
|
|
|
|
'gap-vertical': 'var(--space-3)',
|
|
|
|
|
|
'gap-horizontal': 'var(--space-4)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-size-xs': '14px',
|
|
|
|
|
|
'item-size-sm': '16px',
|
|
|
|
|
|
'item-size-md': '18px',
|
|
|
|
|
|
'item-size-lg': '22px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-size-xl': '26px',
|
|
|
|
|
|
'dot-size-xs': '5px',
|
|
|
|
|
|
'dot-size-sm': '6px',
|
|
|
|
|
|
'dot-size-md': '7px',
|
|
|
|
|
|
'dot-size-lg': '9px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'dot-size-xl': '11px',
|
|
|
|
|
|
'item-gap': 'var(--space-3)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'item-label-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'item-label-color-disabled': 'var(--color-content-disabled)',
|
|
|
|
|
|
'indicator-radius': 'var(--radius-full)',
|
|
|
|
|
|
'indicator-border-width': 'var(--border-width)',
|
|
|
|
|
|
'indicator-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'indicator-border': 'var(--color-border-default)',
|
|
|
|
|
|
'indicator-border-hover': 'var(--color-border-strong)',
|
|
|
|
|
|
'indicator-bg-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 78%, var(--color-surface-default) )',
|
|
|
|
|
|
'indicator-border-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-border-default) 72%, var(--color-border-subtle) )',
|
|
|
|
|
|
'indicator-bg-checked-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-content-disabled) 40%, var(--color-surface-overlay) )',
|
|
|
|
|
|
'dot-color': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'dot-color-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-content-on-solid) 82%, var(--color-surface-default) )',
|
|
|
|
|
|
'focus-ring-offset': 'var(--focus-ring-offset)',
|
|
|
|
|
|
'focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'focus-ring-color': 'var(--focus-ring-color)',
|
|
|
|
|
|
'focus-ring-surface': 'var(--color-surface-default)',
|
|
|
|
|
|
'focus-ring':
|
|
|
|
|
|
'0 0 0 var(--radio-group-focus-ring-offset) var(--radio-group-focus-ring-surface), 0 0 0 calc(var(--radio-group-focus-ring-offset) + var(--radio-group-focus-ring-width)) var(--radio-group-focus-ring-color)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.72',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-solid-hover': 'var(--color-primary-solid-hover)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-solid-hover': 'var(--color-neutral-solid-hover)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-solid-hover': 'var(--color-secondary-solid-hover)',
|
|
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-solid-hover': 'var(--color-affirm-solid-hover)',
|
|
|
|
|
|
'label-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'label-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'label-line-height': 'var(--leading-ui)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'label-color': 'var(--color-content-primary)',
|
|
|
|
|
|
// Private palette (TSC v2.1). Declared on the [data-radio-group]
|
|
|
|
|
|
// host, inherited by [data-radio-group-item] descendants via
|
|
|
|
|
|
// CSS custom property inheritance. Migrated from per-color
|
|
|
|
|
|
// blocks in radio-group.css.
|
|
|
|
|
|
'_palette-solid': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--radio-group-primary-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--radio-group-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--radio-group-neutral-solid)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--radio-group-affirm-solid)', scope: 'color:affirm' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_palette-solid-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--radio-group-primary-solid-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--radio-group-secondary-solid-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--radio-group-neutral-solid-hover)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--radio-group-affirm-solid-hover)', scope: 'color:affirm' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_palette-text': { value: 'var(--radio-group-dot-color)', scope: 'host' }
|
|
|
|
|
|
},
|
|
|
|
|
|
'rating-group': {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-2-5)',
|
|
|
|
|
|
'item-size-xs': '14px',
|
|
|
|
|
|
'item-size-sm': '18px',
|
|
|
|
|
|
'item-size-md': '22px',
|
|
|
|
|
|
'item-size-lg': '28px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-size-xl': '34px',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-md)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': 'var(--font-size-xl)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'item-color-inactive': 'var(--color-neutral-border)',
|
|
|
|
|
|
'item-color-active': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'item-color-partial': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'item-hover-offset': '-1px',
|
|
|
|
|
|
'focus-radius': 'var(--radius-md)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
'search-field': {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'px-md': 'var(--space-3)',
|
|
|
|
|
|
'px-lg': 'var(--space-3-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'px-xl': 'var(--space-4)',
|
|
|
|
|
|
'gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-2)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-3)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-default)',
|
|
|
|
|
|
'border-focus': 'var(--color-focus-ring)',
|
|
|
|
|
|
'border-invalid': 'var(--color-risk-border)',
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'clear-hidden-opacity': '0',
|
|
|
|
|
|
'icon-size-xs': 'var(--icon-size-xs)',
|
|
|
|
|
|
'icon-size-sm': 'var(--icon-size-sm)',
|
|
|
|
|
|
'icon-size-md': 'var(--icon-size-md)',
|
|
|
|
|
|
'icon-size-lg': 'var(--icon-size-md)',
|
|
|
|
|
|
'icon-size-xl': 'var(--icon-size-lg)',
|
|
|
|
|
|
'icon-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'icon-margin-inline-end': 'var(--space-1-5)',
|
|
|
|
|
|
'loading-indicator-size-xs': 'var(--icon-size-xs)',
|
|
|
|
|
|
'loading-indicator-size-sm': 'var(--icon-size-sm)',
|
|
|
|
|
|
'loading-indicator-size-md': 'var(--icon-size-md)',
|
|
|
|
|
|
'loading-indicator-size-lg': 'var(--icon-size-md)',
|
|
|
|
|
|
'loading-indicator-size-xl': 'var(--icon-size-lg)',
|
|
|
|
|
|
'loading-indicator-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'loading-indicator-track': 'var(--color-border-subtle)',
|
|
|
|
|
|
'loading-indicator-thickness': '2px',
|
|
|
|
|
|
'loading-indicator-duration': '900ms',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
fix(password-field): align input chrome with system + add Form/SIUM demo
Style fix — input chrome was hand-rolled with raw color tokens
(`--color-neutral-border`, `--ring-width`) instead of consuming the
recipe layer like every other text input. Now matches search-field and
number-field exactly:
- Added `password-field` recipe to `src/uix/eidos/lib/recipes/base.ts`
with the same surface as `search-field` (height, px, gap, font-size
per size; border, focus, invalid, bg, color, focus-shadow tokens).
- Regenerated `src/uix/eidos/generated/base.css`.
- Rewrote `password-field.css` to consume the new tokens — same focus
ring (`focus-shadow`), same border colors, same disabled opacity,
same transition tokens. VisibilityTrigger gets its own border/bg/
color-on-hover scheme aligned with search-field's clear button.
- Added per-size icon + caps font-size tokens so the trigger and caps
pill scale with the input.
Form + SIUM demo — answers "how does PasswordField validate?":
Added a new subsection in the Live tab with three working forms wired
through `<Form>` + `<Field>` and SIUM schemas:
1. Login (purpose='current', non-empty password)
2. Registration (purpose='new', complexity rules via regex pipes —
uppercase + digit + symbol + 8+ chars, plus the visual StrengthMeter
as a companion to the schema)
3. Password change (3 fields with a cross-field `refine()` so new ===
confirm; demonstrates SIUM's refine pattern)
The section explicitly documents that PasswordField has no built-in
complexity rules — validation is schema-first. The schema decides
what's "correct"; PasswordField's flags propagate via Field's OR-merge
of `formFieldState.isInvalid`.
svelte-check: 0 errors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'password-field': {
|
|
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'px-md': 'var(--space-3)',
|
|
|
|
|
|
'px-lg': 'var(--space-3-5)',
|
|
|
|
|
|
'px-xl': 'var(--space-4)',
|
|
|
|
|
|
'gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-2)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2-5)',
|
|
|
|
|
|
'gap-xl': 'var(--space-3)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-xl': 'var(--font-size-md)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-default)',
|
|
|
|
|
|
'border-focus': 'var(--color-focus-ring)',
|
|
|
|
|
|
'border-invalid': 'var(--color-risk-border)',
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'trigger-radius': 'var(--radius-full)',
|
|
|
|
|
|
'trigger-border-width': 'var(--border-width)',
|
|
|
|
|
|
'trigger-border': 'transparent',
|
|
|
|
|
|
'trigger-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'trigger-bg': 'transparent',
|
|
|
|
|
|
'trigger-bg-hover': 'var(--color-surface-raised)',
|
|
|
|
|
|
'trigger-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'trigger-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-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)',
|
|
|
|
|
|
'icon-size-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'icon-size-sm': 'var(--control-height-xs)',
|
|
|
|
|
|
'icon-size-md': 'var(--control-height-sm)',
|
|
|
|
|
|
'icon-size-lg': 'var(--control-height-sm)',
|
|
|
|
|
|
'icon-size-xl': 'var(--control-height-md)',
|
fix(password-field): align input chrome with system + add Form/SIUM demo
Style fix — input chrome was hand-rolled with raw color tokens
(`--color-neutral-border`, `--ring-width`) instead of consuming the
recipe layer like every other text input. Now matches search-field and
number-field exactly:
- Added `password-field` recipe to `src/uix/eidos/lib/recipes/base.ts`
with the same surface as `search-field` (height, px, gap, font-size
per size; border, focus, invalid, bg, color, focus-shadow tokens).
- Regenerated `src/uix/eidos/generated/base.css`.
- Rewrote `password-field.css` to consume the new tokens — same focus
ring (`focus-shadow`), same border colors, same disabled opacity,
same transition tokens. VisibilityTrigger gets its own border/bg/
color-on-hover scheme aligned with search-field's clear button.
- Added per-size icon + caps font-size tokens so the trigger and caps
pill scale with the input.
Form + SIUM demo — answers "how does PasswordField validate?":
Added a new subsection in the Live tab with three working forms wired
through `<Form>` + `<Field>` and SIUM schemas:
1. Login (purpose='current', non-empty password)
2. Registration (purpose='new', complexity rules via regex pipes —
uppercase + digit + symbol + 8+ chars, plus the visual StrengthMeter
as a companion to the schema)
3. Password change (3 fields with a cross-field `refine()` so new ===
confirm; demonstrates SIUM's refine pattern)
The section explicitly documents that PasswordField has no built-in
complexity rules — validation is schema-first. The schema decides
what's "correct"; PasswordField's flags propagate via Field's OR-merge
of `formFieldState.isInvalid`.
svelte-check: 0 errors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'caps-color': 'var(--color-risk-text)',
|
|
|
|
|
|
'caps-bg': 'color-mix(in srgb, var(--color-risk-track) 50%, transparent)',
|
|
|
|
|
|
'caps-font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'caps-font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'caps-font-size-md': 'var(--font-size-xs)',
|
|
|
|
|
|
'caps-font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'caps-font-size-xl': 'var(--font-size-sm)',
|
|
|
|
|
|
'strength-segment-bg': 'var(--color-border-default)',
|
fix(password-field): align input chrome with system + add Form/SIUM demo
Style fix — input chrome was hand-rolled with raw color tokens
(`--color-neutral-border`, `--ring-width`) instead of consuming the
recipe layer like every other text input. Now matches search-field and
number-field exactly:
- Added `password-field` recipe to `src/uix/eidos/lib/recipes/base.ts`
with the same surface as `search-field` (height, px, gap, font-size
per size; border, focus, invalid, bg, color, focus-shadow tokens).
- Regenerated `src/uix/eidos/generated/base.css`.
- Rewrote `password-field.css` to consume the new tokens — same focus
ring (`focus-shadow`), same border colors, same disabled opacity,
same transition tokens. VisibilityTrigger gets its own border/bg/
color-on-hover scheme aligned with search-field's clear button.
- Added per-size icon + caps font-size tokens so the trigger and caps
pill scale with the input.
Form + SIUM demo — answers "how does PasswordField validate?":
Added a new subsection in the Live tab with three working forms wired
through `<Form>` + `<Field>` and SIUM schemas:
1. Login (purpose='current', non-empty password)
2. Registration (purpose='new', complexity rules via regex pipes —
uppercase + digit + symbol + 8+ chars, plus the visual StrengthMeter
as a companion to the schema)
3. Password change (3 fields with a cross-field `refine()` so new ===
confirm; demonstrates SIUM's refine pattern)
The section explicitly documents that PasswordField has no built-in
complexity rules — validation is schema-first. The schema decides
what's "correct"; PasswordField's flags propagate via Field's OR-merge
of `formFieldState.isInvalid`.
svelte-check: 0 errors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'strength-segment-gap': '4px',
|
|
|
|
|
|
'strength-segment-height': '6px',
|
fix(password-field): align input chrome with system + add Form/SIUM demo
Style fix — input chrome was hand-rolled with raw color tokens
(`--color-neutral-border`, `--ring-width`) instead of consuming the
recipe layer like every other text input. Now matches search-field and
number-field exactly:
- Added `password-field` recipe to `src/uix/eidos/lib/recipes/base.ts`
with the same surface as `search-field` (height, px, gap, font-size
per size; border, focus, invalid, bg, color, focus-shadow tokens).
- Regenerated `src/uix/eidos/generated/base.css`.
- Rewrote `password-field.css` to consume the new tokens — same focus
ring (`focus-shadow`), same border colors, same disabled opacity,
same transition tokens. VisibilityTrigger gets its own border/bg/
color-on-hover scheme aligned with search-field's clear button.
- Added per-size icon + caps font-size tokens so the trigger and caps
pill scale with the input.
Form + SIUM demo — answers "how does PasswordField validate?":
Added a new subsection in the Live tab with three working forms wired
through `<Form>` + `<Field>` and SIUM schemas:
1. Login (purpose='current', non-empty password)
2. Registration (purpose='new', complexity rules via regex pipes —
uppercase + digit + symbol + 8+ chars, plus the visual StrengthMeter
as a companion to the schema)
3. Password change (3 fields with a cross-field `refine()` so new ===
confirm; demonstrates SIUM's refine pattern)
The section explicitly documents that PasswordField has no built-in
complexity rules — validation is schema-first. The schema decides
what's "correct"; PasswordField's flags propagate via Field's OR-merge
of `formFieldState.isInvalid`.
svelte-check: 0 errors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'strength-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
select: {
|
|
|
|
|
|
'stack-gap': 'var(--space-2)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-md)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': 'var(--font-size-lg)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
// Per-color forwarders consumed only by the TSC v2.2 `_accent-*`
|
|
|
|
|
|
// cascade below. The `solid` slot is intentionally omitted —
|
|
|
|
|
|
// select.css doesn't read `_accent-solid`, so its forwarders
|
|
|
|
|
|
// would be orphans (caught by the recipe-css-contract guard).
|
|
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'neutral-text': 'var(--color-neutral-text)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'fulfill-track': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'fulfill-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-text': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'risk-text': 'var(--color-risk-text)',
|
|
|
|
|
|
'threat-text': 'var(--color-threat-text)',
|
|
|
|
|
|
'loss-track': 'var(--color-loss-track)',
|
|
|
|
|
|
'loss-border': 'var(--color-loss-border)',
|
|
|
|
|
|
'loss-text': 'var(--color-loss-text)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'trigger-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'trigger-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'trigger-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'trigger-height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'trigger-height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'trigger-px-xs': 'var(--space-2)',
|
|
|
|
|
|
'trigger-px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'trigger-px-md': 'var(--space-3)',
|
|
|
|
|
|
'trigger-px-lg': 'var(--space-3-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'trigger-px-xl': 'var(--space-4)',
|
|
|
|
|
|
'trigger-gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'trigger-gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'trigger-gap-md': 'var(--space-2)',
|
|
|
|
|
|
'trigger-gap-lg': 'var(--space-2-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'trigger-gap-xl': 'var(--space-3)',
|
|
|
|
|
|
'trigger-border-width': 'var(--border-width)',
|
|
|
|
|
|
'trigger-border': 'var(--color-border-default)',
|
|
|
|
|
|
'trigger-border-hover': 'var(--color-border-strong)',
|
|
|
|
|
|
'trigger-radius': 'var(--radius-md)',
|
|
|
|
|
|
'trigger-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'trigger-bg-hover': 'var(--color-surface-raised)',
|
|
|
|
|
|
'trigger-shadow': 'var(--shadow-subtle)',
|
|
|
|
|
|
'trigger-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-indicator-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'trigger-indicator-size': 'var(--icon-size-sm)',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'disabled-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'disabled-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'disabled-color': 'var(--color-content-disabled)',
|
|
|
|
|
|
'content-z': '80',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'content-py-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'content-py-sm': 'var(--space-1)',
|
|
|
|
|
|
'content-py-md': 'var(--space-1-5)',
|
|
|
|
|
|
'content-py-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'content-py-xl': 'var(--space-2-5)',
|
|
|
|
|
|
'content-px-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'content-px-sm': 'var(--space-1)',
|
|
|
|
|
|
'content-px-md': 'var(--space-1-5)',
|
|
|
|
|
|
'content-px-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'content-px-xl': 'var(--space-2-5)',
|
|
|
|
|
|
'content-min-width': '12rem',
|
|
|
|
|
|
'content-max-width': '24rem',
|
|
|
|
|
|
'content-max-height': 'min(20rem, calc(100dvh - var(--space-6)))',
|
|
|
|
|
|
'content-border-width': 'var(--border-width)',
|
|
|
|
|
|
'content-border': 'var(--color-border-default)',
|
|
|
|
|
|
'content-radius': 'var(--radius-lg)',
|
|
|
|
|
|
'content-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'content-color': 'var(--color-content-primary)',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'content-shadow': 'var(--depth-overlay-shadow), var(--depth-overlay-halo)',
|
|
|
|
|
|
'content-outline-shadow': 'var(--depth-raised-shadow), var(--depth-raised-halo)',
|
|
|
|
|
|
'content-ghost-shadow': 'var(--depth-raised-shadow), var(--depth-raised-halo)',
|
|
|
|
|
|
'open-duration': 'var(--duration-normal)',
|
|
|
|
|
|
'close-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'viewport-gap': 'var(--space-0-5)',
|
|
|
|
|
|
'viewport-padding': 'var(--space-0-5)',
|
|
|
|
|
|
'group-gap': 'var(--space-0-5)',
|
|
|
|
|
|
'group-py': 'var(--space-1)',
|
|
|
|
|
|
'group-heading-py': 'var(--space-1)',
|
|
|
|
|
|
'group-heading-px': 'var(--space-2)',
|
|
|
|
|
|
'group-heading-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'group-heading-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'group-heading-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'group-heading-letter-spacing': '0.04em',
|
|
|
|
|
|
'group-heading-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'separator-size': 'var(--border-width)',
|
|
|
|
|
|
'separator-my': 'var(--space-1)',
|
|
|
|
|
|
'separator-bg': 'var(--color-border-subtle)',
|
|
|
|
|
|
'item-gap': 'var(--space-2)',
|
|
|
|
|
|
'item-min-height': 'var(--control-height-sm)',
|
|
|
|
|
|
'item-px': 'var(--space-2)',
|
|
|
|
|
|
'item-radius': 'var(--radius-md)',
|
|
|
|
|
|
'item-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'item-bg-highlighted': 'var(--color-surface-raised)',
|
|
|
|
|
|
'item-color-highlighted': 'var(--color-content-primary)',
|
|
|
|
|
|
'item-indicator-size': 'var(--icon-size-sm)',
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-focus-ring-width': '2px',
|
|
|
|
|
|
'item-description-mt': '0.125rem',
|
|
|
|
|
|
'item-description-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'item-description-font-size': '0.85em',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
// Restored after accidental sed-removal during switch migration.
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'risk-track': 'var(--color-risk-track)',
|
|
|
|
|
|
'risk-border': 'var(--color-risk-border)',
|
|
|
|
|
|
'threat-track': 'var(--color-threat-track)',
|
|
|
|
|
|
'threat-border': 'var(--color-threat-border)',
|
|
|
|
|
|
// TSC v2.2 — multi-part palette cascade. Select's `data-color`
|
|
|
|
|
|
// attribute lives on the trigger AND content parts (NOT on the
|
|
|
|
|
|
// root `[data-select]`), because content portals out of the
|
|
|
|
|
|
// document tree and must carry the color independently. The
|
|
|
|
|
|
// `parts: ['trigger', 'content']` field tells the generator to
|
|
|
|
|
|
// emit each declaration as a comma-separated rule targeting both
|
|
|
|
|
|
// `[data-select-trigger]` and `[data-select-content]`.
|
|
|
|
|
|
//
|
|
|
|
|
|
// 1 host default (primary) + 7 per-color cascades for each of the
|
|
|
|
|
|
// 3 perceptual slots that select.css consumes (`track`, `border`,
|
|
|
|
|
|
// `text`). The legacy CSS also declared `--_select-accent-solid`
|
|
|
|
|
|
// but nothing in select.css read it; that orphan stayed out of
|
|
|
|
|
|
// the TSC migration on purpose.
|
|
|
|
|
|
'_accent-track': {
|
|
|
|
|
|
parts: ['trigger', 'content'],
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--select-primary-track)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--select-secondary-track)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--select-neutral-track)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--select-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--select-fulfill-track)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--select-risk-track)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--select-threat-track)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--select-loss-track)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-border': {
|
|
|
|
|
|
parts: ['trigger', 'content'],
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--select-primary-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--select-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--select-neutral-border)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--select-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--select-fulfill-border)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--select-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--select-threat-border)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--select-loss-border)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-text': {
|
|
|
|
|
|
parts: ['trigger', 'content'],
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--select-primary-text)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--select-secondary-text)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--select-neutral-text)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--select-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--select-fulfill-text)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--select-risk-text)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--select-threat-text)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--select-loss-text)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
toolbar: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'padding-inline-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'padding-inline-sm': 'var(--space-1)',
|
|
|
|
|
|
'padding-inline-md': 'var(--space-1-5)',
|
|
|
|
|
|
'padding-inline-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'padding-block-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'padding-block-sm': 'var(--space-1)',
|
|
|
|
|
|
'padding-block-md': 'var(--space-1)',
|
|
|
|
|
|
'padding-block-lg': 'var(--space-1-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'control-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'control-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'control-height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-px-xs': 'var(--space-1-5)',
|
|
|
|
|
|
'control-px-sm': 'var(--space-2)',
|
|
|
|
|
|
'control-px-md': 'var(--space-2-5)',
|
|
|
|
|
|
'control-px-lg': 'var(--space-3)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'control-gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'control-gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'control-gap-lg': 'var(--space-2)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
radius: 'var(--radius-lg)',
|
|
|
|
|
|
bg: 'var(--color-surface-raised)',
|
|
|
|
|
|
border: 'var(--color-border-subtle)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
shadow: 'var(--shadow-subtle)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'group-gap': 'var(--space-0-5)',
|
|
|
|
|
|
'control-radius': 'var(--radius-md)',
|
|
|
|
|
|
'control-border-width': 'var(--border-width)',
|
|
|
|
|
|
'control-border': 'transparent',
|
|
|
|
|
|
'control-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'control-border-active': 'var(--color-primary-border)',
|
|
|
|
|
|
'control-bg': 'transparent',
|
|
|
|
|
|
'control-bg-hover': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'control-bg-active': 'var(--color-primary-track)',
|
|
|
|
|
|
'control-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'control-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'control-color-active': 'var(--color-primary-text)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'separator-bg': 'var(--color-border-subtle)',
|
|
|
|
|
|
'separator-thickness': 'var(--border-width)',
|
|
|
|
|
|
'separator-length': 'var(--control-height-md)',
|
|
|
|
|
|
'separator-radius': 'var(--radius-full)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.48'
|
|
|
|
|
|
},
|
|
|
|
|
|
'file-upload': {
|
|
|
|
|
|
'gap-sm': 'var(--space-2)',
|
|
|
|
|
|
'gap-md': 'var(--space-3)',
|
|
|
|
|
|
'gap-lg': 'var(--space-4)',
|
|
|
|
|
|
'padding-sm': 'var(--space-4)',
|
|
|
|
|
|
'padding-md': 'var(--space-5)',
|
|
|
|
|
|
'padding-lg': 'var(--space-6)',
|
|
|
|
|
|
'control-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'control-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'control-height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-md)',
|
|
|
|
|
|
'preview-size-sm': '32px',
|
|
|
|
|
|
'preview-size-md': '40px',
|
|
|
|
|
|
'preview-size-lg': '48px',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'label-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'dropzone-gap': 'var(--space-2)',
|
|
|
|
|
|
'dropzone-min-height': '9rem',
|
|
|
|
|
|
'dropzone-border-width': 'var(--border-width)',
|
|
|
|
|
|
'dropzone-border': 'var(--color-border-default)',
|
|
|
|
|
|
'dropzone-radius': 'var(--radius-lg)',
|
|
|
|
|
|
'dropzone-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'dropzone-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'button-gap': 'var(--space-1-5)',
|
|
|
|
|
|
'button-px': 'var(--space-3)',
|
|
|
|
|
|
'button-border-width': 'var(--border-width)',
|
|
|
|
|
|
'button-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'button-border-hover': 'var(--color-border-default)',
|
|
|
|
|
|
'button-radius': 'var(--radius-md)',
|
|
|
|
|
|
'button-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'button-bg-hover': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'button-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'button-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'button-solid-color': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'list-gap': 'var(--space-2)',
|
|
|
|
|
|
'item-gap': 'var(--space-3)',
|
|
|
|
|
|
'item-padding': 'var(--space-2)',
|
|
|
|
|
|
'item-border-width': 'var(--border-width)',
|
|
|
|
|
|
'item-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'item-radius': 'var(--radius-md)',
|
|
|
|
|
|
'item-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'item-shadow': 'var(--shadow-subtle)',
|
|
|
|
|
|
'preview-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'preview-bg': 'var(--color-neutral-track)',
|
|
|
|
|
|
'preview-color': 'var(--color-neutral-text)',
|
|
|
|
|
|
'item-name-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'item-name-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'item-size-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'item-size-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'progress-height': '4px',
|
|
|
|
|
|
'progress-radius': 'var(--radius-full)',
|
|
|
|
|
|
'progress-track-bg': 'var(--color-neutral-track)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.52',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'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.
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'risk-track': 'var(--color-risk-track)',
|
|
|
|
|
|
'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(--file-upload-primary-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--file-upload-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--file-upload-neutral-solid)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--file-upload-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--file-upload-fulfill-solid)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--file-upload-risk-solid)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--file-upload-threat-solid)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--file-upload-loss-solid)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-solid-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--file-upload-primary-solid-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--file-upload-secondary-solid-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--file-upload-neutral-solid-hover)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--file-upload-affirm-solid-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--file-upload-fulfill-solid-hover)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--file-upload-risk-solid-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--file-upload-threat-solid-hover)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--file-upload-loss-solid-hover)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-track': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--file-upload-primary-track)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--file-upload-secondary-track)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--file-upload-neutral-track)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--file-upload-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--file-upload-fulfill-track)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--file-upload-risk-track)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--file-upload-threat-track)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--file-upload-loss-track)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-border': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--file-upload-primary-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--file-upload-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--file-upload-neutral-border)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--file-upload-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--file-upload-fulfill-border)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--file-upload-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--file-upload-threat-border)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--file-upload-loss-border)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-text': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--file-upload-primary-text)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--file-upload-secondary-text)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--file-upload-neutral-text)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--file-upload-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--file-upload-fulfill-text)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--file-upload-risk-text)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--file-upload-threat-text)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--file-upload-loss-text)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
'tag-group': {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'item-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'item-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'item-height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-px-xs': 'var(--space-1-5)',
|
|
|
|
|
|
'item-px-sm': 'var(--space-2)',
|
|
|
|
|
|
'item-px-md': 'var(--space-2-5)',
|
|
|
|
|
|
'item-px-lg': 'var(--space-3)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'item-gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'item-gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'item-gap-lg': 'var(--space-2)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-sm)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'label-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'label-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'item-radius': 'var(--radius-full)',
|
|
|
|
|
|
'item-border-width': 'var(--border-width)',
|
|
|
|
|
|
'item-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'item-border-hover': 'var(--color-border-default)',
|
|
|
|
|
|
'item-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'item-bg-hover': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'item-shadow': 'var(--shadow-subtle)',
|
|
|
|
|
|
'item-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'item-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'solid-fg': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'remove-size': 'var(--control-height-xs)',
|
|
|
|
|
|
'remove-radius': 'var(--radius-full)',
|
|
|
|
|
|
'remove-border-width': 'var(--border-width)',
|
|
|
|
|
|
'remove-border': 'transparent',
|
|
|
|
|
|
'remove-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'remove-bg': 'transparent',
|
|
|
|
|
|
'remove-bg-hover': 'color-mix(in srgb, currentColor 12%, transparent)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.5',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid-bg': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-solid-bg-hover': 'var(--color-primary-solid-hover)',
|
Theming: on-solid contrast by luminance (P2-2) + translucent role surfaces (P2-4)
Two audit P2 quality defects, fixed at engine level.
P2-2 - on-solid text illegible on light solids:
The `contrast` slot defaulted to `--color-content-on-solid` (white) for every
role. On light solids (amber/yellow, risk=orange ~2.3:1) white is sub-AA. The
engine now picks by WCAG contrast (gamma-linearized) of the role step-9: when
white fails (<3:1) it uses `--color-content-on-solid-contrast` (a dark, new
OPTIONAL `content.onSolidContrast` semantic, #1c1917 in base). Only risk flips
to dark in base (5.89:1); purple/red/teal/green keep white (convention, >=3:1).
An explicit `slots.contrast` override is still honored verbatim.
P2-4 - opaque tinted soft surfaces:
The soft variant tint (Button + Badge `{role}-soft-bg`) was opaque (step-1 track
+ opaque color-mix hover) so it did not composite over non-uniform backgrounds.
New derived tokens `--color-{role}-surface` (= a2) + `--color-{role}-surface-hover`
(= a3) are translucent by construction (compositing-inverse alpha). Button/Badge
soft consume them. Toast/Tabs untouched - they are cards, opacity is correct.
- config-types: optional onSolidContrast + CONTENT_COLOR_OPTIONAL_KEYS.
- config: content keySet allows the optional key; validator value-checks it.
- render-css: wcagContrastRatio/wcagRelativeLuminance; luminance pick; emit
on-solid-contrast + surface/surface-hover.
- contract: on-solid-contrast + surface tokens per role.
- themes/base: onSolidContrast #1c1917 (light + dark).
- recipes/base: Button + Badge soft-bg -> surface, soft-bg-hover -> surface-hover.
- docs: THEMING.md section 24 + section 22 item 2; audit P2-2/P2-4 resolved.
Verified: npm run check (0 new errors), vitest eidos (0 new regressions),
browser runtime (risk 5.89:1 dark text, surfaces translucent rgba).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'primary-soft-bg': 'var(--color-primary-surface)',
|
|
|
|
|
|
'primary-soft-bg-hover': 'var(--color-primary-surface-hover)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-soft-fg': 'var(--color-primary-text)',
|
|
|
|
|
|
'primary-outline-border': 'var(--color-primary-border)',
|
|
|
|
|
|
'primary-outline-fg': 'var(--color-primary-text)',
|
|
|
|
|
|
'secondary-solid-bg': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-solid-bg-hover': 'var(--color-secondary-solid-hover)',
|
Theming: on-solid contrast by luminance (P2-2) + translucent role surfaces (P2-4)
Two audit P2 quality defects, fixed at engine level.
P2-2 - on-solid text illegible on light solids:
The `contrast` slot defaulted to `--color-content-on-solid` (white) for every
role. On light solids (amber/yellow, risk=orange ~2.3:1) white is sub-AA. The
engine now picks by WCAG contrast (gamma-linearized) of the role step-9: when
white fails (<3:1) it uses `--color-content-on-solid-contrast` (a dark, new
OPTIONAL `content.onSolidContrast` semantic, #1c1917 in base). Only risk flips
to dark in base (5.89:1); purple/red/teal/green keep white (convention, >=3:1).
An explicit `slots.contrast` override is still honored verbatim.
P2-4 - opaque tinted soft surfaces:
The soft variant tint (Button + Badge `{role}-soft-bg`) was opaque (step-1 track
+ opaque color-mix hover) so it did not composite over non-uniform backgrounds.
New derived tokens `--color-{role}-surface` (= a2) + `--color-{role}-surface-hover`
(= a3) are translucent by construction (compositing-inverse alpha). Button/Badge
soft consume them. Toast/Tabs untouched - they are cards, opacity is correct.
- config-types: optional onSolidContrast + CONTENT_COLOR_OPTIONAL_KEYS.
- config: content keySet allows the optional key; validator value-checks it.
- render-css: wcagContrastRatio/wcagRelativeLuminance; luminance pick; emit
on-solid-contrast + surface/surface-hover.
- contract: on-solid-contrast + surface tokens per role.
- themes/base: onSolidContrast #1c1917 (light + dark).
- recipes/base: Button + Badge soft-bg -> surface, soft-bg-hover -> surface-hover.
- docs: THEMING.md section 24 + section 22 item 2; audit P2-2/P2-4 resolved.
Verified: npm run check (0 new errors), vitest eidos (0 new regressions),
browser runtime (risk 5.89:1 dark text, surfaces translucent rgba).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'secondary-soft-bg': 'var(--color-secondary-surface)',
|
|
|
|
|
|
'secondary-soft-bg-hover': 'var(--color-secondary-surface-hover)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'secondary-soft-fg': 'var(--color-secondary-text)',
|
|
|
|
|
|
'secondary-outline-border': 'var(--color-secondary-border)',
|
|
|
|
|
|
'secondary-outline-fg': 'var(--color-secondary-text)',
|
|
|
|
|
|
'neutral-solid-bg': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-solid-bg-hover': 'var(--color-neutral-solid-hover)',
|
Theming: on-solid contrast by luminance (P2-2) + translucent role surfaces (P2-4)
Two audit P2 quality defects, fixed at engine level.
P2-2 - on-solid text illegible on light solids:
The `contrast` slot defaulted to `--color-content-on-solid` (white) for every
role. On light solids (amber/yellow, risk=orange ~2.3:1) white is sub-AA. The
engine now picks by WCAG contrast (gamma-linearized) of the role step-9: when
white fails (<3:1) it uses `--color-content-on-solid-contrast` (a dark, new
OPTIONAL `content.onSolidContrast` semantic, #1c1917 in base). Only risk flips
to dark in base (5.89:1); purple/red/teal/green keep white (convention, >=3:1).
An explicit `slots.contrast` override is still honored verbatim.
P2-4 - opaque tinted soft surfaces:
The soft variant tint (Button + Badge `{role}-soft-bg`) was opaque (step-1 track
+ opaque color-mix hover) so it did not composite over non-uniform backgrounds.
New derived tokens `--color-{role}-surface` (= a2) + `--color-{role}-surface-hover`
(= a3) are translucent by construction (compositing-inverse alpha). Button/Badge
soft consume them. Toast/Tabs untouched - they are cards, opacity is correct.
- config-types: optional onSolidContrast + CONTENT_COLOR_OPTIONAL_KEYS.
- config: content keySet allows the optional key; validator value-checks it.
- render-css: wcagContrastRatio/wcagRelativeLuminance; luminance pick; emit
on-solid-contrast + surface/surface-hover.
- contract: on-solid-contrast + surface tokens per role.
- themes/base: onSolidContrast #1c1917 (light + dark).
- recipes/base: Button + Badge soft-bg -> surface, soft-bg-hover -> surface-hover.
- docs: THEMING.md section 24 + section 22 item 2; audit P2-2/P2-4 resolved.
Verified: npm run check (0 new errors), vitest eidos (0 new regressions),
browser runtime (risk 5.89:1 dark text, surfaces translucent rgba).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'neutral-soft-bg': 'var(--color-neutral-surface)',
|
|
|
|
|
|
'neutral-soft-bg-hover': 'var(--color-neutral-surface-hover)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'neutral-soft-fg': 'var(--color-neutral-text)',
|
|
|
|
|
|
'neutral-outline-border': 'var(--color-neutral-border)',
|
|
|
|
|
|
'neutral-outline-fg': 'var(--color-neutral-text)',
|
|
|
|
|
|
'affirm-solid-bg': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-solid-bg-hover': 'var(--color-affirm-solid-hover)',
|
Theming: on-solid contrast by luminance (P2-2) + translucent role surfaces (P2-4)
Two audit P2 quality defects, fixed at engine level.
P2-2 - on-solid text illegible on light solids:
The `contrast` slot defaulted to `--color-content-on-solid` (white) for every
role. On light solids (amber/yellow, risk=orange ~2.3:1) white is sub-AA. The
engine now picks by WCAG contrast (gamma-linearized) of the role step-9: when
white fails (<3:1) it uses `--color-content-on-solid-contrast` (a dark, new
OPTIONAL `content.onSolidContrast` semantic, #1c1917 in base). Only risk flips
to dark in base (5.89:1); purple/red/teal/green keep white (convention, >=3:1).
An explicit `slots.contrast` override is still honored verbatim.
P2-4 - opaque tinted soft surfaces:
The soft variant tint (Button + Badge `{role}-soft-bg`) was opaque (step-1 track
+ opaque color-mix hover) so it did not composite over non-uniform backgrounds.
New derived tokens `--color-{role}-surface` (= a2) + `--color-{role}-surface-hover`
(= a3) are translucent by construction (compositing-inverse alpha). Button/Badge
soft consume them. Toast/Tabs untouched - they are cards, opacity is correct.
- config-types: optional onSolidContrast + CONTENT_COLOR_OPTIONAL_KEYS.
- config: content keySet allows the optional key; validator value-checks it.
- render-css: wcagContrastRatio/wcagRelativeLuminance; luminance pick; emit
on-solid-contrast + surface/surface-hover.
- contract: on-solid-contrast + surface tokens per role.
- themes/base: onSolidContrast #1c1917 (light + dark).
- recipes/base: Button + Badge soft-bg -> surface, soft-bg-hover -> surface-hover.
- docs: THEMING.md section 24 + section 22 item 2; audit P2-2/P2-4 resolved.
Verified: npm run check (0 new errors), vitest eidos (0 new regressions),
browser runtime (risk 5.89:1 dark text, surfaces translucent rgba).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'affirm-soft-bg': 'var(--color-affirm-surface)',
|
|
|
|
|
|
'affirm-soft-bg-hover': 'var(--color-affirm-surface-hover)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'affirm-soft-fg': 'var(--color-affirm-text)',
|
|
|
|
|
|
'affirm-outline-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'affirm-outline-fg': 'var(--color-affirm-text)',
|
|
|
|
|
|
'fulfill-solid-bg': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'fulfill-solid-bg-hover': 'var(--color-fulfill-solid-hover)',
|
Theming: on-solid contrast by luminance (P2-2) + translucent role surfaces (P2-4)
Two audit P2 quality defects, fixed at engine level.
P2-2 - on-solid text illegible on light solids:
The `contrast` slot defaulted to `--color-content-on-solid` (white) for every
role. On light solids (amber/yellow, risk=orange ~2.3:1) white is sub-AA. The
engine now picks by WCAG contrast (gamma-linearized) of the role step-9: when
white fails (<3:1) it uses `--color-content-on-solid-contrast` (a dark, new
OPTIONAL `content.onSolidContrast` semantic, #1c1917 in base). Only risk flips
to dark in base (5.89:1); purple/red/teal/green keep white (convention, >=3:1).
An explicit `slots.contrast` override is still honored verbatim.
P2-4 - opaque tinted soft surfaces:
The soft variant tint (Button + Badge `{role}-soft-bg`) was opaque (step-1 track
+ opaque color-mix hover) so it did not composite over non-uniform backgrounds.
New derived tokens `--color-{role}-surface` (= a2) + `--color-{role}-surface-hover`
(= a3) are translucent by construction (compositing-inverse alpha). Button/Badge
soft consume them. Toast/Tabs untouched - they are cards, opacity is correct.
- config-types: optional onSolidContrast + CONTENT_COLOR_OPTIONAL_KEYS.
- config: content keySet allows the optional key; validator value-checks it.
- render-css: wcagContrastRatio/wcagRelativeLuminance; luminance pick; emit
on-solid-contrast + surface/surface-hover.
- contract: on-solid-contrast + surface tokens per role.
- themes/base: onSolidContrast #1c1917 (light + dark).
- recipes/base: Button + Badge soft-bg -> surface, soft-bg-hover -> surface-hover.
- docs: THEMING.md section 24 + section 22 item 2; audit P2-2/P2-4 resolved.
Verified: npm run check (0 new errors), vitest eidos (0 new regressions),
browser runtime (risk 5.89:1 dark text, surfaces translucent rgba).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'fulfill-soft-bg': 'var(--color-fulfill-surface)',
|
|
|
|
|
|
'fulfill-soft-bg-hover': 'var(--color-fulfill-surface-hover)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'fulfill-soft-fg': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'fulfill-outline-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-outline-fg': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'risk-solid-bg': 'var(--color-risk-solid)',
|
|
|
|
|
|
'risk-solid-bg-hover': 'var(--color-risk-solid-hover)',
|
Theming: on-solid contrast by luminance (P2-2) + translucent role surfaces (P2-4)
Two audit P2 quality defects, fixed at engine level.
P2-2 - on-solid text illegible on light solids:
The `contrast` slot defaulted to `--color-content-on-solid` (white) for every
role. On light solids (amber/yellow, risk=orange ~2.3:1) white is sub-AA. The
engine now picks by WCAG contrast (gamma-linearized) of the role step-9: when
white fails (<3:1) it uses `--color-content-on-solid-contrast` (a dark, new
OPTIONAL `content.onSolidContrast` semantic, #1c1917 in base). Only risk flips
to dark in base (5.89:1); purple/red/teal/green keep white (convention, >=3:1).
An explicit `slots.contrast` override is still honored verbatim.
P2-4 - opaque tinted soft surfaces:
The soft variant tint (Button + Badge `{role}-soft-bg`) was opaque (step-1 track
+ opaque color-mix hover) so it did not composite over non-uniform backgrounds.
New derived tokens `--color-{role}-surface` (= a2) + `--color-{role}-surface-hover`
(= a3) are translucent by construction (compositing-inverse alpha). Button/Badge
soft consume them. Toast/Tabs untouched - they are cards, opacity is correct.
- config-types: optional onSolidContrast + CONTENT_COLOR_OPTIONAL_KEYS.
- config: content keySet allows the optional key; validator value-checks it.
- render-css: wcagContrastRatio/wcagRelativeLuminance; luminance pick; emit
on-solid-contrast + surface/surface-hover.
- contract: on-solid-contrast + surface tokens per role.
- themes/base: onSolidContrast #1c1917 (light + dark).
- recipes/base: Button + Badge soft-bg -> surface, soft-bg-hover -> surface-hover.
- docs: THEMING.md section 24 + section 22 item 2; audit P2-2/P2-4 resolved.
Verified: npm run check (0 new errors), vitest eidos (0 new regressions),
browser runtime (risk 5.89:1 dark text, surfaces translucent rgba).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'risk-soft-bg': 'var(--color-risk-surface)',
|
|
|
|
|
|
'risk-soft-bg-hover': 'var(--color-risk-surface-hover)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'risk-soft-fg': 'var(--color-risk-text)',
|
|
|
|
|
|
'risk-outline-border': 'var(--color-risk-border)',
|
|
|
|
|
|
'risk-outline-fg': 'var(--color-risk-text)',
|
|
|
|
|
|
'threat-solid-bg': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-solid-bg-hover': 'var(--color-threat-solid-hover)',
|
Theming: on-solid contrast by luminance (P2-2) + translucent role surfaces (P2-4)
Two audit P2 quality defects, fixed at engine level.
P2-2 - on-solid text illegible on light solids:
The `contrast` slot defaulted to `--color-content-on-solid` (white) for every
role. On light solids (amber/yellow, risk=orange ~2.3:1) white is sub-AA. The
engine now picks by WCAG contrast (gamma-linearized) of the role step-9: when
white fails (<3:1) it uses `--color-content-on-solid-contrast` (a dark, new
OPTIONAL `content.onSolidContrast` semantic, #1c1917 in base). Only risk flips
to dark in base (5.89:1); purple/red/teal/green keep white (convention, >=3:1).
An explicit `slots.contrast` override is still honored verbatim.
P2-4 - opaque tinted soft surfaces:
The soft variant tint (Button + Badge `{role}-soft-bg`) was opaque (step-1 track
+ opaque color-mix hover) so it did not composite over non-uniform backgrounds.
New derived tokens `--color-{role}-surface` (= a2) + `--color-{role}-surface-hover`
(= a3) are translucent by construction (compositing-inverse alpha). Button/Badge
soft consume them. Toast/Tabs untouched - they are cards, opacity is correct.
- config-types: optional onSolidContrast + CONTENT_COLOR_OPTIONAL_KEYS.
- config: content keySet allows the optional key; validator value-checks it.
- render-css: wcagContrastRatio/wcagRelativeLuminance; luminance pick; emit
on-solid-contrast + surface/surface-hover.
- contract: on-solid-contrast + surface tokens per role.
- themes/base: onSolidContrast #1c1917 (light + dark).
- recipes/base: Button + Badge soft-bg -> surface, soft-bg-hover -> surface-hover.
- docs: THEMING.md section 24 + section 22 item 2; audit P2-2/P2-4 resolved.
Verified: npm run check (0 new errors), vitest eidos (0 new regressions),
browser runtime (risk 5.89:1 dark text, surfaces translucent rgba).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'threat-soft-bg': 'var(--color-threat-surface)',
|
|
|
|
|
|
'threat-soft-bg-hover': 'var(--color-threat-surface-hover)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'threat-soft-fg': 'var(--color-threat-text)',
|
|
|
|
|
|
'threat-outline-border': 'var(--color-threat-border)',
|
|
|
|
|
|
'threat-outline-fg': 'var(--color-threat-text)',
|
|
|
|
|
|
'loss-solid-bg': 'var(--color-loss-solid)',
|
|
|
|
|
|
'loss-solid-bg-hover': 'var(--color-loss-solid-hover)',
|
Theming: on-solid contrast by luminance (P2-2) + translucent role surfaces (P2-4)
Two audit P2 quality defects, fixed at engine level.
P2-2 - on-solid text illegible on light solids:
The `contrast` slot defaulted to `--color-content-on-solid` (white) for every
role. On light solids (amber/yellow, risk=orange ~2.3:1) white is sub-AA. The
engine now picks by WCAG contrast (gamma-linearized) of the role step-9: when
white fails (<3:1) it uses `--color-content-on-solid-contrast` (a dark, new
OPTIONAL `content.onSolidContrast` semantic, #1c1917 in base). Only risk flips
to dark in base (5.89:1); purple/red/teal/green keep white (convention, >=3:1).
An explicit `slots.contrast` override is still honored verbatim.
P2-4 - opaque tinted soft surfaces:
The soft variant tint (Button + Badge `{role}-soft-bg`) was opaque (step-1 track
+ opaque color-mix hover) so it did not composite over non-uniform backgrounds.
New derived tokens `--color-{role}-surface` (= a2) + `--color-{role}-surface-hover`
(= a3) are translucent by construction (compositing-inverse alpha). Button/Badge
soft consume them. Toast/Tabs untouched - they are cards, opacity is correct.
- config-types: optional onSolidContrast + CONTENT_COLOR_OPTIONAL_KEYS.
- config: content keySet allows the optional key; validator value-checks it.
- render-css: wcagContrastRatio/wcagRelativeLuminance; luminance pick; emit
on-solid-contrast + surface/surface-hover.
- contract: on-solid-contrast + surface tokens per role.
- themes/base: onSolidContrast #1c1917 (light + dark).
- recipes/base: Button + Badge soft-bg -> surface, soft-bg-hover -> surface-hover.
- docs: THEMING.md section 24 + section 22 item 2; audit P2-2/P2-4 resolved.
Verified: npm run check (0 new errors), vitest eidos (0 new regressions),
browser runtime (risk 5.89:1 dark text, surfaces translucent rgba).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
'loss-soft-bg': 'var(--color-loss-surface)',
|
|
|
|
|
|
'loss-soft-bg-hover': 'var(--color-loss-surface-hover)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'loss-soft-fg': 'var(--color-loss-text)',
|
|
|
|
|
|
'loss-outline-border': 'var(--color-loss-border)',
|
|
|
|
|
|
'loss-outline-fg': 'var(--color-loss-text)',
|
|
|
|
|
|
// Private selected palette (TSC v2.1). 8 colors, 7 slots
|
|
|
|
|
|
// (solid-bg + solid-bg-hover for solid variant, soft-bg +
|
|
|
|
|
|
// soft-bg-hover + soft-fg for soft variant, outline-border +
|
|
|
|
|
|
// outline-fg for outline variant). All 3 variants share the
|
|
|
|
|
|
// same per-color cascade keyed on `data-color`.
|
|
|
|
|
|
'_selected-solid-bg': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tag-group-primary-solid-bg)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tag-group-secondary-solid-bg)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tag-group-neutral-solid-bg)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tag-group-affirm-solid-bg)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tag-group-fulfill-solid-bg)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tag-group-risk-solid-bg)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tag-group-threat-solid-bg)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tag-group-loss-solid-bg)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_selected-solid-bg-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tag-group-primary-solid-bg-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tag-group-secondary-solid-bg-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tag-group-neutral-solid-bg-hover)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tag-group-affirm-solid-bg-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tag-group-fulfill-solid-bg-hover)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tag-group-risk-solid-bg-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tag-group-threat-solid-bg-hover)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tag-group-loss-solid-bg-hover)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_selected-soft-bg': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tag-group-primary-soft-bg)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tag-group-secondary-soft-bg)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tag-group-neutral-soft-bg)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tag-group-affirm-soft-bg)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tag-group-fulfill-soft-bg)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tag-group-risk-soft-bg)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tag-group-threat-soft-bg)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tag-group-loss-soft-bg)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_selected-soft-bg-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tag-group-primary-soft-bg-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tag-group-secondary-soft-bg-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tag-group-neutral-soft-bg-hover)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tag-group-affirm-soft-bg-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tag-group-fulfill-soft-bg-hover)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tag-group-risk-soft-bg-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tag-group-threat-soft-bg-hover)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tag-group-loss-soft-bg-hover)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_selected-soft-fg': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tag-group-primary-soft-fg)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tag-group-secondary-soft-fg)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tag-group-neutral-soft-fg)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tag-group-affirm-soft-fg)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tag-group-fulfill-soft-fg)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tag-group-risk-soft-fg)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tag-group-threat-soft-fg)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tag-group-loss-soft-fg)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_selected-outline-border': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tag-group-primary-outline-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tag-group-secondary-outline-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tag-group-neutral-outline-border)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tag-group-affirm-outline-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tag-group-fulfill-outline-border)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tag-group-risk-outline-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tag-group-threat-outline-border)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tag-group-loss-outline-border)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_selected-outline-fg': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tag-group-primary-outline-fg)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tag-group-secondary-outline-fg)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tag-group-neutral-outline-fg)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tag-group-affirm-outline-fg)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tag-group-fulfill-outline-fg)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tag-group-risk-outline-fg)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tag-group-threat-outline-fg)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tag-group-loss-outline-fg)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
editable: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-2-5)',
|
|
|
|
|
|
'control-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'control-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'control-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'control-height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'control-px-xs': 'var(--space-1-5)',
|
|
|
|
|
|
'control-px-sm': 'var(--space-2)',
|
|
|
|
|
|
'control-px-md': 'var(--space-2-5)',
|
|
|
|
|
|
'control-px-lg': 'var(--space-3)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-px-xl': 'var(--space-3-5)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-md)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': 'var(--font-size-lg)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'area-min-inline-size': '12ch',
|
|
|
|
|
|
'control-radius': 'var(--radius-md)',
|
|
|
|
|
|
'control-border-width': 'var(--border-width)',
|
|
|
|
|
|
'control-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'control-border-hover': 'var(--color-border-default)',
|
|
|
|
|
|
'control-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'control-shadow': 'var(--shadow-subtle)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'trigger-gap': 'var(--space-1)',
|
|
|
|
|
|
'trigger-px': 'var(--space-2-5)',
|
|
|
|
|
|
'trigger-radius': 'var(--radius-md)',
|
|
|
|
|
|
'trigger-border-width': 'var(--border-width)',
|
|
|
|
|
|
'trigger-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'trigger-border-hover': 'var(--color-border-default)',
|
|
|
|
|
|
'trigger-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'trigger-bg-hover': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'trigger-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'trigger-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'submit-color': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.5',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'risk-solid': 'var(--color-risk-solid)',
|
|
|
|
|
|
'threat-solid': 'var(--color-threat-solid)',
|
|
|
|
|
|
// Restored after accidental sed-removal during switch migration.
|
|
|
|
|
|
'primary-border': 'var(--color-primary-border)',
|
|
|
|
|
|
'secondary-border': 'var(--color-secondary-border)',
|
|
|
|
|
|
'neutral-border': 'var(--color-neutral-border)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'risk-border': 'var(--color-risk-border)',
|
|
|
|
|
|
'threat-border': 'var(--color-threat-border)',
|
|
|
|
|
|
// Private accent palette (TSC v2.1). Only solid + border +
|
|
|
|
|
|
// solid-hover are consumed; track/text declared pre-TSC but unused.
|
|
|
|
|
|
'_accent-solid': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--editable-primary-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--editable-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--editable-neutral-solid)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--editable-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--editable-risk-solid)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--editable-threat-solid)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-border': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--editable-primary-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--editable-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--editable-neutral-border)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--editable-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--editable-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--editable-threat-border)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-solid-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--color-primary-solid-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--color-secondary-solid-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--color-neutral-solid-hover)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--color-affirm-solid-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--color-risk-solid-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--color-threat-solid-hover)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
Build TextArea component + fix locale propagation bug across soma providers
Major work in this session:
1. NumberField demo refactored to expose Intl.NumberFormatOptions live
- 9 canonical presets (currency/unit/percent/compact/plain)
- Locale/currency/unit lists derived from $libs/langs, $libs/currency,
$format/units (no more hardcoded arrays)
- Default locale from uix.format.numbers.getLocale()
2. Bug fix: locale prop ignored when soma.format service is active
- soma/NumberField: 5 bypass points via new `hasOwnLocale` getter
(decimalSeparator, groupSeparator, formatValue, formatEditValue, parseValue)
- soma/Calendar: dateOrder respects locale prop (matches DateField precedence)
- soma/RangeCalendar: same dateOrder fix
- When the consumer passes `locale` prop, soma.nums/dates is bypassed
and Intl is used directly with the prop locale
3. TextArea — new component, full 4-layer stack
- morfo: 3 parts (provider/input/count), 3 events
(commit-input/commit-submit/shift-count-overflow), APG textbox
- soma: TextAreaProvider with autosize (scrollHeight measurement),
submitOn modes (false|enter|shift+enter|mod+enter), maxLength soft clamp,
Field integration (OR-merge), counter overflow tracking
- eidos: 5 sizes × 3 variants × 8 colors, autosize suppresses CSS resize
- sema: commit-submit + shift-count-overflow perceptual cues
- demo: canonical 6-tab depth, all props exposed as live controls
- PrimitiveTextareaAttributes added to soma/types/html.ts
4. Also includes accumulated unreleased work from prior sessions:
- Eidos ports: announce, clipboard, drag-drop, feed, table,
tree-grid, tree-view, virtual-grid, virtual-list, words
- Their canonical demos under web/routes/uix/components/
- Semantic events defined for utility morfos
(announce/clipboard/virtual-list/virtual-grid)
- Tree indent guides fixed (TreeView ::before, TreeGrid stacked gradients)
- Sidebar reorganized with Data + Utilities groups
- Eidos words content layer and primitives
Reference library survey performed before TextArea API design (Mantine,
Radix Themes, Chakra v3, React Aria, Ark UI, Bits UI, shadcn, MUI, Prime).
Decision documented: no separate CurrencyField/UnitField — single
NumberField with formatOptions is the canon (matches all surveyed
headless libs except PrimeReact's mode enum, which still uses 1 component).
svelte-check: 0 errors in modified/created files.
See CONTINUE.md for full session notes and next steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
words: {
|
|
|
|
|
|
// 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.
|
|
|
|
|
|
'radius-xs': 'var(--radius-sm)',
|
Build TextArea component + fix locale propagation bug across soma providers
Major work in this session:
1. NumberField demo refactored to expose Intl.NumberFormatOptions live
- 9 canonical presets (currency/unit/percent/compact/plain)
- Locale/currency/unit lists derived from $libs/langs, $libs/currency,
$format/units (no more hardcoded arrays)
- Default locale from uix.format.numbers.getLocale()
2. Bug fix: locale prop ignored when soma.format service is active
- soma/NumberField: 5 bypass points via new `hasOwnLocale` getter
(decimalSeparator, groupSeparator, formatValue, formatEditValue, parseValue)
- soma/Calendar: dateOrder respects locale prop (matches DateField precedence)
- soma/RangeCalendar: same dateOrder fix
- When the consumer passes `locale` prop, soma.nums/dates is bypassed
and Intl is used directly with the prop locale
3. TextArea — new component, full 4-layer stack
- morfo: 3 parts (provider/input/count), 3 events
(commit-input/commit-submit/shift-count-overflow), APG textbox
- soma: TextAreaProvider with autosize (scrollHeight measurement),
submitOn modes (false|enter|shift+enter|mod+enter), maxLength soft clamp,
Field integration (OR-merge), counter overflow tracking
- eidos: 5 sizes × 3 variants × 8 colors, autosize suppresses CSS resize
- sema: commit-submit + shift-count-overflow perceptual cues
- demo: canonical 6-tab depth, all props exposed as live controls
- PrimitiveTextareaAttributes added to soma/types/html.ts
4. Also includes accumulated unreleased work from prior sessions:
- Eidos ports: announce, clipboard, drag-drop, feed, table,
tree-grid, tree-view, virtual-grid, virtual-list, words
- Their canonical demos under web/routes/uix/components/
- Semantic events defined for utility morfos
(announce/clipboard/virtual-list/virtual-grid)
- Tree indent guides fixed (TreeView ::before, TreeGrid stacked gradients)
- Sidebar reorganized with Data + Utilities groups
- Eidos words content layer and primitives
Reference library survey performed before TextArea API design (Mantine,
Radix Themes, Chakra v3, React Aria, Ark UI, Bits UI, shadcn, MUI, Prime).
Decision documented: no separate CurrencyField/UnitField — single
NumberField with formatOptions is the canon (matches all surveyed
headless libs except PrimeReact's mode enum, which still uses 1 component).
svelte-check: 0 errors in modified/created files.
See CONTINUE.md for full session notes and next steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'radius-sm': 'var(--radius-md)',
|
|
|
|
|
|
'radius-md': 'var(--radius-lg)',
|
|
|
|
|
|
'radius-lg': 'var(--radius-xl)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
border: 'var(--color-border-subtle)',
|
|
|
|
|
|
'border-hover': 'var(--color-border-default)',
|
|
|
|
|
|
bg: 'var(--color-surface-raised)',
|
|
|
|
|
|
shadow: 'var(--shadow-subtle)',
|
Build TextArea component + fix locale propagation bug across soma providers
Major work in this session:
1. NumberField demo refactored to expose Intl.NumberFormatOptions live
- 9 canonical presets (currency/unit/percent/compact/plain)
- Locale/currency/unit lists derived from $libs/langs, $libs/currency,
$format/units (no more hardcoded arrays)
- Default locale from uix.format.numbers.getLocale()
2. Bug fix: locale prop ignored when soma.format service is active
- soma/NumberField: 5 bypass points via new `hasOwnLocale` getter
(decimalSeparator, groupSeparator, formatValue, formatEditValue, parseValue)
- soma/Calendar: dateOrder respects locale prop (matches DateField precedence)
- soma/RangeCalendar: same dateOrder fix
- When the consumer passes `locale` prop, soma.nums/dates is bypassed
and Intl is used directly with the prop locale
3. TextArea — new component, full 4-layer stack
- morfo: 3 parts (provider/input/count), 3 events
(commit-input/commit-submit/shift-count-overflow), APG textbox
- soma: TextAreaProvider with autosize (scrollHeight measurement),
submitOn modes (false|enter|shift+enter|mod+enter), maxLength soft clamp,
Field integration (OR-merge), counter overflow tracking
- eidos: 5 sizes × 3 variants × 8 colors, autosize suppresses CSS resize
- sema: commit-submit + shift-count-overflow perceptual cues
- demo: canonical 6-tab depth, all props exposed as live controls
- PrimitiveTextareaAttributes added to soma/types/html.ts
4. Also includes accumulated unreleased work from prior sessions:
- Eidos ports: announce, clipboard, drag-drop, feed, table,
tree-grid, tree-view, virtual-grid, virtual-list, words
- Their canonical demos under web/routes/uix/components/
- Semantic events defined for utility morfos
(announce/clipboard/virtual-list/virtual-grid)
- Tree indent guides fixed (TreeView ::before, TreeGrid stacked gradients)
- Sidebar reorganized with Data + Utilities groups
- Eidos words content layer and primitives
Reference library survey performed before TextArea API design (Mantine,
Radix Themes, Chakra v3, React Aria, Ark UI, Bits UI, shadcn, MUI, Prime).
Decision documented: no separate CurrencyField/UnitField — single
NumberField with formatOptions is the canon (matches all surveyed
headless libs except PrimeReact's mode enum, which still uses 1 component).
svelte-check: 0 errors in modified/created files.
See CONTINUE.md for full session notes and next steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-md)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'disabled-opacity': '0.5',
|
|
|
|
|
|
// Smallest doc-chrome size (breadcrumb, cell labels) — one step under `sm`.
|
|
|
|
|
|
'font-size-xs': '0.6875rem',
|
|
|
|
|
|
// Wash scale: ONE canonical set of color-mix opacities for the editor's
|
|
|
|
|
|
// accent/role tints (header washes, hover fills, glows, focus rings).
|
|
|
|
|
|
// Replaces the ad-hoc 4/8/12/14/16/22/30/35/40/45/50 % soup with 4 steps.
|
|
|
|
|
|
// They are percentages, applied to whatever base color each surface mixes.
|
|
|
|
|
|
'wash-faint': '6%',
|
|
|
|
|
|
'wash-subtle': '16%',
|
|
|
|
|
|
'wash-soft': '30%',
|
|
|
|
|
|
'wash-strong': '44%',
|
|
|
|
|
|
// 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)',
|
|
|
|
|
|
// The CHROME typeface (toolbar · bubble · drawer · inspector · menus). Always a
|
|
|
|
|
|
// UI sans, INDEPENDENT of `font-family` (the content/reading font, which a theme
|
|
|
|
|
|
// may set to serif). Keeps every control + label in one face.
|
|
|
|
|
|
'chrome-font': 'var(--font-ui)',
|
|
|
|
|
|
// The inline-control tier height — every control sitting on an inspector
|
|
|
|
|
|
// row (number-field, colour trigger, ToggleGroup chip) shares ONE height
|
|
|
|
|
|
// so a row of mixed controls aligns. 1.75rem (28px) was the number-field's
|
|
|
|
|
|
// magic height; named here and applied uniformly to kill the 26/28/36 mix.
|
|
|
|
|
|
'control-height': '1.75rem',
|
|
|
|
|
|
// Fixed width for the right-hand control in an inline inspector row so the
|
|
|
|
|
|
// panel's right edge reads as a clean column (number-field was 6.75rem,
|
|
|
|
|
|
// colour trigger 7.5rem — a ragged edge). 7.5rem fits the 8-char alpha hex.
|
|
|
|
|
|
'field-width': '7.5rem',
|
Build TextArea component + fix locale propagation bug across soma providers
Major work in this session:
1. NumberField demo refactored to expose Intl.NumberFormatOptions live
- 9 canonical presets (currency/unit/percent/compact/plain)
- Locale/currency/unit lists derived from $libs/langs, $libs/currency,
$format/units (no more hardcoded arrays)
- Default locale from uix.format.numbers.getLocale()
2. Bug fix: locale prop ignored when soma.format service is active
- soma/NumberField: 5 bypass points via new `hasOwnLocale` getter
(decimalSeparator, groupSeparator, formatValue, formatEditValue, parseValue)
- soma/Calendar: dateOrder respects locale prop (matches DateField precedence)
- soma/RangeCalendar: same dateOrder fix
- When the consumer passes `locale` prop, soma.nums/dates is bypassed
and Intl is used directly with the prop locale
3. TextArea — new component, full 4-layer stack
- morfo: 3 parts (provider/input/count), 3 events
(commit-input/commit-submit/shift-count-overflow), APG textbox
- soma: TextAreaProvider with autosize (scrollHeight measurement),
submitOn modes (false|enter|shift+enter|mod+enter), maxLength soft clamp,
Field integration (OR-merge), counter overflow tracking
- eidos: 5 sizes × 3 variants × 8 colors, autosize suppresses CSS resize
- sema: commit-submit + shift-count-overflow perceptual cues
- demo: canonical 6-tab depth, all props exposed as live controls
- PrimitiveTextareaAttributes added to soma/types/html.ts
4. Also includes accumulated unreleased work from prior sessions:
- Eidos ports: announce, clipboard, drag-drop, feed, table,
tree-grid, tree-view, virtual-grid, virtual-list, words
- Their canonical demos under web/routes/uix/components/
- Semantic events defined for utility morfos
(announce/clipboard/virtual-list/virtual-grid)
- Tree indent guides fixed (TreeView ::before, TreeGrid stacked gradients)
- Sidebar reorganized with Data + Utilities groups
- Eidos words content layer and primitives
Reference library survey performed before TextArea API design (Mantine,
Radix Themes, Chakra v3, React Aria, Ark UI, Bits UI, shadcn, MUI, Prime).
Decision documented: no separate CurrencyField/UnitField — single
NumberField with formatOptions is the canon (matches all surveyed
headless libs except PrimeReact's mode enum, which still uses 1 component).
svelte-check: 0 errors in modified/created files.
See CONTINUE.md for full session notes and next steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'command-gap': 'var(--space-1)',
|
|
|
|
|
|
'command-radius': 'var(--radius-md)',
|
|
|
|
|
|
'command-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'command-solid-color': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'content-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'content-py-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'content-py-md': 'var(--space-3)',
|
|
|
|
|
|
'content-py-lg': 'var(--space-4)',
|
|
|
|
|
|
'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',
|
|
|
|
|
|
// 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)',
|
Build TextArea component + fix locale propagation bug across soma providers
Major work in this session:
1. NumberField demo refactored to expose Intl.NumberFormatOptions live
- 9 canonical presets (currency/unit/percent/compact/plain)
- Locale/currency/unit lists derived from $libs/langs, $libs/currency,
$format/units (no more hardcoded arrays)
- Default locale from uix.format.numbers.getLocale()
2. Bug fix: locale prop ignored when soma.format service is active
- soma/NumberField: 5 bypass points via new `hasOwnLocale` getter
(decimalSeparator, groupSeparator, formatValue, formatEditValue, parseValue)
- soma/Calendar: dateOrder respects locale prop (matches DateField precedence)
- soma/RangeCalendar: same dateOrder fix
- When the consumer passes `locale` prop, soma.nums/dates is bypassed
and Intl is used directly with the prop locale
3. TextArea — new component, full 4-layer stack
- morfo: 3 parts (provider/input/count), 3 events
(commit-input/commit-submit/shift-count-overflow), APG textbox
- soma: TextAreaProvider with autosize (scrollHeight measurement),
submitOn modes (false|enter|shift+enter|mod+enter), maxLength soft clamp,
Field integration (OR-merge), counter overflow tracking
- eidos: 5 sizes × 3 variants × 8 colors, autosize suppresses CSS resize
- sema: commit-submit + shift-count-overflow perceptual cues
- demo: canonical 6-tab depth, all props exposed as live controls
- PrimitiveTextareaAttributes added to soma/types/html.ts
4. Also includes accumulated unreleased work from prior sessions:
- Eidos ports: announce, clipboard, drag-drop, feed, table,
tree-grid, tree-view, virtual-grid, virtual-list, words
- Their canonical demos under web/routes/uix/components/
- Semantic events defined for utility morfos
(announce/clipboard/virtual-list/virtual-grid)
- Tree indent guides fixed (TreeView ::before, TreeGrid stacked gradients)
- Sidebar reorganized with Data + Utilities groups
- Eidos words content layer and primitives
Reference library survey performed before TextArea API design (Mantine,
Radix Themes, Chakra v3, React Aria, Ark UI, Bits UI, shadcn, MUI, Prime).
Decision documented: no separate CurrencyField/UnitField — single
NumberField with formatOptions is the canon (matches all surveyed
headless libs except PrimeReact's mode enum, which still uses 1 component).
svelte-check: 0 errors in modified/created files.
See CONTINUE.md for full session notes and next steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'heading-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'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)',
|
Build TextArea component + fix locale propagation bug across soma providers
Major work in this session:
1. NumberField demo refactored to expose Intl.NumberFormatOptions live
- 9 canonical presets (currency/unit/percent/compact/plain)
- Locale/currency/unit lists derived from $libs/langs, $libs/currency,
$format/units (no more hardcoded arrays)
- Default locale from uix.format.numbers.getLocale()
2. Bug fix: locale prop ignored when soma.format service is active
- soma/NumberField: 5 bypass points via new `hasOwnLocale` getter
(decimalSeparator, groupSeparator, formatValue, formatEditValue, parseValue)
- soma/Calendar: dateOrder respects locale prop (matches DateField precedence)
- soma/RangeCalendar: same dateOrder fix
- When the consumer passes `locale` prop, soma.nums/dates is bypassed
and Intl is used directly with the prop locale
3. TextArea — new component, full 4-layer stack
- morfo: 3 parts (provider/input/count), 3 events
(commit-input/commit-submit/shift-count-overflow), APG textbox
- soma: TextAreaProvider with autosize (scrollHeight measurement),
submitOn modes (false|enter|shift+enter|mod+enter), maxLength soft clamp,
Field integration (OR-merge), counter overflow tracking
- eidos: 5 sizes × 3 variants × 8 colors, autosize suppresses CSS resize
- sema: commit-submit + shift-count-overflow perceptual cues
- demo: canonical 6-tab depth, all props exposed as live controls
- PrimitiveTextareaAttributes added to soma/types/html.ts
4. Also includes accumulated unreleased work from prior sessions:
- Eidos ports: announce, clipboard, drag-drop, feed, table,
tree-grid, tree-view, virtual-grid, virtual-list, words
- Their canonical demos under web/routes/uix/components/
- Semantic events defined for utility morfos
(announce/clipboard/virtual-list/virtual-grid)
- Tree indent guides fixed (TreeView ::before, TreeGrid stacked gradients)
- Sidebar reorganized with Data + Utilities groups
- Eidos words content layer and primitives
Reference library survey performed before TextArea API design (Mantine,
Radix Themes, Chakra v3, React Aria, Ark UI, Bits UI, shadcn, MUI, Prime).
Decision documented: no separate CurrencyField/UnitField — single
NumberField with formatOptions is the canon (matches all surveyed
headless libs except PrimeReact's mode enum, which still uses 1 component).
svelte-check: 0 errors in modified/created files.
See CONTINUE.md for full session notes and next steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'heading-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'heading-line-height': 'var(--leading-heading)',
|
|
|
|
|
|
'strong-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'code-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'code-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'code-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'code-font-family': 'var(--font-mono)',
|
|
|
|
|
|
'code-py': 'var(--space-0-5)',
|
|
|
|
|
|
'code-px': 'var(--space-1)',
|
|
|
|
|
|
'quote-px': 'var(--space-3)',
|
|
|
|
|
|
'quote-border-width': 'var(--border-width-thick)',
|
Build TextArea component + fix locale propagation bug across soma providers
Major work in this session:
1. NumberField demo refactored to expose Intl.NumberFormatOptions live
- 9 canonical presets (currency/unit/percent/compact/plain)
- Locale/currency/unit lists derived from $libs/langs, $libs/currency,
$format/units (no more hardcoded arrays)
- Default locale from uix.format.numbers.getLocale()
2. Bug fix: locale prop ignored when soma.format service is active
- soma/NumberField: 5 bypass points via new `hasOwnLocale` getter
(decimalSeparator, groupSeparator, formatValue, formatEditValue, parseValue)
- soma/Calendar: dateOrder respects locale prop (matches DateField precedence)
- soma/RangeCalendar: same dateOrder fix
- When the consumer passes `locale` prop, soma.nums/dates is bypassed
and Intl is used directly with the prop locale
3. TextArea — new component, full 4-layer stack
- morfo: 3 parts (provider/input/count), 3 events
(commit-input/commit-submit/shift-count-overflow), APG textbox
- soma: TextAreaProvider with autosize (scrollHeight measurement),
submitOn modes (false|enter|shift+enter|mod+enter), maxLength soft clamp,
Field integration (OR-merge), counter overflow tracking
- eidos: 5 sizes × 3 variants × 8 colors, autosize suppresses CSS resize
- sema: commit-submit + shift-count-overflow perceptual cues
- demo: canonical 6-tab depth, all props exposed as live controls
- PrimitiveTextareaAttributes added to soma/types/html.ts
4. Also includes accumulated unreleased work from prior sessions:
- Eidos ports: announce, clipboard, drag-drop, feed, table,
tree-grid, tree-view, virtual-grid, virtual-list, words
- Their canonical demos under web/routes/uix/components/
- Semantic events defined for utility morfos
(announce/clipboard/virtual-list/virtual-grid)
- Tree indent guides fixed (TreeView ::before, TreeGrid stacked gradients)
- Sidebar reorganized with Data + Utilities groups
- Eidos words content layer and primitives
Reference library survey performed before TextArea API design (Mantine,
Radix Themes, Chakra v3, React Aria, Ark UI, Bits UI, shadcn, MUI, Prime).
Decision documented: no separate CurrencyField/UnitField — single
NumberField with formatOptions is the canon (matches all surveyed
headless libs except PrimeReact's mode enum, which still uses 1 component).
svelte-check: 0 errors in modified/created files.
See CONTINUE.md for full session notes and next steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'quote-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'list-padding-inline-start': 'var(--space-5)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'fulfill-solid': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'fulfill-track': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'fulfill-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-text': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'risk-text': 'var(--color-risk-text)',
|
|
|
|
|
|
'threat-solid': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-text': 'var(--color-threat-text)',
|
|
|
|
|
|
'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-border': 'var(--color-primary-border)',
|
|
|
|
|
|
'neutral-track': 'var(--color-neutral-track)',
|
|
|
|
|
|
'neutral-border': 'var(--color-neutral-border)',
|
|
|
|
|
|
'affirm-track': 'var(--color-affirm-track)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'risk-track': 'var(--color-risk-track)',
|
|
|
|
|
|
'risk-border': 'var(--color-risk-border)',
|
|
|
|
|
|
'threat-track': 'var(--color-threat-track)',
|
|
|
|
|
|
'threat-border': 'var(--color-threat-border)'
|
Build TextArea component + fix locale propagation bug across soma providers
Major work in this session:
1. NumberField demo refactored to expose Intl.NumberFormatOptions live
- 9 canonical presets (currency/unit/percent/compact/plain)
- Locale/currency/unit lists derived from $libs/langs, $libs/currency,
$format/units (no more hardcoded arrays)
- Default locale from uix.format.numbers.getLocale()
2. Bug fix: locale prop ignored when soma.format service is active
- soma/NumberField: 5 bypass points via new `hasOwnLocale` getter
(decimalSeparator, groupSeparator, formatValue, formatEditValue, parseValue)
- soma/Calendar: dateOrder respects locale prop (matches DateField precedence)
- soma/RangeCalendar: same dateOrder fix
- When the consumer passes `locale` prop, soma.nums/dates is bypassed
and Intl is used directly with the prop locale
3. TextArea — new component, full 4-layer stack
- morfo: 3 parts (provider/input/count), 3 events
(commit-input/commit-submit/shift-count-overflow), APG textbox
- soma: TextAreaProvider with autosize (scrollHeight measurement),
submitOn modes (false|enter|shift+enter|mod+enter), maxLength soft clamp,
Field integration (OR-merge), counter overflow tracking
- eidos: 5 sizes × 3 variants × 8 colors, autosize suppresses CSS resize
- sema: commit-submit + shift-count-overflow perceptual cues
- demo: canonical 6-tab depth, all props exposed as live controls
- PrimitiveTextareaAttributes added to soma/types/html.ts
4. Also includes accumulated unreleased work from prior sessions:
- Eidos ports: announce, clipboard, drag-drop, feed, table,
tree-grid, tree-view, virtual-grid, virtual-list, words
- Their canonical demos under web/routes/uix/components/
- Semantic events defined for utility morfos
(announce/clipboard/virtual-list/virtual-grid)
- Tree indent guides fixed (TreeView ::before, TreeGrid stacked gradients)
- Sidebar reorganized with Data + Utilities groups
- Eidos words content layer and primitives
Reference library survey performed before TextArea API design (Mantine,
Radix Themes, Chakra v3, React Aria, Ark UI, Bits UI, shadcn, MUI, Prime).
Decision documented: no separate CurrencyField/UnitField — single
NumberField with formatOptions is the canon (matches all surveyed
headless libs except PrimeReact's mode enum, which still uses 1 component).
svelte-check: 0 errors in modified/created files.
See CONTINUE.md for full session notes and next steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
},
|
|
|
|
|
|
'tags-input': {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-2)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-3)',
|
|
|
|
|
|
'control-min-height-xs': 'var(--control-height-sm)',
|
|
|
|
|
|
'control-min-height-sm': 'var(--control-height-md)',
|
|
|
|
|
|
'control-min-height-md': 'var(--control-height-lg)',
|
|
|
|
|
|
'control-min-height-lg': 'calc(var(--control-height-lg) + var(--space-2))',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-min-height-xl': 'calc(var(--control-height-xl) + var(--space-2))',
|
|
|
|
|
|
'control-px-xs': 'var(--space-1-5)',
|
|
|
|
|
|
'control-px-sm': 'var(--space-2)',
|
|
|
|
|
|
'control-px-md': 'var(--space-2-5)',
|
|
|
|
|
|
'control-px-lg': 'var(--space-3)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-px-xl': 'var(--space-3-5)',
|
|
|
|
|
|
'control-py-xs': 'var(--space-0-5)',
|
|
|
|
|
|
'control-py-sm': 'var(--space-1)',
|
|
|
|
|
|
'control-py-md': 'var(--space-1-5)',
|
|
|
|
|
|
'control-py-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'control-py-xl': 'var(--space-2-5)',
|
|
|
|
|
|
'item-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'item-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'item-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'item-height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'item-px-xs': 'var(--space-1-5)',
|
|
|
|
|
|
'item-px-sm': 'var(--space-2)',
|
|
|
|
|
|
'item-px-md': 'var(--space-2-5)',
|
|
|
|
|
|
'item-px-lg': 'var(--space-3)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'item-px-xl': 'var(--space-3-5)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-md)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': 'var(--font-size-lg)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'item-gap': 'var(--space-1-5)',
|
|
|
|
|
|
'control-radius': 'var(--radius-lg)',
|
|
|
|
|
|
'control-border-width': 'var(--border-width)',
|
|
|
|
|
|
'control-border': 'var(--color-border-default)',
|
|
|
|
|
|
'control-border-hover': 'var(--color-border-strong)',
|
|
|
|
|
|
'control-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'control-shadow': 'var(--shadow-subtle)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'input-min-inline-size': '8ch',
|
|
|
|
|
|
'placeholder-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'item-radius': 'var(--radius-full)',
|
|
|
|
|
|
'item-border-width': 'var(--border-width)',
|
|
|
|
|
|
'item-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'item-bg': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'item-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'action-gap': 'var(--space-1)',
|
|
|
|
|
|
'action-px': 'var(--space-2-5)',
|
|
|
|
|
|
'action-radius': 'var(--radius-md)',
|
|
|
|
|
|
'action-border-width': 'var(--border-width)',
|
|
|
|
|
|
'action-border': 'transparent',
|
|
|
|
|
|
'action-border-hover': 'var(--color-border-subtle)',
|
|
|
|
|
|
'action-bg': 'transparent',
|
|
|
|
|
|
'action-bg-hover': 'color-mix(in srgb, currentColor 10%, transparent)',
|
|
|
|
|
|
'action-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'action-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'delete-size': 'var(--control-height-xs)',
|
|
|
|
|
|
'delete-radius': 'var(--radius-full)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.52',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'neutral-text': 'var(--color-neutral-text)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'fulfill-track': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'fulfill-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-text': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'risk-text': 'var(--color-risk-text)',
|
|
|
|
|
|
'threat-text': 'var(--color-threat-text)',
|
|
|
|
|
|
'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 tags-input.css for tag chip color cues per intent.
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'risk-track': 'var(--color-risk-track)',
|
|
|
|
|
|
'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, 3 slots (track,
|
|
|
|
|
|
// border, text). `solid` was declared pre-TSC but never consumed.
|
|
|
|
|
|
'_accent-track': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tags-input-primary-track)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tags-input-secondary-track)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tags-input-neutral-track)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tags-input-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tags-input-fulfill-track)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tags-input-risk-track)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tags-input-threat-track)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tags-input-loss-track)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-border': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tags-input-primary-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tags-input-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tags-input-neutral-border)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tags-input-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tags-input-fulfill-border)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tags-input-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tags-input-threat-border)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tags-input-loss-border)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-text': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--tags-input-primary-text)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--tags-input-secondary-text)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--tags-input-neutral-text)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--tags-input-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--tags-input-fulfill-text)', scope: 'color:fulfill' },
|
|
|
|
|
|
{ value: 'var(--tags-input-risk-text)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--tags-input-threat-text)', scope: 'color:threat' },
|
|
|
|
|
|
{ value: 'var(--tags-input-loss-text)', scope: 'color:loss' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
stepper: {
|
|
|
|
|
|
'gap-sm': 'var(--space-3)',
|
|
|
|
|
|
'gap-md': 'var(--space-4)',
|
|
|
|
|
|
'gap-lg': 'var(--space-5)',
|
|
|
|
|
|
'indicator-size-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'indicator-size-md': 'var(--control-height-md)',
|
|
|
|
|
|
'indicator-size-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
'list-gap': 'var(--space-1)',
|
|
|
|
|
|
'item-gap': 'var(--space-2)',
|
|
|
|
|
|
'trigger-gap': 'var(--space-2)',
|
|
|
|
|
|
'trigger-px': 'var(--space-2)',
|
|
|
|
|
|
'trigger-py': 'var(--space-1)',
|
|
|
|
|
|
'trigger-radius': 'var(--radius-md)',
|
|
|
|
|
|
'trigger-border-width': 'var(--border-width)',
|
|
|
|
|
|
'trigger-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'trigger-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-bg-hover': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'indicator-radius': 'var(--radius-full)',
|
|
|
|
|
|
'indicator-border-width': 'var(--border-width)',
|
|
|
|
|
|
'indicator-border': 'var(--color-border-default)',
|
|
|
|
|
|
'indicator-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'indicator-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'indicator-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'complete-color': 'var(--color-content-on-solid)',
|
|
|
|
|
|
'separator-min-size': '3rem',
|
|
|
|
|
|
'separator-thickness': 'var(--border-width-thick)',
|
|
|
|
|
|
'separator-radius': 'var(--radius-full)',
|
|
|
|
|
|
'separator-bg': 'var(--color-border-subtle)',
|
|
|
|
|
|
'content-padding': 'var(--space-4)',
|
|
|
|
|
|
'content-radius': 'var(--radius-lg)',
|
|
|
|
|
|
'content-border-width': 'var(--border-width)',
|
|
|
|
|
|
'content-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'content-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'content-shadow': 'var(--shadow-subtle)',
|
|
|
|
|
|
'nav-height': 'var(--control-height-md)',
|
|
|
|
|
|
'nav-px': 'var(--space-3)',
|
|
|
|
|
|
'nav-radius': 'var(--radius-md)',
|
|
|
|
|
|
'nav-border-width': 'var(--border-width)',
|
|
|
|
|
|
'nav-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'nav-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'nav-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'nav-hover-brightness': '1.04',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.45',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-text': 'var(--color-neutral-text)',
|
|
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'fulfill-solid': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'fulfill-track': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'fulfill-border': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-text': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'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)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
// Private accent palette (TSC v2.1). Per-color cascade in config.
|
|
|
|
|
|
'_accent-solid': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--stepper-primary-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--stepper-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--stepper-neutral-solid)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--stepper-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--stepper-fulfill-solid)', scope: 'color:fulfill' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-track': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--stepper-primary-track)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--stepper-secondary-track)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--stepper-neutral-track)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--stepper-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--stepper-fulfill-track)', scope: 'color:fulfill' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-border': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--stepper-primary-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--stepper-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--stepper-neutral-border)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--stepper-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--stepper-fulfill-border)', scope: 'color:fulfill' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_accent-text': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--stepper-primary-text)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--stepper-secondary-text)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--stepper-neutral-text)', scope: 'color:neutral' },
|
|
|
|
|
|
{ value: 'var(--stepper-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--stepper-fulfill-text)', scope: 'color:fulfill' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
slider: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'track-size-xs': '3px',
|
|
|
|
|
|
'track-size-sm': '4px',
|
|
|
|
|
|
'track-size-md': '6px',
|
|
|
|
|
|
'track-size-lg': '8px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'track-size-xl': '10px',
|
|
|
|
|
|
'thumb-size-xs': '12px',
|
|
|
|
|
|
'thumb-size-sm': '16px',
|
|
|
|
|
|
'thumb-size-md': '20px',
|
|
|
|
|
|
'thumb-size-lg': '24px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'thumb-size-xl': '28px',
|
|
|
|
|
|
'hit-size-xs': '24px',
|
|
|
|
|
|
'hit-size-sm': '28px',
|
|
|
|
|
|
'hit-size-md': '32px',
|
|
|
|
|
|
'hit-size-lg': '36px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'hit-size-xl': '40px',
|
|
|
|
|
|
'tick-size-xs': '3px',
|
|
|
|
|
|
'tick-size-sm': '4px',
|
|
|
|
|
|
'tick-size-md': '5px',
|
|
|
|
|
|
'tick-size-lg': '6px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'tick-size-xl': '7px',
|
|
|
|
|
|
'min-inline-size': '12rem',
|
|
|
|
|
|
'min-block-size': '10rem',
|
|
|
|
|
|
'track-radius': 'var(--radius-full)',
|
feat(uix): cropper, image-picker, image-adjustments + reusable zoom-pan layer
Three new components across all 4 layers (morfo/soma/sema/eidos) + demos + langs + READMEs:
- ImageAdjustments — reusable image-filter sliders subcomponent.
- ImagePicker — composes file-upload + image + image-adjustments (fill modes, rotation).
- Cropper — Ark image-cropper anatomy: normalized 0-1 crop rect, rect + round shapes,
8 resize handles, fixedSize move-only (avatar), canvas Blob output (5-arg drawImage
for SVG safety), wheel/pan zoom, two-zone gesture (selection moves the area, the
background pans to set focus; img draggable=false guards native DnD per zag).
New reusable soma/layers/zoom-pan: cursor-centered zoom, clamped pan, transform +
viewport-frac-to-content-frac mapping. Image-viewer / diagram-pan / map can reuse it.
sema: add 'zoom' verb to the handle family (direct manipulation, documented extension).
slider: track visible at zero (gray, not white), thumb lifts on drag.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
// The unfilled groove. `--color-neutral-track` equals the surface in the
|
|
|
|
|
|
// base theme (invisible against panels), so the track uses the same
|
|
|
|
|
|
// visible-track mix as Progress: a light tint of content-primary on the
|
|
|
|
|
|
// surface. Reads on white AND dark, and follows the theme.
|
|
|
|
|
|
'track-bg': 'color-mix(in srgb, var(--color-content-primary) 12%, var(--color-surface-default))',
|
|
|
|
|
|
'range-bg': 'var(--color-primary-solid)',
|
|
|
|
|
|
'thumb-radius': 'var(--radius-full)',
|
|
|
|
|
|
'thumb-border-width': 'var(--border-width)',
|
|
|
|
|
|
'thumb-border': 'var(--color-border-default)',
|
|
|
|
|
|
'thumb-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'thumb-shadow': 'var(--shadow-subtle)',
|
feat(uix): cropper, image-picker, image-adjustments + reusable zoom-pan layer
Three new components across all 4 layers (morfo/soma/sema/eidos) + demos + langs + READMEs:
- ImageAdjustments — reusable image-filter sliders subcomponent.
- ImagePicker — composes file-upload + image + image-adjustments (fill modes, rotation).
- Cropper — Ark image-cropper anatomy: normalized 0-1 crop rect, rect + round shapes,
8 resize handles, fixedSize move-only (avatar), canvas Blob output (5-arg drawImage
for SVG safety), wheel/pan zoom, two-zone gesture (selection moves the area, the
background pans to set focus; img draggable=false guards native DnD per zag).
New reusable soma/layers/zoom-pan: cursor-centered zoom, clamped pan, transform +
viewport-frac-to-content-frac mapping. Image-viewer / diagram-pan / map can reuse it.
sema: add 'zoom' verb to the handle family (direct manipulation, documented extension).
slider: track visible at zero (gray, not white), thumb lifts on drag.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
|
|
|
|
// Pickup lift WHILE grabbed (pointer :active): the thumb scales toward the
|
|
|
|
|
|
// viewer + rides a higher shadow — the draggable-surface lift doctrine
|
|
|
|
|
|
// (THEMING §14), scaled up from the surface `--motion-scale-lift` (1.02)
|
|
|
|
|
|
// because a ~20px thumb needs a larger multiplier to read as a lift.
|
|
|
|
|
|
'thumb-scale-active': '1.15',
|
|
|
|
|
|
'thumb-shadow-active': 'var(--shadow-3)',
|
|
|
|
|
|
'thumb-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), var(--slider-thumb-shadow)',
|
|
|
|
|
|
'tick-radius': 'var(--radius-full)',
|
|
|
|
|
|
'tick-bg': 'var(--color-neutral-border)',
|
|
|
|
|
|
'tick-bg-active': 'var(--color-primary-solid)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'disabled-opacity': '0.56'
|
|
|
|
|
|
},
|
|
|
|
|
|
switch: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'size-xs-track-width': '26px',
|
|
|
|
|
|
'size-xs-track-height': '15px',
|
|
|
|
|
|
'size-xs-thumb-size': '11px',
|
|
|
|
|
|
'size-xs-thumb-translate': '12px',
|
|
|
|
|
|
'size-sm-track-width': '32px',
|
|
|
|
|
|
'size-sm-track-height': '18px',
|
|
|
|
|
|
'size-sm-thumb-size': '14px',
|
|
|
|
|
|
'size-sm-thumb-translate': '14px',
|
|
|
|
|
|
'size-md-track-width': '38px',
|
|
|
|
|
|
'size-md-track-height': '22px',
|
|
|
|
|
|
'size-md-thumb-size': '18px',
|
|
|
|
|
|
'size-md-thumb-translate': '16px',
|
|
|
|
|
|
'size-lg-track-width': '46px',
|
|
|
|
|
|
'size-lg-track-height': '28px',
|
|
|
|
|
|
'size-lg-thumb-size': '24px',
|
|
|
|
|
|
'size-lg-thumb-translate': '18px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'size-xl-track-width': '54px',
|
|
|
|
|
|
'size-xl-track-height': '34px',
|
|
|
|
|
|
'size-xl-thumb-size': '30px',
|
|
|
|
|
|
'size-xl-thumb-translate': '20px',
|
|
|
|
|
|
'track-radius': 'var(--radius-full)',
|
|
|
|
|
|
'track-border-width': 'var(--border-width)',
|
|
|
|
|
|
'thumb-inset': '1px',
|
|
|
|
|
|
'thumb-radius': 'var(--radius-full)',
|
|
|
|
|
|
'thumb-border-width': 'var(--border-width)',
|
|
|
|
|
|
'thumb-shadow': '0 1px 2px rgb(17 14 10 / 0.12)',
|
|
|
|
|
|
'focus-ring-offset': 'var(--focus-ring-offset)',
|
|
|
|
|
|
'focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'focus-ring-color': 'var(--focus-ring-color)',
|
|
|
|
|
|
'focus-ring-surface': 'var(--color-surface-default)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'track-bg-off': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'track-bg-off-hover':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 82%, var(--color-surface-raised) )',
|
|
|
|
|
|
'track-border-off': 'var(--color-border-default)',
|
|
|
|
|
|
'track-border-off-hover': 'var(--color-border-strong)',
|
|
|
|
|
|
'track-bg-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 70%, var(--color-surface-default) )',
|
|
|
|
|
|
'track-border-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-border-default) 70%, var(--color-border-subtle) )',
|
|
|
|
|
|
'thumb-bg-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-default) 88%, var(--color-surface-raised) )',
|
|
|
|
|
|
'thumb-border-disabled':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-border-subtle) 88%, var(--color-surface-overlay) )',
|
|
|
|
|
|
'disabled-opacity': '0.72',
|
|
|
|
|
|
'thumb-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'thumb-border':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-border-default) 82%, var(--color-surface-overlay) )',
|
|
|
|
|
|
'thumb-icon-color': 'var(--color-content-muted)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-solid-hover': 'var(--color-primary-solid-hover)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-solid-hover': 'var(--color-neutral-solid-hover)',
|
|
|
|
|
|
'risk-solid': 'var(--color-risk-solid)',
|
|
|
|
|
|
'risk-solid-hover': 'var(--color-risk-solid-hover)',
|
|
|
|
|
|
'threat-solid': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-solid-hover': 'var(--color-threat-solid-hover)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-solid-hover': 'var(--color-secondary-solid-hover)',
|
|
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-solid-hover': 'var(--color-affirm-solid-hover)',
|
|
|
|
|
|
// Private palette (TSC v2.1). Host default = neutral, plus
|
|
|
|
|
|
// per-color overrides. Migrated from manual blocks in switch.css.
|
|
|
|
|
|
// Only solid/solid-hover are actively consumed; track/border
|
|
|
|
|
|
// existed in the pre-TSC defaults but were never referenced.
|
|
|
|
|
|
'_palette-solid': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--switch-neutral-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--switch-primary-solid)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--switch-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--switch-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--switch-risk-solid)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--switch-threat-solid)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'_palette-solid-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--switch-neutral-solid-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--switch-primary-solid-hover)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--switch-secondary-solid-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--switch-affirm-solid-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--switch-risk-solid-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--switch-threat-solid-hover)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
tabs: {
|
|
|
|
|
|
'stack-gap': 'var(--space-4)',
|
|
|
|
|
|
'line-stack-gap': 'var(--space-3)',
|
|
|
|
|
|
'provider-radius': 'var(--radius-xl)',
|
|
|
|
|
|
'provider-border-width': 'var(--border-width)',
|
|
|
|
|
|
'provider-border': 'var(--color-border-default)',
|
|
|
|
|
|
'provider-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'surface-provider-padding': 'var(--space-3)',
|
|
|
|
|
|
'surface-provider-shadow': 'var(--shadow-subtle)',
|
|
|
|
|
|
'list-gap': 'var(--space-1)',
|
|
|
|
|
|
'list-padding': 'var(--space-1)',
|
|
|
|
|
|
'list-radius': 'var(--radius-lg)',
|
|
|
|
|
|
'list-width': '220px',
|
|
|
|
|
|
'list-bg': 'transparent',
|
|
|
|
|
|
'list-border-width': 'var(--border-width)',
|
|
|
|
|
|
'list-border': 'var(--color-border-default)',
|
|
|
|
|
|
'line-list-padding-inline-end': 'var(--space-2)',
|
|
|
|
|
|
'surface-list-bg': 'color-mix(in srgb, var(--color-surface-default) 82%, transparent)',
|
|
|
|
|
|
'pills-list-bg': 'color-mix(in srgb, var(--color-surface-default) 90%, transparent)',
|
|
|
|
|
|
'trigger-height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'trigger-height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'trigger-height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'trigger-height-lg': 'var(--control-height-lg)',
|
|
|
|
|
|
'trigger-px-xs': 'var(--space-2-5)',
|
|
|
|
|
|
'trigger-px-sm': 'var(--space-3)',
|
|
|
|
|
|
'trigger-px-md': 'var(--space-3-5)',
|
|
|
|
|
|
'trigger-px-lg': 'var(--space-4)',
|
|
|
|
|
|
'trigger-gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'trigger-gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'trigger-gap-md': 'var(--space-2)',
|
|
|
|
|
|
'trigger-gap-lg': 'var(--space-2)',
|
|
|
|
|
|
'trigger-radius': 'var(--radius-md)',
|
|
|
|
|
|
'trigger-border-width': 'var(--border-width)',
|
|
|
|
|
|
'trigger-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'trigger-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'trigger-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'trigger-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'trigger-letter-spacing': 'var(--tracking-ui)',
|
|
|
|
|
|
'trigger-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'trigger-color-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-color-active': 'var(--color-content-primary)',
|
|
|
|
|
|
'trigger-bg': 'transparent',
|
|
|
|
|
|
'trigger-bg-hover': 'color-mix( in srgb, var(--color-surface-default) 84%, transparent )',
|
|
|
|
|
|
'trigger-bg-active': 'var(--color-surface-overlay)',
|
|
|
|
|
|
'trigger-border': 'transparent',
|
|
|
|
|
|
'trigger-border-active': 'var(--color-primary-border)',
|
|
|
|
|
|
'trigger-transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'trigger-transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'trigger-focus-ring-offset': 'var(--focus-ring-offset)',
|
|
|
|
|
|
'trigger-focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'trigger-focus-ring-color': 'var(--focus-ring-color)',
|
|
|
|
|
|
'surface-trigger-border-active':
|
|
|
|
|
|
'color-mix( in srgb, var(--tabs-trigger-border-active) 58%, transparent )',
|
|
|
|
|
|
'pills-trigger-radius': 'var(--radius-full)',
|
|
|
|
|
|
'pills-trigger-border-active':
|
|
|
|
|
|
'color-mix( in srgb, var(--tabs-trigger-border-active) 58%, transparent )',
|
|
|
|
|
|
'pills-trigger-shadow-active': 'var(--shadow-subtle)',
|
|
|
|
|
|
'content-padding-xs': 'var(--space-3)',
|
|
|
|
|
|
'content-padding-sm': 'var(--space-4)',
|
|
|
|
|
|
'content-padding-md': 'var(--space-5)',
|
|
|
|
|
|
'content-padding-lg': 'var(--space-6)',
|
|
|
|
|
|
'content-radius': 'var(--radius-lg)',
|
|
|
|
|
|
'content-bg': 'transparent',
|
|
|
|
|
|
'content-border-width': 'var(--border-width)',
|
|
|
|
|
|
'content-border': 'transparent',
|
|
|
|
|
|
'content-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'surface-content-border': 'color-mix( in srgb, var(--tabs-provider-border) 84%, transparent )',
|
|
|
|
|
|
'surface-content-bg': 'color-mix( in srgb, var(--color-surface-overlay) 92%, transparent )',
|
|
|
|
|
|
'pills-content-padding-block-start': 'var(--space-2)',
|
|
|
|
|
|
'disabled-opacity': '0.5',
|
|
|
|
|
|
'indicator-transition-duration': 'var(--duration-normal)',
|
|
|
|
|
|
'indicator-transition-ease': 'cubic-bezier(0.32, 0.72, 0, 1)',
|
|
|
|
|
|
'indicator-line-thickness': '2px',
|
|
|
|
|
|
'scrollable-fade': '16px'
|
feat(eidos): Card, Avatar ext, Image, SText, Badge, service components + dates engine fixes
Sprint completo:
- Card (eidos + sema): elevation/intent/interactive, eventos select+activate.
- Avatar: ring, AvatarBadge, AvatarGroup separados; demo Avatar standalone.
- Image: status surface (idle/loading/loaded/error) consumiendo soma ImageProvider.
- SText + STextVirtualList: canvas-text engine portado de morfo-driven-soma como
componentes separados para optimizar bundle (no se importa canvas si no se usa).
- Badge: primitivo eidos puro.
- Trans, FormatNumber, FormatDate, RelativeTime: 4 service components greppables
alrededor de uix.langs y uix.format. Nav group "Utilities".
Bugs fix arts/format/dates (engine-dates.ts):
1. Preset / per-axis conflict: Intl.DateTimeFormat rechaza dateStyle/timeStyle
con cualquier per-axis (weekday/era/year/month/day/dayPeriod/hour/minute/
second/fractionalSecondDigits) o con timeZoneName. Engine drop-ea ambos
presets por defecto cuando detecta conflict (regla estricta — un solo
per-axis hace ilegales los dos presets).
2. Per-call locale override: formatDate/Time/DateTime aceptan tercer arg
locale?: string. No muta engine state. Cache (getCachedDateFormat) keyea
por (locale x options). resolveCallHourCycle: cuando hay locale override
y pref auto, el ciclo horario se resuelve desde el locale OVERRIDE.
3. withHourCycle precedence: caller hourCycle/hour12 ahora gana sobre
preferencia del engine. Antes spread mal ordenado sobrescribia 'h12' del
caller con 'h23' del engine cuando locale resolvia a 24h.
FormatDate component vuelve a rutear siempre por uix.format.dates
(cache + hourCycle + locale reactivo), pasando locale como tercer arg.
Demos service components autonomos del toolbar global: cada uno owns su
demoLocale state con 7 chips (es-ES/en-US/en-GB/de-DE/fr-FR/ja-JP/ar-EG).
FormatDate stage filtra dateStyle/timeStyle por mode + chip hourCycle anadido.
Tests: 14/14 passing en engine-dates.test.ts (+6 nuevos: conflict handling,
locale override, hourCycle precedence).
Docs: arts/format/README.md (handoff 2026-05-25 con las 3 reglas),
README.md por service component, project_service_components_sprint_2026-05-25.md,
feedback_service_demos_own_locale.md (pattern reusable).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
},
|
|
|
|
|
|
's-text': {
|
|
|
|
|
|
'hint-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'hint-opacity': '0.8',
|
|
|
|
|
|
'hint-margin-top': 'var(--space-1)'
|
|
|
|
|
|
},
|
|
|
|
|
|
's-text-virtual-list': {
|
|
|
|
|
|
'line-height': 'var(--leading-prose)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
'border-color': 'var(--color-border-subtle)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'row-px': 'var(--space-3)',
|
|
|
|
|
|
'row-border-width': 'var(--border-width)',
|
|
|
|
|
|
'row-border-color': 'var(--color-border-subtle)'
|
|
|
|
|
|
},
|
|
|
|
|
|
toast: {
|
|
|
|
|
|
'toaster-z': '1200',
|
|
|
|
|
|
'toaster-inset': 'var(--space-4)',
|
|
|
|
|
|
'toaster-gap': 'var(--space-3)',
|
|
|
|
|
|
'toaster-width': '420px',
|
|
|
|
|
|
'provider-min-width': '280px',
|
|
|
|
|
|
'provider-max-width': '420px',
|
|
|
|
|
|
'provider-gap': 'var(--space-3)',
|
|
|
|
|
|
'provider-stack-gap': 'var(--space-1)',
|
|
|
|
|
|
'provider-px': 'var(--space-4)',
|
|
|
|
|
|
'provider-py': 'var(--space-3)',
|
|
|
|
|
|
'provider-border-width': 'var(--border-width)',
|
|
|
|
|
|
'provider-radius': 'var(--radius-lg)',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'provider-shadow': 'var(--depth-overlay-shadow), var(--depth-overlay-halo)',
|
|
|
|
|
|
'accent-width': '3px',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
|
|
|
|
|
'closed-offset': '10px',
|
|
|
|
|
|
'closed-scale': '0.98',
|
|
|
|
|
|
'status-size': '32px',
|
|
|
|
|
|
'status-radius': 'var(--radius-full)',
|
|
|
|
|
|
'title-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'title-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'title-font-weight': 'var(--font-weight-semibold)',
|
|
|
|
|
|
'title-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'title-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'message-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'description-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'description-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'description-line-height': 'var(--leading-prose)',
|
|
|
|
|
|
'description-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'action-gap': 'var(--space-1)',
|
|
|
|
|
|
'action-px': 'var(--space-2)',
|
|
|
|
|
|
'action-py': 'var(--space-1)',
|
|
|
|
|
|
'action-margin-top': 'var(--space-1)',
|
|
|
|
|
|
'action-border-width': 'var(--border-width)',
|
|
|
|
|
|
'action-radius': 'var(--radius-md)',
|
|
|
|
|
|
'action-font-family': 'var(--font-ui)',
|
|
|
|
|
|
'action-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'action-font-weight': 'var(--font-weight-medium)',
|
|
|
|
|
|
'action-line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'action-focus-ring-offset': 'var(--focus-ring-offset)',
|
|
|
|
|
|
'action-focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'action-focus-ring-color': 'var(--focus-ring-color)',
|
|
|
|
|
|
'close-size': '28px',
|
|
|
|
|
|
'close-border-width': 'var(--border-width)',
|
|
|
|
|
|
'close-radius': 'var(--radius-full)',
|
|
|
|
|
|
'close-bg': 'transparent',
|
|
|
|
|
|
'close-border': 'transparent',
|
|
|
|
|
|
'close-color': 'var(--color-content-secondary)',
|
|
|
|
|
|
'close-hover-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'close-hover-border': 'var(--color-border-subtle)',
|
|
|
|
|
|
'close-hover-color': 'var(--color-content-primary)',
|
|
|
|
|
|
'close-focus-ring-offset': 'var(--focus-ring-offset)',
|
|
|
|
|
|
'close-focus-ring-width': 'var(--focus-ring-width)',
|
|
|
|
|
|
'close-focus-ring-color': 'var(--focus-ring-color)',
|
|
|
|
|
|
'default-surface':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 92%, var(--color-neutral-track) )',
|
|
|
|
|
|
'default-border':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-neutral-border) 72%, var(--color-border-default) )',
|
|
|
|
|
|
'default-accent': 'var(--color-neutral-border)',
|
|
|
|
|
|
'default-status-bg': 'var(--color-neutral-track)',
|
|
|
|
|
|
'default-status-color': 'var(--color-neutral-text)',
|
|
|
|
|
|
'default-action-color': 'var(--color-neutral-text)',
|
|
|
|
|
|
'default-action-hover-bg': 'var(--color-neutral-track)',
|
|
|
|
|
|
'affirm-surface':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 90%, var(--color-affirm-track) )',
|
|
|
|
|
|
'affirm-border':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-affirm-border) 70%, var(--color-border-default) )',
|
|
|
|
|
|
'affirm-accent': 'var(--color-affirm-border)',
|
|
|
|
|
|
'affirm-status-bg': 'var(--color-affirm-track)',
|
|
|
|
|
|
'affirm-status-color': 'var(--color-affirm-text)',
|
|
|
|
|
|
'affirm-action-color': 'var(--color-affirm-text)',
|
|
|
|
|
|
'affirm-action-hover-bg': 'var(--color-affirm-track)',
|
|
|
|
|
|
'fulfill-surface':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 90%, var(--color-fulfill-track) )',
|
|
|
|
|
|
'fulfill-border':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-fulfill-border) 70%, var(--color-border-default) )',
|
|
|
|
|
|
'fulfill-accent': 'var(--color-fulfill-border)',
|
|
|
|
|
|
'fulfill-status-bg': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'fulfill-status-color': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'fulfill-action-color': 'var(--color-fulfill-text)',
|
|
|
|
|
|
'fulfill-action-hover-bg': 'var(--color-fulfill-track)',
|
|
|
|
|
|
'risk-surface':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 90%, var(--color-risk-track) )',
|
|
|
|
|
|
'risk-border':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-risk-border) 72%, var(--color-border-default) )',
|
|
|
|
|
|
'risk-accent': 'var(--color-risk-border)',
|
|
|
|
|
|
'risk-status-bg': 'var(--color-risk-track)',
|
|
|
|
|
|
'risk-status-color': 'var(--color-risk-text)',
|
|
|
|
|
|
'risk-action-color': 'var(--color-risk-text)',
|
|
|
|
|
|
'risk-action-hover-bg': 'var(--color-risk-track)',
|
|
|
|
|
|
'threat-surface':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 90%, var(--color-threat-track) )',
|
|
|
|
|
|
'threat-border':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-threat-border) 72%, var(--color-border-default) )',
|
|
|
|
|
|
'threat-accent': 'var(--color-threat-border)',
|
|
|
|
|
|
'threat-status-bg': 'var(--color-threat-track)',
|
|
|
|
|
|
'threat-status-color': 'var(--color-threat-text)',
|
|
|
|
|
|
'threat-action-color': 'var(--color-threat-text)',
|
|
|
|
|
|
'threat-action-hover-bg': 'var(--color-threat-track)',
|
|
|
|
|
|
'loss-surface':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-surface-overlay) 90%, var(--color-loss-track) )',
|
|
|
|
|
|
'loss-border':
|
|
|
|
|
|
'color-mix( in srgb, var(--color-loss-border) 72%, var(--color-border-default) )',
|
|
|
|
|
|
'loss-accent': 'var(--color-loss-border)',
|
|
|
|
|
|
'loss-status-bg': 'var(--color-loss-track)',
|
|
|
|
|
|
'loss-status-color': 'var(--color-loss-text)',
|
|
|
|
|
|
'loss-action-color': 'var(--color-loss-text)',
|
|
|
|
|
|
'loss-action-hover-bg': 'var(--color-loss-track)'
|
|
|
|
|
|
},
|
|
|
|
|
|
toggle: {
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xs': 'var(--control-height-xs)',
|
|
|
|
|
|
'height-sm': 'var(--control-height-sm)',
|
|
|
|
|
|
'height-md': 'var(--control-height-md)',
|
|
|
|
|
|
'height-lg': 'var(--control-height-lg)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'height-xl': 'var(--control-height-xl)',
|
|
|
|
|
|
'px-xs': 'var(--space-2)',
|
|
|
|
|
|
'px-sm': 'var(--space-2-5)',
|
|
|
|
|
|
'px-md': 'var(--space-3-5)',
|
|
|
|
|
|
'px-lg': 'var(--space-4-5)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'px-xl': 'var(--space-5)',
|
|
|
|
|
|
'gap-xs': 'var(--space-1)',
|
|
|
|
|
|
'gap-sm': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-md': 'var(--space-1-5)',
|
|
|
|
|
|
'gap-lg': 'var(--space-2)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'gap-xl': 'var(--space-2-5)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'line-height': 'var(--leading-ui)',
|
|
|
|
|
|
'letter-spacing': 'var(--tracking-normal)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xs': '10px',
|
|
|
|
|
|
'font-size-sm': '12px',
|
|
|
|
|
|
'font-size-md': '14px',
|
|
|
|
|
|
'font-size-lg': '16px',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-size-xl': '18px',
|
|
|
|
|
|
'font-weight-xs': 'var(--font-weight-medium)',
|
|
|
|
|
|
'font-weight-sm': 'var(--font-weight-medium)',
|
|
|
|
|
|
'font-weight-md': 'var(--font-weight-medium)',
|
|
|
|
|
|
'font-weight-lg': 'var(--font-weight-medium)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'font-weight-xl': 'var(--font-weight-medium)',
|
|
|
|
|
|
'radius-xs': 'var(--radius-sm)',
|
|
|
|
|
|
'radius-sm': 'var(--radius-sm)',
|
|
|
|
|
|
'radius-md': 'var(--radius-md)',
|
|
|
|
|
|
'radius-lg': 'var(--radius-md)',
|
eidos: theming fixes + size/variant parity batch + docs
- theme: add surface.muted + content.muted to color contract (neutral-3
+ neutral-10). Plugs 17 broken --color-content-muted and 3 broken
--color-surface-muted references in recipes/components.
- form.css: fix --color-neutral-element-hover typo → --color-neutral-hover.
- archetypes.css + events.css: replace raw hsl/rgba indigo with
color-mix(var(--color-primary-solid) …) — no raw colors left in eidos.
- combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css
and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled
overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme.
- sizes: 20 components expand from sm/md/lg to xs..xl (form controls,
text inputs, progress/meter, field/form) or xs..lg (nav controls:
breadcrumb, pagination, tag-group, toolbar). Composite panels keep
sm/md/lg deliberately.
- variants: field + toolbar drop arbitrary ControlVariant narrowings;
both expose all 3 (surface | outline | ghost) with new outline CSS.
- pagination demo: disambiguate siblingCount/boundaryCount as "per side"
in label + API table (Radix/MUI convention).
- docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity)
+ §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) +
§12.8 (size category cheatsheet) added. eidos/README +
active_architecture.md sync texts/migration nomenclature.
- PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión.
Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'radius-xl': 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
shadow: 'none',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
// Per-color forwarders consumed by the palette-* cascades below.
|
|
|
|
|
|
// 8 slots per color (track / element / hover / border / solid /
|
|
|
|
|
|
// solid-hover / text / contrast) matching the 8 palette-* tokens
|
|
|
|
|
|
// the cascades target. Missing any forwarder makes the
|
|
|
|
|
|
// corresponding palette-{slot} resolve to empty for that color,
|
|
|
|
|
|
// which downstream collapses any derived token consuming it
|
|
|
|
|
|
// (e.g. ghost-on-bg uses palette-track).
|
|
|
|
|
|
'primary-track': 'var(--color-primary-track)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-element': 'var(--color-primary-element)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'primary-hover': 'var(--color-primary-hover)',
|
|
|
|
|
|
'primary-border': 'var(--color-primary-border)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-solid-hover': 'var(--color-primary-solid-hover)',
|
|
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'primary-contrast': 'var(--color-primary-contrast)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'neutral-track': 'var(--color-neutral-track)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'neutral-element': 'var(--color-neutral-element)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'neutral-hover': 'var(--color-neutral-hover)',
|
|
|
|
|
|
'neutral-border': 'var(--color-neutral-border)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-solid-hover': 'var(--color-neutral-solid-hover)',
|
|
|
|
|
|
'neutral-text': 'var(--color-neutral-text)',
|
|
|
|
|
|
'neutral-contrast': 'var(--color-neutral-contrast)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'risk-track': 'var(--color-risk-track)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'risk-element': 'var(--color-risk-element)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'risk-hover': 'var(--color-risk-hover)',
|
|
|
|
|
|
'risk-border': 'var(--color-risk-border)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'risk-solid': 'var(--color-risk-solid)',
|
|
|
|
|
|
'risk-solid-hover': 'var(--color-risk-solid-hover)',
|
|
|
|
|
|
'risk-text': 'var(--color-risk-text)',
|
|
|
|
|
|
'risk-contrast': 'var(--color-risk-contrast)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'threat-track': 'var(--color-threat-track)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'threat-element': 'var(--color-threat-element)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'threat-hover': 'var(--color-threat-hover)',
|
|
|
|
|
|
'threat-border': 'var(--color-threat-border)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'threat-solid': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-solid-hover': 'var(--color-threat-solid-hover)',
|
|
|
|
|
|
'threat-text': 'var(--color-threat-text)',
|
|
|
|
|
|
'threat-contrast': 'var(--color-threat-contrast)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'secondary-track': 'var(--color-secondary-track)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'secondary-element': 'var(--color-secondary-element)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'secondary-hover': 'var(--color-secondary-hover)',
|
|
|
|
|
|
'secondary-border': 'var(--color-secondary-border)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-solid-hover': 'var(--color-secondary-solid-hover)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'secondary-contrast': 'var(--color-secondary-contrast)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'affirm-track': 'var(--color-affirm-track)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'affirm-element': 'var(--color-affirm-element)',
|
fix(toggle): add missing per-color track/hover/border forwarders
The toggle palette cascade (palette-track / palette-hover / palette-border
declarations in TSC) referenced --toggle-{X}-track, --toggle-{X}-hover,
--toggle-{X}-border for X in {primary, neutral, secondary, affirm, risk,
threat} — but the recipe only declared 5 forwarders per color (element /
solid / solid-hover / text / contrast). The 3 missing slots × 6 colors =
18 unresolved tokens made --toggle-palette-{track,hover,border} resolve
to empty for any non-neutral color (the host default DID declare them).
Visible effect, only when a non-neutral color was active:
- ghost-on-bg = var(--toggle-palette-track) → empty → transparent fallback
- ghost-on-border = color-mix(... palette-border ...) → invalid →
property dropped, border falls through to base layer
- outline-on-bg = color-mix(... palette-element ...) was the one that
worked because palette-element forwarders DID exist for all 6 colors
Surfaced today while verifying the TSC v2.2 toggle-group color cascade
fix in the browser. The toggle-group composition correctly overrode
--toggle-palette-* on items, but the empty track/hover/border slots
collapsed ghost-state styling downstream.
Verified with browser probe (preview_inspect):
- ghost + affirm: paletteTrack #0d1514, paletteHover #023b37,
paletteBorder #145750 (was "")
- ghost + threat: paletteTrack #191111, paletteHover #500f1c,
paletteBorder #72232d (was "")
- outline + primary: paletteTrack #18111b, paletteHover #3d224e,
paletteBorder #54346b (was "")
Tests: 100/100 pass in src/uix/eidos. Recipe contract guard accepts
the new forwarders (kebab-case, valid var() values).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'affirm-hover': 'var(--color-affirm-hover)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-solid-hover': 'var(--color-affirm-solid-hover)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'affirm-contrast': 'var(--color-affirm-contrast)',
|
|
|
|
|
|
// Palette tokens: 8 custom properties, each declared 7 times.
|
|
|
|
|
|
// One default declaration at scope 'host' (the neutral color), plus
|
|
|
|
|
|
// one override per supported color value (scope 'color:X'). The
|
|
|
|
|
|
// generator emits them as a `[data-toggle]` block (default) plus
|
|
|
|
|
|
// six `[data-toggle][data-color='X']` blocks (overrides). The CSS
|
|
|
|
|
|
// cascade picks the most specific match per element.
|
|
|
|
|
|
//
|
|
|
|
|
|
// This replaces the per-color blocks that used to live in
|
|
|
|
|
|
// `toggle.css` — the config now owns the entire palette cascade.
|
|
|
|
|
|
'palette-track': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-neutral-track)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--toggle-primary-track)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-secondary-track)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-track)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-track)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-element': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-neutral-element)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--toggle-primary-element)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-secondary-element)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-element)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-element)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-element)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-neutral-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--toggle-primary-hover)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-secondary-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-hover)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-border': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-neutral-border)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--toggle-primary-border)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-secondary-border)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-border)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-solid': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-neutral-solid)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--toggle-primary-solid)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-secondary-solid)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-solid)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-solid)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-solid-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-neutral-solid-hover)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--toggle-primary-solid-hover)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-secondary-solid-hover)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-solid-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-solid-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-solid-hover)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-text': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-neutral-text)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--toggle-primary-text)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-secondary-text)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-text)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-text)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-contrast': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-neutral-contrast)', scope: 'host' },
|
|
|
|
|
|
{ value: 'var(--toggle-primary-contrast)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-secondary-contrast)', scope: 'color:secondary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-contrast)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-contrast)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-contrast)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
// Variant tokens that depend on the runtime `--toggle-palette-*`
|
|
|
|
|
|
// values are scoped to `host` so the var() reference resolves
|
|
|
|
|
|
// against the toggle element (where the palette override lives),
|
|
|
|
|
|
// not against `:root` (which would freeze them at neutral).
|
|
|
|
|
|
// The generator infers the `depends` set automatically from the
|
|
|
|
|
|
// `var(--toggle-palette-*)` references — no manual `depends`
|
|
|
|
|
|
// arrays needed. See Token Scope Contract in `lib/config-types.ts`.
|
|
|
|
|
|
'solid-bg': 'var(--color-surface-raised)',
|
|
|
|
|
|
'solid-fg': 'var(--color-content-primary)',
|
|
|
|
|
|
'solid-border': 'var(--color-border-default)',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'solid-hover-bg': {
|
|
|
|
|
|
value: 'color-mix( in srgb, var(--color-surface-overlay) 68%, var(--toggle-palette-track) )',
|
|
|
|
|
|
scope: 'host'
|
|
|
|
|
|
},
|
|
|
|
|
|
'solid-hover-border': {
|
|
|
|
|
|
value: 'color-mix( in srgb, var(--toggle-palette-border) 45%, var(--color-border-strong) )',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
scope: 'host'
|
|
|
|
|
|
},
|
|
|
|
|
|
'solid-on-bg': { value: 'var(--toggle-palette-solid)', scope: 'host' },
|
|
|
|
|
|
'solid-on-fg': { value: 'var(--toggle-palette-contrast)', scope: 'host' },
|
|
|
|
|
|
'solid-on-border': { value: 'var(--toggle-palette-solid)', scope: 'host' },
|
|
|
|
|
|
'solid-on-hover-bg': { value: 'var(--toggle-palette-solid-hover)', scope: 'host' },
|
|
|
|
|
|
'solid-on-hover-border': { value: 'var(--toggle-palette-solid-hover)', scope: 'host' },
|
|
|
|
|
|
'outline-bg': 'transparent',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'outline-fg': { value: 'var(--toggle-palette-text)', scope: 'host' },
|
|
|
|
|
|
'outline-border': {
|
|
|
|
|
|
value: 'color-mix( in srgb, var(--toggle-palette-border) 88%, var(--color-border-default) )',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
scope: 'host'
|
|
|
|
|
|
},
|
|
|
|
|
|
'outline-hover-bg': { value: 'var(--toggle-palette-track)', scope: 'host' },
|
|
|
|
|
|
'outline-hover-border': {
|
|
|
|
|
|
value: 'color-mix( in srgb, var(--toggle-palette-border) 100%, var(--color-border-default) )',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
scope: 'host'
|
|
|
|
|
|
},
|
|
|
|
|
|
'outline-on-bg': {
|
|
|
|
|
|
value:
|
|
|
|
|
|
'color-mix( in srgb, var(--toggle-palette-element) 100%, var(--color-surface-raised) )',
|
|
|
|
|
|
scope: 'host'
|
|
|
|
|
|
},
|
|
|
|
|
|
'outline-on-fg': { value: 'var(--toggle-palette-text)', scope: 'host' },
|
|
|
|
|
|
'outline-on-border': { value: 'var(--toggle-palette-border)', scope: 'host' },
|
|
|
|
|
|
'outline-on-hover-bg': { value: 'var(--toggle-palette-hover)', scope: 'host' },
|
|
|
|
|
|
'outline-on-hover-border': { value: 'var(--toggle-palette-border)', scope: 'host' },
|
|
|
|
|
|
'ghost-bg': 'transparent',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'ghost-fg': { value: 'var(--toggle-palette-text)', scope: 'host' },
|
|
|
|
|
|
'ghost-border': 'transparent',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'ghost-hover-bg': {
|
|
|
|
|
|
value: 'color-mix(in srgb, var(--toggle-palette-track) 72%, transparent)',
|
|
|
|
|
|
scope: 'host'
|
|
|
|
|
|
},
|
|
|
|
|
|
'ghost-hover-border': 'transparent',
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'ghost-on-bg': { value: 'var(--toggle-palette-track)', scope: 'host' },
|
|
|
|
|
|
'ghost-on-fg': { value: 'var(--toggle-palette-text)', scope: 'host' },
|
|
|
|
|
|
'ghost-on-border': {
|
|
|
|
|
|
value: 'color-mix( in srgb, var(--toggle-palette-border) 72%, transparent )',
|
|
|
|
|
|
scope: 'host'
|
|
|
|
|
|
},
|
|
|
|
|
|
'ghost-on-hover-bg': { value: 'var(--toggle-palette-element)', scope: 'host' },
|
|
|
|
|
|
'ghost-on-hover-border': {
|
|
|
|
|
|
value: 'color-mix( in srgb, var(--toggle-palette-border) 88%, transparent )',
|
|
|
|
|
|
scope: 'host'
|
|
|
|
|
|
},
|
|
|
|
|
|
'disabled-opacity': '0.45'
|
|
|
|
|
|
},
|
|
|
|
|
|
tooltip: {
|
|
|
|
|
|
'content-z': '76',
|
|
|
|
|
|
'max-width': '22rem',
|
|
|
|
|
|
'padding-y-sm': 'var(--space-1)',
|
|
|
|
|
|
'padding-x-sm': 'var(--space-2)',
|
|
|
|
|
|
'padding-y-md': 'var(--space-1-5)',
|
|
|
|
|
|
'padding-x-md': 'var(--space-2-5)',
|
|
|
|
|
|
'padding-y-lg': 'var(--space-2)',
|
|
|
|
|
|
'padding-x-lg': 'var(--space-3)',
|
|
|
|
|
|
'font-size-sm': 'var(--font-size-xs)',
|
|
|
|
|
|
'font-size-md': 'var(--font-size-sm)',
|
|
|
|
|
|
'font-size-lg': 'var(--font-size-md)',
|
|
|
|
|
|
'font-family': 'var(--font-ui)',
|
|
|
|
|
|
'font-weight': 'var(--font-weight-regular)',
|
|
|
|
|
|
'line-height': 'var(--leading-text)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
bg: 'var(--color-surface-overlay)',
|
|
|
|
|
|
color: 'var(--color-content-primary)',
|
|
|
|
|
|
border: 'color-mix( in srgb, var(--color-border-default) 84%, var(--tooltip-bg) )',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
shadow: 'var(--depth-overlay-shadow), var(--depth-overlay-halo)'
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// Layout primitives. Box, Flex, Grid, Float and Group expose their CSS
|
|
|
|
|
|
// variables as a pass-through channel: callers push per-instance values
|
|
|
|
|
|
// inline via `pushStyleVar`, and the recipe simply mirrors the CSS
|
|
|
|
|
|
// fallbacks so the contract sees each var as declared. `revert-layer`
|
|
|
|
|
|
// means "fall back to the underlying tag's natural rule" — the right
|
|
|
|
|
|
// default for unset Box props.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
box: {
|
|
|
|
|
|
display: 'revert-layer',
|
|
|
|
|
|
position: 'revert-layer',
|
|
|
|
|
|
width: 'revert-layer',
|
|
|
|
|
|
'min-width': '0',
|
|
|
|
|
|
'max-width': 'revert-layer',
|
|
|
|
|
|
height: 'revert-layer',
|
|
|
|
|
|
'min-height': 'revert-layer',
|
|
|
|
|
|
'max-height': 'revert-layer',
|
|
|
|
|
|
padding: 'revert-layer',
|
|
|
|
|
|
'padding-block': 'revert-layer',
|
|
|
|
|
|
'padding-inline': 'revert-layer',
|
|
|
|
|
|
'padding-top': 'revert-layer',
|
|
|
|
|
|
'padding-right': 'revert-layer',
|
|
|
|
|
|
'padding-bottom': 'revert-layer',
|
|
|
|
|
|
'padding-left': 'revert-layer',
|
|
|
|
|
|
margin: 'revert-layer',
|
|
|
|
|
|
'margin-block': 'revert-layer',
|
|
|
|
|
|
'margin-inline': 'revert-layer',
|
|
|
|
|
|
'margin-top': 'revert-layer',
|
|
|
|
|
|
'margin-right': 'revert-layer',
|
|
|
|
|
|
'margin-bottom': 'revert-layer',
|
|
|
|
|
|
'margin-left': 'revert-layer',
|
|
|
|
|
|
gap: 'revert-layer',
|
|
|
|
|
|
top: 'revert-layer',
|
|
|
|
|
|
right: 'revert-layer',
|
|
|
|
|
|
bottom: 'revert-layer',
|
|
|
|
|
|
left: 'revert-layer',
|
|
|
|
|
|
inset: 'revert-layer',
|
|
|
|
|
|
'inset-block': 'revert-layer',
|
|
|
|
|
|
'inset-inline': 'revert-layer',
|
|
|
|
|
|
overflow: 'revert-layer',
|
|
|
|
|
|
'overflow-x': 'revert-layer',
|
|
|
|
|
|
'overflow-y': 'revert-layer',
|
|
|
|
|
|
flex: 'revert-layer',
|
|
|
|
|
|
grow: 'revert-layer',
|
|
|
|
|
|
shrink: 'revert-layer',
|
|
|
|
|
|
basis: 'revert-layer',
|
|
|
|
|
|
order: 'revert-layer',
|
|
|
|
|
|
'align-self': 'revert-layer',
|
|
|
|
|
|
'justify-self': 'revert-layer',
|
|
|
|
|
|
'place-self': 'revert-layer',
|
|
|
|
|
|
'grid-column': 'revert-layer',
|
|
|
|
|
|
'grid-row': 'revert-layer',
|
|
|
|
|
|
'grid-area': 'revert-layer'
|
|
|
|
|
|
},
|
|
|
|
|
|
flex: {
|
|
|
|
|
|
direction: 'row',
|
|
|
|
|
|
align: 'stretch',
|
|
|
|
|
|
justify: 'flex-start',
|
|
|
|
|
|
wrap: 'nowrap',
|
|
|
|
|
|
'align-content': 'normal',
|
|
|
|
|
|
'row-gap': 'var(--box-gap, revert-layer)',
|
|
|
|
|
|
'column-gap': 'var(--box-gap, revert-layer)'
|
|
|
|
|
|
},
|
|
|
|
|
|
grid: {
|
|
|
|
|
|
'template-columns': 'none',
|
|
|
|
|
|
'template-rows': 'none',
|
|
|
|
|
|
'auto-columns': 'auto',
|
|
|
|
|
|
'auto-rows': 'auto',
|
|
|
|
|
|
'auto-flow': 'row',
|
|
|
|
|
|
align: 'stretch',
|
|
|
|
|
|
justify: 'start',
|
|
|
|
|
|
'align-content': 'normal',
|
|
|
|
|
|
'place-items': 'revert-layer',
|
|
|
|
|
|
'place-content': 'revert-layer',
|
|
|
|
|
|
gap: 'revert-layer',
|
|
|
|
|
|
'row-gap': 'var(--grid-gap, revert-layer)',
|
|
|
|
|
|
'column-gap': 'var(--grid-gap, revert-layer)'
|
|
|
|
|
|
},
|
|
|
|
|
|
float: {
|
|
|
|
|
|
gap: 'var(--space-3)'
|
|
|
|
|
|
},
|
|
|
|
|
|
group: {
|
|
|
|
|
|
'attached-overlap': '1px'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// Banner — announcement strip. Public surface area is intentionally
|
|
|
|
|
|
// small (gap + radius); the rest of the chrome resolves from
|
|
|
|
|
|
// data-intent + data-variant.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
banner: {
|
|
|
|
|
|
gap: 'var(--space-3)',
|
|
|
|
|
|
radius: '0',
|
|
|
|
|
|
// Per-intent palette forwarders → Banner is retintable via
|
|
|
|
|
|
// `recipes.banner.{intent}-{slot}` like every other color component
|
|
|
|
|
|
// (button/badge/toggle). banner.css reads these instead of the raw
|
|
|
|
|
|
// foundation `--color-{intent}-*` tokens, so a per-component recipe
|
|
|
|
|
|
// override actually reaches it. (audit P1-5)
|
|
|
|
|
|
'primary-solid': 'var(--color-primary-solid)',
|
|
|
|
|
|
'primary-contrast': 'var(--color-primary-contrast)',
|
|
|
|
|
|
'primary-track': 'var(--color-primary-track)',
|
|
|
|
|
|
'primary-border': 'var(--color-primary-border)',
|
|
|
|
|
|
'primary-text': 'var(--color-primary-text)',
|
|
|
|
|
|
'secondary-solid': 'var(--color-secondary-solid)',
|
|
|
|
|
|
'secondary-contrast': 'var(--color-secondary-contrast)',
|
|
|
|
|
|
'secondary-track': 'var(--color-secondary-track)',
|
|
|
|
|
|
'secondary-border': 'var(--color-secondary-border)',
|
|
|
|
|
|
'secondary-text': 'var(--color-secondary-text)',
|
|
|
|
|
|
'neutral-solid': 'var(--color-neutral-solid)',
|
|
|
|
|
|
'neutral-contrast': 'var(--color-neutral-contrast)',
|
|
|
|
|
|
'neutral-track': 'var(--color-neutral-track)',
|
|
|
|
|
|
'neutral-border': 'var(--color-neutral-border)',
|
|
|
|
|
|
'neutral-text': 'var(--color-neutral-text)',
|
|
|
|
|
|
'affirm-solid': 'var(--color-affirm-solid)',
|
|
|
|
|
|
'affirm-contrast': 'var(--color-affirm-contrast)',
|
|
|
|
|
|
'affirm-track': 'var(--color-affirm-track)',
|
|
|
|
|
|
'affirm-border': 'var(--color-affirm-border)',
|
|
|
|
|
|
'affirm-text': 'var(--color-affirm-text)',
|
|
|
|
|
|
'fulfill-solid': 'var(--color-fulfill-solid)',
|
|
|
|
|
|
'fulfill-contrast': 'var(--color-fulfill-contrast)',
|
|
|
|
|
|
'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-contrast': 'var(--color-risk-contrast)',
|
|
|
|
|
|
'risk-track': 'var(--color-risk-track)',
|
|
|
|
|
|
'risk-border': 'var(--color-risk-border)',
|
|
|
|
|
|
'risk-text': 'var(--color-risk-text)',
|
|
|
|
|
|
'threat-solid': 'var(--color-threat-solid)',
|
|
|
|
|
|
'threat-contrast': 'var(--color-threat-contrast)',
|
|
|
|
|
|
'threat-track': 'var(--color-threat-track)',
|
|
|
|
|
|
'threat-border': 'var(--color-threat-border)',
|
|
|
|
|
|
'threat-text': 'var(--color-threat-text)',
|
|
|
|
|
|
'loss-solid': 'var(--color-loss-solid)',
|
|
|
|
|
|
'loss-contrast': 'var(--color-loss-contrast)',
|
|
|
|
|
|
'loss-track': 'var(--color-loss-track)',
|
|
|
|
|
|
'loss-border': 'var(--color-loss-border)',
|
|
|
|
|
|
'loss-text': 'var(--color-loss-text)'
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// Container — full-bleed wrapper that caps `max-width` at the xl
|
|
|
|
|
|
// container token by default. Callers usually push `maxWidth` via Box,
|
|
|
|
|
|
// but the recipe needs the var declared.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
container: {
|
|
|
|
|
|
'width-xl': 'var(--layout-container-width-xl, 80rem)'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// Section — vertical rhythm scale. Sizes map to the spacing primitives.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
section: {
|
|
|
|
|
|
'padding-block-sm': 'var(--space-8)',
|
|
|
|
|
|
'padding-block-md': 'var(--space-12)',
|
|
|
|
|
|
'padding-block-lg': 'var(--space-16)',
|
|
|
|
|
|
'padding-block-xl': 'calc(var(--space-16) * 1.5)'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// Separator — purely geometric divider.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
separator: {
|
|
|
|
|
|
thickness: 'var(--border-width)',
|
|
|
|
|
|
color: 'var(--color-border-default)',
|
|
|
|
|
|
'min-length': 'var(--space-4)'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
// ToggleGroup — gap is component-owned; the color cascade modifies
|
|
|
|
|
|
// Toggle's `palette-*` tokens via TSC v2.2 cross-recipe composition
|
|
|
|
|
|
// (see `composition` block below).
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
'toggle-group': {
|
feat(eidos): TSC v2.2 (parts + composition) + universal theming coverage
Token Scope Contract universal — no más excepciones arquitectónicas.
Los 3 componentes que vivían fuera de TSC v2.1 (select, avatar,
toggle-group) ahora están dentro del contrato via dos extensiones nuevas.
TSC v2.2 extensiones (lib/config-types.ts + render-css.ts + config.ts):
- `parts: readonly string[]` en RecipeTokenMultiDeclaration — emite
selectores comma-separados (`[data-{c}-x], [data-{c}-y]`) para
componentes con data-color cascadeado per-part. Consumer: select.
- `composition: { foreignRecipe: { targetSelector, tokens } }` sibling
key — overrides cross-recipe scoped a la cascade del host. Consumer:
toggle-group modifica `--toggle-palette-*` en sus items.
Migraciones:
- select: 3 private `_accent-{track,border,text}` con parts: ['trigger',
'content'] + 7 cascades color:X each. Removed orphan `_accent-solid`
(CSS no consumía).
- avatar: 6 tokens via composite scopes `['variant:X', 'color:Y']` con
matrix helper inline. Badge usa parts: ['badge']. Reemplaza 24 bloques
CSS × 2 partes.
- toggle-group: composition block con 8 palette tokens × 4 colors.
Reemplaza 4 bloques CSS per-color.
Bug toggle-group post-composition (encontrado y arreglado):
Tras la composition migration, el cascade del toggle-group seguía roto
porque los tokens derivados (`--toggle-solid-on-bg`, `--toggle-outline-fg`,
etc.) viven en scope `[data-toggle]`. El `[data-toggle-group-item]` es
sibling (no descendant), así que `var(--toggle-solid-on-bg)` resolvía
undefined. Fix: inlined derivation expressions directamente en
`[data-toggle-group-item]` y sus variant cascades (solid/outline/ghost),
referenciando palette tokens en su propio scope local.
Validador + emisor + contract:
- `validateRecipeComposition` valida el shape `{ targetSelector, tokens }`
y rechaza composition entries con scope='root'.
- `stripCompositionKey` + `emitComposition` separan el pipeline.
- `appendRecipeContractTokens` skip-list para `composition` (no aparece
como fake `--{c}-composition` knob).
- `tokenKeys`/`tokenEntries` helpers en recipe-css-contract.test.ts
filtran composition en todos los iteradores.
Documentación:
- THEMING.md §18 reescrito como "Cobertura universal de TSC". §7
extendido con subsecciones "Multi-part scope" y "Cross-recipe
composition" + ejemplos completos. TOC actualizado.
- eidos/README.md tabla de referencia ampliada con TSC v2.2 + §18.
- CLAUDE.md gana hand-off "2026-05-27 #5" (TSC v2.2 + cobertura universal).
- CONTINUE.md reescrito al estado actual de la sesión.
Working tree también incluye sprint Words en paralelo (multiple authors):
slash menu, find/replace regex, code language picker, table audit,
toolbar family menu, code highlight engine.
Tests: 786/786 pass en src/uix/{eidos,morfo,soma,sema}. `npm run check`:
6 errores pre-existentes (lib/_demo, soma/components/internal,
web/routes/active) no relacionados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
gap: 'var(--space-1)',
|
|
|
|
|
|
// TSC v2.2 — cross-recipe composition. Items inside a toggle-group
|
|
|
|
|
|
// ARE toggles, so the group's `data-color` cascade must override
|
|
|
|
|
|
// Toggle's PUBLIC palette tokens (owned by Toggle's recipe — not by
|
|
|
|
|
|
// toggle-group) ONLY when reached through a toggle-group ancestor.
|
|
|
|
|
|
//
|
|
|
|
|
|
// `targetSelector: '[data-toggle-group-item]'` reaches the foreign
|
|
|
|
|
|
// part inside the host's cascade. The generator emits:
|
|
|
|
|
|
// [data-toggle-group][data-color='X'] [data-toggle-group-item] {
|
|
|
|
|
|
// --toggle-palette-{slot}: var(--toggle-X-{slot});
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// Replaces the 4 hand-written CSS blocks that used to live in
|
|
|
|
|
|
// `toggle-group.css` (lines 264-308 in the legacy file).
|
|
|
|
|
|
composition: {
|
|
|
|
|
|
toggle: {
|
|
|
|
|
|
targetSelector: '[data-toggle-group-item]',
|
|
|
|
|
|
tokens: {
|
|
|
|
|
|
'palette-track': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-primary-track)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-track)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-track)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-track)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-element': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-primary-element)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-element)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-element)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-element)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-primary-hover)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-hover)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-border': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-primary-border)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-border)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-border)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-border)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-solid': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-primary-solid)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-solid)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-solid)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-solid)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-solid-hover': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-primary-solid-hover)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-solid-hover)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-solid-hover)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-solid-hover)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-text': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-primary-text)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-text)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-text)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-text)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
'palette-contrast': {
|
|
|
|
|
|
declarations: [
|
|
|
|
|
|
{ value: 'var(--toggle-primary-contrast)', scope: 'color:primary' },
|
|
|
|
|
|
{ value: 'var(--toggle-affirm-contrast)', scope: 'color:affirm' },
|
|
|
|
|
|
{ value: 'var(--toggle-risk-contrast)', scope: 'color:risk' },
|
|
|
|
|
|
{ value: 'var(--toggle-threat-contrast)', scope: 'color:threat' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// PinInput — one-time code cells.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
'pin-input': {
|
|
|
|
|
|
gap: 'var(--space-2)',
|
|
|
|
|
|
'disabled-opacity': '0.55',
|
|
|
|
|
|
'cell-size-sm': '2rem',
|
|
|
|
|
|
'cell-size-md': '2.5rem',
|
|
|
|
|
|
'cell-size-lg': '3rem',
|
|
|
|
|
|
'cell-size-xl': '3.5rem',
|
|
|
|
|
|
'cell-font-size-sm': 'var(--font-size-md)',
|
|
|
|
|
|
'cell-font-size-md': 'var(--font-size-lg)',
|
|
|
|
|
|
'cell-font-size-lg': 'var(--font-size-xl)',
|
|
|
|
|
|
'cell-font-size-xl': 'var(--font-size-xxl)',
|
|
|
|
|
|
'cell-font-weight': '500',
|
|
|
|
|
|
'cell-radius': 'var(--radius-md)',
|
|
|
|
|
|
'cell-border-width': '1px',
|
|
|
|
|
|
'cell-border-color': 'var(--color-border-default)',
|
|
|
|
|
|
'cell-bg': 'var(--color-surface-default)',
|
|
|
|
|
|
'cell-filled-bg': 'var(--color-primary-element)',
|
|
|
|
|
|
'cell-filled-border': 'var(--color-primary-border)',
|
|
|
|
|
|
'cell-active-border': 'var(--color-primary-solid)',
|
|
|
|
|
|
'cell-invalid-border': 'var(--color-threat-solid)'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// ScrollArea — overlay scrollbars (macOS-style).
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
'scroll-area': {
|
|
|
|
|
|
bg: 'transparent',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'scrollbar-padding': 'var(--space-0-5)',
|
|
|
|
|
|
'scrollbar-size': 'var(--space-2-5)',
|
|
|
|
|
|
'track-bg': 'color-mix(in srgb, var(--color-neutral-track) 60%, transparent)',
|
|
|
|
|
|
'track-bg-hover': 'color-mix(in srgb, var(--color-neutral-track) 84%, transparent)',
|
|
|
|
|
|
'thumb-bg': 'var(--color-content-muted)',
|
|
|
|
|
|
'thumb-bg-hover': 'var(--color-content-secondary)',
|
|
|
|
|
|
'thumb-radius': 'var(--radius-full)',
|
|
|
|
|
|
'thumb-min-size': 'var(--space-3)',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// Splitter — resizable panels with a draggable handle + grip pill.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
splitter: {
|
|
|
|
|
|
bg: 'var(--color-surface-default)',
|
|
|
|
|
|
radius: 'var(--radius-md)',
|
|
|
|
|
|
'border-width': 'var(--border-width)',
|
|
|
|
|
|
'border-color': 'var(--color-border-default)',
|
|
|
|
|
|
'disabled-opacity': '0.6',
|
|
|
|
|
|
'panel-bg': 'transparent',
|
|
|
|
|
|
'handle-size': 'var(--space-2)',
|
|
|
|
|
|
'handle-bg': 'var(--color-border-subtle)',
|
|
|
|
|
|
'handle-bg-hover': 'var(--color-border-default)',
|
|
|
|
|
|
'handle-bg-active': 'var(--color-primary-solid)',
|
|
|
|
|
|
'grip-radius': 'var(--radius-full)',
|
|
|
|
|
|
'grip-bg': 'var(--color-content-muted)',
|
|
|
|
|
|
'grip-main': 'var(--space-4)',
|
|
|
|
|
|
'grip-cross': '2px',
|
|
|
|
|
|
'transition-duration': 'var(--duration-fast)',
|
|
|
|
|
|
'transition-ease': 'var(--ease-default)'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// NavigationMenu — soma writes the active-trigger rect into these
|
|
|
|
|
|
// indicator vars; the recipe paints the underline.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
'navigation-menu': {
|
|
|
|
|
|
'indicator-w': '0px',
|
|
|
|
|
|
'indicator-x': '0px'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// DropdownMenu — panel chrome + item rows. Mirror tokens to context-menu.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
'dropdown-menu': {
|
|
|
|
|
|
// Floating menu panel stacks in the top overlay band (matches
|
|
|
|
|
|
// `select` — both are click-triggered list overlays). Without this
|
|
|
|
|
|
// the portaled panel inherits `z-index: auto` and any positioned
|
|
|
|
|
|
// page element with a positive z-index (e.g. a selected
|
|
|
|
|
|
// `[data-toggle-group-item]`, z-index 1) paints THROUGH it.
|
|
|
|
|
|
'content-z': '80',
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'content-min-width': '12rem',
|
|
|
|
|
|
'content-max-height': 'min(60vh, 22rem)',
|
|
|
|
|
|
'content-padding': 'var(--space-1)',
|
|
|
|
|
|
'content-border-width': '1px',
|
|
|
|
|
|
'content-border-color': 'var(--color-border-default)',
|
|
|
|
|
|
'content-radius': 'var(--radius-md)',
|
|
|
|
|
|
'content-bg': 'var(--color-surface-overlay)',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'content-shadow': 'var(--depth-overlay-shadow), var(--depth-overlay-halo)',
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'content-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'item-gap': 'var(--space-2)',
|
|
|
|
|
|
'item-height': '2rem',
|
|
|
|
|
|
'item-px': 'var(--space-2)',
|
|
|
|
|
|
'item-py': 'var(--space-1)',
|
|
|
|
|
|
'item-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'item-bg-hover': 'var(--color-primary-element)',
|
|
|
|
|
|
'item-fg-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'item-disabled-opacity': '0.55',
|
|
|
|
|
|
'heading-px': 'var(--space-2)',
|
|
|
|
|
|
'heading-py': 'var(--space-1)',
|
|
|
|
|
|
'heading-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'separator-bg': 'var(--color-border-subtle)',
|
|
|
|
|
|
'separator-my': 'var(--space-1)'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// ContextMenu — same surface as DropdownMenu, with a span Trigger.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
'context-menu': {
|
|
|
|
|
|
'content-min-width': '12rem',
|
|
|
|
|
|
'content-max-height': 'min(60vh, 22rem)',
|
|
|
|
|
|
'content-padding': 'var(--space-1)',
|
|
|
|
|
|
'content-border-width': '1px',
|
|
|
|
|
|
'content-border-color': 'var(--color-border-default)',
|
|
|
|
|
|
'content-radius': 'var(--radius-md)',
|
|
|
|
|
|
'content-bg': 'var(--color-surface-overlay)',
|
feat(eidos): depth adoption — elevated components consume the channel (shadow + halo)
The Fase 2 rim halo now reaches real UI, not just the showcase. Each elevated
component's shadow signal (recipe tokens in recipes/base.ts + the few direct
box-shadow uses) now composes `var(--depth-{plane}-shadow), var(--depth-{plane}-halo)`.
Reaches: popover, dialog, drawer, dropdown/context/navigation-menu, menubar,
select, tooltip, card, combobox, command, link-preview, words.
Shadow signal only — z-index stays component-managed (the z bands are finer than
the 5 planos), so zero stacking risk. Verified: dialog keeps its own z-index 71
and composes drop shadow + oklab halo. Retuning a plane now retunes every
component on it.
Verified: npm run check 0 errors; eidos 183/186 (3 pre-existing `words` failures,
unrelated). Regenerated generated/base.css. THEMING 29 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
'content-shadow': 'var(--depth-overlay-shadow), var(--depth-overlay-halo)',
|
fix(uix audit): apply Kim audit remediations across morfo/soma/eidos/recipe layers
Resolves 34 of 40 failures from src/uix/audit-uix-kimi-1.md. The remaining
6 are all Words component (excluded per project owner — actively developed
on a separate track) or unrelated infra (cookie-adapter-client jsdom timeout).
Key changes:
- soma/provider/context.ts: swallow Svelte's `lifecycle_outside_component`
in `context.set()` so unit tests can instantiate providers without a
component tree (unblocked 18 picker tests in one line).
- soma/textarea: route inline style writes through `dom.apply({attrs})`
instead of direct `el.style.X = Y` (contract regex compliance).
- soma/picker-shell: add minimal Provider component + morfo so the shared
handle utility passes the morfo/component contract.
- eidos/_layout: lift `shared.ts` to `eidos/lib/layout-helpers.ts` (the
`_layout` directory wasn't a real component) and update 8 layout
primitive imports.
- eidos/command: replace `onMount` with `$effect` (visual layer can't use
Svelte 4 lifecycle hooks per component-api contract); restructure
`Item.Icon`/`Item.Shortcut` namespace so contract regex matches.
- eidos/color-picker: extract hue spectrum hsl literals to sidecar
`color-picker-spectrum.css`; keep main recipe color-literal-free.
- eidos/lib/recipes/base.ts: declare 196 layout-primitive + chrome CSS
vars (box, flex, grid, float, group, banner, container, section,
separator, toggle-group, pin-input, scroll-area, splitter,
navigation-menu, dropdown-menu, context-menu, date-range-field,
time-range-field, plus per-component additions to date-field,
color-picker, button, select). 197 missing → 0 non-Words.
- morfo: add `data-dir` to carousel, `data-kind` to date-picker, add
StrengthMeterLabel sub-part to password-field, register picker-shell.
- 5 pickers (date/color/date-range/time/time-range): add `internals.ts`
indirection so `exports.ts` doesn't re-export `*provider.svelte.ts`
directly (contract D); rewrite virtual root types to plain object
literals (no `WithChild`/`PrimitiveDivAttributes`).
- 4 new READMEs (button, textarea, password-field, picker-shell)
following the search-field canonical template.
Test result: 2391/2397 passing (99.75%). Remaining 6 failures are all
Words-scope or jsdom infra timeout — explicitly out of scope.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
|
|
|
|
'content-font-size': 'var(--font-size-sm)',
|
|
|
|
|
|
'item-gap': 'var(--space-2)',
|
|
|
|
|
|
'item-height': '2rem',
|
|
|
|
|
|
'item-px': 'var(--space-2)',
|
|
|
|
|
|
'item-py': 'var(--space-1)',
|
|
|
|
|
|
'item-radius': 'var(--radius-sm)',
|
|
|
|
|
|
'item-bg-hover': 'var(--color-primary-element)',
|
|
|
|
|
|
'item-fg-hover': 'var(--color-content-primary)',
|
|
|
|
|
|
'item-disabled-opacity': '0.55',
|
|
|
|
|
|
'heading-px': 'var(--space-2)',
|
|
|
|
|
|
'heading-py': 'var(--space-1)',
|
|
|
|
|
|
'heading-font-size': 'var(--font-size-xs)',
|
|
|
|
|
|
'separator-bg': 'var(--color-border-subtle)',
|
|
|
|
|
|
'separator-my': 'var(--space-1)'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// DateRangeField — layout only; chrome inherits from date-field.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
'date-range-field': {
|
|
|
|
|
|
'row-gap': 'var(--space-3)',
|
|
|
|
|
|
'separator-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'separator-glyph': "'—'"
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// TimeRangeField — layout only; chrome inherits from time-field.
|
|
|
|
|
|
// ─────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
'time-range-field': {
|
|
|
|
|
|
'row-gap': 'var(--space-3)',
|
|
|
|
|
|
'separator-color': 'var(--color-content-muted)',
|
|
|
|
|
|
'separator-glyph': "'—'"
|
|
|
|
|
|
}
|
|
|
|
|
|
} as const satisfies RecipeTokenSet;
|