From 05f916a7d1fb24421609e6cef86d904de6e4907a Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 24 May 2026 02:29:52 +0000 Subject: [PATCH] portada: reticula ilumina en hover via JS, contenido centrado, orden 0x01|0x00 / 0x02|0x03 --- Cargo.toml.bak | 509 +++++++++++++++++++ crates/apps/gioser-web/index.html | 61 ++- crates/apps/gioser-web/index.html.bak | 127 +++++ crates/apps/gioser-web/styles.css | 33 +- crates/apps/gioser-web/styles.css.bak | 679 ++++++++++++++++++++++++++ 5 files changed, 1375 insertions(+), 34 deletions(-) create mode 100644 Cargo.toml.bak create mode 100644 crates/apps/gioser-web/index.html.bak create mode 100644 crates/apps/gioser-web/styles.css.bak diff --git a/Cargo.toml.bak b/Cargo.toml.bak new file mode 100644 index 0000000..264decb --- /dev/null +++ b/Cargo.toml.bak @@ -0,0 +1,509 @@ +[workspace] +resolver = "2" +members = [ + # ============================================================ + # protocol/ — Contratos canónicos + routing entre módulos + # ============================================================ + "crates/protocol/brahman-card", + "crates/protocol/brahman-card-wit", + "crates/protocol/brahman-cards", + "crates/protocol/brahman-handshake", + "crates/protocol/brahman-broker", + "crates/protocol/brahman-admin", + "crates/protocol/brahman-sidecar", + "crates/protocol/brahman-net", + "crates/protocol/brahman-dht", + "crates/protocol/brahman-card-discovery", + "crates/protocol/brahman-ssh-multiplex", + "crates/protocol/brahman-auth", + "crates/protocol/arje-card", + + # ============================================================ + # init/ — PID 1 + encarnación Linux (arje) + # ============================================================ + "crates/init/arje-zero", + "crates/init/arje-kernel", + "crates/init/arje-soma", + "crates/init/arje-snapshot", + "crates/init/arje-incarnate", + "crates/init/arje-absorb", + + # ============================================================ + # runtime/ — Infraestructura de ejecución (bus + cas + wasm + brain) + # ============================================================ + "crates/runtime/arje-bus", + "crates/runtime/arje-cas", + "crates/runtime/arje-wasm", + "crates/runtime/arje-brain-rules", + "crates/runtime/arje-brain-cognitive", + "crates/runtime/arje-brain-audit", + "crates/runtime/arje-brain", + "crates/runtime/arje-echo", + "crates/runtime/sandokan-lifecycle", + "crates/runtime/sandokan-core", + "crates/runtime/sandokan-local", + "crates/runtime/sandokan-daemon", + "crates/runtime/sandokan-remote", + "crates/runtime/sandokan", + + # ============================================================ + # compat/ — Shims D-Bus para correr software systemd-aware + # ============================================================ + "crates/compat/arje-compat-common", + "crates/compat/arje-policy-provider", + "crates/compat/arje-logind-compat", + "crates/compat/arje-hostnamed-compat", + "crates/compat/arje-timedated-compat", + "crates/compat/arje-localed-compat", + "crates/compat/arje-journald-compat", + "crates/compat/arje-resolved-compat", + "crates/compat/arje-polkit-compat", + "crates/compat/arje-machined-compat", + "crates/compat/arje-tmpfiles-compat", + "crates/compat/arje-systemd1-compat", + "crates/compat/arje-notify-compat", + "crates/compat/arje-binfmt-compat", + "crates/compat/arje-timer-compat", + + # ============================================================ + # modules/semantic_dht/ (minga) — DHT semántico de código + # ============================================================ + "crates/modules/semantic_dht/minga-core", + "crates/modules/semantic_dht/minga-store", + "crates/modules/semantic_dht/minga-p2p", + "crates/modules/semantic_dht/minga-vfs", + "crates/modules/semantic_dht/minga-cli", + + # ============================================================ + # modules/nahual/ — Motor GPUI: libs + widgets (era yahweh) + # ============================================================ + "crates/modules/nahual/libs/core", + "crates/modules/nahual/libs/theme", + "crates/modules/nahual/libs/launcher", + "crates/modules/nahual/libs/bus", + "crates/modules/nahual/libs/meta-schema", + "crates/modules/nahual/libs/meta-runtime", + "crates/modules/nahual/libs/providers/fs", + "crates/modules/nahual/libs/providers/sqlite", + "crates/modules/nahual/widgets/tree", + "crates/modules/nahual/widgets/container_core", + "crates/modules/nahual/widgets/splitter", + "crates/modules/nahual/widgets/tabs", + "crates/modules/nahual/widgets/tiled", + "crates/modules/nahual/widgets/text_input", + "crates/modules/nahual/widgets/meta-form", + "crates/modules/nahual/widgets/banner", + "crates/modules/nahual/widgets/card", + "crates/modules/nahual/widgets/stat-card", + "crates/modules/nahual/widgets/app-header", + "crates/modules/nahual/widgets/theme-switcher", + + # ============================================================ + # modules/pineal/ — Data-viz agnóstica con backends (era lapaloma) + # ============================================================ + "crates/modules/pineal/core", + "crates/modules/pineal/render", + "crates/modules/pineal/cartesian", + "crates/modules/pineal/stream", + "crates/modules/pineal/mesh", + "crates/modules/pineal/financial", + "crates/modules/pineal/polar", + "crates/modules/pineal/heatmap", + "crates/modules/pineal/treemap", + "crates/modules/pineal/flow", + "crates/modules/pineal/phosphor", + "crates/modules/pineal/export", + "crates/modules/pineal/umbrella", + + # ============================================================ + # modules/verbo/ — Provider de embeddings model-agnostic + # ============================================================ + "crates/modules/verbo/verbo-core", + "crates/modules/verbo/verbo-mock", + "crates/modules/verbo/verbo-daemon", + + # ============================================================ + # modules/agorapura/ — Identidad humana federada + # ============================================================ + "crates/modules/agorapura/agorapura-core", + "crates/modules/agorapura/agorapura-graph", + + # ============================================================ + # modules/badu/ — Toma de notas con gravedad semántica + # ============================================================ + "crates/modules/badu/badu-core", + "crates/modules/badu/badu-gravity", + + # ============================================================ + # modules/takiy/ — Composición musical asistida + # ============================================================ + "crates/modules/takiy/takiy-core", + + # ============================================================ + # modules/matilda/ — Administración de servidores + # ============================================================ + "crates/modules/matilda/matilda-core", + "crates/modules/matilda/matilda-config", + "crates/modules/matilda/matilda-plan", + "crates/modules/matilda/matilda-apply", + "crates/modules/matilda/matilda-ghost", + "crates/modules/matilda/matilda-linker", + "crates/modules/matilda/matilda-discover", + + # ============================================================ + # modules/yachay/ — Notebooks computacionales reproducibles + # ============================================================ + "crates/modules/yachay/yachay-core", + + # ============================================================ + # modules/charka/ — Transpilador COBOL → Rust + # ============================================================ + "crates/modules/charka/charka-bcd", + "crates/modules/charka/charka-lexer", + "crates/modules/charka/charka-parser", + "crates/modules/charka/charka-ir", + "crates/modules/charka/charka-runtime", + "crates/modules/charka/charka-codegen", + "crates/modules/charka/charka-shadow", + + # ============================================================ + # modules/mirada/ — Compositor Wayland + # ============================================================ + "crates/modules/mirada/mirada-layout", + "crates/modules/mirada/mirada-protocol", + "crates/modules/mirada/mirada-brain", + "crates/modules/mirada/mirada-link", + "crates/modules/mirada/mirada-body", + + # ============================================================ + # modules/nakui/ — ERP matemático (categórico) + # ============================================================ + "crates/modules/nakui/core", + + # ============================================================ + # modules/chasqui/ — Explorador semántico de nómadas (ex-nouser, ex-akasha) + # ============================================================ + "crates/modules/chasqui/card", + "crates/modules/chasqui/core", + "crates/modules/chasqui/nous", + "crates/modules/chasqui/nous-mock", + "crates/modules/chasqui/nous-real", + + # ============================================================ + # modules/shuma/ — Runtime de espacios aislados (era shipote) + # ============================================================ + "crates/modules/shuma/shuma-card", + "crates/modules/shuma/shuma-protocol", + "crates/modules/shuma/shuma-discern", + "crates/modules/shuma/shuma-core", + "crates/modules/shuma/shuma-intent", + "crates/modules/shuma/shuma-line", + "crates/modules/shuma/shuma-sysmon", + "crates/modules/shuma/shuma-session", + "crates/modules/shuma/shuma-exec", + "crates/modules/shuma/shuma-infer", + "crates/modules/shuma/shuma-shell-render", + + # ============================================================ + # modules/dominium/ — Simulador psicológico de campo medio + # ============================================================ + "crates/modules/dominium/dominium-core", + "crates/modules/dominium/dominium-physics", + "crates/modules/dominium/dominium-iso", + "crates/modules/dominium/dominium-render-plan", + "crates/modules/dominium/dominium-canvas-gpui", + + # ============================================================ + # modules/gioser/ — Landing WASM (chacana + 4 elementos) + # ============================================================ + "crates/modules/gioser/gioser-geom", + "crates/modules/gioser/gioser-physics", + "crates/modules/gioser/gioser-palette", + "crates/modules/gioser/gioser-shaders", + "crates/modules/gioser/gioser-canvas-web", + "crates/modules/gioser/gioser-graph-web", + + # ========================================================== + # modules/fana/ — Writer DAG editor (absorbe pluma) + # ============================================================ + "crates/modules/fana/fana-core", + "crates/modules/fana/fana-graph", + "crates/modules/fana/fana-render-plan", + "crates/modules/fana/fana-editor-gpui", + "crates/modules/fana/fana-store", + "crates/modules/fana/fana-semantic", + "crates/modules/fana/fana-md", + "crates/modules/fana/fana-md-reader-web", + + # ============================================================ + # modules/revista/ — Deck horizontal swipe (Flutter PageView) + # ============================================================ + "crates/modules/revista/revista-core", + "crates/modules/revista/revista-web", + + # ============================================================ + # modules/barra/ — Taskbar agnóstica estilo Windows + # ============================================================ + "crates/modules/barra/barra-core", + "crates/modules/barra/barra-web", + + # ============================================================ +#### # modules/cosmobiologia/ — Estudio de astrología profesional +#### # ============================================================ +#### "crates/modules/cosmobiologia/cosmobiologia-card", +#### "crates/modules/cosmobiologia/cosmobiologia-model", +#### "crates/modules/cosmobiologia/cosmobiologia-store", +#### "crates/modules/cosmobiologia/cosmobiologia-render", +#### "crates/modules/cosmobiologia/cosmobiologia-corpus", +#### "crates/modules/cosmobiologia/cosmobiologia-engine", +#### "crates/modules/cosmobiologia/cosmobiologia-modules", +#### "crates/modules/cosmobiologia/cosmobiologia-theme", +#### "crates/modules/cosmobiologia/cosmobiologia-canvas", +#### "crates/modules/cosmobiologia/cosmobiologia-tree", +#### "crates/modules/cosmobiologia/cosmobiologia-panel", +#### "crates/modules/cosmobiologia/cosmobiologia-web", + + # ============================================================ + # apps/ — Binarios finales que consumen el protocolo + # ============================================================ + "crates/apps/brahman-broker-explorer", + "crates/apps/brahman-demo", + "crates/apps/sandokan", + "crates/apps/nahual-shell", + "crates/apps/nahual-file-explorer", + "crates/apps/nahual-database-explorer", + "crates/apps/nahual-text-viewer", + "crates/apps/nahual-image-viewer", + "crates/apps/chasqui-explorer", + "crates/apps/nakui-explorer", + "crates/apps/nakui-ui", + "crates/apps/minga-explorer", + "crates/apps/shuma-daemon", + "crates/apps/shuma-cli", + "crates/apps/shuma-gateway", + "crates/apps/shuma-shell", + "crates/apps/gioser-web", + "crates/apps/pineal-demo", + "crates/apps/pineal-stream-demo", + "crates/apps/pineal-phosphor-demo", + "crates/apps/pineal-financial-demo", +#### "crates/apps/cosmobiologia", +#### "crates/apps/cosmobiologia-cli", +#### "crates/apps/cosmobiologia-server", + "crates/apps/dominium", + "crates/apps/fana", + "crates/apps/agorapura", + "crates/apps/badu", + "crates/apps/matilda", + "crates/apps/yachay", + "crates/apps/mirada", + "crates/apps/mirada-compositor", + "crates/apps/mirada-ctl", + "crates/apps/mirada-launcher", + "crates/apps/mirada-portal", + "crates/apps/mirada-greeter", + "crates/apps/charka", +] + +# renaser — el SO bare-metal SASOS. Vive en el mismo repo pero es su +# PROPIO workspace de Cargo: usa toolchain nightly, target +# `x86_64-unknown-none` y `panic = "abort"`, incompatibles con los +# perfiles globales de este workspace. Cargo lo trata como ajeno; los +# crates compartidos se referencian por `path` cruzando la frontera. +exclude = ["renaser"] + +[workspace.package] +version = "0.1.0" +edition = "2021" +rust-version = "1.80" +license = "MIT OR Apache-2.0" +authors = ["Brahman Contributors"] +publish = false +repository = "https://example.invalid/brahman" + +[workspace.dependencies] +# === Serialización === +serde = { version = "1", features = ["derive"] } +serde_json = "1" +serde-big-array = "0.5" +postcard = { version = "1", features = ["use-std"] } +toml = "0.8" +ron = "0.8" +bincode = "1" +base64 = "0.22" + +# === Errores === +thiserror = "2" # bump uniforme; arje (era 1) puede requerir ajustes menores +anyhow = "1" + +# === Async === +tokio = { version = "1", features = ["full"] } +tokio-util = { version = "0.7", features = ["compat"] } +async-trait = "0.1" +futures = "0.3" + +# === Observabilidad === +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } + +# === Linux primitives (arje) === +nix = { version = "0.29", features = ["signal", "process", "sched", "mount", "fs", "socket", "net", "user"] } +libc = "0.2" + +# === IDs / Hash / Crypto === +ulid = { version = "1", features = ["serde"] } +uuid = { version = "1", features = ["v4"] } +sha2 = "0.10" +blake3 = "1.5" +ed25519-dalek = "2" +aes-gcm = "0.10" +argon2 = "0.5" +rand = "0.8" + +# === WASM (arje) === +# wasmi 1.0: unifica la versión con renaser (su kernel ya corre 1.0), para +# que el ABI WASM del host sea idéntico en Linux y en bare-metal. +wasmi = "1.0" +wat = "1" + +# === Storage / DB === +sled = "0.34" +rusqlite = { version = "0.31", features = ["bundled", "blob"] } + +# === P2P (minga) === +libp2p = { version = "0.56", features = ["tokio", "tcp", "noise", "yamux", "macros", "kad", "identify"] } +libp2p-stream = "=0.4.0-alpha" +libp2p-allow-block-list = "0.6" + +# === SSH (brahman-ssh-multiplex, sandokan RemoteEngine, matilda) === +russh = "0.54" + +# === Math determinista cross-platform (dominium) === +libm = "0.2" + +# === Code parsing (minga) === +tree-sitter = "0.24" +tree-sitter-rust = "0.23" +tree-sitter-python = "0.23" +tree-sitter-typescript = "0.23" +tree-sitter-javascript = "0.23" +tree-sitter-go = "0.23" + +# === FS notify === +notify = "6.1" + +# === FUSE (minga-vfs) === +# default-features = false: prescinde de pkg-config/libfuse-dev en build. +# El montaje pasa a ser Rust puro (vía el helper `fusermount3` en runtime). +fuser = { version = "0.15", default-features = false } + +# === CLI / auth (minga) === +clap = { version = "4", features = ["derive"] } +rpassword = "7" + +# === PAM (brahman-auth) === +pam = "0.8" + +# === D-Bus (arje compat) === +zbus = { version = "4", default-features = false, features = ["tokio"] } + +# === Tests === +tempfile = "3" + +# === GPUI (nahual) === +gpui = "0.2" + +# === Filesystem helpers === +directories = "5" + +# === WASM web (gioser) === +wasm-bindgen = "0.2" +wasm-bindgen-futures = "0.4" +js-sys = "0.3" +web-sys = "0.3" +glam = "0.30" + +# === Markdown (pluma) === +pulldown-cmark = { version = "0.12", default-features = false, features = ["html"] } + +# ============================================================ +# Intra-workspace deps de nahual (referenciadas por workspace = true) +# ============================================================ +nahual-core = { path = "crates/modules/nahual/libs/core" } +nahual-theme = { path = "crates/modules/nahual/libs/theme" } +nahual-bus = { path = "crates/modules/nahual/libs/bus" } +nahual-provider-fs = { path = "crates/modules/nahual/libs/providers/fs" } +nahual-provider-sqlite = { path = "crates/modules/nahual/libs/providers/sqlite" } +nahual-widget-tree = { path = "crates/modules/nahual/widgets/tree" } +nahual-widget-container-core = { path = "crates/modules/nahual/widgets/container_core" } +nahual-widget-splitter = { path = "crates/modules/nahual/widgets/splitter" } +nahual-widget-tabs = { path = "crates/modules/nahual/widgets/tabs" } +nahual-widget-tiled = { path = "crates/modules/nahual/widgets/tiled" } +nahual-widget-text-input = { path = "crates/modules/nahual/widgets/text_input" } +nahual-file-explorer = { path = "crates/apps/nahual-file-explorer" } +nahual-database-explorer = { path = "crates/apps/nahual-database-explorer" } +nahual-text-viewer = { path = "crates/apps/nahual-text-viewer" } +nahual-image-viewer = { path = "crates/apps/nahual-image-viewer" } + +# ============================================================ +# Intra-workspace deps de pineal (módulo de gráficos) +# ============================================================ +pineal-core = { path = "crates/modules/pineal/core" } +pineal-render = { path = "crates/modules/pineal/render" } +pineal-cartesian = { path = "crates/modules/pineal/cartesian" } +pineal-stream = { path = "crates/modules/pineal/stream" } +pineal-mesh = { path = "crates/modules/pineal/mesh" } +pineal-financial = { path = "crates/modules/pineal/financial" } +pineal-polar = { path = "crates/modules/pineal/polar" } +pineal-heatmap = { path = "crates/modules/pineal/heatmap" } +pineal-treemap = { path = "crates/modules/pineal/treemap" } +pineal-flow = { path = "crates/modules/pineal/flow" } +pineal-phosphor = { path = "crates/modules/pineal/phosphor" } +pineal-export = { path = "crates/modules/pineal/export" } +pineal = { path = "crates/modules/pineal/umbrella" } + +[profile.release] +lto = "thin" +codegen-units = 1 +strip = "symbols" +panic = "abort" + +[profile.dev] +opt-level = 0 +# `line-tables-only` mantiene stack traces con archivo:línea correctos +# pero descarta el resto de symbols. Reduce target/ ~40% sin sacrificar +# debugging real para nuestro flujo (no usamos gdb sobre estos crates). +debug = "line-tables-only" +split-debuginfo = "unpacked" +incremental = true +# Más codegen-units = más paralelismo + builds incrementales más chicas +# (cada cambio re-compila menos). Default es 256 en dev pero lo +# anclamos para evitar regresiones. +codegen-units = 256 + +# Override puntual para deps grandes que NO debuggeamos: gpui, ort, +# fastembed, tokenizers, image. Subir opt-level acá hace que sus libs +# pesen menos en target/ (símbolos descartados durante la build). +[profile.dev.package."*"] +opt-level = 0 +debug = "line-tables-only" + +[profile.dev.package.gpui] +opt-level = 1 +debug = false + +[profile.dev.package.ort] +opt-level = 1 +debug = false + +[profile.dev.package.fastembed] +opt-level = 1 +debug = false + +[profile.dev.package.tokenizers] +opt-level = 1 +debug = false + +[profile.dev.package.image] +opt-level = 1 +debug = false diff --git a/crates/apps/gioser-web/index.html b/crates/apps/gioser-web/index.html index 95c5ae8..30cf3a7 100644 --- a/crates/apps/gioser-web/index.html +++ b/crates/apps/gioser-web/index.html @@ -13,29 +13,7 @@
- - - - - - - - - + + + +
+ + + + + @@ -152,8 +152,22 @@ const portada = document.getElementById('portada'); const deck = document.getElementById('deck'); const controls = document.getElementById('global-page-controls'); + const reticulaV = document.querySelector('.reticula-v'); + const reticulaH = document.querySelector('.reticula-h'); + const reticulaC = document.querySelector('.reticula-center'); + // Hover en cuadrantes ilumina retícula document.querySelectorAll('.cuadrante').forEach(q => { + q.addEventListener('mouseenter', () => { + reticulaV.classList.add('brighter'); + reticulaH.classList.add('brighter'); + reticulaC.classList.add('brighter'); + }); + q.addEventListener('mouseleave', () => { + reticulaV.classList.remove('brighter'); + reticulaH.classList.remove('brighter'); + reticulaC.classList.remove('brighter'); + }); q.addEventListener('click', function(e) { const hex = this.dataset.q; const camino = Q_TO_CAMINO[hex] || 'aire'; @@ -164,7 +178,6 @@ controls.style.opacity = '1'; controls.style.pointerEvents = 'auto'; // navegar vía hash para que el WASM lo atrape - // (el WASM escucha popstate + lee hash al boot) history.pushState({}, '', '/estudio/' + camino); window.dispatchEvent(new PopStateEvent('popstate')); }); diff --git a/crates/apps/gioser-web/index.html.bak b/crates/apps/gioser-web/index.html.bak new file mode 100644 index 0000000..de7c4af --- /dev/null +++ b/crates/apps/gioser-web/index.html.bak @@ -0,0 +1,127 @@ + + + + + + GioSer · En el centro, el ser + + + + + + + + +
+ + + + SOFTWARE + Tecnología + + + + + + QUIÉN SOY + Bitácora + + + + + + MANIFIESTO + Invariantes + + + + + + MÍSTICA + Espiritualidad + + + + + + + +
+ + + + + +
+ + +
+ + + + + + + diff --git a/crates/apps/gioser-web/styles.css b/crates/apps/gioser-web/styles.css index 6b9a25f..71ce19a 100644 --- a/crates/apps/gioser-web/styles.css +++ b/crates/apps/gioser-web/styles.css @@ -62,7 +62,12 @@ html, body { background: var(--reticula); z-index: 1; pointer-events: none; - transition: background 0.4s ease; + transition: background 0.4s ease, box-shadow 0.4s ease; +} + +.reticula-v.brighter { + background: rgba(192, 192, 192, 0.35); + box-shadow: 0 0 6px rgba(192, 192, 192, 0.2); } .reticula-h { @@ -74,7 +79,12 @@ html, body { background: var(--reticula); z-index: 1; pointer-events: none; - transition: background 0.4s ease; + transition: background 0.4s ease, box-shadow 0.4s ease; +} + +.reticula-h.brighter { + background: rgba(192, 192, 192, 0.35); + box-shadow: 0 0 6px rgba(192, 192, 192, 0.2); } .reticula-center { @@ -87,7 +97,12 @@ html, body { border-radius: 50%; z-index: 2; pointer-events: none; - transition: border-color 0.4s ease; + transition: border-color 0.4s ease, box-shadow 0.4s ease; +} + +.reticula-center.brighter { + border-color: rgba(192, 192, 192, 0.3); + box-shadow: 0 0 8px rgba(192, 192, 192, 0.15); } /* =================================================== @@ -112,11 +127,6 @@ html, body { background: var(--reticula-hover); } -.cuadrante:hover ~ .reticula-v, -.cuadrante:hover ~ .reticula-h { - background: var(--accent-glow); -} - /* Borde iluminado en hover */ .cuadrante-border { position: absolute; @@ -137,7 +147,9 @@ html, body { display: flex; flex-direction: column; justify-content: center; - padding: 24px 28px; + align-items: center; + text-align: center; + padding: 32px 20px; opacity: 0.7; transition: opacity 0.3s ease; } @@ -169,8 +181,9 @@ html, body { color: var(--fg-dim); line-height: 1.5; margin-bottom: 12px; - max-width: 80%; + max-width: 75%; font-family: var(--font-ui); + text-align: center; } .cuadrante-meta { diff --git a/crates/apps/gioser-web/styles.css.bak b/crates/apps/gioser-web/styles.css.bak new file mode 100644 index 0000000..170cc54 --- /dev/null +++ b/crates/apps/gioser-web/styles.css.bak @@ -0,0 +1,679 @@ +/* === Tokens === */ +:root { + --bg: #06050d; + --fg: #e8eaf5; + --gold: #d8a85d; + --gold-deep: #b77e34; + --aire: #d0dbff; + --agua: #6cd0f3; + --fuego: #f59056; + --tierra: #d49873; + --cuerpo: #e07a5f; + --sombra: #4a4a5a; + --cosmos: #d4a843; + --practica: #2d936c; + --olvido: #b0b8c0; + + --ease-emerge: cubic-bezier(0.22, 0.61, 0.20, 1); + --ease-magma: cubic-bezier(0.32, 0, 0.05, 1); + --ease-page: cubic-bezier(0.22, 0.61, 0.36, 1); + + --taskbar-height: 52px; +} + +* { box-sizing: border-box; } + +html, body { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + background: var(--bg); + color: var(--fg); + font-family: 'Inter', system-ui, -apple-system, sans-serif; + font-weight: 300; + overflow: hidden; +} + +/* === Canvas WebGL === */ +#gioser-canvas { + position: fixed; + inset: 0; + width: 100vw; + height: 100vh; + display: block; + z-index: 0; + transition: opacity 600ms var(--ease-emerge), filter 600ms var(--ease-emerge); +} +body.deck-visible #gioser-canvas { + opacity: 0.30; + filter: blur(4px) saturate(80%); +} + +/* === Tips (botones cardinales sobre el aro) === */ +#tips { + position: fixed; + inset: 0; + pointer-events: none; + z-index: 5; + transition: opacity 250ms ease; +} +body.deck-visible #tips { + opacity: 0; + pointer-events: none; +} + +.tip { + position: absolute; + top: 0; left: 0; + pointer-events: auto; + text-decoration: none; + color: var(--fg); + user-select: none; + cursor: pointer; + + display: flex; + flex-direction: column; + align-items: center; + gap: 0.55rem; + padding: 1.1rem 1.6rem 0.95rem; + min-width: 168px; + + background: + radial-gradient(ellipse at top, rgba(255, 255, 255, 0.04), transparent 65%), + rgba(8, 6, 22, 0.55); + backdrop-filter: blur(12px) saturate(140%); + -webkit-backdrop-filter: blur(12px) saturate(140%); + border-radius: 20px; + border: 1px solid rgba(216, 168, 93, 0.25); + + box-shadow: + 0 12px 36px rgba(0, 0, 0, 0.40), + inset 0 0 0 1px rgba(255, 255, 255, 0.04); + + transition: + box-shadow 350ms var(--ease-emerge), + border-color 350ms var(--ease-emerge), + background 350ms var(--ease-emerge); +} +.tip::before { + content: ""; + position: absolute; + inset: -10px; + border-radius: 26px; + border: 1px solid currentColor; + opacity: 0; + transition: opacity 400ms ease, inset 400ms var(--ease-emerge); + pointer-events: none; +} +.tip:hover { + border-color: currentColor; + background: + radial-gradient(ellipse at top, rgba(255, 255, 255, 0.07), transparent 65%), + rgba(20, 14, 40, 0.72); +} +.tip:hover::before { + opacity: 0.45; + inset: -16px; +} +.tip-glyph { + width: 54px; + height: 54px; + color: currentColor; + filter: drop-shadow(0 0 6px currentColor) drop-shadow(0 0 16px currentColor); + transition: filter 320ms ease, transform 350ms var(--ease-emerge); +} +.tip:hover .tip-glyph { + filter: drop-shadow(0 0 14px currentColor) drop-shadow(0 0 28px currentColor); + transform: translateY(-3px); +} +.tip-label { + font-family: 'Cinzel', serif; + font-size: 0.95rem; + letter-spacing: 0.42em; + font-weight: 600; + text-indent: 0.42em; + margin-top: 0.15rem; +} +.tip-sub { + font-family: 'Inter', sans-serif; + font-size: 0.7rem; + letter-spacing: 0.22em; + font-weight: 300; + color: rgba(232, 234, 245, 0.62); + text-transform: uppercase; + text-indent: 0.22em; +} +.tip-aire { color: var(--aire); } +.tip-fuego { color: var(--fuego); } +.tip-agua { color: var(--agua); } +.tip-tierra { color: var(--tierra); } +.tip-cuerpo { color: var(--cuerpo); } +.tip-sombra { color: var(--sombra); } +.tip-cosmos { color: var(--cosmos); } +.tip-practica { color: var(--practica); } +.tip-olvido { color: var(--olvido); } + +/* === DECK: contenedor único de páginas swipeable === */ +.deck { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: var(--taskbar-height); + z-index: 100; + pointer-events: none; + opacity: 0; + visibility: hidden; + transform-origin: var(--origin-x, 50%) var(--origin-y, 50%); + transform: scale(0.0); + overflow: hidden; + touch-action: pan-y; + background: + radial-gradient(ellipse at center, var(--deck-glow, rgba(216, 168, 93, 0.15)), transparent 65%), + rgba(6, 5, 13, 0.96); + backdrop-filter: blur(28px) saturate(140%); + -webkit-backdrop-filter: blur(28px) saturate(140%); + transition: + transform 600ms var(--ease-magma), + opacity 450ms ease, + visibility 0s 600ms; +} +.deck.open { + pointer-events: auto; + opacity: 1; + visibility: visible; + transform: scale(1); + transition: + transform 600ms var(--ease-magma), + opacity 450ms ease, + visibility 0s; +} +/* Acento del deck según elemento activo: glow radial del color. */ +body.deck-active-aire .deck { --deck-glow: rgba(208, 219, 255, 0.22); } +body.deck-active-fuego .deck { --deck-glow: rgba(245, 144, 86, 0.28); } +body.deck-active-agua .deck { --deck-glow: rgba(108, 208, 243, 0.22); } +body.deck-active-tierra .deck { --deck-glow: rgba(212, 152, 115, 0.24); } + +/* Strip horizontal con páginas — vista-web traslada esto. + touch-action: pan-y declara al browser "yo manejo horizontal, el + vertical (scroll interno de cada página) lo dejas pasar". Sin esto + el navegador móvil se traga el gesto horizontal antes de que JS + pueda capturarlo. */ +.deck-strip { + display: flex; + flex-direction: row; + width: 100%; + height: 100%; + transform: translate3d(var(--vista-offset, 0px), 0, 0); + transition: transform 360ms var(--ease-page); + will-change: transform; + touch-action: pan-y; +} +/* Asegurar que TODOS los descendientes del strip hereden el contrato + touch-action — si el toque llega a un párrafo o , el browser + chequea el touch-action del target, no del padre. */ +.deck-strip * { + touch-action: pan-y; +} +.deck-strip.vista-dragging, +.deck-strip.vista-instant { + transition: none; +} + +.deck-page { + flex: 0 0 100%; + width: 100%; + height: 100%; + position: relative; + overflow-y: auto; + overflow-x: hidden; + touch-action: pan-y; +} +.deck-page[data-element="aire"] { --page-accent: var(--aire); } +.deck-page[data-element="fuego"] { --page-accent: var(--fuego); } +.deck-page[data-element="agua"] { --page-accent: var(--agua); } +.deck-page[data-element="tierra"] { --page-accent: var(--tierra); } + +/* Ambience por página */ +.page-ambience { + position: absolute; + inset: 0; + pointer-events: none; + z-index: 0; + transition: opacity 2s ease; + filter: blur(60px); + opacity: 0.5; +} +.deck-page[data-element="aire"] .page-ambience { + background: radial-gradient(circle at 50% 50%, rgba(208,219,255,0.22), transparent 60%); + animation: page-breathe 8s ease-in-out infinite alternate; +} +.deck-page[data-element="fuego"] .page-ambience { + background: radial-gradient(circle at 50% 50%, rgba(245,144,86,0.22), transparent 60%); + animation: page-breathe 6s ease-in-out infinite alternate; +} +.deck-page[data-element="agua"] .page-ambience { + background: radial-gradient(circle at 50% 50%, rgba(108,208,243,0.22), transparent 60%); + animation: page-breathe 10s ease-in-out infinite alternate; +} +.deck-page[data-element="tierra"] .page-ambience { + background: radial-gradient(circle at 50% 50%, rgba(140,100,60,0.22), transparent 60%); + animation: page-breathe 7s ease-in-out infinite alternate; +} +@keyframes page-breathe { + from { opacity: 0.30; } + to { opacity: 0.60; } +} + +/* Head + controls — fijos en el deck, no dentro de la página */ +.page-controls { + position: fixed; + top: 1.2rem; + right: 1.2rem; + z-index: 100; + display: flex; + gap: 0.5rem; + opacity: 0; + pointer-events: none; + transition: opacity 0.3s ease; +} +body.deck-visible .page-controls { + opacity: 1; + pointer-events: auto; +} +.page-control-btn { + width: 40px; + height: 40px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.04); + border: 1px solid rgba(255, 255, 255, 0.18); + color: var(--page-accent, var(--gold)); + font-size: 1.2rem; + line-height: 1; + cursor: pointer; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + font-family: 'Inter', sans-serif; + transition: + background 200ms ease, + border-color 200ms ease, + transform 250ms var(--ease-emerge); +} +.page-control-btn:hover { + background: rgba(255, 255, 255, 0.10); + border-color: currentColor; +} +.page-minimize svg { + width: 18px; + height: 18px; +} +.page-close { + font-size: 1.6rem; +} +.page-close:hover { transform: rotate(90deg); } + +.page-head { + position: relative; + z-index: 2; + text-align: center; + padding: 7vh 8vw 2vh; + color: var(--page-accent, var(--gold)); +} +.page-mark { + display: inline-block; + font-family: 'Inter', sans-serif; + font-size: 0.7rem; + letter-spacing: 0.55em; + text-transform: uppercase; + color: rgba(232, 234, 245, 0.6); + margin-bottom: 0.4rem; + text-indent: 0.55em; +} +.page-title { + font-family: 'Cinzel', serif; + font-weight: 700; + font-size: clamp(2.4rem, 6vw, 4.6rem); + margin: 0; + letter-spacing: 0.08em; + color: var(--page-accent, var(--gold)); + text-shadow: 0 0 28px currentColor, 0 0 56px rgba(255, 255, 255, 0.10); +} +.page-tag { + display: block; + font-family: 'Inter', sans-serif; + font-size: 0.78rem; + letter-spacing: 0.32em; + text-transform: uppercase; + color: rgba(232, 234, 245, 0.55); + margin-top: 0.7rem; + text-indent: 0.32em; +} +.page-content { + position: relative; + z-index: 2; + padding: 1vh 10vw 8vh; + opacity: 0; + transition: opacity 400ms ease 250ms; +} +.deck.open .deck-page .page-content { + opacity: 1; +} + +/* === pluma-doc dentro de la página === */ +.pluma-doc { + max-width: 760px; + margin: 0 auto; + font-family: 'Inter', sans-serif; + font-weight: 300; + font-size: 1.05rem; + line-height: 1.78; + color: rgba(232, 234, 245, 0.92); +} +.pluma-doc > * + * { margin-top: 1.0em; } +.pluma-doc h1 { + font-family: 'Cinzel', serif; + font-weight: 700; + font-size: clamp(1.7rem, 3vw, 2.4rem); + color: var(--page-accent); + text-shadow: 0 0 18px currentColor; + letter-spacing: 0.04em; + margin-top: 1.4em; +} +.pluma-doc h2 { + font-family: 'Cinzel', serif; + font-weight: 500; + font-size: 1.5rem; + color: var(--page-accent); + letter-spacing: 0.04em; + margin-top: 1.6em; + padding-bottom: 0.3em; + border-bottom: 1px solid rgba(255, 255, 255, 0.10); +} +.pluma-doc h3 { + font-family: 'Inter', sans-serif; + font-weight: 600; + font-size: 1.18rem; + color: rgba(255, 255, 255, 0.92); + letter-spacing: 0.03em; + margin-top: 1.6em; +} +.pluma-doc p { margin: 0; } +.pluma-doc a { + color: var(--page-accent); + text-decoration: none; + border-bottom: 1px solid currentColor; + transition: opacity 200ms ease; +} +.pluma-doc a:hover { opacity: 0.7; } +.pluma-doc strong { color: rgba(255, 255, 255, 0.98); font-weight: 600; } +.pluma-doc em { color: rgba(255, 255, 255, 0.92); } +.pluma-doc code { + font-family: 'JetBrains Mono', ui-monospace, monospace; + background: rgba(255, 255, 255, 0.06); + padding: 0.12em 0.45em; + border-radius: 4px; + font-size: 0.92em; + color: var(--page-accent); +} +.pluma-doc pre { + background: rgba(0, 0, 0, 0.45); + border: 1px solid rgba(255, 255, 255, 0.08); + border-left: 3px solid var(--page-accent); + border-radius: 8px; + padding: 1rem 1.2rem; + overflow-x: auto; + font-size: 0.92rem; +} +.pluma-doc pre code { + background: transparent; + color: rgba(232, 234, 245, 0.92); + padding: 0; +} +.pluma-doc blockquote { + border-left: 3px solid var(--page-accent); + padding: 0.4em 1.2em; + color: rgba(232, 234, 245, 0.75); + font-style: italic; + background: rgba(255, 255, 255, 0.03); + border-radius: 0 6px 6px 0; +} +.pluma-doc ul, .pluma-doc ol { padding-left: 1.6em; } +.pluma-doc li { margin: 0.4em 0; } +.pluma-doc li::marker { color: var(--page-accent); } +.pluma-doc hr { + border: none; + height: 1px; + background: linear-gradient(to right, transparent, var(--page-accent), transparent); + margin: 2em 0; +} +.pluma-doc table { + border-collapse: collapse; + width: 100%; + font-size: 0.95rem; +} +.pluma-doc th, .pluma-doc td { + padding: 0.55em 0.9em; + border-bottom: 1px solid rgba(255, 255, 255, 0.08); + text-align: left; +} +.pluma-doc th { + color: var(--page-accent); + font-weight: 600; + letter-spacing: 0.04em; +} +.pluma-loading, .pluma-error { + display: flex; + align-items: center; + justify-content: center; + min-height: 30vh; + color: rgba(232, 234, 245, 0.55); + font-family: 'Cinzel', serif; + letter-spacing: 0.4em; + font-size: 0.9rem; +} +.pluma-loading::before { + content: ""; + width: 28px; + height: 28px; + margin-right: 1rem; + border: 1px solid var(--page-accent); + border-top-color: transparent; + border-radius: 50%; + animation: pluma-spin 1s linear infinite; +} +.pluma-error { color: var(--fuego); font-style: italic; } +@keyframes pluma-spin { to { transform: rotate(360deg); } } + +/* === Taskbar estilo Windows === */ +.taskbar { + position: fixed; + left: 0; + right: 0; + bottom: 0; + height: var(--taskbar-height); + z-index: 200; + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0 0.8rem; + background: linear-gradient(to top, rgba(6, 5, 13, 0.94), rgba(8, 6, 22, 0.80)); + backdrop-filter: blur(24px) saturate(140%); + -webkit-backdrop-filter: blur(24px) saturate(140%); + border-top: 1px solid rgba(216, 168, 93, 0.22); + box-shadow: 0 -10px 36px rgba(0, 0, 0, 0.45); +} + +.taskbar-home { + width: 40px; + height: 40px; + display: inline-flex; + align-items: center; + justify-content: center; + background: transparent; + border: 1px solid rgba(216, 168, 93, 0.32); + color: var(--gold); + border-radius: 9px; + cursor: pointer; + padding: 0; + transition: all 220ms var(--ease-emerge); +} +.taskbar-home:hover { + border-color: var(--gold); + background: rgba(216, 168, 93, 0.12); + box-shadow: 0 0 16px rgba(216, 168, 93, 0.35); + transform: translateY(-1px); +} +.taskbar-home-glyph { + width: 22px; + height: 22px; + filter: drop-shadow(0 0 6px currentColor); +} + +.taskbar-brand { + font-family: 'Cinzel', serif; + font-weight: 700; + font-size: 1.30rem; + letter-spacing: 0.07em; + color: #f4eedf; + text-decoration: none; + text-shadow: 0 0 14px rgba(216, 168, 93, 0.45); + padding: 0 0.55rem; + user-select: none; + transition: text-shadow 220ms ease, color 220ms ease; + white-space: nowrap; +} +.taskbar-brand:hover { + color: #ffffff; + text-shadow: 0 0 20px rgba(216, 168, 93, 0.7), 0 0 36px rgba(245, 144, 86, 0.30); +} +.taskbar-brand .brand-dot { + color: var(--gold); + margin: 0 0.05em; +} + +.taskbar-divider { + display: inline-block; + width: 1px; + height: 26px; + background: rgba(255, 255, 255, 0.12); + margin: 0 0.25rem; +} + +.taskbar-list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + gap: 0.4rem; + overflow-x: auto; + scrollbar-width: none; + -ms-overflow-style: none; +} +.taskbar-list::-webkit-scrollbar { display: none; } + +.taskbar-item { + height: 38px; + padding: 0 1.0rem; + display: inline-flex; + align-items: center; + gap: 0.55rem; + background: rgba(255, 255, 255, 0.04); + border: 1px solid rgba(255, 255, 255, 0.10); + border-radius: 9px; + color: var(--task-color, var(--fg)); + font-family: 'Cinzel', serif; + font-size: 0.72rem; + letter-spacing: 0.36em; + text-indent: 0.36em; + font-weight: 600; + cursor: pointer; + transition: all 260ms var(--ease-emerge); + white-space: nowrap; +} +.taskbar-item:hover { + background: rgba(255, 255, 255, 0.09); + border-color: var(--task-color, currentColor); + transform: translateY(-1px); +} +.taskbar-item.active { + background: rgba(255, 255, 255, 0.11); + border-color: var(--task-color); + box-shadow: + 0 0 18px var(--task-color), + inset 0 -2px 0 0 var(--task-color); +} +.taskbar-item-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--task-color, var(--gold)); + box-shadow: 0 0 8px currentColor; +} +.taskbar-item[data-task="aire"] { --task-color: var(--aire); } +.taskbar-item[data-task="fuego"] { --task-color: var(--fuego); } +.taskbar-item[data-task="tierra"] { --task-color: var(--tierra); } +.taskbar-item[data-task="agua"] { --task-color: var(--agua); } + +.taskbar-spacer { + flex: 1; + min-width: 0.6rem; +} + +.taskbar-credit { + display: inline-flex; + align-items: center; + gap: 0.4rem; + font-family: 'Inter', sans-serif; + font-size: 0.78rem; + letter-spacing: 0.04em; + color: rgba(216, 168, 93, 0.75); + text-decoration: none; + padding: 0.35rem 0.7rem; + border-radius: 8px; + border: 1px solid transparent; + transition: all 220ms var(--ease-emerge); + white-space: nowrap; +} +.taskbar-credit:hover { + color: var(--gold); + border-color: rgba(216, 168, 93, 0.25); + background: rgba(216, 168, 93, 0.06); +} +.copyleft-mark { + display: inline-block; + font-size: 1rem; + /* © con escala horizontal -1 = copyleft visual. */ + transform: scaleX(-1); + color: currentColor; +} + +@media (max-width: 720px) { + .tip { min-width: 110px; padding: 0.7rem 0.9rem; } + .tip-glyph { width: 36px; height: 36px; } + .tip-label { font-size: 0.72rem; } + .tip-sub { display: none; } + .page-head { padding: 5vh 5vw 1vh; } + .page-content { padding: 0 5vw 5vh; } + .taskbar { height: 46px; padding: 0 0.4rem; gap: 0.3rem; } + .taskbar-home { width: 36px; height: 36px; } + .taskbar-item { height: 34px; padding: 0 0.7rem; font-size: 0.65rem; } + .taskbar-brand { font-size: 1.05rem; padding: 0 0.3rem; } + .taskbar-credit-text { display: none; } + .deck { bottom: 46px; } + :root { --taskbar-height: 46px; } +} + +/* Los tips nuevos (cuerpo, sombra, cosmos, practica, olvido) existen + en el DOM para navegación JS (popstate, grafo), pero no se ven en + la chacana — no hay canvas-glyph para ellos. Se ocultan por defecto. */ +.tip-hidden { + position: absolute; + visibility: hidden; + pointer-events: none; + width: 0; + height: 0; + overflow: hidden; +}