From 2dff73079e55bcb662161225a96a18ed06234a76 Mon Sep 17 00:00:00 2001 From: SMOSTAFAH1 <1.318674e+08+SMOSTAFAH1@users.noreply.github.com> Date: Tue, 10 Nov 2026 16:22:37 +0000 Subject: [PATCH 1/4] feat(engine): highlight hovered objects Co-authored-by: Manus --- crates/draw-engine/src/engine/frame.rs | 8 ++++++++ crates/draw-engine/src/engine/hover.rs | 18 ++++++++++++++++-- crates/draw-engine/src/engine/mod.rs | 6 ++++++ crates/draw-engine/src/wasm/paint.rs | 10 ++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/crates/draw-engine/src/engine/frame.rs b/crates/draw-engine/src/engine/frame.rs index 07712c1..946e0d1 100644 --- a/crates/draw-engine/src/engine/frame.rs +++ b/crates/draw-engine/src/engine/frame.rs @@ -61,6 +61,8 @@ pub struct PaintView<'a> { /// picture of the board, which it changes on every press without touching. pub flowchart_pending: Vec<&'a DrawElement>, pub selected: Vec<&'a DrawElement>, + /// The selectable element currently beneath the pointer, before a press commits selection. + pub hovered: Option<&'a DrawElement>, /// Where a multi-selection's box and handles go: around what a transform carries, /// the same box the handles are hit on. `None` when fewer than two are carried. pub group_box: Option, @@ -403,6 +405,11 @@ impl DrawEngine { .filter_map(|id| self.scene.get(id)) .filter(|el| !el.is_deleted) .collect(); + let hovered = self + .hovered_id + .as_deref() + .and_then(|id| self.scene.get(id)) + .filter(|el| !el.is_deleted); let lasso = match &self.interaction { Some(super::Interaction::Lasso { path, .. }) => path.clone(), _ => Vec::new(), @@ -554,6 +561,7 @@ impl DrawEngine { erasing_revision: self.erasing_revision, flowchart_pending, selected, + hovered, group_box, marquee, lasso, diff --git a/crates/draw-engine/src/engine/hover.rs b/crates/draw-engine/src/engine/hover.rs index c8eb686..099d295 100644 --- a/crates/draw-engine/src/engine/hover.rs +++ b/crates/draw-engine/src/engine/hover.rs @@ -99,8 +99,18 @@ impl DrawEngine { /// outline a few units off an intersection lights whatever that intersection is over, and /// near the tolerance's edge it lights **nothing** at all. pub fn hover_pointer(&mut self, sx: f64, sy: f64) { - if self.tool != DrawTool::Arrow || self.interaction.is_some() || self.multi_linear.is_some() - { + if self.interaction.is_some() || self.multi_linear.is_some() { + return; + } + if self.tool == DrawTool::Select { + let next = self.pressed_at(sx, sy).map(|el| el.id.clone()); + if next != self.hovered_id { + self.hovered_id = next; + self.request_draw(); + } + return; + } + if self.tool != DrawTool::Arrow { return; } let world = self.screen_to_world(sx, sy); @@ -145,10 +155,14 @@ impl DrawEngine { if self.interaction.is_some() || self.multi_linear.is_some() { return; } + let hover_changed = self.hovered_id.take().is_some(); if self.binding_highlight.take().is_some() { self.binding_point = None; self.request_draw(); } + if hover_changed { + self.request_draw(); + } } /// Ctrl/Cmd, as held for the pointer event about to be reported: while it is down an diff --git a/crates/draw-engine/src/engine/mod.rs b/crates/draw-engine/src/engine/mod.rs index 7fbd378..18b3c00 100644 --- a/crates/draw-engine/src/engine/mod.rs +++ b/crates/draw-engine/src/engine/mod.rs @@ -283,6 +283,8 @@ pub struct DrawEngine { settled_selection: std::rc::Rc, /// Between a press and its release, when what the press selects is not settled yet. pointer_open: bool, + /// Element currently under the pointer in the Select tool, for immediate hover feedback. + hovered_id: Option, /// The right-button session in progress, if one is. Outlives the gesture it holds, /// because the platform's `contextmenu` can arrive after the release that ended it — /// see [`Self::consumes_context_menu`] and [`crate::pan`]. @@ -406,6 +408,7 @@ impl DrawEngine { history_seq: 0, settled_selection: std::rc::Rc::default(), pointer_open: false, + hovered_id: None, secondary_pan: None, suppress_next_context_menu: false, remote_refused: std::collections::HashMap::new(), @@ -803,6 +806,9 @@ impl DrawEngine { } pub fn set_tool(&mut self, tool: DrawTool) { + if self.tool != tool { + self.hovered_id = None; + } self.set_tool_step(tool); self.refresh_live(); } diff --git a/crates/draw-engine/src/wasm/paint.rs b/crates/draw-engine/src/wasm/paint.rs index 64176e5..b2c9856 100644 --- a/crates/draw-engine/src/wasm/paint.rs +++ b/crates/draw-engine/src/wasm/paint.rs @@ -2059,6 +2059,16 @@ fn paint_overlay(ctx: &CanvasRenderingContext2d, view: &PaintView) { } } + if let Some(hovered) = view.hovered { + // Hover feedback is deliberately an outline only: it previews the click without + // adding handles or changing the committed selection. + ctx.save(); + set_stroke(ctx, &view.theme.accent); + ctx.set_global_alpha(0.75); + paint_element_outline(ctx, view, hovered); + ctx.restore(); + } + if view.selected.len() == 1 { paint_shape_selection(ctx, view, view.selected[0]); paint_radius_handles(ctx, view); From cd60dc179c71344fb9977f61f17ea7df3c80fd31 Mon Sep 17 00:00:00 2001 From: SMOSTAFAH1 <1.318674e+08+SMOSTAFAH1@users.noreply.github.com> Date: Tue, 10 Nov 2026 16:23:22 +0000 Subject: [PATCH 2/4] fix(fonts): recalculate Lilita glyph bounds Co-authored-by: Manus --- ...r-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 | Bin 1416 -> 1328 bytes ...ular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 | Bin 10676 -> 10156 bytes crates/draw-engine/src/engine/frame.rs | 1 + 3 files changed, 1 insertion(+) diff --git a/crates/draw-engine/assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 b/crates/draw-engine/assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 index 51e6f53a8989c7ad2d1659fe7374ab37d3f2b405..4f335a73f857909a3d6f825095f20cca71fefa6d 100644 GIT binary patch delta 1306 zcmV+#1?BpP3$O|pcTYw#00961000Fr01f~E000Si000Etkr*g{J^?lYBm*=H8~_9$ z1%qSXAo|BpH!17+By|69c&I0Qz!iw1pc^R=|gDo8p(ok-t**AoyMBRj4+SE!<5)cirN zy?GYRNcE;mgmYMymPD;!BaVS$WxCVEyqOFGR%SR$tTUHUlTI%aGuH_b8Dy^w51+N{ znv6(RpI&`l@37yjIFGTl{TUiwt2AagpA z9ARY{H?ppOu{r{=*U6x6w4HM|(>hk2>d5;@j4UGA!m3+vt!un&h{KmkEsqnDJN*VL zGt9^pO9_$4knzeZk{ZpH=u4Q@TeGi}6*92WE1*J#E}_IPqG2;3=zCCPDd%Kd0Wm zRI?aEyF~!^WVqFtKA!icGpJt80pZonO*IOj}_*E;I@0EXJ>?@ z)^&`3>Lvcg+$f(^!{qo4s?P$f(`TiXsg%u1OIJ1Ks!{_n{V@pHlI-kc#MkudcWsZY zOPEn@tS7LIYF*)~&s7WV4lDT!`2BHXysBSzQVEM)9gC+jftjtJJ67dxGauwbeSQnkSpa{vG!00@Syv_5mcNYnqDiYomQ0M0n5 zo(6yyI^R0v%jE%7FFgZ*3aF`!o+CF0s4C9Nn+<~C5I`L#aAuMKU@t(fL6HnVkLwH^i{0v^_jC}?1zh(<7q z8x@!$Md%??qy!G!L1Re()o4F?&G3a&VH?WOiW&&*fN(?`)W4vKf+|)b36Y3DwH4Gb zp#&!yQGv`Gw#q;gyqE|saD+3Q;fh#vpahLbps`&aR^ZVl_(HT=MZK0xxWXBEE+?eI zL=`$v&uZT)QyPXQG^59Rtcq&62-YZrjV`;$o3^4}CugnYVK4~|oz`-B8LCkNN0j!7 zUf96C$1Xp})mk61Ed$Vbhw{Z5X(J#)Vi!UKSVKiH^*;quP&ib|x4{)DbpYf~vj1Z| Q!BafL9z4ejEXPm)0Dh5IiU0rr delta 1395 zcmV-(1&sQz3Wy6BcTYw#00961000Gu01f~E000Si000Fwkr*g{UJD!m0X70812hC6 z1%qS_wTFEy+d>1l#1bxY#gth4WorqE1JqzZ_uvF>^eCKsNoi@#14L3ZX0-s ze>A_ogeRzEF|Bof@bJHm{=Qk*%Ddl9NMM3b|8CBc52nL9x$X2VE2Wk|0;v{q5K!q4 z`=9mfivM#zUl(nUN0Bxf$N&dYB9V7loJHx8ya7c4j<(;4dHjof`o}*;fqqkS7RjYk z<^cD-Yat*605AvoD*k}s5O+Z+ ze9Ox63owCe+M|vWz#iirAOQWw10Vw&jA#ony-^Q@z%qy+rEt3p(WN?#YFhglw$2#o zR4s1mW#!M7U7N;s#IZui89<=ur0Q_c80aInVUD65Lq>aDE>vh;9Gw##9}tk%e8cFH zoF}>CgVwo!+T8Ko!AN1w{1P(VLDJaZY<0zS1VJ=5cspGQJwY_>S7D4cpS^^)t6`xDwY;hbgmJ

X2V)9OivdcF#FzR==5~%Q}i(Bq$|dyr7F&? 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 literal 10676 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 { view.flowchart_pending = Vec::new(); view.laser = Vec::new(); view.peer_lasers = Vec::new(); + view.hovered = None; view.peer_marks = Vec::new(); view.snap_guides = Vec::new(); view.linear_handles = Vec::new(); From b404d0055b4738b3113023fa506e795071c9b140 Mon Sep 17 00:00:00 2001 From: SMOSTAFAH1 <1.318674e+08+SMOSTAFAH1@users.noreply.github.com> Date: Tue, 10 Nov 2026 16:33:09 +0000 Subject: [PATCH 3/4] test(fonts): record rebuilt Lilita checksums Co-authored-by: Manus --- crates/draw-engine/tests/ci_svg_fonts_bytes.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/draw-engine/tests/ci_svg_fonts_bytes.rs b/crates/draw-engine/tests/ci_svg_fonts_bytes.rs index 2ac3f40..f8584ad 100644 --- a/crates/draw-engine/tests/ci_svg_fonts_bytes.rs +++ b/crates/draw-engine/tests/ci_svg_fonts_bytes.rs @@ -362,11 +362,11 @@ fn the_shipped_files_hash_to_the_recorded_values() { ), ( include_bytes!("../assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2"), - 0x1380_bdc3, + 0x9a95_2276, ), ( include_bytes!("../assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2"), - 0x8a23_e0d0, + 0xda05_848c, ), ]; for (bytes, expected) in &files { From e126651387de0e333c237d31625982d7f7d4617a Mon Sep 17 00:00:00 2001 From: SMOSTAFAH1 <1.318674e+08+SMOSTAFAH1@users.noreply.github.com> Date: Tue, 10 Nov 2026 16:36:44 +0000 Subject: [PATCH 4/4] test(fonts): sync Lilita checksum registry Co-authored-by: Manus --- crates/draw-engine/tests/ci_svg_fonts_bytes.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/draw-engine/tests/ci_svg_fonts_bytes.rs b/crates/draw-engine/tests/ci_svg_fonts_bytes.rs index f8584ad..2a9f457 100644 --- a/crates/draw-engine/tests/ci_svg_fonts_bytes.rs +++ b/crates/draw-engine/tests/ci_svg_fonts_bytes.rs @@ -91,11 +91,11 @@ const SHIPPED_CRC32: [(&str, u32); 10] = [ ), ( "Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2", - 0x1380_bdc3, + 0x9a95_2276, ), ( "Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2", - 0x8a23_e0d0, + 0xda05_848c, ), ];