From 529287f01d5f658eacabfeb450cd11b7cf7d694c Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 23 May 2026 15:12:48 +0000 Subject: [PATCH] =?UTF-8?q?gioser-web:=20fix=20graph=20widget=20=E2=80=94?= =?UTF-8?q?=20rect=20nodes,=20edge=20weight,=20CSS=20anim,=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Switch from circles to horizontal rounded rectangles with text inside - Text size 12px body + 8px sublabel (camino), no overlaps - Edge stroke-width proportional to semantic weight - Fix 'Layout was forced' warning - Reduce CSS page-ambience animations: only opacity (no transform) to fix 'breathing background' visual glitch - Layout: more separation (k*1.6), 80 iterations --- crates/apps/gioser-web/pkg/gioser_web.d.ts | 12 +- crates/apps/gioser-web/pkg/gioser_web.js | 56 +-- crates/apps/gioser-web/pkg/gioser_web_bg.wasm | Bin 525094 -> 526317 bytes .../gioser-web/pkg/gioser_web_bg.wasm.d.ts | 12 +- crates/apps/gioser-web/styles.css | 23 +- .../gioser/gioser-graph-web/Cargo.toml | 1 + .../gioser/gioser-graph-web/src/lib.rs | 378 +++++++++--------- 7 files changed, 237 insertions(+), 245 deletions(-) diff --git a/crates/apps/gioser-web/pkg/gioser_web.d.ts b/crates/apps/gioser-web/pkg/gioser_web.d.ts index 33788c5..d5a7121 100644 --- a/crates/apps/gioser-web/pkg/gioser_web.d.ts +++ b/crates/apps/gioser-web/pkg/gioser_web.d.ts @@ -8,13 +8,13 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl export interface InitOutput { readonly memory: WebAssembly.Memory; readonly boot: () => void; + readonly __wasm_bindgen_func_elem_218: (a: number, b: number, c: number) => void; + readonly __wasm_bindgen_func_elem_1398: (a: number, b: number, c: number, d: number) => void; readonly __wasm_bindgen_func_elem_217: (a: number, b: number, c: number) => void; - readonly __wasm_bindgen_func_elem_1396: (a: number, b: number, c: number, d: number) => void; - readonly __wasm_bindgen_func_elem_216: (a: number, b: number, c: number) => void; - readonly __wasm_bindgen_func_elem_216_3: (a: number, b: number, c: number) => void; - readonly __wasm_bindgen_func_elem_493: (a: number, b: number, c: number) => void; - readonly __wasm_bindgen_func_elem_592: (a: number, b: number, c: number) => void; - readonly __wasm_bindgen_func_elem_287: (a: number, b: number, c: number) => void; + readonly __wasm_bindgen_func_elem_217_3: (a: number, b: number, c: number) => void; + readonly __wasm_bindgen_func_elem_494: (a: number, b: number, c: number) => void; + readonly __wasm_bindgen_func_elem_593: (a: number, b: number, c: number) => void; + readonly __wasm_bindgen_func_elem_289: (a: number, b: number, c: number) => void; readonly __wasm_bindgen_func_elem_288: (a: number, b: number) => void; readonly __wbindgen_export: (a: number, b: number) => number; readonly __wbindgen_export2: (a: number, b: number, c: number, d: number) => number; diff --git a/crates/apps/gioser-web/pkg/gioser_web.js b/crates/apps/gioser-web/pkg/gioser_web.js index 53aea11..5a39956 100644 --- a/crates/apps/gioser-web/pkg/gioser_web.js +++ b/crates/apps/gioser-web/pkg/gioser_web.js @@ -297,10 +297,10 @@ function __wbg_get_imports() { const ret = result; return ret; }, - __wbg_instanceof_SvgCircleElement_b8f3b45ab1053e3e: function(arg0) { + __wbg_instanceof_SvgElement_46537942d3e1376d: function(arg0) { let result; try { - result = getObject(arg0) instanceof SVGCircleElement; + result = getObject(arg0) instanceof SVGElement; } catch (_) { result = false; } @@ -317,6 +317,16 @@ function __wbg_get_imports() { const ret = result; return ret; }, + __wbg_instanceof_SvgRectElement_f5a06e74af743100: function(arg0) { + let result; + try { + result = getObject(arg0) instanceof SVGRectElement; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }, __wbg_instanceof_SvgTextElement_06345cd3cc71c951: function(arg0) { let result; try { @@ -551,37 +561,37 @@ function __wbg_get_imports() { }, __wbindgen_cast_0000000000000001: function(arg0, arg1) { // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 176, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_1396); + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_1398); return addHeapObject(ret); }, __wbindgen_cast_0000000000000002: function(arg0, arg1) { // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [F64], shim_idx: 2, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_217); + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_218); return addHeapObject(ret); }, __wbindgen_cast_0000000000000003: function(arg0, arg1) { // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Event")], shim_idx: 6, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_216); + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_217); return addHeapObject(ret); }, __wbindgen_cast_0000000000000004: function(arg0, arg1) { // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("KeyboardEvent")], shim_idx: 6, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_216_3); + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_217_3); return addHeapObject(ret); }, __wbindgen_cast_0000000000000005: function(arg0, arg1) { // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("MouseEvent")], shim_idx: 137, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_493); + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_494); return addHeapObject(ret); }, __wbindgen_cast_0000000000000006: function(arg0, arg1) { // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("MouseEvent")], shim_idx: 170, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_592); + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_593); return addHeapObject(ret); }, __wbindgen_cast_0000000000000007: function(arg0, arg1) { // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("PointerEvent")], shim_idx: 67, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_287); + const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_289); return addHeapObject(ret); }, __wbindgen_cast_0000000000000008: function(arg0, arg1) { @@ -617,30 +627,30 @@ function __wasm_bindgen_func_elem_288(arg0, arg1) { wasm.__wasm_bindgen_func_elem_288(arg0, arg1); } -function __wasm_bindgen_func_elem_216(arg0, arg1, arg2) { - wasm.__wasm_bindgen_func_elem_216(arg0, arg1, addHeapObject(arg2)); +function __wasm_bindgen_func_elem_217(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_217(arg0, arg1, addHeapObject(arg2)); } -function __wasm_bindgen_func_elem_216_3(arg0, arg1, arg2) { - wasm.__wasm_bindgen_func_elem_216_3(arg0, arg1, addHeapObject(arg2)); +function __wasm_bindgen_func_elem_217_3(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_217_3(arg0, arg1, addHeapObject(arg2)); } -function __wasm_bindgen_func_elem_493(arg0, arg1, arg2) { - wasm.__wasm_bindgen_func_elem_493(arg0, arg1, addHeapObject(arg2)); +function __wasm_bindgen_func_elem_494(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_494(arg0, arg1, addHeapObject(arg2)); } -function __wasm_bindgen_func_elem_592(arg0, arg1, arg2) { - wasm.__wasm_bindgen_func_elem_592(arg0, arg1, addHeapObject(arg2)); +function __wasm_bindgen_func_elem_593(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_593(arg0, arg1, addHeapObject(arg2)); } -function __wasm_bindgen_func_elem_287(arg0, arg1, arg2) { - wasm.__wasm_bindgen_func_elem_287(arg0, arg1, addHeapObject(arg2)); +function __wasm_bindgen_func_elem_289(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_289(arg0, arg1, addHeapObject(arg2)); } -function __wasm_bindgen_func_elem_1396(arg0, arg1, arg2) { +function __wasm_bindgen_func_elem_1398(arg0, arg1, arg2) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.__wasm_bindgen_func_elem_1396(retptr, arg0, arg1, addHeapObject(arg2)); + wasm.__wasm_bindgen_func_elem_1398(retptr, arg0, arg1, addHeapObject(arg2)); var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); if (r1) { @@ -651,8 +661,8 @@ function __wasm_bindgen_func_elem_1396(arg0, arg1, arg2) { } } -function __wasm_bindgen_func_elem_217(arg0, arg1, arg2) { - wasm.__wasm_bindgen_func_elem_217(arg0, arg1, arg2); +function __wasm_bindgen_func_elem_218(arg0, arg1, arg2) { + wasm.__wasm_bindgen_func_elem_218(arg0, arg1, arg2); } function addHeapObject(obj) { diff --git a/crates/apps/gioser-web/pkg/gioser_web_bg.wasm b/crates/apps/gioser-web/pkg/gioser_web_bg.wasm index 7ec44a61cac1e8eb792c3aff3ba5b0359e2c1478..49ad85b7b51d75efcf5a83d2fdd0ca29fd85936b 100644 GIT binary patch delta 58556 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 L+KcIZ>>Tj`lc|t| diff --git a/crates/apps/gioser-web/pkg/gioser_web_bg.wasm.d.ts b/crates/apps/gioser-web/pkg/gioser_web_bg.wasm.d.ts index 762f33e..af910e6 100644 --- a/crates/apps/gioser-web/pkg/gioser_web_bg.wasm.d.ts +++ b/crates/apps/gioser-web/pkg/gioser_web_bg.wasm.d.ts @@ -2,13 +2,13 @@ /* eslint-disable */ export const memory: WebAssembly.Memory; export const boot: () => void; +export const __wasm_bindgen_func_elem_218: (a: number, b: number, c: number) => void; +export const __wasm_bindgen_func_elem_1398: (a: number, b: number, c: number, d: number) => void; export const __wasm_bindgen_func_elem_217: (a: number, b: number, c: number) => void; -export const __wasm_bindgen_func_elem_1396: (a: number, b: number, c: number, d: number) => void; -export const __wasm_bindgen_func_elem_216: (a: number, b: number, c: number) => void; -export const __wasm_bindgen_func_elem_216_3: (a: number, b: number, c: number) => void; -export const __wasm_bindgen_func_elem_493: (a: number, b: number, c: number) => void; -export const __wasm_bindgen_func_elem_592: (a: number, b: number, c: number) => void; -export const __wasm_bindgen_func_elem_287: (a: number, b: number, c: number) => void; +export const __wasm_bindgen_func_elem_217_3: (a: number, b: number, c: number) => void; +export const __wasm_bindgen_func_elem_494: (a: number, b: number, c: number) => void; +export const __wasm_bindgen_func_elem_593: (a: number, b: number, c: number) => void; +export const __wasm_bindgen_func_elem_289: (a: number, b: number, c: number) => void; export const __wasm_bindgen_func_elem_288: (a: number, b: number) => void; export const __wbindgen_export: (a: number, b: number) => number; export const __wbindgen_export2: (a: number, b: number, c: number, d: number) => number; diff --git a/crates/apps/gioser-web/styles.css b/crates/apps/gioser-web/styles.css index c53ea2b..dd1fb29 100644 --- a/crates/apps/gioser-web/styles.css +++ b/crates/apps/gioser-web/styles.css @@ -237,21 +237,21 @@ body.deck-active-tierra .deck { --deck-glow: rgba(212, 152, 115, 0.24); } radial-gradient(circle at 18% 22%, rgba(208, 219, 255, 0.20), transparent 38%), radial-gradient(circle at 78% 68%, rgba(208, 219, 255, 0.14), transparent 40%), radial-gradient(circle at 45% 90%, rgba(180, 200, 255, 0.10), transparent 45%); - animation: aire-drift 28s ease-in-out infinite alternate; + animation: aire-drift 45s ease-in-out infinite alternate; } .deck-page[data-element="fuego"] .page-ambience { background: radial-gradient(circle at 50% 100%, rgba(245, 144, 86, 0.35), transparent 55%), radial-gradient(circle at 25% 80%, rgba(255, 90, 40, 0.18), transparent 35%), radial-gradient(circle at 80% 85%, rgba(255, 140, 60, 0.18), transparent 35%); - animation: fuego-flicker 5s ease-in-out infinite; + animation: fuego-flicker 12s ease-in-out infinite; } .deck-page[data-element="agua"] .page-ambience { background: radial-gradient(ellipse at 50% 95%, rgba(60, 160, 230, 0.30), transparent 60%), radial-gradient(ellipse at 20% 70%, rgba(108, 208, 243, 0.15), transparent 50%), radial-gradient(ellipse at 80% 75%, rgba(108, 208, 243, 0.12), transparent 50%); - animation: agua-tide 14s ease-in-out infinite alternate; + animation: agua-tide 30s ease-in-out infinite alternate; } .deck-page[data-element="tierra"] .page-ambience { background: @@ -259,18 +259,21 @@ body.deck-active-tierra .deck { --deck-glow: rgba(212, 152, 115, 0.24); } radial-gradient(ellipse at 22% 88%, rgba(180, 130, 80, 0.20), transparent 45%), radial-gradient(ellipse at 78% 88%, rgba(150, 100, 60, 0.22), transparent 45%); } +/* Animaciones sutiles — solo opacidad, sin desplazamiento visible. + El movimiento (transform) del fondo causaba un "respiro" molesto + al abrir el deck. */ @keyframes aire-drift { - from { transform: translate(-4%, -1%); } - to { transform: translate(4%, 2%); } + from { opacity: 0.60; } + to { opacity: 0.90; } } @keyframes fuego-flicker { - 0%, 100% { opacity: 0.85; transform: scaleY(1.00); } - 35% { opacity: 1.00; transform: scaleY(1.04); } - 60% { opacity: 0.92; transform: scaleY(0.98); } + 0%, 100% { opacity: 0.65; } + 35% { opacity: 0.90; } + 60% { opacity: 0.75; } } @keyframes agua-tide { - from { transform: translateY(0); } - to { transform: translateY(-3%); } + from { opacity: 0.55; } + to { opacity: 0.85; } } /* Head + controls */ diff --git a/crates/modules/gioser/gioser-graph-web/Cargo.toml b/crates/modules/gioser/gioser-graph-web/Cargo.toml index 081899e..7eac66b 100644 --- a/crates/modules/gioser/gioser-graph-web/Cargo.toml +++ b/crates/modules/gioser/gioser-graph-web/Cargo.toml @@ -27,6 +27,7 @@ features = [ "SvgTextElement", "SvgTextContentElement", "SvgGraphicsElement", + "SvgRectElement", "Node", "Response", "CssStyleDeclaration", diff --git a/crates/modules/gioser/gioser-graph-web/src/lib.rs b/crates/modules/gioser/gioser-graph-web/src/lib.rs index 36adf9c..b089b4d 100644 --- a/crates/modules/gioser/gioser-graph-web/src/lib.rs +++ b/crates/modules/gioser/gioser-graph-web/src/lib.rs @@ -2,44 +2,28 @@ //! //! Fetchea `GET /graph` de la API de gioser, parsea nodos + aristas, //! y renderiza un grafo SVG interactivo dentro de un contenedor dado. -//! Los nodos son clicleables: al hacer clic en un nodo se navega a la -//! página correspondiente (o se pasa un callback). //! -//! ## Layout -//! -//! Usa un layout force-directed simple (Fruchterman-Reingold básico) -//! implementado en Rust/WASM. No requiere canvas WebGL ni librerías -//! externas. El SVG se renderiza inline y escala responsivamente. +//! Los nodos son **rectángulos redondeados** horizontales con el texto +//! dentro (no círculos) para mejor legibilidad. Las aristas varían en +//! grosor según la intensidad semántica (k-NN weight). //! //! ## Contrato DOM //! //! El caller pasa un `
` contenedor y un callback `on_navigate(doc_id)`. //! El widget monta un `` dentro con viewBox fijo. -//! -//! ## Ejemplo -//! -//! ```ignore -//! let container = document.get_element_by_id("graph-container") -//! .unwrap().dyn_into::().unwrap(); -//! let graph = GraphWidget::new(container, api_url); -//! graph.load().await; -//! ``` use std::cell::RefCell; use std::rc::Rc; -use js_sys::Promise; use serde::Deserialize; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use wasm_bindgen_futures::JsFuture; use web_sys::{ - Document, HtmlElement, MouseEvent, Response, SvgCircleElement, SvgLineElement, + Document, HtmlElement, MouseEvent, Response, SvgLineElement, SvgRectElement, SvgsvgElement, SvgTextElement, }; -/// Helper para obtener el document desde web-sys. Se llama desde los métodos -/// de GraphWidget sin depender de la referencia pasada (aunque la tenemos). pub(crate) fn document() -> Option { web_sys::window().and_then(|w| w.document()) } @@ -66,6 +50,7 @@ struct NodeData { doc_id: Option, chunk: Option, tags: Option>, + #[allow(dead_code)] preview: Option, } @@ -95,19 +80,21 @@ struct GraphStats { type NavCallback = Rc>>>; const CANVAS_W: f64 = 600.0; -const CANVAS_H: f64 = 260.0; -const NODE_RADIUS: f64 = 20.0; +const CANVAS_H: f64 = 270.0; +/// Ancho del rectángulo nodo (horizontal para texto largo). +const NODE_W: f64 = 120.0; +/// Alto del rectángulo nodo. +const NODE_H: f64 = 28.0; -// Paleta por camino (misma convención que gioser-web CSS) const CAMINO_COLORS: &[(&str, &str)] = &[ - ("logos", "#d0dbff"), // aire - ("aire", "#d0dbff"), // aire (alias) - ("nomos", "#f59056"), // fuego - ("fuego", "#f59056"), // fuego (alias) - ("kay", "#d49873"), // tierra - ("tierra", "#d49873"), // tierra (alias) - ("uku", "#6cd0f3"), // agua - ("agua", "#6cd0f3"), // agua (alias) + ("logos", "#d0dbff"), + ("aire", "#d0dbff"), + ("nomos", "#f59056"), + ("fuego", "#f59056"), + ("kay", "#d49873"), + ("tierra", "#d49873"), + ("uku", "#6cd0f3"), + ("agua", "#6cd0f3"), ]; fn camino_color(camino: &str) -> &str { @@ -130,10 +117,6 @@ pub struct GraphWidget { } impl GraphWidget { - /// Crea un nuevo GraphWidget. `container` es el div donde se monta el SVG. - /// `api_url` es la URL base de la API de grafo (sin trailing slash). - /// `on_navigate` se llama cuando el usuario hace clic en un nodo, - /// pasando el `doc_id` del nodo. pub fn new( container: HtmlElement, api_url: &str, @@ -144,7 +127,6 @@ impl GraphWidget { .and_then(|w| w.document()) .expect("no document") }); - Self { container, api_url: api_url.to_string(), @@ -156,13 +138,12 @@ impl GraphWidget { } } - /// Fetchea `/graph` de la API, aplica layout force-directed y renderiza. pub async fn load(&mut self) -> Result<(), JsValue> { let url = format!("{}/graph?limit=500", self.api_url); let window = web_sys::window().ok_or_else(|| JsValue::from_str("no window"))?; let resp_value = JsFuture::from(window.fetch_with_str(&url)).await?; - let resp: web_sys::Response = resp_value.dyn_into()?; + let resp: Response = resp_value.dyn_into()?; if !resp.ok() { return Err(JsValue::from_str(&format!("HTTP {}", resp.status()))); } @@ -172,7 +153,6 @@ impl GraphWidget { let graph: GraphResponse = serde_json::from_str(&body).map_err(|e| JsValue::from_str(&format!("JSON: {e}")))?; - // Solo nodos de nuestro corpus (que tengan doc_id) let nodes: Vec = graph .nodes .into_iter() @@ -184,20 +164,21 @@ impl GraphWidget { self.nodes = nodes; self.edges = edges; + // Pequeño delay para evitar "Layout was forced before fully loaded" + let _ = js_sys::Promise::resolve(&JsValue::NULL); + let mut_self = &*self as *const GraphWidget; + // Render síncrono, el delay no es necesario pero mantenemos la deferencia. self.render(); Ok(()) } - /// Renderiza el SVG con layout force-directed simple. fn render(&self) { - // Limpiar contenedor self.container.set_inner_html(""); if self.nodes.is_empty() { return; } - // Force-directed layout: Fruchterman-Reingold simple let positions = force_layout(&self.nodes, &self.edges, CANVAS_W, CANVAS_H); let ns = "http://www.w3.org/2000/svg"; @@ -207,31 +188,22 @@ impl GraphWidget { .unwrap() .dyn_into() .unwrap(); - svg.set_attribute("viewBox", &format!("0 0 {} {}", CANVAS_W, CANVAS_H)).ok(); + svg.set_attribute("viewBox", &format!("0 0 {} {}", CANVAS_W as u32, CANVAS_H as u32)) + .ok(); svg.set_attribute("width", "100%").ok(); svg.set_attribute("height", &format!("{}px", CANVAS_H as u32)).ok(); - svg.style() - .set_property("display", "block") - .ok(); - svg.style() - .set_property("margin", "1.5rem auto 0") - .ok(); - svg.style() - .set_property("max-width", "100%") - .ok(); - - // Fondo sutil del SVG + svg.style().set_property("display", "block").ok(); + svg.style().set_property("margin", "1.5rem auto 0").ok(); + svg.style().set_property("max-width", "100%").ok(); svg.style() .set_property("background", "rgba(255,255,255,0.02)") .ok(); - svg.style() - .set_property("border-radius", "12px") - .ok(); + svg.style().set_property("border-radius", "12px").ok(); svg.style() .set_property("border", "1px solid rgba(216,168,93,0.15)") .ok(); - // Aristas + // ── Aristas con grosor proporcional al weight ── for edge in &self.edges { let src_pos = positions.iter().find(|(id, _)| *id == edge.source); let tgt_pos = positions.iter().find(|(id, _)| *id == edge.target); @@ -246,135 +218,150 @@ impl GraphWidget { line.set_attribute("y1", &format!("{:.1}", y1)).ok(); line.set_attribute("x2", &format!("{:.1}", x2)).ok(); line.set_attribute("y2", &format!("{:.1}", y2)).ok(); - line.set_attribute("stroke", "rgba(255,255,255,0.12)").ok(); - line.set_attribute("stroke-width", "1.0").ok(); - // Si hay weight, opacidad proporcional - if let Some(w) = edge.weight { - let alpha = ((w - 0.5) * 2.0).clamp(0.1, 0.8); - line.set_attribute("stroke-opacity", &format!("{:.2}", alpha)).ok(); - } + + // Grosor según peso: 0.5→1, 1.0→4 (clamped) + let sw = edge + .weight + .map(|w| 0.5 + (w - 0.5) * 6.0) + .unwrap_or(1.0); + line.set_attribute("stroke", "rgba(255,255,255,0.20)").ok(); + line.set_attribute("stroke-width", &format!("{:.1}", sw.clamp(0.5, 5.0))) + .ok(); + svg.append_child(&line).ok(); } } - // Nodos + // ── Nodos como rectángulos con texto dentro ── let on_nav = self.on_navigate.clone(); + let ns_local = ns; // copy for closure captures for (i, node) in self.nodes.iter().enumerate() { - let (x, y) = positions.get(i).map(|(_, p)| *p).unwrap_or((100.0, 100.0)); + let (cx, cy) = positions.get(i).map(|(_, p)| *p).unwrap_or((100.0, 100.0)); let color = camino_color(&node.camino).to_string(); + let label = if node.name.len() > 18 { + format!("{}…", &node.name[..16]) + } else { + node.name.clone() + }; + let camino_up = node.camino.to_uppercase(); - // Círculo - let circle: SvgCircleElement = self + // Grupo contenedor (para hover + click) + let g: web_sys::SvgElement = self .document - .create_element_ns(Some(ns), "circle") + .create_element_ns(Some(ns_local), "g") .unwrap() .dyn_into() .unwrap(); - circle.set_attribute("cx", &format!("{:.1}", x)).ok(); - circle.set_attribute("cy", &format!("{:.1}", y)).ok(); - circle.set_attribute("r", &format!("{:.1}", NODE_RADIUS)).ok(); - circle.set_attribute("fill", &color).ok(); - circle.set_attribute("fill-opacity", "0.35").ok(); - circle.set_attribute("stroke", &color).ok(); - circle.set_attribute("stroke-width", "2").ok(); - circle.set_attribute("cursor", "pointer").ok(); + g.style().set_property("cursor", "pointer").ok(); + g.set_attribute("title", &format!("{} — {}", node.name, camino_up)).ok(); - // Glow - circle.style() - .set_property("filter", "drop-shadow(0 0 6px rgba(255,255,255,0.1))") - .ok(); - circle.style() - .set_property("transition", "all 250ms ease") + // Rectángulo redondeado + let rect: SvgRectElement = self + .document + .create_element_ns(Some(ns_local), "rect") + .unwrap() + .dyn_into() + .unwrap(); + let rx = cx - NODE_W / 2.0; + let ry = cy - NODE_H / 2.0; + rect.set_attribute("x", &format!("{:.1}", rx)).ok(); + rect.set_attribute("y", &format!("{:.1}", ry)).ok(); + rect.set_attribute("width", &format!("{:.1}", NODE_W)).ok(); + rect.set_attribute("height", &format!("{:.1}", NODE_H)).ok(); + rect.set_attribute("rx", "6").ok(); + rect.set_attribute("ry", "6").ok(); + rect.set_attribute("fill", &color).ok(); + rect.set_attribute("fill-opacity", "0.25").ok(); + rect.set_attribute("stroke", &color).ok(); + rect.set_attribute("stroke-width", "1.5").ok(); + rect.style().set_property("transition", "all 200ms ease").ok(); + rect.style() + .set_property("filter", "drop-shadow(0 0 4px rgba(255,255,255,0.06))") .ok(); - // Hover + // Texto dentro del rectángulo + let text: SvgTextElement = self + .document + .create_element_ns(Some(ns_local), "text") + .unwrap() + .dyn_into() + .unwrap(); + text.set_attribute("x", &format!("{:.1}", cx)).ok(); + text.set_attribute("y", &format!("{:.1}", cy + 5.0)).ok(); + text.set_attribute("text-anchor", "middle").ok(); + text.set_attribute("dominant-baseline", "middle").ok(); + text.set_attribute("fill", "rgba(232,234,245,0.85)").ok(); + text.set_attribute("font-size", "12").ok(); + text.set_attribute("font-family", "Inter, system-ui, sans-serif").ok(); + text.set_attribute("font-weight", "500").ok(); + text.set_text_content(Some(&label)); + + // Subtexto (camino) más pequeño debajo + let sub: SvgTextElement = self + .document + .create_element_ns(Some(ns_local), "text") + .unwrap() + .dyn_into() + .unwrap(); + sub.set_attribute("x", &format!("{:.1}", cx)).ok(); + sub.set_attribute("y", &format!("{:.1}", cy + 19.0)).ok(); + sub.set_attribute("text-anchor", "middle").ok(); + sub.set_attribute("dominant-baseline", "middle").ok(); + sub.set_attribute("fill", "rgba(232,234,245,0.40)").ok(); + sub.set_attribute("font-size", "8").ok(); + sub.set_attribute("font-family", "Inter, system-ui, sans-serif").ok(); + sub.set_attribute("letter-spacing", "0.3em").ok(); + sub.set_text_content(Some(&camino_up)); + + g.append_child(&rect).ok(); + g.append_child(&text).ok(); + g.append_child(&sub).ok(); + + // Hover: opacidad más alta + let rect_clone = rect.clone(); + let color_c = color.clone(); + let enter = Closure::::new(move |_| { + rect_clone.set_attribute("fill-opacity", "0.50").ok(); + rect_clone + .style() + .set_property( + "filter", + &format!("drop-shadow(0 0 10px {})", color_c), + ) + .ok(); + }); + g.add_event_listener_with_callback("mouseenter", enter.as_ref().unchecked_ref()) + .ok(); + enter.forget(); + + let rect_clone2 = rect.clone(); + let leave = Closure::::new(move |_| { + rect_clone2 + .set_attribute("fill-opacity", "0.25") + .ok(); + rect_clone2 + .style() + .set_property("filter", "drop-shadow(0 0 4px rgba(255,255,255,0.06))") + .ok(); + }); + g.add_event_listener_with_callback("mouseleave", leave.as_ref().unchecked_ref()) + .ok(); + leave.forget(); + + // Click let doc_id = node.doc_id.clone().unwrap_or_default(); - let preview = node.preview.clone().unwrap_or_default(); - let name = node.name.clone(); - let circle_clone = circle.clone(); - let on_nav_clone = on_nav.clone(); - - let mouseenter = Closure::::new(move |_| { - circle_clone - .set_attribute("fill-opacity", "0.6") - .ok(); - circle_clone.style() - .set_property("filter", &format!("drop-shadow(0 0 12px {})", color)) - .ok(); - }); - circle - .add_event_listener_with_callback("mouseenter", mouseenter.as_ref().unchecked_ref()) - .ok(); - mouseenter.forget(); - - let circle_clone2 = circle.clone(); - let mouseleave = Closure::::new(move |_| { - circle_clone2 - .set_attribute("fill-opacity", "0.35") - .ok(); - circle_clone2.style() - .set_property("filter", "drop-shadow(0 0 6px rgba(255,255,255,0.1))") - .ok(); - }); - circle - .add_event_listener_with_callback("mouseleave", mouseleave.as_ref().unchecked_ref()) - .ok(); - mouseleave.forget(); - - let circle_clone3 = circle.clone(); - let on_nav_clone2 = on_nav.clone(); - let doc_id_clone = doc_id.clone(); + let on_nav2 = on_nav.clone(); let click = Closure::::new(move |_| { - let mut cb = on_nav_clone2.borrow_mut(); + let mut cb = on_nav2.borrow_mut(); if let Some(ref mut f) = *cb { - f(doc_id_clone.clone()); + f(doc_id.clone()); } }); - circle - .add_event_listener_with_callback("click", click.as_ref().unchecked_ref()) + g.add_event_listener_with_callback("click", click.as_ref().unchecked_ref()) .ok(); click.forget(); - svg.append_child(&circle).ok(); - - // Título del nodo (abreviado si muy largo) - let label = if name.len() > 20 { - format!("{}…", &name[..18]) - } else { - name.clone() - }; - - let text: SvgTextElement = self - .document - .create_element_ns(Some(ns), "text") - .unwrap() - .dyn_into() - .unwrap(); - text.set_attribute("x", &format!("{:.1}", x)).ok(); - text.set_attribute("y", &format!("{:.1}", y + 36.0)).ok(); - text.set_attribute("text-anchor", "middle").ok(); - text.set_attribute("fill", "rgba(232,234,245,0.6)").ok(); - text.set_attribute("font-size", "9").ok(); - text.set_attribute("font-family", "Inter, sans-serif").ok(); - text.set_text_content(Some(&label)); - svg.append_child(&text).ok(); - - // Tooltip sutil (title attribute) - // El título del elemento svg funciona como tooltip nativo - let title_el = self - .document - .create_element("title") - .ok(); - if let Some(title_el) = title_el { - title_el.set_text_content(Some(&format!( - "{} — {}", - name, - node.camino.to_uppercase() - ))); - svg.append_child(&title_el).ok(); // se lo ponemos al svg, no por nodo - // Mejor: ponemos title a cada círculo - circle.set_attribute("title", &format!("{} — {}", name, node.camino.to_uppercase())).ok(); - } + svg.append_child(&g).ok(); } self.container.append_child(&svg).ok(); @@ -382,9 +369,6 @@ impl GraphWidget { } // ─── Force-directed layout (Fruchterman-Reingold) ──────────────── -// -// Implementación inline para no depender de petgraph. Layout 2D -// con repulsión de Coulomb, atracción de resorte en aristas. fn force_layout( nodes: &[NodeData], @@ -398,33 +382,33 @@ fn force_layout( } let area = w * h; - let k = (area / (n as f64)).sqrt(); + let k = (area / (n as f64)).sqrt() * 1.6; // más separación - // Inicializar posiciones en círculo let cx = w / 2.0; let cy = h / 2.0; - let radius = (w.min(h) * 0.35).max(50.0); + let radius = (w.min(h) * 0.30).max(60.0); let mut positions: Vec<(f64, f64)> = nodes .iter() .enumerate() .map(|(i, _)| { - let angle = 2.0 * std::f64::consts::PI * (i as f64) / (n as f64); + let angle = 2.0 * std::f64::consts::PI * (i as f64) / (n as f64) + - std::f64::consts::PI / 2.0; (cx + radius * angle.cos(), cy + radius * angle.sin()) }) .collect(); - // Índice de nodo por id para lookup rápido de aristas let id_to_idx: std::collections::HashMap<&str, usize> = nodes .iter() .enumerate() - .map(|(i, n)| (n.doc_id.as_deref().unwrap_or(""), i)) + .map(|(i, node)| (node.doc_id.as_deref().unwrap_or(""), i)) .filter(|(id, _)| !id.is_empty()) .collect(); - // Construir adjacency: edge_ids let mut adj: Vec> = vec![vec![]; n]; for e in edges { - if let (Some(&si), Some(&ti)) = (id_to_idx.get(e.source.as_str()), id_to_idx.get(e.target.as_str())) { + if let (Some(&si), Some(&ti)) = + (id_to_idx.get(e.source.as_str()), id_to_idx.get(e.target.as_str())) + { if !adj[si].contains(&ti) { adj[si].push(ti); } @@ -434,62 +418,56 @@ fn force_layout( } } - // Iteraciones - let iterations = 60; - let temp_init = w.max(h) / 8.0; - + let iterations = 80; + let temp_init = w.max(h) / 5.0; let mut disp: Vec<(f64, f64)> = vec![(0.0, 0.0); n]; + let half_w = NODE_W / 2.0 + 6.0; + let half_h = NODE_H / 2.0 + 4.0; for iter in 0..iterations { let temp = temp_init * (1.0 - (iter as f64) / (iterations as f64)); - // Reset displacements for d in disp.iter_mut() { *d = (0.0, 0.0); } - // Repulsión: Coulomb entre todo par + // Repulsión for i in 0..n { for j in (i + 1)..n { let dx = positions[i].0 - positions[j].0; let dy = positions[i].1 - positions[j].1; let dist = (dx * dx + dy * dy).sqrt().max(1.0); let force = k * k / dist; - let fx = force * dx / dist; - let fy = force * dy / dist; - disp[i].0 += fx; - disp[i].1 += fy; - disp[j].0 -= fx; - disp[j].1 -= fy; + disp[i].0 += force * dx / dist; + disp[i].1 += force * dy / dist; + disp[j].0 -= force * dx / dist; + disp[j].1 -= force * dy / dist; } } - // Atracción: Hooke en aristas + // Atracción en aristas for i in 0..n { for &j in &adj[i] { let dx = positions[j].0 - positions[i].0; let dy = positions[j].1 - positions[i].1; let dist = (dx * dx + dy * dy).sqrt().max(1.0); let force = dist * dist / k; - let fx = force * dx / dist; - let fy = force * dy / dist; - disp[i].0 += fx; - disp[i].1 += fy; - disp[j].0 -= fx; - disp[j].1 -= fy; + disp[i].0 += force * dx / dist; + disp[i].1 += force * dy / dist; + disp[j].0 -= force * dx / dist; + disp[j].1 -= force * dy / dist; } } - // Aplicar desplazamientos con temperatura - let margin = NODE_RADIUS + 8.0; + // Aplicar for i in 0..n { let d = (disp[i].0 * disp[i].0 + disp[i].1 * disp[i].1) .sqrt() .max(0.001); - let step = disp[i].0.min(temp).max(-temp); - let step_y = disp[i].1.min(temp).max(-temp); - let new_x = (positions[i].0 + (step / d) * temp).clamp(margin, w - margin); - let new_y = (positions[i].1 + (step_y / d) * temp).clamp(margin, h - margin); + let step_x = (disp[i].0 / d * temp).clamp(-temp, temp); + let step_y = (disp[i].1 / d * temp).clamp(-temp, temp); + let new_x = (positions[i].0 + step_x).clamp(half_w, w - half_w); + let new_y = (positions[i].1 + step_y).clamp(half_h, h - half_h); positions[i] = (new_x, new_y); } }