[{"data":1,"prerenderedAt":256},["ShallowReactive",2],{"msfe-doc:\u002Fcustomization\u002Ftoolbars":3},{"id":4,"title":5,"body":6,"description":238,"extension":239,"keywords":240,"locale":247,"meta":248,"navigation":249,"order":250,"path":251,"section":252,"seo":253,"stem":254,"__hash__":255},"docs\u002Fcustomization\u002Ftoolbars.zh-CN.md","工具栏与弹窗",{"type":7,"value":8,"toc":229},"minimark",[9,13,36,132,142,145,162,168,171,178,194,197,210,223,226],[10,11,12],"h2",{"id":12},"工具栏由宿主构建",[14,15,16,17,21,22,25,26,25,29,25,32,35],"p",{},"MSFE 不要求固定工具栏或菜单。QuireKit 应用从 ",[18,19,20],"code",{},"@quirekit\u002Fui\u002Fvue"," 使用 ",[18,23,24],{},"QuireButton","、",[18,27,28],{},"QuireIconButton",[18,30,31],{},"QuireSelect",[18,33,34],{},"QuirePopover"," 等组件；其他宿主可以选择自己的组件。编辑行为统一调用 MSFE 的公共接口。",[37,38,39,55],"table",{},[40,41,42],"thead",{},[43,44,45,49,52],"tr",{},[46,47,48],"th",{},"UI",[46,50,51],{},"读取",[46,53,54],{},"执行",[56,57,58,77,92,108,121],"tbody",{},[43,59,60,64,72],{},[61,62,63],"td",{},"粗体按钮",[61,65,66,25,69],{},[18,67,68],{},"isActive('bold')",[18,70,71],{},"can().toggleBold()",[61,73,74],{},[18,75,76],{},"commands.toggleBold()",[43,78,79,82,87],{},[61,80,81],{},"标题级别",[61,83,84],{},[18,85,86],{},"getAttributes('heading')",[61,88,89],{},[18,90,91],{},"commands.setHeading(level)",[43,93,94,97,103],{},[61,95,96],{},"代码块语言",[61,98,99,100],{},"当前 NodeView 的 ",[18,101,102],{},"attrs.language",[61,104,105],{},[18,106,107],{},"nodeView.updateAttributes({ language })",[43,109,110,113,116],{},[61,111,112],{},"图片插入",[61,114,115],{},"对话框自己的表单状态",[61,117,118],{},[18,119,120],{},"commands.insertImage({ url, alt, title })",[43,122,123,126,129],{},[61,124,125],{},"自定义状态",[61,127,128],{},"已安装的语义查询",[61,130,131],{},"自己的具名命令或字段 patch",[14,133,134,137,138,141],{},[18,135,136],{},"getAttributes()"," 对不存在、混合值或未确认解析返回 ",[18,139,140],{},"null","；不要把它显示为某个默认值并误覆盖多选区。",[10,143,144],{"id":144},"状态订阅与启用条件",[14,146,147,148,153,154,157,158,161],{},"使用 ",[149,150,152],"a",{"href":151},"\u002Fguide\u002Fstate","状态订阅"," 更新当前选区相关的启用状态。",[18,155,156],{},"can()"," 不能执行副作用；",[18,159,160],{},"isActive()"," 不能只依赖 DOM 上是否有加粗样式。控件销毁时释放订阅。",[14,163,164,165,167],{},"QuireKit 的有限选项选择器使用 ",[18,166,31],{},"，不要通过普通文本输入模拟不受约束的语言名。图标按钮提供可访问名称；切换按钮提供状态；键盘操作不依赖 hover。",[10,169,170],{"id":170},"点击时的选择意图",[14,172,173,174,177],{},"简单按钮可以在宿主事件策略允许时保留编辑器焦点，然后执行命令并 ",[18,175,176],{},"focus()","。弹出菜单或对话框需要捕获目标；不能要求所有按钮都阻止 pointerdown，因为这会破坏键盘、触摸和输入控件。",[14,179,180,181,184,185,188,189,193],{},"短暂菜单保存 ",[18,182,183],{},"captureTarget()","；异步对话框使用 ",[18,186,187],{},"captureAnchor()"," 和文档作用域。不要读取“打开弹窗后新的选区”来替换用户最初选中的文本。完整函数见 ",[149,190,192],{"href":191},"\u002Fguide\u002Fselection","选区与异步目标","。",[10,195,196],{"id":196},"只读和错误反馈",[14,198,199,200,25,203,25,206,209],{},"写入控件应同时考虑只读、locked、组合输入、功能安装和语法适用性；最终以命令结果为准。",[18,201,202],{},"readonly",[18,204,205],{},"stale-target",[18,207,208],{},"not-applicable"," 可给出不同反馈，不需要把底层异常直接展示给最终用户。",[14,211,212,213,217,218,222],{},"查看源码、复制和折叠等读取动作不必一律禁用。示例 ",[149,214,216],{"href":215},"\u002Fextensions\u002Fcontainers","容器控件"," 与 ",[149,219,221],{"href":220},"\u002Fextensions\u002Fcode-blocks","代码块工具栏"," 展示了两种不同协议。",[10,224,225],{"id":225},"复杂应用中的边界",[14,227,228],{},"菜单项只发命令；扩展描述行为；codec 处理精确源码；组件库负责视觉和交互状态。不要把格式按钮的业务逻辑复制到快捷键、右键菜单和浮动栏三处。创建一个具名命令供所有入口复用，并用命令链组织一次操作。",{"title":230,"searchDepth":231,"depth":231,"links":232},"",2,[233,234,235,236,237],{"id":12,"depth":231,"text":12},{"id":144,"depth":231,"text":144},{"id":170,"depth":231,"text":170},{"id":196,"depth":231,"text":196},{"id":225,"depth":231,"text":225},"用组件库构建命令入口，正确同步适用性、选区和异步表单。","md",[241,242,243,244,245,246],"toolbar","menu","dialog","can","isActive","getAttributes","zh-CN",{},true,1,"\u002Fcustomization\u002Ftoolbars","UI 与主题",{"title":5,"description":238},"customization\u002Ftoolbars.zh-CN","OwJMWYuIKDECx81SYthEyn_pVrQTTdi42Ba2tOxWNwg",1793046311420]