feat(eidos): index-runtime.css, el hermano de index.css sin la fundacion estatica

Hoy la fundacion se emite DOS veces en quien arranca eidos por runtime:
index.css importa generated/base.css (495.701 bytes) y apply() escribe
el mismo bloque como <style> (431.431 bytes) — ~463 KB duplicados y
~9.500 reglas parseadas dos veces. Los 39 consumidores de index.css
viven todos bajo web/routes/** (congelado): no se migra ninguno.

ADITIVO: index.css no cambia ni un byte (verificado normalizando CRLF
contra HEAD); los dos custodios que lo leen —recipe-css-contract.test.ts
y scripts/component-audit.ts— siguen verdes sin editarlos. El hermano es
index.css sin `@import './generated/base.css'`, mismo orden; el guard
index-runtime-css.test.ts compara las listas de @import de ambos y
asierta que index.css contiene la fundacion (no pasa sobre vacio). El
XOR de recipe-css-contract.test.ts:251 solo mira index.css: con dos
entradas queda compensado por este guard, no cubierto.

Costura conocida, sin cerrar: color-scheme vive hoy solo en la via
estatica (base.css); apply() no lo emite, asi que quien adopte este
fichero no lo recibe. Cerrarlo exige que apply() decida la apariencia
desde themeContext.mode — decision de contrato, va a firma del autor.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
alpha-0.1-background
dev 3 weeks ago
parent cc586612ae
commit 598ea460e8

@ -0,0 +1,21 @@
import { readFileSync } from 'node:fs';
import { describe, expect, it } from 'vitest';
const FOUNDATION_IMPORT = "@import './generated/base.css';";
function imports(path: string): string[] {
return readFileSync(path, 'utf8')
.split(/\r?\n/)
.map((line) => line.trim())
.filter((line) => line.startsWith('@import '));
}
describe('index-runtime.css', () => {
it('is index.css minus the generated foundation, same imports in the same order', () => {
const index = imports('src/uix/eidos/index.css');
expect(index).toContain(FOUNDATION_IMPORT);
expect(imports('src/uix/eidos/index-runtime.css')).toEqual(
index.filter((line) => line !== FOUNDATION_IMPORT)
);
});
});

@ -0,0 +1,29 @@
/**
* Eidos — runtime-foundation entrypoint.
*
* Sibling of `index.css` for apps that boot eidos at runtime (`ActiveEidos`
* with `applyDom` on): `apply()` already writes the generated foundation as a
* `<style>`, so importing `index.css` would ship and parse it twice. This file
* is `index.css` WITHOUT `@import './generated/base.css'` — everything else is
* identical, in the same order.
*
* Do NOT use it under SSR/static rendering with `applyDom: false`: nothing
* would write the foundation. Those consumers keep `index.css`.
*
* Keep in sync with `index.css` (guarded by `index-runtime-css.test.ts`).
*/
@import './archetypes.css';
@import './events.css';
@import './components/box/box.css';
@import './components/flex/flex.css';
@import './components/grid/grid.css';
@import './components/stack/stack.css';
@import './components/group/group.css';
@import './components/wrap/wrap.css';
@import './components/container/container.css';
@import './components/section/section.css';
@import './components/aspect-ratio/aspect-ratio.css';
@import './components/auto-grid/auto-grid.css';
@import './components/spin-field/spin-field.css';
Loading…
Cancel
Save

Powered by TurnKey Linux.