diff --git a/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md b/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md index bad7dceb..408fef79 100644 --- a/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md +++ b/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md @@ -291,3 +291,9 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据 - 修改:`editor_runtime/block_dnd.rs` 新增 `hovered_block_from_target(target, root, handle_selector)`,承接 `target_element`、handle shell 过滤、direct block index 解析和 `block_state_from_index(index)` 委托;`lib.rs` 的同名函数退化为只负责获取 `editor_root_element()` 后调用 runtime helper。 - 边界:未迁 `hovered_block_from_selection`、`drop_indicator_from_target`、`drop_indicator_from_point`、drag/drop listener、keyboard signal 分支或 block reorder 行为;本批只外置共享 target -> `HoveredBlockState` 解析层。 - 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check`、`cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen`、临时当前源码服务 `MNOTE_WEB_BIND=127.0.0.1:3020 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3020 cargo run --manifest-path rust/Cargo.toml -p mnote-web`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3020 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3020 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3020 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`。 +- 2026-05-25:Batch AK 派发 1 个只读 Reasonix worker 审计 `drop_indicator_from_target` / `drop_indicator_from_point` 的最小外置边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-ak-worker-a-5-29-drop-indicator-readonly`,run id `reasonix-2026-05-25T00-23-12-071Z-5cb35e3f`,显式 `--no-memory-recall`。 + - Codex 已读取 Hindsight recall、`process-handoff.md/json`,并核对 worktree `git status --short` / `git diff --stat` 为空;只读结论经主控复核后采纳。 + - 审计结论:`drop_indicator_from_target` 已具备迁入 `editor_runtime/block_dnd.rs` 的条件,`drop_indicator_from_point` 可同刀迁出;`hovered_block_from_target` 的 hover listener 壳与现有 drag/drop 调用点暂留 `lib.rs`,通过 `HANDLE_SHELL_SELECTOR` 参数注入 runtime helper。 + - Codex 主控完成最小机械切片:`editor_runtime/block_dnd.rs` 新增 `drop_indicator_from_target(target, client_y, handle_selector)`、`drop_indicator_from_point(client_x, client_y, handle_selector)`;`lib.rs` 同名函数退化为只透传 `HANDLE_SHELL_SELECTOR` 的薄壳,不扩散 drag/drop listener 或 block reorder 调用点。 + - 边界:未迁 `hovered_block_from_selection`、drag/drop listener、keyboard signal 分支、block reorder 行为或 `HANDLE_SHELL_SELECTOR` 常量定义;本批只外置 drop indicator 的 target/point 解析 helper。 + - 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check`、`cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm`、临时当前源码服务 `MNOTE_WEB_BIND=127.0.0.1:3032 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3032 cargo run --manifest-path rust/Cargo.toml -p mnote-web`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3032 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3032 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3032 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`。 diff --git a/rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_dnd.rs b/rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_dnd.rs index 86e12894..e1fe54bb 100644 --- a/rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_dnd.rs +++ b/rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_dnd.rs @@ -139,6 +139,32 @@ pub(crate) fn hovered_block_from_target( block_state_from_index(index) } +pub(crate) fn drop_indicator_from_target( + target: EventTarget, + client_y: i32, + handle_selector: &str, +) -> Option { + let root = editor_root_element()?; + let hovered = hovered_block_from_target(target, &root, handle_selector)?; + let block = root.children().item(hovered.index as u32)?; + let stage = editor_stage_element()?; + Some(drop_indicator_from_block_rects( + hovered.index, + &block, + &stage, + client_y, + )) +} + +pub(crate) fn drop_indicator_from_point( + client_x: i32, + client_y: i32, + handle_selector: &str, +) -> Option { + let target = event_target_from_point(client_x, client_y)?; + drop_indicator_from_target(target, client_y, handle_selector) +} + pub(crate) fn block_state_from_index(index: usize) -> Option { let root = editor_root_element()?; let stage = editor_stage_element()?; diff --git a/rust/spikes/leptos-tiptap-spike/src/lib.rs b/rust/spikes/leptos-tiptap-spike/src/lib.rs index 05daa813..ade3a48b 100644 --- a/rust/spikes/leptos-tiptap-spike/src/lib.rs +++ b/rust/spikes/leptos-tiptap-spike/src/lib.rs @@ -23,8 +23,10 @@ use web_sys::{ use editor_runtime::attachment_upload::dispatch_editor_upload_request; use editor_runtime::block_dnd::{ block_state_from_index as block_state_from_index_runtime, direct_block_from_element, - drop_indicator_from_block_rects, element_within_handle_shell, event_target_from_point, - hovered_block_from_target as hovered_block_from_target_runtime, top_level_block_index, + drop_indicator_from_point as drop_indicator_from_point_runtime, + drop_indicator_from_target as drop_indicator_from_target_runtime, + element_within_handle_shell, hovered_block_from_target as hovered_block_from_target_runtime, + top_level_block_index, }; use editor_runtime::block_menu_overlay; use editor_runtime::block_menu_document::{ @@ -5031,21 +5033,11 @@ fn drop_indicator_from_target( target: web_sys::EventTarget, client_y: i32, ) -> Option { - let hovered = hovered_block_from_target(target)?; - let root = editor_root_element()?; - let block = root.children().item(hovered.index as u32)?; - let stage = editor_stage_element()?; - Some(drop_indicator_from_block_rects( - hovered.index, - &block, - &stage, - client_y, - )) + drop_indicator_from_target_runtime(target, client_y, HANDLE_SHELL_SELECTOR) } fn drop_indicator_from_point(client_x: i32, client_y: i32) -> Option { - let target = event_target_from_point(client_x, client_y)?; - drop_indicator_from_target(target, client_y) + drop_indicator_from_point_runtime(client_x, client_y, HANDLE_SHELL_SELECTOR) } fn document_content_mut(document: &mut Value) -> Result<&mut Vec, String> {