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 737d2f15..80b2954b 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 @@ -152,3 +152,6 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据 - 2026-05-25:Batch N 继续收口 overlay escape 小切片:Codex 主控把 `close_editor_floating_overlays_if_escape` 机械迁入 `editor_runtime/overlays.rs`,`lib.rs` 仅保留调用和仍需壳层状态的 open / sync overlay 编排。 - 未迁:`try_sync_editor_overlay_state`、`on_selection_change`、`open_slash_menu_overlay` / `open_image_toolbar_overlay` / `open_block_menu_overlay`,原因是仍依赖 DOM event、toolbar lock、selection bridge 或 Leptos shell signal 编排。 - 已验证:`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`、`NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`。 +- 2026-05-25:Batch O 继续收口 overlay open helper:Codex 主控把 `open_slash_menu_overlay`、`open_image_toolbar_overlay`、`open_block_menu_overlay` 迁入 `editor_runtime/overlays.rs`。这三者只复用 `close_editor_floating_overlays` 并设置 Leptos signals;`open_block_menu_overlay` 仅读取 `block_menu_open` 判定是否重新打开。 + - 未迁:`try_sync_editor_overlay_state`、`on_selection_change` 和各调用点 DOM / selection bridge 逻辑,原因是仍属于 editor shell 编排。 + - 已验证:`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_SMOKE_BASE_URL=http://127.0.0.1:3001 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:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`。 diff --git a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js index 7d7dcd16..86518b31 100644 --- a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js +++ b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js @@ -1284,7 +1284,7 @@ function __wbg_get_imports() { return ret; }, __wbindgen_cast_0000000000000006: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("KeyboardEvent")], shim_idx: 524, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("KeyboardEvent")], shim_idx: 883, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__hd90af689bc3e71bf); return ret; }, diff --git a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm index 0e3cde12..21268355 100644 Binary files a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm and b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm differ diff --git a/rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs b/rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs index 2f597d30..0e6dd7ea 100644 --- a/rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs +++ b/rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs @@ -182,6 +182,151 @@ pub(crate) fn close_editor_floating_overlays_if_escape( overlay_open } +#[allow(clippy::too_many_arguments)] +pub(crate) fn open_slash_menu_overlay( + set_slash_open: WriteSignal, + set_slash_index: WriteSignal, + set_slash_query: WriteSignal, + set_turn_into_open: WriteSignal, + set_color_menu_open: WriteSignal, + set_more_menu_open: WriteSignal, + set_locked_toolbar_anchor: WriteSignal>, + set_text_selection_active: WriteSignal, + set_floating_toolbar_anchor: WriteSignal>, + set_image_toolbar_anchor: WriteSignal>, + set_table_toolbar_open: WriteSignal, + set_table_options_open: WriteSignal, + set_table_overlay_anchor: WriteSignal>, + set_table_selection_overlay: WriteSignal>, + set_block_menu_open: WriteSignal, + set_block_menu_anchor: WriteSignal>, + set_block_turn_into_open: WriteSignal, + set_block_folded_title_open: WriteSignal, +) { + close_editor_floating_overlays( + set_slash_open, + set_slash_index, + set_slash_query, + set_turn_into_open, + set_color_menu_open, + set_more_menu_open, + set_locked_toolbar_anchor, + set_text_selection_active, + set_floating_toolbar_anchor, + set_image_toolbar_anchor, + set_table_toolbar_open, + set_table_options_open, + set_table_overlay_anchor, + set_table_selection_overlay, + set_block_menu_open, + set_block_menu_anchor, + set_block_turn_into_open, + set_block_folded_title_open, + ); + set_slash_open.set(true); +} + +#[allow(clippy::too_many_arguments)] +pub(crate) fn open_image_toolbar_overlay( + image_anchor: Option, + set_block_keyboard_mode: WriteSignal, + set_hovered_block: WriteSignal>, + set_slash_open: WriteSignal, + set_slash_index: WriteSignal, + set_slash_query: WriteSignal, + set_turn_into_open: WriteSignal, + set_color_menu_open: WriteSignal, + set_more_menu_open: WriteSignal, + set_locked_toolbar_anchor: WriteSignal>, + set_text_selection_active: WriteSignal, + set_floating_toolbar_anchor: WriteSignal>, + set_image_toolbar_anchor: WriteSignal>, + set_table_toolbar_open: WriteSignal, + set_table_options_open: WriteSignal, + set_table_overlay_anchor: WriteSignal>, + set_table_selection_overlay: WriteSignal>, + set_block_menu_open: WriteSignal, + set_block_menu_anchor: WriteSignal>, + set_block_turn_into_open: WriteSignal, + set_block_folded_title_open: WriteSignal, +) { + close_editor_floating_overlays( + set_slash_open, + set_slash_index, + set_slash_query, + set_turn_into_open, + set_color_menu_open, + set_more_menu_open, + set_locked_toolbar_anchor, + set_text_selection_active, + set_floating_toolbar_anchor, + set_image_toolbar_anchor, + set_table_toolbar_open, + set_table_options_open, + set_table_overlay_anchor, + set_table_selection_overlay, + set_block_menu_open, + set_block_menu_anchor, + set_block_turn_into_open, + set_block_folded_title_open, + ); + set_block_keyboard_mode.set(false); + set_hovered_block.set(None); + set_image_toolbar_anchor.set(image_anchor); +} + +#[allow(clippy::too_many_arguments)] +pub(crate) fn open_block_menu_overlay( + anchor: HoveredBlockState, + same_anchor: bool, + block_menu_open: ReadSignal, + set_slash_open: WriteSignal, + set_slash_index: WriteSignal, + set_slash_query: WriteSignal, + set_turn_into_open: WriteSignal, + set_color_menu_open: WriteSignal, + set_more_menu_open: WriteSignal, + set_locked_toolbar_anchor: WriteSignal>, + set_text_selection_active: WriteSignal, + set_floating_toolbar_anchor: WriteSignal>, + set_image_toolbar_anchor: WriteSignal>, + set_table_toolbar_open: WriteSignal, + set_table_options_open: WriteSignal, + set_table_overlay_anchor: WriteSignal>, + set_table_selection_overlay: WriteSignal>, + set_block_menu_open: WriteSignal, + set_block_menu_anchor: WriteSignal>, + set_block_turn_into_open: WriteSignal, + set_block_folded_title_open: WriteSignal, +) -> bool { + let should_open = !block_menu_open.get_untracked() || !same_anchor; + close_editor_floating_overlays( + set_slash_open, + set_slash_index, + set_slash_query, + set_turn_into_open, + set_color_menu_open, + set_more_menu_open, + set_locked_toolbar_anchor, + set_text_selection_active, + set_floating_toolbar_anchor, + set_image_toolbar_anchor, + set_table_toolbar_open, + set_table_options_open, + set_table_overlay_anchor, + set_table_selection_overlay, + set_block_menu_open, + set_block_menu_anchor, + set_block_turn_into_open, + set_block_folded_title_open, + ); + if should_open { + set_block_menu_open.set(true); + set_block_menu_anchor.set(Some(anchor)); + } + should_open +} + pub(crate) fn try_close_block_menu_overlays( set_slash_open: WriteSignal, set_turn_into_open: WriteSignal, diff --git a/rust/spikes/leptos-tiptap-spike/src/lib.rs b/rust/spikes/leptos-tiptap-spike/src/lib.rs index c3be01c3..2e8ebbd1 100644 --- a/rust/spikes/leptos-tiptap-spike/src/lib.rs +++ b/rust/spikes/leptos-tiptap-spike/src/lib.rs @@ -40,10 +40,10 @@ use editor_runtime::dom_selection::{ }; use editor_runtime::editor_focus::{active_editor_stage, body_has_focus, schedule_editor_focus}; use editor_runtime::overlays::{ - close_editor_floating_overlays, close_editor_floating_overlays_if_escape, - floating_toolbar_anchor_from_selection, sync_text_selection_overlay, try_close_block_menu_overlays, - FloatingToolbarAnchor, ImageToolbarAnchor, TableOverlayAnchor, TableSelectionKind, - TableSelectionOverlayState, + close_editor_floating_overlays_if_escape, floating_toolbar_anchor_from_selection, + open_block_menu_overlay, open_image_toolbar_overlay, open_slash_menu_overlay, + sync_text_selection_overlay, try_close_block_menu_overlays, FloatingToolbarAnchor, + ImageToolbarAnchor, TableOverlayAnchor, TableSelectionKind, TableSelectionOverlayState, }; use editor_runtime::persistence::{ load_persisted_document, normalize_identity_value, persist_document_state, @@ -5657,148 +5657,6 @@ fn toolbar_overlay_locked( turn_into_open || color_menu_open || more_menu_open } -fn open_slash_menu_overlay( - set_slash_open: WriteSignal, - set_slash_index: WriteSignal, - set_slash_query: WriteSignal, - set_turn_into_open: WriteSignal, - set_color_menu_open: WriteSignal, - set_more_menu_open: WriteSignal, - set_locked_toolbar_anchor: WriteSignal>, - set_text_selection_active: WriteSignal, - set_floating_toolbar_anchor: WriteSignal>, - set_image_toolbar_anchor: WriteSignal>, - set_table_toolbar_open: WriteSignal, - set_table_options_open: WriteSignal, - set_table_overlay_anchor: WriteSignal>, - set_table_selection_overlay: WriteSignal>, - set_block_menu_open: WriteSignal, - set_block_menu_anchor: WriteSignal>, - set_block_turn_into_open: WriteSignal, - set_block_folded_title_open: WriteSignal, -) { - close_editor_floating_overlays( - set_slash_open, - set_slash_index, - set_slash_query, - set_turn_into_open, - set_color_menu_open, - set_more_menu_open, - set_locked_toolbar_anchor, - set_text_selection_active, - set_floating_toolbar_anchor, - set_image_toolbar_anchor, - set_table_toolbar_open, - set_table_options_open, - set_table_overlay_anchor, - set_table_selection_overlay, - set_block_menu_open, - set_block_menu_anchor, - set_block_turn_into_open, - set_block_folded_title_open, - ); - set_slash_open.set(true); -} - -fn open_image_toolbar_overlay( - image_anchor: Option, - set_block_keyboard_mode: WriteSignal, - set_hovered_block: WriteSignal>, - set_slash_open: WriteSignal, - set_slash_index: WriteSignal, - set_slash_query: WriteSignal, - set_turn_into_open: WriteSignal, - set_color_menu_open: WriteSignal, - set_more_menu_open: WriteSignal, - set_locked_toolbar_anchor: WriteSignal>, - set_text_selection_active: WriteSignal, - set_floating_toolbar_anchor: WriteSignal>, - set_image_toolbar_anchor: WriteSignal>, - set_table_toolbar_open: WriteSignal, - set_table_options_open: WriteSignal, - set_table_overlay_anchor: WriteSignal>, - set_table_selection_overlay: WriteSignal>, - set_block_menu_open: WriteSignal, - set_block_menu_anchor: WriteSignal>, - set_block_turn_into_open: WriteSignal, - set_block_folded_title_open: WriteSignal, -) { - close_editor_floating_overlays( - set_slash_open, - set_slash_index, - set_slash_query, - set_turn_into_open, - set_color_menu_open, - set_more_menu_open, - set_locked_toolbar_anchor, - set_text_selection_active, - set_floating_toolbar_anchor, - set_image_toolbar_anchor, - set_table_toolbar_open, - set_table_options_open, - set_table_overlay_anchor, - set_table_selection_overlay, - set_block_menu_open, - set_block_menu_anchor, - set_block_turn_into_open, - set_block_folded_title_open, - ); - set_block_keyboard_mode.set(false); - set_hovered_block.set(None); - set_image_toolbar_anchor.set(image_anchor); -} - -fn open_block_menu_overlay( - anchor: HoveredBlockState, - same_anchor: bool, - block_menu_open: ReadSignal, - set_slash_open: WriteSignal, - set_slash_index: WriteSignal, - set_slash_query: WriteSignal, - set_turn_into_open: WriteSignal, - set_color_menu_open: WriteSignal, - set_more_menu_open: WriteSignal, - set_locked_toolbar_anchor: WriteSignal>, - set_text_selection_active: WriteSignal, - set_floating_toolbar_anchor: WriteSignal>, - set_image_toolbar_anchor: WriteSignal>, - set_table_toolbar_open: WriteSignal, - set_table_options_open: WriteSignal, - set_table_overlay_anchor: WriteSignal>, - set_table_selection_overlay: WriteSignal>, - set_block_menu_open: WriteSignal, - set_block_menu_anchor: WriteSignal>, - set_block_turn_into_open: WriteSignal, - set_block_folded_title_open: WriteSignal, -) -> bool { - let should_open = !block_menu_open.get_untracked() || !same_anchor; - close_editor_floating_overlays( - set_slash_open, - set_slash_index, - set_slash_query, - set_turn_into_open, - set_color_menu_open, - set_more_menu_open, - set_locked_toolbar_anchor, - set_text_selection_active, - set_floating_toolbar_anchor, - set_image_toolbar_anchor, - set_table_toolbar_open, - set_table_options_open, - set_table_overlay_anchor, - set_table_selection_overlay, - set_block_menu_open, - set_block_menu_anchor, - set_block_turn_into_open, - set_block_folded_title_open, - ); - if should_open { - set_block_menu_open.set(true); - set_block_menu_anchor.set(Some(anchor)); - } - should_open -} - fn try_sync_editor_overlay_state( set_editor_focused: WriteSignal, set_text_selection_active: WriteSignal,