From 62058ab19302c95a7e1ad2b379769ed0bc152533 Mon Sep 17 00:00:00 2001 From: sergio Date: Thu, 14 May 2026 02:20:34 +0000 Subject: [PATCH] feat(gioser): deck swipeable + minimize, brand+copyleft en taskbar (vista-web) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nuevo módulo agnóstico: - `crates/modules/vista/vista-web` — Deck::mount(strip) instala swipe horizontal con snap a la página más cercana, estilo Flutter PageView. goto(idx, smooth) navega programáticamente. on_change(cb) fires tras snap. Drag decision: horizontal si dx > 8px y > 1.3*dy; sino cede al pan-y nativo (scroll vertical del contenido). resize listener ajusta --vista-offset sin animar usando .vista-instant un frame. App rediseñada: - Brand "GioSer" sacado del centro de la chacana → ahora en la taskbar junto al botón home (data-home). brand-dot dorado entre Gio·Ser. El centro de la chacana queda con sol limpio. - Copyleft + sergio@gioser.net a la derecha de la taskbar, abre https://sergio.gioser.net en nueva pestaña (target=_blank rel=noopener). - 4 drawers separados → reemplazados por un único `.deck` con `.deck-strip` vista-web manejado. Las páginas se crean dinámicamente al abrir un elemento por primera vez (`ensure_page_dom`). - Cada página tiene controles minimizar (─) y cerrar (×) arriba a la derecha, con ambience animada por elemento. - Click minimize → active=None, deck scale(0) hacia la cajita del taskbar (origin = bounding rect del taskbar-item). Página queda en memoria, tab sigue en la barra. - Click cajita del taskbar: - Si está activa → minimize (toggle). - Si está minimizada → restore con scale-up desde la cajita. - Click home / brand → minimize all (estilo Show Desktop, no destruye). - Swipe horizontal o click cajita → deck.goto(idx, smooth=true) con snap animado por vista-web. on_swipe sync de taskbar active state. - Cerrar página → remueve del strip + del Vec pages; si era activa, reemplaza por neighbor o hide deck si era la última. CSS: - Eliminado `.brand` fixed center y `.drawer` × 4 individuales. - `.deck` único + `.deck-strip` con `transform: translate3d(--vista-offset)` y transition transform 360ms cubic-bezier(0.22, 0.61, 0.36, 1). - `.deck-strip.vista-dragging` / `.vista-instant` → transition: none. - `.deck-page[data-element]` cada una con su page-ambience animada (aire-drift, fuego-flicker, agua-tide, tierra static). - `.taskbar-brand` Cinzel 1.3rem dorado + .brand-dot. - `.taskbar-credit` con `.copyleft-mark` (© con scaleX(-1) = copyleft visual). - `.taskbar-spacer { flex:1 }` empuja credit a la derecha. - `.taskbar-item.active` glow del color del elemento + border-bottom. - `body.deck-visible` baja opacity del canvas + esconde tips y brand. Workspace verde + 18 tests (geom 6 + palette 4 + physics 3 + pluma-md 5). Co-Authored-By: Claude Opus 4.7 --- Cargo.lock | 10 + Cargo.toml | 5 + crates/apps/gioser-web/Cargo.toml | 1 + crates/apps/gioser-web/index.html | 70 +--- crates/apps/gioser-web/src/lib.rs | 435 +++++++++++++++------- crates/apps/gioser-web/styles.css | 347 +++++++++-------- crates/modules/vista/vista-web/Cargo.toml | 26 ++ crates/modules/vista/vista-web/src/lib.rs | 282 ++++++++++++++ 8 files changed, 830 insertions(+), 346 deletions(-) create mode 100644 crates/modules/vista/vista-web/Cargo.toml create mode 100644 crates/modules/vista/vista-web/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 9383dcb..2979fa3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3951,6 +3951,7 @@ dependencies = [ "gioser-canvas-web", "js-sys", "pluma-reader-web", + "vista-web", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -11880,6 +11881,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vista-web" +version = "0.1.0" +dependencies = [ + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "vswhom" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index eda49e7..f6610fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -123,6 +123,11 @@ members = [ "crates/modules/pluma/pluma-md", "crates/modules/pluma/pluma-reader-web", + # ============================================================ + # modules/vista/ — deck horizontal swipe estilo Flutter PageView + # ============================================================ + "crates/modules/vista/vista-web", + # ============================================================ # apps/ — apps que consumen el protocolo (yahweh modules+shell) # ============================================================ diff --git a/crates/apps/gioser-web/Cargo.toml b/crates/apps/gioser-web/Cargo.toml index 9235d8e..5ae02ee 100644 --- a/crates/apps/gioser-web/Cargo.toml +++ b/crates/apps/gioser-web/Cargo.toml @@ -12,6 +12,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] gioser-canvas-web = { path = "../../modules/gioser/gioser-canvas-web" } pluma-reader-web = { path = "../../modules/pluma/pluma-reader-web" } +vista-web = { path = "../../modules/vista/vista-web" } wasm-bindgen.workspace = true wasm-bindgen-futures.workspace = true js-sys.workspace = true diff --git a/crates/apps/gioser-web/index.html b/crates/apps/gioser-web/index.html index 884361d..99fe19a 100644 --- a/crates/apps/gioser-web/index.html +++ b/crates/apps/gioser-web/index.html @@ -12,10 +12,6 @@ -
-

Gio·Ser

-
-
- - + + - - - - - - - -