Generate Eidos base CSS artifact

active-uix
dev 5 months ago
parent 501f55b0cc
commit 8d6d4c5700

@ -7,3 +7,6 @@ bun.lockb
# Miscellaneous
/static/
# Generated artifacts
src/uix/eidos/generated/

@ -101,12 +101,14 @@ a su `portalTo`. No usar nombres como `somaPortalTo` en `ActiveUix`.
y `contentScale` para `compact`, `comfortable`, `spacious`; `ActiveEidos`
proyecta `data-density` y Eidos publica aliases activos como
`--density-space-scale`.
4. Pendiente: introducir un artefacto CSS generado en build desde
`ActiveEidos` antes de retirar `contracts/`, `tokens/` o `themes/base/`
del entrypoint estatico `src/uix/eidos/index.css`.
4. `src/uix/eidos/generated/base.css` queda como primer artefacto CSS generado
desde `EidosConfig` base mediante `npm run generate:eidos-css`; `index.css`
lo importa como foundation estatica.
5. Pendiente: decidir que tokens per-component de `tokens/components/*`
quedan como recipe estable y cuales deben salir de `EidosConfig`.
6. No reintroducir engine visual separado, carpeta `engine`, ni wrapper `Eidos` sin
6. Pendiente: retirar `contracts/`, `tokens/` o `themes/base/` del entrypoint
estatico cuando las recipes ya no dependan de aliases historicos.
7. No reintroducir engine visual separado, carpeta `engine`, ni wrapper `Eidos` sin
contrato propio.
## Pendiente de limpieza

@ -20,7 +20,8 @@
"morfo:check": "node --import tsx/esm scripts/morfo-check.ts",
"morfo:vocabulary": "node --import tsx/esm scripts/morfo-vocabulary-check.ts",
"perm:check": "node --import tsx/esm scripts/permutation-check.ts",
"generate:contracts-docs": "node --import tsx/esm scripts/generate-contracts-docs.ts"
"generate:contracts-docs": "node --import tsx/esm scripts/generate-contracts-docs.ts",
"generate:eidos-css": "node --import tsx/esm scripts/generate-eidos-css.ts"
},
"devDependencies": {
"@sveltejs/adapter-static": "^3.0.10",

@ -0,0 +1,14 @@
import { mkdirSync, writeFileSync } from 'node:fs';
import { dirname, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import { renderGeneratedBaseEidosCss } from '../src/uix/eidos/lib/generated-css.ts';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const outputPath = resolve(__dirname, '..', 'src', 'uix', 'eidos', 'generated', 'base.css');
mkdirSync(dirname(outputPath), { recursive: true });
writeFileSync(outputPath, `${renderGeneratedBaseEidosCss()}\n`);
console.log(`Generated ${outputPath}`);

@ -392,6 +392,7 @@ src/uix/eidos/
├── active-eidos.svelte.ts ActiveEidos: runtime/contexto visual creado por ActiveEidos.create
├── archetypes.css reglas comunes a [data-archetype=*]
├── events.css reacciones a [data-event-*] (sema visual)
├── generated/base.css foundation CSS generado desde EidosConfig base
├── contracts/ CSS legacy/estatico durante migracion
├── tokens/ valores CSS legacy hasta generarlos desde ActiveEidos
├── themes/base/ CSS legacy de base hasta sustituirlo por salida generada
@ -406,8 +407,8 @@ src/uix/eidos/
`ActiveEidos` es la fuente de verdad nueva del theming: primitivas
(color + alpha scales, size map, espacios, control height, radius, borde,
opacidad, z-index, focus ring, layout, tipografia, shadow, motion, icon), roles
semanticos y themes. Tambien resuelve el theme activo desde `ActiveUix.prefs`
(`theme` como mode efectivo light/dark, mas `density`) e inyecta CSS runtime
semanticos y themes. Tambien resuelve el theme activo desde sus fuentes
visuales (`theme`, `modeSource`, `densitySource` o defaults) e inyecta CSS runtime
cuando la app no lo precompila. Los themes externos pueden venir solo por CSS
si respetan el contrato de custom properties (`themeSource: 'auto' | 'config' | 'css'`);
`getCssContract()` publica ese contrato como datos typed y
@ -832,9 +833,10 @@ Para evitar mission creep, conviene fijar lo que UIX **no quiere ser**:
**Pendiente**:
- Sustituir progresivamente `contracts/`, `tokens/` y `themes/base/` por
salida generada desde `ActiveEidos`, dejando los recipes por componente
como CSS de estructura visual.
- Sustituir progresivamente `contracts/`, `tokens/` y `themes/base/`. El primer
artefacto generado ya existe en `src/uix/eidos/generated/base.css`; falta
retirar aliases/contratos legacy cuando las recipes de componentes dejen de
depender de ellos.
- Reparar demos/rutas y componentes eidos que sigan en una mezcla historica
de `Provider`/flat snippets para que todo compile contra la opcion C
disciplinada.

@ -20,7 +20,9 @@ Esta auditoria queda parcialmente cerrada por fases en la rama `active-uix`:
orquesta prepare/handle/cleanup de canales.
- `Sema` ya no transporta `motion`, `color` ni `presence` en el mapa canonico.
- `SoundChannel` no registra listeners globales en el constructor.
- `ActiveUix` escribe `data-mode`; `ActiveEidos` escribe `data-theme`.
- `ActivePrefsDomProjection` escribe `dir`, `data-motion`, `data-sound` y
`data-haptic`; `ActiveEidos` escribe `data-theme`, `data-mode` y
`data-density`.
- La auditoria DOM P1 queda documentada en `src/uix/dom_audit.md`.
Pendiente vivo: terminar la generacion/retirada de CSS legacy de Eidos.
@ -323,8 +325,11 @@ y de theme desde la configuracion viva. Mantenerlos:
- Hace que `eidos-lint` sea necesario.
- Incrementa bundle size.
**Propuesta:** Generar `contracts/`, `tokens/` y `themes/base/` desde `ActiveEidos`/`EidosConfig` en build time.
Borrar los archivos fuente manual.
**Estado 2026-05-13:** existe el primer artefacto generado,
`src/uix/eidos/generated/base.css`, producido con `npm run generate:eidos-css`
desde `EidosConfig` base. Aun no se borran `contracts/`, `tokens/` ni
`themes/base/` porque varias recipes y aliases historicos dependen de ellos.
El siguiente paso es separar recipes estables de aliases/contratos retirables.
---

@ -53,6 +53,7 @@ src/uix/eidos/
index.css → entrypoint que importa todo el CSS
archetypes.css → reglas comunes a [data-archetype=*]
events.css → reacciones a [data-event-*] (sema visual)
generated/base.css → salida estatica generada desde EidosConfig base
contracts/ → APIs CSS legacy/estaticas durante migracion
tokens/ → valores CSS legacy hasta generarlos desde ActiveEidos
themes/base/ → CSS legacy de base hasta sustituirlo por salida generada
@ -65,9 +66,10 @@ src/uix/eidos/
```
`lib/` contiene el soporte puro de configuracion visual: primitivas, semantica
visual, themes, contrato CSS y render. Los CSS historicos (`contracts/`,
`tokens/`, `themes/base/`) siguen existiendo como material estatico durante la
migracion, pero no son el modelo que debe crecer.
visual, themes, contrato CSS y render. `generated/base.css` es el primer
artefacto estatico generado desde esa configuracion (`npm run generate:eidos-css`).
Los CSS historicos (`contracts/`, `tokens/`, `themes/base/`) siguen existiendo
como material de transicion, pero no son el modelo que debe crecer.
## Runtime activo
@ -648,11 +650,11 @@ podrá retirarse.
documentada en [`components/README.md`](./components/README.md), pero
la migracion de componentes/rutas no debe mezclarse con el trabajo del
modulo general.
- **CSS historico**: `contracts/`, `tokens/` y `themes/base/` siguen
presentes como CSS estatico de transicion porque `src/uix/eidos/index.css`
lo consume en rutas SSR/docs donde `ActiveEidos` se crea con
`applyDom:false`. No se deben retirar hasta introducir un artefacto CSS
generado en build desde `ActiveEidos` para consumidores estaticos.
- **CSS generado/legacy**: `generated/base.css` ya se genera desde la config
base de Eidos con `npm run generate:eidos-css` y se importa como foundation
estatica. `contracts/`, `tokens/` y `themes/base/` siguen presentes como
transicion porque aun hay recipes y aliases historicos que dependen de ellos.
El siguiente paso es decidir que queda como recipe estable y que se elimina.
- **Primitivas pendientes de cerrar**: decision final sobre que CSS legacy
queda como recipe frente a lo generado.
- **Check del repo**: `npm run check` no reporta errores en este punto; quedan

@ -0,0 +1,16 @@
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
import { describe, expect, it } from 'vitest';
import { renderGeneratedBaseEidosCss } from './lib/generated-css';
describe('generated Eidos CSS', () => {
it('keeps generated/base.css in sync with the base config renderer', () => {
const file = readFileSync(resolve('src/uix/eidos/generated/base.css'), 'utf8').replace(
/\r\n/g,
'\n'
);
expect(file).toBe(`${renderGeneratedBaseEidosCss()}\n`);
});
});

File diff suppressed because it is too large Load Diff

@ -62,6 +62,9 @@
/* ── Theme: actual values filling the contract slots (default = base) ───── */
@import './themes/base/index.css';
/* ── Generated foundation: ActiveEidos base config static export ────────── */
@import './generated/base.css';
/* ── Eidos-specific layers (no equivalent in air) ───────────────────────── */
@import './archetypes.css';
@import './events.css';

@ -0,0 +1,24 @@
import { renderStaticCss, renderThemeCss } from './render-css';
import { createThemeBaseEidosConfig } from './themes/base';
export function renderGeneratedBaseEidosCss(): string {
const config = createThemeBaseEidosConfig();
return [
`/*
* Generated Eidos foundation CSS.
*
* Source: src/uix/eidos/lib/themes/base.ts
* Command: npm run generate:eidos-css
*
* Do not edit this file by hand.
*/`,
renderStaticCss(config),
renderThemeCss(config, 'base-light', {
selector: ":root,\n[data-theme='base-light'],\n[data-theme='light']"
}),
renderThemeCss(config, 'base-dark', {
selector: "[data-theme='base-dark'],\n[data-theme='dark']"
})
].join('\n\n');
}
Loading…
Cancel
Save

Powered by TurnKey Linux.