Shader (gioser-shaders):
- 3 cuerpos centrales renderizados realísticamente con interpolación
gradual entre ellos (cross-fade smoothstep):
- render_sun: núcleo gauss + corona pulsante + textura de plasma FBM
(boiling surface).
- render_moon: disco con limb darkening, cráteres + mares (2 octavas
de fbm), terminador móvil (fase lunar), halo azulado en el limb
iluminado.
- render_earth: disco con continentes fbm (rotación lenta), polos
blancos, nubes en otra capa, día/noche en hemisferio iluminado,
halo atmosférico azul (Rayleigh simplificado).
- Uniforms u_body_a, u_body_b (int 0/1/2), u_body_blend (float).
- Cuerpo central se calcula sólo si inside > 0.001 (perf — saltea pixels
fuera de la superficie de la chacana).
- radial_mult atenúa los rayos cuando luna/tierra están activos — el sol
es el único que irradia tan intensamente.
- element_cloud(): aura ancha por cardinal (sigma_along=0.42,
sigma_perp=0.34) con textura fbm animada y modulación por elemento.
- AIRE: corrientes suaves que ondulan horizontalmente.
- FUEGO: lengüetazos rápidos con flicker.
- TIERRA: densidad sólida con variación lenta.
- AGUA: ondulaciones grandes que viajan hacia afuera.
Las nubes cubren todo el cuadrante del cardinal, no solo la punta.
- Helper functions vnoise_c + fbm_c agregadas (necesarias para superficies
realistas de luna/tierra y para nubes elementales).
Renderer (gioser-canvas-web):
- body_state(t) -> (body_a, body_b, blend) state machine:
- BODY_PHASE_SECS = 45 (≈10 pulsos del sol antes de transicionar).
- BODY_TRANSITION_SECS = 4 (cross-fade gradual).
- Total cycle: 147s = sol 45s → trans 4s → luna 45s → trans 4s → tierra 45s → trans 4s.
- Smoothstep cubic en el blend para curva natural (no linear).
- Sube u_body_a/b como int (uniform1i) y u_body_blend como float.
App + contenido:
- index.html: nuevos labels en los 4 tips
- NORTE (aire): SOFTWARE / Tecnología
- ESTE (fuego): QUIÉN SOY / Bitácora
- SUR (tierra): MANIFIESTO / Invariantes
- OESTE (agua): MÍSTICA / Espiritualidad
- Íconos SVG nuevos relacionados al tema:
- aire: chip de circuito con nodos y conexiones
- fuego: libro abierto con líneas
- tierra: hexagrama dentro de círculo (sacred geometry / invariante)
- agua: ojo en triángulo (mística)
- gioser-web src/lib.rs: ensure_page_dom usa nuevos title+tag por elemento.
- 4 md/*.md reescritos con contenido seed para los nuevos temas, con
manifiesto explícito en tierra.md.
Workspace verde + 21 tests.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Visual de la chacana retrabajado contra chakana.png de referencia:
- Sol detrás (gauss + corona, masked al interior de la chacana — sólo
asoma por la superficie de la cruz, no se cuela afuera).
- Doble outline dorado (línea principal + paralela offset 0.020), color
CHACANA_LINE pasa de cyan helado a dorado-ámbar del logo.
- Interior con niebla violeta-noche (u_dark_color) y rayos radiales
sutiles desde el centro, modulados por sin(t * 0.3).
- Aro doble exterior: ring fino interior + ring grueso con 4 grupos de
3 puntos cardinales (calculados angularmente, no rayos largos).
- WORLD_SCALE 1.45→1.05, MAX_TILT 35°→28° (más sólido, menos caricaturesco).
Título "GioSer" centrado dentro de la superficie de la chacana, sin
subtítulo. Se inclina junto con la chacana vía CSS perspective +
rotateX/rotateY desde u-tilt-x/y inyectadas cada frame por WASM.
Botones (4 tips):
- Reposicionados a `arm_extent * 1.32` (entre punta y aro grueso).
- Bigger: min-width 168px, glyph 54px, label Cinzel 0.95rem.
- Doble anillo en hover (::before con border + glow).
- Cuando un drawer se abre, fade-out de tips + canvas + brand.
Drawers MD (uno por elemento):
- `<aside class="drawer drawer-{element}">` con transform-origin desde
CSS vars (--origin-x/y) seteadas por WASM al click — crece desde la
posición exacta del botón hasta fullscreen en 700ms con cubic-bezier.
- Ambience por elemento: AIRE (radial drift), FUEGO (flicker keyframe),
AGUA (tide vertical), TIERRA (warm earth gradient).
- Cerrado con botón X, Escape o data-close-drawer.
- Carga MD desde ./md/{element}.md via spawn_local + Reader::open_url.
Pluma (visor MD agnóstico, dos crates nuevos):
- `crates/modules/pluma/pluma-md` — wrapper sobre pulldown-cmark 0.12.
API: to_html(), to_themed_html(md, theme) con sanitización del theme,
events() para AST stream. GFM completo. No deps web. 5 tests.
- `crates/modules/pluma/pluma-reader-web` — toma HtmlElement, expone
open_url async (fetch via wasm-bindgen-futures), render_md sync,
show_loading/show_error. NO inyecta CSS — el host estiliza
`.pluma-doc[data-pluma-theme="..."]` con sus colores.
CSS pluma-doc completo: h1/h2/h3, code/pre con border-left accent,
blockquote, tables, lists, hr gradient. Loader spinner + error state.
Placeholders en md/{aire,fuego,tierra,agua}.md con texto seed.
Workspace verde + 18 tests (6 geom + 4 palette + 3 physics + 5 pluma-md).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>