重构基线
This commit is contained in:
@@ -132,7 +132,6 @@ impl EditorButtonProps {
|
||||
/// - data-testid
|
||||
/// - tooltip(data-tooltip)
|
||||
/// - onClick 阻止默认并调用回调
|
||||
#[component]
|
||||
pub(crate) fn EditorButton(props: EditorButtonProps) -> impl IntoView {
|
||||
let on_click = props.on_click.clone();
|
||||
let click_handler = move |event: ev::MouseEvent| {
|
||||
|
||||
@@ -9,10 +9,9 @@
|
||||
//! 这些函数替代原 lib.rs / overlays.rs / view 中的手写 Escape keydown 和
|
||||
//! document mousedown listener,对齐 Radix DismissableLayer + FocusScope 语义。
|
||||
|
||||
use std::{cell::RefCell, rc::Rc};
|
||||
use wasm_bindgen::{closure::Closure, JsCast};
|
||||
use web_sys::{
|
||||
window, Document, Element, EventTarget, HtmlElement, KeyboardEvent, MouseEvent,
|
||||
};
|
||||
use web_sys::{window, Element, HtmlElement, KeyboardEvent, MouseEvent};
|
||||
|
||||
use crate::editor_runtime::dom_events::target_element;
|
||||
|
||||
@@ -24,18 +23,20 @@ pub(crate) fn register_dismissable_layer(
|
||||
container_id: &str,
|
||||
on_dismiss: Box<dyn FnMut()>,
|
||||
) -> DismissHandle {
|
||||
let dismiss = std::cell::RefCell::new(on_dismiss);
|
||||
let dismiss = Rc::new(RefCell::new(on_dismiss));
|
||||
let win = window();
|
||||
let doc = win.as_ref().and_then(|w| w.document());
|
||||
|
||||
// Escape keydown(捕获阶段,确保在 Tiptap 之前处理)
|
||||
let container_id_esc = container_id.to_string();
|
||||
let doc_esc = doc.clone();
|
||||
let dismiss_for_esc = Rc::clone(&dismiss);
|
||||
let dismiss_esc = Closure::wrap(Box::new(move |event: KeyboardEvent| {
|
||||
if event.key() != "Escape" {
|
||||
return;
|
||||
}
|
||||
// 只处理 container 可见的情况
|
||||
if let Some(ref doc) = doc {
|
||||
if let Some(ref doc) = doc_esc {
|
||||
if let Ok(Some(el)) = doc.query_selector(&format!("#{container_id_esc}")) {
|
||||
if !is_element_visible(&el) {
|
||||
return;
|
||||
@@ -44,7 +45,7 @@ pub(crate) fn register_dismissable_layer(
|
||||
event.stop_propagation();
|
||||
}
|
||||
}
|
||||
if let Ok(mut f) = dismiss.try_borrow_mut() {
|
||||
if let Ok(mut f) = dismiss_for_esc.try_borrow_mut() {
|
||||
f();
|
||||
}
|
||||
}) as Box<dyn FnMut(_)>);
|
||||
@@ -59,6 +60,7 @@ pub(crate) fn register_dismissable_layer(
|
||||
|
||||
// 点击外部 handler(mousedown,因为 click 可能在 focus 转移之后才触发)
|
||||
let container_id_click = container_id.to_string();
|
||||
let dismiss_for_click = Rc::clone(&dismiss);
|
||||
let dismiss_click = Closure::wrap(Box::new(move |event: MouseEvent| {
|
||||
let target = event.target();
|
||||
let Some(target_el) = target.and_then(target_element) else {
|
||||
@@ -72,7 +74,7 @@ pub(crate) fn register_dismissable_layer(
|
||||
if let Ok(Some(_)) = target_el.closest(".ProseMirror") {
|
||||
return;
|
||||
}
|
||||
if let Ok(mut f) = dismiss.try_borrow_mut() {
|
||||
if let Ok(mut f) = dismiss_for_click.try_borrow_mut() {
|
||||
f();
|
||||
}
|
||||
}) as Box<dyn FnMut(_)>);
|
||||
|
||||
@@ -49,6 +49,7 @@ pub(crate) const ICON_MAP: &[(&str, &str)] = &[
|
||||
("autorenew", "autorenew"),
|
||||
("link", "link"),
|
||||
("arrow_outward", "arrow_outward"),
|
||||
("arrow_drop_down", "arrow_drop_down"),
|
||||
("history", "history"),
|
||||
("chat", "chat"),
|
||||
("palette", "palette"),
|
||||
@@ -76,7 +77,7 @@ pub(crate) fn icon_ligature(name: &str) -> Option<&'static str> {
|
||||
///
|
||||
/// The `name` parameter must be a Material Symbols ligature name
|
||||
/// (e.g. `"auto_awesome"`, `"chevron_right"`, `"looks_one"`).
|
||||
pub(crate) fn material_icon(name: &str) -> impl IntoView {
|
||||
pub(crate) fn material_icon(name: &'static str) -> impl IntoView {
|
||||
view! {
|
||||
<span class="material-symbols-outlined" aria-hidden="true">{name}</span>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user