From 906e5f639cba7cf2c9351eeadbf05469a5852abd Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 23 May 2026 15:53:00 +0000 Subject: [PATCH] gioser-graph: edges behind nodes, variable thickness by raw weight - Edges and nodes now in separate SVG groups (edges first = behind) - Stroke width: 0.6 + w*4.0 instead of normalized range (more visible variation) - Brightness: uses raw weight directly, not normalized against max - Edges group has no breathing animation (only nodes breathe) --- crates/apps/gioser-web/pkg/gioser_web_bg.wasm | Bin 527892 -> 527719 bytes .../gioser/gioser-graph-web/src/lib.rs | 43 ++++++++++-------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/crates/apps/gioser-web/pkg/gioser_web_bg.wasm b/crates/apps/gioser-web/pkg/gioser_web_bg.wasm index c45b3e524705a87b75649981ee82c9a261e33d6e..9e1c7124e5ea52c3a9ad17aff1e8bb815e874e0e 100644 GIT binary patch delta 9907 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 diff --git a/crates/modules/gioser/gioser-graph-web/src/lib.rs b/crates/modules/gioser/gioser-graph-web/src/lib.rs index 53f9dad..e64b524 100644 --- a/crates/modules/gioser/gioser-graph-web/src/lib.rs +++ b/crates/modules/gioser/gioser-graph-web/src/lib.rs @@ -207,13 +207,22 @@ impl GraphWidget { )); svg.append_child(&style_el).ok(); - let breathe_group: web_sys::SvgElement = self + // Grupo para aristas (sin animación de respiración, están detrás) + let edges_group: web_sys::SvgElement = self .document .create_element_ns(Some(ns), "g") .unwrap() .dyn_into() .unwrap(); - breathe_group.set_attribute("class", "gb-svg").ok(); + + // Grupo para nodos (con respiración, encima) + let nodes_group: web_sys::SvgElement = self + .document + .create_element_ns(Some(ns), "g") + .unwrap() + .dyn_into() + .unwrap(); + nodes_group.set_attribute("class", "gb-svg").ok(); // Mapas: UUID → posición y color let pos_map: std::collections::HashMap<&str, (f64, f64)> = positions @@ -225,11 +234,6 @@ impl GraphWidget { .map(|n| (n.id.as_str(), camino_color(&n.camino))) .collect(); - let max_w = self.edges.iter() - .filter_map(|e| e.weight) - .fold(0.0_f64, f64::max) - .max(0.5); - // ── Aristas: mezcla de colores de los nodos que conecta ── let mut drawn = std::collections::HashSet::new(); for edge in &self.edges { @@ -247,19 +251,19 @@ impl GraphWidget { let c2 = color_map.get(edge.target.as_str()).copied().unwrap_or("#888"); let w = edge.weight.unwrap_or(0.7); - let norm_w = (w / max_w).clamp(0.0, 1.0); + // Sin normalización por max — usar weight directamente con más rango + // weight 0.5→0.8 suele ser el rango real; mapeamos a grosor visible + let thick = 0.6 + w * 4.0; // w=0.5→2.6, w=0.9→4.2, w=1.0→4.6 // Mezclar colores: 50/50 + brillo según weight let blended = blend_colors(c1, c2, 0.5); - - // Brillo extra según el peso (acercar a blanco) let (br, bg, bb) = parse_hex(&blended); - let r = (br as f64 + (255.0 - br as f64) * norm_w * 0.4) as u32; - let g = (bg as f64 + (255.0 - bg as f64) * norm_w * 0.4) as u32; - let b = (bb as f64 + (255.0 - bb as f64) * norm_w * 0.4) as u32; + let bright_factor = 0.2 + w * 0.5; // más brillo directo + let r = (br as f64 + (255.0 - br as f64) * bright_factor) as u32; + let g = (bg as f64 + (255.0 - bg as f64) * bright_factor) as u32; + let b = (bb as f64 + (255.0 - bb as f64) * bright_factor) as u32; - let alpha = 0.20 + norm_w * 0.65; - let sw = 1.0 + norm_w * 4.5; + let alpha = 0.15 + w * 0.75; let line: SvgLineElement = self .document @@ -272,10 +276,10 @@ impl GraphWidget { line.set_attribute("x2", &format!("{:.1}", x2)).ok(); line.set_attribute("y2", &format!("{:.1}", y2)).ok(); line.set_attribute("stroke", &format!("#{:02x}{:02x}{:02x}", r, g, b)).ok(); - line.set_attribute("stroke-width", &format!("{:.1}", sw)).ok(); + line.set_attribute("stroke-width", &format!("{:.1}", thick)).ok(); line.set_attribute("stroke-opacity", &format!("{:.2}", alpha)).ok(); line.set_attribute("class", "gb-line").ok(); - breathe_group.append_child(&line).ok(); + edges_group.append_child(&line).ok(); } // ── Nodos ── @@ -407,10 +411,11 @@ impl GraphWidget { g.add_event_listener_with_callback("click", click.as_ref().unchecked_ref()).ok(); click.forget(); - breathe_group.append_child(&g).ok(); + nodes_group.append_child(&g).ok(); } - svg.append_child(&breathe_group).ok(); + svg.append_child(&edges_group).ok(); + svg.append_child(&nodes_group).ok(); self.container.append_child(&svg).ok(); } }