O cubo era a visão de mundo dos antigos — terra plana, mas um cubo quadrado.
Um runtime de cubo semântico com skins intercambiáveis, no navegador, sem build. Estética darkroom (âmbar + porcelana sobre preto), cel-shading, conduzido pela respiração.
Trocar a pele do cubo é uma chamada:
loader.load("stone"); // cube → stone, crossfade dip-to-blackSete reference skins on-canon trocáveis em runtime — cube (herói), kintsugi-cube, lattice, stone, ribbon, arch, shard — todos no mesmo motor, sob o mesmo canon, com luz contre-jour (luz atrás, sombra longa à frente).
Sem bundler. Sirva a pasta e abra index.html:
python3 -m http.server 8744 # ou qualquer static server
# http://localhost:8744/index.html → teclas 1–7 trocam o skin (setas = ciclar)Arrastar = orbitar · scroll = zoom · 1–7 = trocar skin · setas = ciclar.
| Camada | Arquivo | Papel |
|---|---|---|
| Motor | src/engine/cube-renderer.js |
cena/câmera/luz/loop; interpreta um skin |
| Cel-shade | src/engine/celshade.js |
toon ramp + rim Fresnel + injeção de shader segura |
| Breath bus | src/engine/breath-bus.js |
ciclo respiratório compartilhado (inspire/hold/expire/hold, Ma) |
| Navegação | src/engine/compass-nav.js |
rosa-dos-ventos opt-in (slerp K=3.1) |
| Contrato | src/skin/skin.schema.json + docs/skin-contract.md |
o que um skin declara |
| Swap | src/skin/skin-loader.js |
troca em runtime com crossfade |
| Stage | (no motor) | palco contre-jour: chão recebe-sombra + key atrás do objeto |
| Skins | src/skins/*.js |
cube (herói) · kintsugi-cube · lattice · stone · ribbon · arch · shard |
| Gate | tools/canon-lint.mjs |
a estética como teste executável |
Um skin é um ES module com export default de um SkinDefinition — quase tudo
declarativo (paleta, geometria, material, costura, respiração). Ver
docs/skin-contract.md. Antes de mergear:
npm run lint # canon-lint: barra azul/red, gold-glow, HUD, fundo não-preto
npm test # self-check do canon-lintFundo #000. Só âmbar (#C8902F–#D99A4E) + porcelana. Sem azul/red/verde saturado.
Sem gold outer-glow. Sem HUD (0–1 palavra, Josefin Sans 200/300). Grão fino estático. Ma (間).
canon-lint aplica isso por máquina — o fosso é a estética, então ela é código.
Cada release leva o codinome de um artista da linhagem construtiva/neoconcreta brasileira
— modelo Apple (Sonoma, Sequoia). v0.1 = Weissmann (Franz Weissmann, Cubo Vazado,
1951 — o cubo de chapa com o "vazio ativo" recortado no centro). Convenção, série e o
firewall-de-verdade (toda atribuição documentada, nunca inventada) em
docs/RELEASE-CODENAMES.md.
O protocolo é aberto: o motor, o contrato de skin e os sete reference skins on-canon são OSS (este repo). As skins premium e o cubo BLANKBACK ficam privados — não se doa a catedral, abre-se o protocolo.
MIT — Instituto Terral.