diff --git a/app/src/main.js b/app/src/main.js index 8f7f272..1bf1024 100644 --- a/app/src/main.js +++ b/app/src/main.js @@ -2770,9 +2770,12 @@ function startBlockTextEdit(o, lines, ev) { ce.remove(); ov.querySelectorAll(".edit-box").forEach((b) => { b.style.display = ""; }); const changed = save && text.trim() && text !== original; - // Huỷ/không đổi gì → trả lại ảnh trang gốc (đang hiện bản ẩn run sửa). - if (!changed && bgSwapped) img.src = prevSrc; + // LUÔN trả lại ảnh trang gốc ngay (đang hiện bản ẩn run sửa): trong lúc + // engine áp thay đổi (file phức tạp mất vài giây) người dùng thấy chữ CŨ + // thay vì khoảng trống — hết cảm giác "chữ biến mất". + if (bgSwapped) img.src = prevSrc; if (changed) { + $("editHint").textContent = "Đang áp dụng thay đổi…"; stageEditOp({ op: "reflowText", indices: allRuns.map((r) => r.index), diff --git a/crates/ff-engine/src/edit.rs b/crates/ff-engine/src/edit.rs index f740477..beef0c6 100644 --- a/crates/ff-engine/src/edit.rs +++ b/crates/ff-engine/src/edit.rs @@ -931,17 +931,23 @@ pub fn apply_edits( bb.top = bb.top.max(r.top); } } - let pad = 2.0; + // Nới DỌC rộng hơn ngang: dấu tiếng Việt (ngã của Ễ…) + // nhiều file (Canva) vẽ bằng op riêng nằm TRÊN cap — + // tâm ngoài bbox +2pt → sót lại dấu lơ lửng sau sửa. + // 8pt vẫn nhỏ hơn nhịp dòng (≥12pt) nên không nuốt + // nhầm dòng bên cạnh. + let pad_x = 2.0; + let pad_y = 8.0; for i in 0..entries.len() as u16 { if idxs.contains(&i) { continue; } let Some(r) = text_rect(i) else { continue }; let (cx, cy) = ((r.left + r.right) / 2.0, (r.bottom + r.top) / 2.0); - if cx >= bb.left - pad - && cx <= bb.right + pad - && cy >= bb.bottom - pad - && cy <= bb.top + pad + if cx >= bb.left - pad_x + && cx <= bb.right + pad_x + && cy >= bb.bottom - pad_y + && cy <= bb.top + pad_y { idxs.push(i); if let Some(g) = geo_of(&page, i)? {