@notectl/core 2.0.2 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +258 -123
- package/dist/chunks/AlignmentPlugin-DGb1VtCU.mjs +2 -0
- package/dist/chunks/AlignmentPlugin-DGb1VtCU.mjs.map +1 -0
- package/dist/chunks/AttrRegistry-DvqbnJ6T.mjs +2 -0
- package/dist/chunks/AttrRegistry-DvqbnJ6T.mjs.map +1 -0
- package/dist/chunks/AttributedMarkCommands-BiJtiHpx.mjs +2 -0
- package/dist/chunks/AttributedMarkCommands-BiJtiHpx.mjs.map +1 -0
- package/dist/chunks/BlockInsertion-Q8B21SaG.mjs +2 -0
- package/dist/chunks/BlockInsertion-Q8B21SaG.mjs.map +1 -0
- package/dist/chunks/BlockTypePickerRegistry-5fFlS2i0.mjs +2 -0
- package/dist/chunks/BlockTypePickerRegistry-5fFlS2i0.mjs.map +1 -0
- package/dist/chunks/BlockquotePlugin-Dz8Pny1r.mjs +2 -0
- package/dist/chunks/BlockquotePlugin-Dz8Pny1r.mjs.map +1 -0
- package/dist/chunks/CaretNavigationPlugin-mQ1nxJ6m.mjs +2 -0
- package/dist/chunks/CaretNavigationPlugin-mQ1nxJ6m.mjs.map +1 -0
- package/dist/chunks/CodeBlockPlugin-oPGiMno0.mjs +2 -0
- package/dist/chunks/CodeBlockPlugin-oPGiMno0.mjs.map +1 -0
- package/dist/chunks/ColorGrid-CcF0bH26.mjs +2 -0
- package/dist/chunks/ColorGrid-CcF0bH26.mjs.map +1 -0
- package/dist/chunks/ColorPickerPopup-BZxMBDxy.mjs +2 -0
- package/dist/chunks/ColorPickerPopup-BZxMBDxy.mjs.map +1 -0
- package/dist/chunks/ColorValidation-rOrJxBBt.mjs +2 -0
- package/dist/chunks/ColorValidation-rOrJxBBt.mjs.map +1 -0
- package/dist/chunks/CommandHelpers-G6M-qXJR.mjs +2 -0
- package/dist/chunks/CommandHelpers-G6M-qXJR.mjs.map +1 -0
- package/dist/chunks/Commands-ByBjgD3-.mjs +2 -0
- package/dist/chunks/Commands-ByBjgD3-.mjs.map +1 -0
- package/dist/chunks/Decoration-D-yB-H5v.mjs +2 -0
- package/dist/chunks/Decoration-D-yB-H5v.mjs.map +1 -0
- package/dist/chunks/Document-DnPKbcPE.mjs +2 -0
- package/dist/chunks/Document-DnPKbcPE.mjs.map +1 -0
- package/dist/chunks/DocumentParser-KuBaEZN6.mjs +2 -0
- package/dist/chunks/DocumentParser-KuBaEZN6.mjs.map +1 -0
- package/dist/chunks/DocumentSerializer-DgdiJsES.mjs +2 -0
- package/dist/chunks/DocumentSerializer-DgdiJsES.mjs.map +1 -0
- package/dist/chunks/DomUtils-BkyCg-OO.mjs +2 -0
- package/dist/chunks/DomUtils-BkyCg-OO.mjs.map +1 -0
- package/dist/chunks/FontPlugin-DYntd3gN.mjs +2 -0
- package/dist/chunks/FontPlugin-DYntd3gN.mjs.map +1 -0
- package/dist/chunks/FontSizePlugin-CGlH-S6g.mjs +2 -0
- package/dist/chunks/FontSizePlugin-CGlH-S6g.mjs.map +1 -0
- package/dist/chunks/GapCursorNavigation-uytzcZ6C.mjs +2 -0
- package/dist/chunks/GapCursorNavigation-uytzcZ6C.mjs.map +1 -0
- package/dist/chunks/GapCursorPlugin-BQ2_-7i6.mjs +2 -0
- package/dist/chunks/GapCursorPlugin-BQ2_-7i6.mjs.map +1 -0
- package/dist/chunks/HTMLUtils-BLwp5G4f.mjs +2 -0
- package/dist/chunks/HTMLUtils-BLwp5G4f.mjs.map +1 -0
- package/dist/chunks/HardBreakPlugin-CCrP_Kec.mjs +2 -0
- package/dist/chunks/HardBreakPlugin-CCrP_Kec.mjs.map +1 -0
- package/dist/chunks/HeadingPlugin-BiDNuBmw.mjs +2 -0
- package/dist/chunks/HeadingPlugin-BiDNuBmw.mjs.map +1 -0
- package/dist/chunks/HighlightPlugin-CwrtRVfS.mjs +2 -0
- package/dist/chunks/HighlightPlugin-CwrtRVfS.mjs.map +1 -0
- package/dist/chunks/HorizontalRulePlugin-CKIkbVwn.mjs +2 -0
- package/dist/chunks/HorizontalRulePlugin-CKIkbVwn.mjs.map +1 -0
- package/dist/chunks/ImagePlugin-BqRAKlG1.mjs +2 -0
- package/dist/chunks/ImagePlugin-BqRAKlG1.mjs.map +1 -0
- package/dist/chunks/KeyboardNav-IMWHB6wc.mjs +2 -0
- package/dist/chunks/KeyboardNav-IMWHB6wc.mjs.map +1 -0
- package/dist/chunks/LinkPlugin-Cb2cpFe8.mjs +2 -0
- package/dist/chunks/LinkPlugin-Cb2cpFe8.mjs.map +1 -0
- package/dist/chunks/ListPlugin-CZgkinoS.mjs +2 -0
- package/dist/chunks/ListPlugin-CZgkinoS.mjs.map +1 -0
- package/dist/chunks/NavigationQueries-CgYPG6oY.mjs +2 -0
- package/dist/chunks/NavigationQueries-CgYPG6oY.mjs.map +1 -0
- package/dist/chunks/NodeResolver-BkOsZnuU.mjs +2 -0
- package/dist/chunks/NodeResolver-BkOsZnuU.mjs.map +1 -0
- package/dist/chunks/NodeSelectionCommands-U8xEdaE4.mjs +2 -0
- package/dist/chunks/NodeSelectionCommands-U8xEdaE4.mjs.map +1 -0
- package/dist/chunks/Platform-wPvKFB9m.mjs +2 -0
- package/dist/chunks/Platform-wPvKFB9m.mjs.map +1 -0
- package/dist/chunks/Plugin-C4cBw3bs.mjs +2 -0
- package/dist/chunks/Plugin-C4cBw3bs.mjs.map +1 -0
- package/dist/chunks/PluginHelpers-BZU5rE44.mjs +2 -0
- package/dist/chunks/PluginHelpers-BZU5rE44.mjs.map +1 -0
- package/dist/chunks/PopupManager-S2qQtTxR.mjs +2 -0
- package/dist/chunks/PopupManager-S2qQtTxR.mjs.map +1 -0
- package/dist/chunks/PopupPositioning-BdSCai19.mjs +2 -0
- package/dist/chunks/PopupPositioning-BdSCai19.mjs.map +1 -0
- package/dist/chunks/PrintPlugin-80SINLGF.mjs +2 -0
- package/dist/chunks/PrintPlugin-80SINLGF.mjs.map +1 -0
- package/dist/chunks/PrintTypes-CWIAfEaX.mjs +2 -0
- package/dist/chunks/PrintTypes-CWIAfEaX.mjs.map +1 -0
- package/dist/chunks/RangeIterator-DEuX1xKV.mjs +2 -0
- package/dist/chunks/RangeIterator-DEuX1xKV.mjs.map +1 -0
- package/dist/chunks/Selection-B14e7gd0.mjs +2 -0
- package/dist/chunks/Selection-B14e7gd0.mjs.map +1 -0
- package/dist/chunks/ShortcutFormatting-c0IajwWG.mjs +2 -0
- package/dist/chunks/ShortcutFormatting-c0IajwWG.mjs.map +1 -0
- package/dist/chunks/SmartPastePlugin-BvYBbHSA.mjs +2 -0
- package/dist/chunks/SmartPastePlugin-BvYBbHSA.mjs.map +1 -0
- package/dist/chunks/StrikethroughPlugin-XBOGv5Oi.mjs +2 -0
- package/dist/chunks/StrikethroughPlugin-XBOGv5Oi.mjs.map +1 -0
- package/dist/chunks/StyleRuntime-Bwde5icB.mjs +2 -0
- package/dist/chunks/StyleRuntime-Bwde5icB.mjs.map +1 -0
- package/dist/chunks/SuperSubPlugin-CVjU4W9y.mjs +2 -0
- package/dist/chunks/SuperSubPlugin-CVjU4W9y.mjs.map +1 -0
- package/dist/chunks/SyntaxTokenTypes-CY2-rJCA.mjs +2 -0
- package/dist/chunks/SyntaxTokenTypes-CY2-rJCA.mjs.map +1 -0
- package/dist/chunks/TablePlugin-BHpp6h9H.mjs +2 -0
- package/dist/chunks/TablePlugin-BHpp6h9H.mjs.map +1 -0
- package/dist/chunks/TextColorPlugin-CGbyMGTr.mjs +2 -0
- package/dist/chunks/TextColorPlugin-CGbyMGTr.mjs.map +1 -0
- package/dist/chunks/TextDirectionCorePlugin-DPU7wy6g.mjs +2 -0
- package/dist/chunks/TextDirectionCorePlugin-DPU7wy6g.mjs.map +1 -0
- package/dist/chunks/TextDirectionLocale-DxOfFixh.mjs +2 -0
- package/dist/chunks/TextDirectionLocale-DxOfFixh.mjs.map +1 -0
- package/dist/chunks/TextFormattingPlugin-CYVnhHH4.mjs +2 -0
- package/dist/chunks/TextFormattingPlugin-CYVnhHH4.mjs.map +1 -0
- package/dist/chunks/ToolbarPlugin-CWDkWXE8.mjs +2 -0
- package/dist/chunks/ToolbarPlugin-CWDkWXE8.mjs.map +1 -0
- package/dist/chunks/TypeBrands-BQR8dEYU.mjs +2 -0
- package/dist/chunks/TypeBrands-BQR8dEYU.mjs.map +1 -0
- package/dist/chunks/WordBoundary-BkxXn2JA.mjs +2 -0
- package/dist/chunks/WordBoundary-BkxXn2JA.mjs.map +1 -0
- package/dist/chunks/XmlDetector-BiWxa0RJ.mjs +2 -0
- package/dist/chunks/XmlDetector-BiWxa0RJ.mjs.map +1 -0
- package/dist/chunks/XmlPatterns-B-V-mHF4.mjs +2 -0
- package/dist/chunks/XmlPatterns-B-V-mHF4.mjs.map +1 -0
- package/dist/chunks/XmlSupport-Czr8xQB1.mjs +2 -0
- package/dist/chunks/XmlSupport-Czr8xQB1.mjs.map +1 -0
- package/dist/chunks/ar-BARk0vUs.mjs +2 -0
- package/dist/chunks/ar-BARk0vUs.mjs.map +1 -0
- package/dist/chunks/ar-BVnwjtBO.mjs +2 -0
- package/dist/chunks/ar-BVnwjtBO.mjs.map +1 -0
- package/dist/chunks/ar-BaLVMaVO.mjs +2 -0
- package/dist/chunks/ar-BaLVMaVO.mjs.map +1 -0
- package/dist/chunks/ar-BbXyJVxi.mjs +2 -0
- package/dist/chunks/ar-BbXyJVxi.mjs.map +1 -0
- package/dist/chunks/ar-Bj_U3O6Y.mjs +2 -0
- package/dist/chunks/ar-Bj_U3O6Y.mjs.map +1 -0
- package/dist/chunks/ar-CLEiZlfu.mjs +2 -0
- package/dist/chunks/ar-CLEiZlfu.mjs.map +1 -0
- package/dist/chunks/ar-CaE825oi.mjs +2 -0
- package/dist/chunks/ar-CaE825oi.mjs.map +1 -0
- package/dist/chunks/ar-CaRHAfkM.mjs +2 -0
- package/dist/chunks/ar-CaRHAfkM.mjs.map +1 -0
- package/dist/chunks/ar-Cg1wGAxo.mjs +2 -0
- package/dist/chunks/ar-Cg1wGAxo.mjs.map +1 -0
- package/dist/chunks/ar-Cp9qv7la.mjs +2 -0
- package/dist/chunks/ar-Cp9qv7la.mjs.map +1 -0
- package/dist/chunks/ar-CpZXocgF.mjs +2 -0
- package/dist/chunks/ar-CpZXocgF.mjs.map +1 -0
- package/dist/chunks/ar-CqD9pUY0.mjs +2 -0
- package/dist/chunks/ar-CqD9pUY0.mjs.map +1 -0
- package/dist/chunks/ar-D1DiKwV_.mjs +2 -0
- package/dist/chunks/ar-D1DiKwV_.mjs.map +1 -0
- package/dist/chunks/ar-D714r_62.mjs +2 -0
- package/dist/chunks/ar-D714r_62.mjs.map +1 -0
- package/dist/chunks/ar-D8hT58sd.mjs +2 -0
- package/dist/chunks/ar-D8hT58sd.mjs.map +1 -0
- package/dist/chunks/ar-DYA1zADy.mjs +2 -0
- package/dist/chunks/ar-DYA1zADy.mjs.map +1 -0
- package/dist/chunks/ar-Dc2VufjD.mjs +2 -0
- package/dist/chunks/ar-Dc2VufjD.mjs.map +1 -0
- package/dist/chunks/ar-DsmIDxDt.mjs +2 -0
- package/dist/chunks/ar-DsmIDxDt.mjs.map +1 -0
- package/dist/chunks/ar-M3QzJIS8.mjs +2 -0
- package/dist/chunks/ar-M3QzJIS8.mjs.map +1 -0
- package/dist/chunks/ar-UKi-TYFz.mjs +2 -0
- package/dist/chunks/ar-UKi-TYFz.mjs.map +1 -0
- package/dist/chunks/ar-UfrdJzT6.mjs +2 -0
- package/dist/chunks/ar-UfrdJzT6.mjs.map +1 -0
- package/dist/chunks/ar-fGsuiCw5.mjs +2 -0
- package/dist/chunks/ar-fGsuiCw5.mjs.map +1 -0
- package/dist/chunks/ar-fSElw9mJ.mjs +2 -0
- package/dist/chunks/ar-fSElw9mJ.mjs.map +1 -0
- package/dist/chunks/color-picker-iPmE48jm.mjs +2 -0
- package/dist/chunks/color-picker-iPmE48jm.mjs.map +1 -0
- package/dist/chunks/de-B4BcTYnc.mjs +2 -0
- package/dist/chunks/de-B4BcTYnc.mjs.map +1 -0
- package/dist/chunks/de-B7H06L3l.mjs +2 -0
- package/dist/chunks/de-B7H06L3l.mjs.map +1 -0
- package/dist/chunks/de-BWk2-9In.mjs +2 -0
- package/dist/chunks/de-BWk2-9In.mjs.map +1 -0
- package/dist/chunks/de-ByDTr_of.mjs +2 -0
- package/dist/chunks/de-ByDTr_of.mjs.map +1 -0
- package/dist/chunks/de-C5If_e7l.mjs +2 -0
- package/dist/chunks/de-C5If_e7l.mjs.map +1 -0
- package/dist/chunks/de-CAmM7IT5.mjs +2 -0
- package/dist/chunks/de-CAmM7IT5.mjs.map +1 -0
- package/dist/chunks/de-CF7zshOE.mjs +2 -0
- package/dist/chunks/de-CF7zshOE.mjs.map +1 -0
- package/dist/chunks/de-CXAESa_f.mjs +2 -0
- package/dist/chunks/de-CXAESa_f.mjs.map +1 -0
- package/dist/chunks/de-ChvJQZeC.mjs +2 -0
- package/dist/chunks/de-ChvJQZeC.mjs.map +1 -0
- package/dist/chunks/de-ClJaNWJr.mjs +2 -0
- package/dist/chunks/de-ClJaNWJr.mjs.map +1 -0
- package/dist/chunks/de-CpNFM0EP.mjs +2 -0
- package/dist/chunks/de-CpNFM0EP.mjs.map +1 -0
- package/dist/chunks/de-CwSQIBLx.mjs +2 -0
- package/dist/chunks/de-CwSQIBLx.mjs.map +1 -0
- package/dist/chunks/de-D3lxYgJa.mjs +2 -0
- package/dist/chunks/de-D3lxYgJa.mjs.map +1 -0
- package/dist/chunks/de-D8gRtvU4.mjs +2 -0
- package/dist/chunks/de-D8gRtvU4.mjs.map +1 -0
- package/dist/chunks/de-D_9IOrAk.mjs +2 -0
- package/dist/chunks/de-D_9IOrAk.mjs.map +1 -0
- package/dist/chunks/de-DcwZkO0v.mjs +2 -0
- package/dist/chunks/de-DcwZkO0v.mjs.map +1 -0
- package/dist/chunks/de-DeSVCxbd.mjs +2 -0
- package/dist/chunks/de-DeSVCxbd.mjs.map +1 -0
- package/dist/chunks/de-DqxnR2Y8.mjs +2 -0
- package/dist/chunks/de-DqxnR2Y8.mjs.map +1 -0
- package/dist/chunks/de-J82qPFkV.mjs +2 -0
- package/dist/chunks/de-J82qPFkV.mjs.map +1 -0
- package/dist/chunks/de-QDbUiCAO.mjs +2 -0
- package/dist/chunks/de-QDbUiCAO.mjs.map +1 -0
- package/dist/chunks/de-eAQXJdL9.mjs +2 -0
- package/dist/chunks/de-eAQXJdL9.mjs.map +1 -0
- package/dist/chunks/de-hneXQd4z.mjs +2 -0
- package/dist/chunks/de-hneXQd4z.mjs.map +1 -0
- package/dist/chunks/de-wXAi5Jyt.mjs +2 -0
- package/dist/chunks/de-wXAi5Jyt.mjs.map +1 -0
- package/dist/chunks/es-5c_5O95N.mjs +2 -0
- package/dist/chunks/es-5c_5O95N.mjs.map +1 -0
- package/dist/chunks/es-B2QB6DHA.mjs +2 -0
- package/dist/chunks/es-B2QB6DHA.mjs.map +1 -0
- package/dist/chunks/es-BEcu8DtV.mjs +2 -0
- package/dist/chunks/es-BEcu8DtV.mjs.map +1 -0
- package/dist/chunks/es-BXTkzYVW.mjs +2 -0
- package/dist/chunks/es-BXTkzYVW.mjs.map +1 -0
- package/dist/chunks/es-BemQV8dI.mjs +2 -0
- package/dist/chunks/es-BemQV8dI.mjs.map +1 -0
- package/dist/chunks/es-BfJM5zJ5.mjs +2 -0
- package/dist/chunks/es-BfJM5zJ5.mjs.map +1 -0
- package/dist/chunks/es-CnqxzYfU.mjs +2 -0
- package/dist/chunks/es-CnqxzYfU.mjs.map +1 -0
- package/dist/chunks/es-CrZtAd3-.mjs +2 -0
- package/dist/chunks/es-CrZtAd3-.mjs.map +1 -0
- package/dist/chunks/es-CsCCy0S5.mjs +2 -0
- package/dist/chunks/es-CsCCy0S5.mjs.map +1 -0
- package/dist/chunks/es-D62AfyHC.mjs +2 -0
- package/dist/chunks/es-D62AfyHC.mjs.map +1 -0
- package/dist/chunks/es-DA_zUbSs.mjs +2 -0
- package/dist/chunks/es-DA_zUbSs.mjs.map +1 -0
- package/dist/chunks/es-DFCDhXJb.mjs +2 -0
- package/dist/chunks/es-DFCDhXJb.mjs.map +1 -0
- package/dist/chunks/es-DHMIpSfB.mjs +2 -0
- package/dist/chunks/es-DHMIpSfB.mjs.map +1 -0
- package/dist/chunks/es-DIH9KVn1.mjs +2 -0
- package/dist/chunks/es-DIH9KVn1.mjs.map +1 -0
- package/dist/chunks/es-DOHIPZYT.mjs +2 -0
- package/dist/chunks/es-DOHIPZYT.mjs.map +1 -0
- package/dist/chunks/es-DPyejgTk.mjs +2 -0
- package/dist/chunks/es-DPyejgTk.mjs.map +1 -0
- package/dist/chunks/es-DUVk_Wkc.mjs +2 -0
- package/dist/chunks/es-DUVk_Wkc.mjs.map +1 -0
- package/dist/chunks/es-Di4t0cUf.mjs +2 -0
- package/dist/chunks/es-Di4t0cUf.mjs.map +1 -0
- package/dist/chunks/es-DjwvgN1j.mjs +2 -0
- package/dist/chunks/es-DjwvgN1j.mjs.map +1 -0
- package/dist/chunks/es-Nawgghri.mjs +2 -0
- package/dist/chunks/es-Nawgghri.mjs.map +1 -0
- package/dist/chunks/es-SuOzBFT7.mjs +2 -0
- package/dist/chunks/es-SuOzBFT7.mjs.map +1 -0
- package/dist/chunks/es-gB6GcNGB.mjs +2 -0
- package/dist/chunks/es-gB6GcNGB.mjs.map +1 -0
- package/dist/chunks/es-xSr9miNk.mjs +2 -0
- package/dist/chunks/es-xSr9miNk.mjs.map +1 -0
- package/dist/chunks/fonts-CG_dDwvT.mjs +2 -0
- package/dist/chunks/fonts-CG_dDwvT.mjs.map +1 -0
- package/dist/chunks/fr-B35gBW5Z.mjs +2 -0
- package/dist/chunks/fr-B35gBW5Z.mjs.map +1 -0
- package/dist/chunks/fr-BFngqWSa.mjs +2 -0
- package/dist/chunks/fr-BFngqWSa.mjs.map +1 -0
- package/dist/chunks/fr-BZRak2_s.mjs +2 -0
- package/dist/chunks/fr-BZRak2_s.mjs.map +1 -0
- package/dist/chunks/fr-Bj_GziCv.mjs +2 -0
- package/dist/chunks/fr-Bj_GziCv.mjs.map +1 -0
- package/dist/chunks/fr-BushvDBo.mjs +2 -0
- package/dist/chunks/fr-BushvDBo.mjs.map +1 -0
- package/dist/chunks/fr-Bz2JMdw5.mjs +2 -0
- package/dist/chunks/fr-Bz2JMdw5.mjs.map +1 -0
- package/dist/chunks/fr-C2y-quYa.mjs +2 -0
- package/dist/chunks/fr-C2y-quYa.mjs.map +1 -0
- package/dist/chunks/fr-C5g40qHr.mjs +2 -0
- package/dist/chunks/fr-C5g40qHr.mjs.map +1 -0
- package/dist/chunks/fr-CRPVlCtC.mjs +2 -0
- package/dist/chunks/fr-CRPVlCtC.mjs.map +1 -0
- package/dist/chunks/fr-Cf0xNw5j.mjs +2 -0
- package/dist/chunks/fr-Cf0xNw5j.mjs.map +1 -0
- package/dist/chunks/fr-Cr62KfH7.mjs +2 -0
- package/dist/chunks/fr-Cr62KfH7.mjs.map +1 -0
- package/dist/chunks/fr-D6XZTFJa.mjs +2 -0
- package/dist/chunks/fr-D6XZTFJa.mjs.map +1 -0
- package/dist/chunks/fr-D9u2mcht.mjs +2 -0
- package/dist/chunks/fr-D9u2mcht.mjs.map +1 -0
- package/dist/chunks/fr-DEWFKFrW.mjs +2 -0
- package/dist/chunks/fr-DEWFKFrW.mjs.map +1 -0
- package/dist/chunks/fr-DGBuhK3D.mjs +2 -0
- package/dist/chunks/fr-DGBuhK3D.mjs.map +1 -0
- package/dist/chunks/fr-DQBLPLlz.mjs +2 -0
- package/dist/chunks/fr-DQBLPLlz.mjs.map +1 -0
- package/dist/chunks/fr-DQM130Rf.mjs +2 -0
- package/dist/chunks/fr-DQM130Rf.mjs.map +1 -0
- package/dist/chunks/fr-Dg5SMkMo.mjs +2 -0
- package/dist/chunks/fr-Dg5SMkMo.mjs.map +1 -0
- package/dist/chunks/fr-Dv0GIx7Q.mjs +2 -0
- package/dist/chunks/fr-Dv0GIx7Q.mjs.map +1 -0
- package/dist/chunks/fr-DyGGhKFe.mjs +2 -0
- package/dist/chunks/fr-DyGGhKFe.mjs.map +1 -0
- package/dist/chunks/fr-DzQfRP8y.mjs +2 -0
- package/dist/chunks/fr-DzQfRP8y.mjs.map +1 -0
- package/dist/chunks/fr-SxdLDSEQ.mjs +2 -0
- package/dist/chunks/fr-SxdLDSEQ.mjs.map +1 -0
- package/dist/chunks/fr-VGC8qZxr.mjs +2 -0
- package/dist/chunks/fr-VGC8qZxr.mjs.map +1 -0
- package/dist/chunks/full-B-bw4M7L.mjs +2 -0
- package/dist/chunks/full-B-bw4M7L.mjs.map +1 -0
- package/dist/chunks/hi-8AQg9KKV.mjs +2 -0
- package/dist/chunks/hi-8AQg9KKV.mjs.map +1 -0
- package/dist/chunks/hi-B0EvMNl3.mjs +2 -0
- package/dist/chunks/hi-B0EvMNl3.mjs.map +1 -0
- package/dist/chunks/hi-B5sPMUNb.mjs +2 -0
- package/dist/chunks/hi-B5sPMUNb.mjs.map +1 -0
- package/dist/chunks/hi-BOfcnulc.mjs +2 -0
- package/dist/chunks/hi-BOfcnulc.mjs.map +1 -0
- package/dist/chunks/hi-BUveHWCk.mjs +2 -0
- package/dist/chunks/hi-BUveHWCk.mjs.map +1 -0
- package/dist/chunks/hi-BZ_n8-zx.mjs +2 -0
- package/dist/chunks/hi-BZ_n8-zx.mjs.map +1 -0
- package/dist/chunks/hi-BeLhPZ5d.mjs +2 -0
- package/dist/chunks/hi-BeLhPZ5d.mjs.map +1 -0
- package/dist/chunks/hi-Bg8jWcjX.mjs +2 -0
- package/dist/chunks/hi-Bg8jWcjX.mjs.map +1 -0
- package/dist/chunks/hi-BktVy4Yc.mjs +2 -0
- package/dist/chunks/hi-BktVy4Yc.mjs.map +1 -0
- package/dist/chunks/hi-Btg6DNgW.mjs +2 -0
- package/dist/chunks/hi-Btg6DNgW.mjs.map +1 -0
- package/dist/chunks/hi-C20PmckT.mjs +2 -0
- package/dist/chunks/hi-C20PmckT.mjs.map +1 -0
- package/dist/chunks/hi-C2DDsttW.mjs +2 -0
- package/dist/chunks/hi-C2DDsttW.mjs.map +1 -0
- package/dist/chunks/hi-CCDCfQV0.mjs +2 -0
- package/dist/chunks/hi-CCDCfQV0.mjs.map +1 -0
- package/dist/chunks/hi-CWX5sDy1.mjs +2 -0
- package/dist/chunks/hi-CWX5sDy1.mjs.map +1 -0
- package/dist/chunks/hi-ClSwgZfK.mjs +2 -0
- package/dist/chunks/hi-ClSwgZfK.mjs.map +1 -0
- package/dist/chunks/hi-D-apR3ri.mjs +2 -0
- package/dist/chunks/hi-D-apR3ri.mjs.map +1 -0
- package/dist/chunks/hi-D6ZQ_R6m.mjs +2 -0
- package/dist/chunks/hi-D6ZQ_R6m.mjs.map +1 -0
- package/dist/chunks/hi-D_rhcSL3.mjs +2 -0
- package/dist/chunks/hi-D_rhcSL3.mjs.map +1 -0
- package/dist/chunks/hi-DcA0CxZR.mjs +2 -0
- package/dist/chunks/hi-DcA0CxZR.mjs.map +1 -0
- package/dist/chunks/hi-Dd2GOD9r.mjs +2 -0
- package/dist/chunks/hi-Dd2GOD9r.mjs.map +1 -0
- package/dist/chunks/hi-DkEmvBok.mjs +2 -0
- package/dist/chunks/hi-DkEmvBok.mjs.map +1 -0
- package/dist/chunks/hi-nfmm9uwI.mjs +2 -0
- package/dist/chunks/hi-nfmm9uwI.mjs.map +1 -0
- package/dist/chunks/hi-wBX612X_.mjs +2 -0
- package/dist/chunks/hi-wBX612X_.mjs.map +1 -0
- package/dist/chunks/minimal-CMt909kl.mjs +2 -0
- package/dist/chunks/minimal-CMt909kl.mjs.map +1 -0
- package/dist/chunks/pt-BGQ7Sh6p.mjs +2 -0
- package/dist/chunks/pt-BGQ7Sh6p.mjs.map +1 -0
- package/dist/chunks/pt-BGQj9xok.mjs +2 -0
- package/dist/chunks/pt-BGQj9xok.mjs.map +1 -0
- package/dist/chunks/pt-BL5xNIhC.mjs +2 -0
- package/dist/chunks/pt-BL5xNIhC.mjs.map +1 -0
- package/dist/chunks/pt-BM8sUzpI.mjs +2 -0
- package/dist/chunks/pt-BM8sUzpI.mjs.map +1 -0
- package/dist/chunks/pt-BVLuZULN.mjs +2 -0
- package/dist/chunks/pt-BVLuZULN.mjs.map +1 -0
- package/dist/chunks/pt-BlGlrx3M.mjs +2 -0
- package/dist/chunks/pt-BlGlrx3M.mjs.map +1 -0
- package/dist/chunks/pt-CKaXK1FK.mjs +2 -0
- package/dist/chunks/pt-CKaXK1FK.mjs.map +1 -0
- package/dist/chunks/pt-CMpzmrVu.mjs +2 -0
- package/dist/chunks/pt-CMpzmrVu.mjs.map +1 -0
- package/dist/chunks/pt-Cw77qSTP.mjs +2 -0
- package/dist/chunks/pt-Cw77qSTP.mjs.map +1 -0
- package/dist/chunks/pt-DBNe2BiX.mjs +2 -0
- package/dist/chunks/pt-DBNe2BiX.mjs.map +1 -0
- package/dist/chunks/pt-DCfJFt-v.mjs +2 -0
- package/dist/chunks/pt-DCfJFt-v.mjs.map +1 -0
- package/dist/chunks/pt-DEs0I6eo.mjs +2 -0
- package/dist/chunks/pt-DEs0I6eo.mjs.map +1 -0
- package/dist/chunks/pt-DKONqS4g.mjs +2 -0
- package/dist/chunks/pt-DKONqS4g.mjs.map +1 -0
- package/dist/chunks/pt-DO4FbPvV.mjs +2 -0
- package/dist/chunks/pt-DO4FbPvV.mjs.map +1 -0
- package/dist/chunks/pt-DbDOQjV-.mjs +2 -0
- package/dist/chunks/pt-DbDOQjV-.mjs.map +1 -0
- package/dist/chunks/pt-DiYv0Ubf.mjs +2 -0
- package/dist/chunks/pt-DiYv0Ubf.mjs.map +1 -0
- package/dist/chunks/pt-Dk4Mr4yC.mjs +2 -0
- package/dist/chunks/pt-Dk4Mr4yC.mjs.map +1 -0
- package/dist/chunks/pt-DpLB51hL.mjs +2 -0
- package/dist/chunks/pt-DpLB51hL.mjs.map +1 -0
- package/dist/chunks/pt-Q5jXPjWo.mjs +2 -0
- package/dist/chunks/pt-Q5jXPjWo.mjs.map +1 -0
- package/dist/chunks/pt-kFy3gqNp.mjs +2 -0
- package/dist/chunks/pt-kFy3gqNp.mjs.map +1 -0
- package/dist/chunks/pt-ncNSxrVp.mjs +2 -0
- package/dist/chunks/pt-ncNSxrVp.mjs.map +1 -0
- package/dist/chunks/pt-tUVNk-7W.mjs +2 -0
- package/dist/chunks/pt-tUVNk-7W.mjs.map +1 -0
- package/dist/chunks/pt-zzij5vS0.mjs +2 -0
- package/dist/chunks/pt-zzij5vS0.mjs.map +1 -0
- package/dist/chunks/rolldown-runtime-B8Ku5yk6.mjs +1 -0
- package/dist/chunks/ru-B-XR4L6x.mjs +2 -0
- package/dist/chunks/ru-B-XR4L6x.mjs.map +1 -0
- package/dist/chunks/ru-B00ZXSqu.mjs +2 -0
- package/dist/chunks/ru-B00ZXSqu.mjs.map +1 -0
- package/dist/chunks/ru-B5wvkAtV.mjs +2 -0
- package/dist/chunks/ru-B5wvkAtV.mjs.map +1 -0
- package/dist/chunks/ru-BA5-gdMK.mjs +2 -0
- package/dist/chunks/ru-BA5-gdMK.mjs.map +1 -0
- package/dist/chunks/ru-BNTSKpWh.mjs +2 -0
- package/dist/chunks/ru-BNTSKpWh.mjs.map +1 -0
- package/dist/chunks/ru-BRy-L-TF.mjs +2 -0
- package/dist/chunks/ru-BRy-L-TF.mjs.map +1 -0
- package/dist/chunks/ru-BZrPeSDg.mjs +2 -0
- package/dist/chunks/ru-BZrPeSDg.mjs.map +1 -0
- package/dist/chunks/ru-B_8ujIHK.mjs +2 -0
- package/dist/chunks/ru-B_8ujIHK.mjs.map +1 -0
- package/dist/chunks/ru-BbgvH6r3.mjs +2 -0
- package/dist/chunks/ru-BbgvH6r3.mjs.map +1 -0
- package/dist/chunks/ru-CDm5R5CV.mjs +2 -0
- package/dist/chunks/ru-CDm5R5CV.mjs.map +1 -0
- package/dist/chunks/ru-CWLFWYwd.mjs +2 -0
- package/dist/chunks/ru-CWLFWYwd.mjs.map +1 -0
- package/dist/chunks/ru-CqsCwBQ_.mjs +2 -0
- package/dist/chunks/ru-CqsCwBQ_.mjs.map +1 -0
- package/dist/chunks/ru-CsFv_mi4.mjs +2 -0
- package/dist/chunks/ru-CsFv_mi4.mjs.map +1 -0
- package/dist/chunks/ru-Cv9Zbbn2.mjs +2 -0
- package/dist/chunks/ru-Cv9Zbbn2.mjs.map +1 -0
- package/dist/chunks/ru-CyTNK9dE.mjs +2 -0
- package/dist/chunks/ru-CyTNK9dE.mjs.map +1 -0
- package/dist/chunks/ru-DEkLlarB.mjs +2 -0
- package/dist/chunks/ru-DEkLlarB.mjs.map +1 -0
- package/dist/chunks/ru-DZge62_-.mjs +2 -0
- package/dist/chunks/ru-DZge62_-.mjs.map +1 -0
- package/dist/chunks/ru-DiVRD-Ds.mjs +2 -0
- package/dist/chunks/ru-DiVRD-Ds.mjs.map +1 -0
- package/dist/chunks/ru-DkP8YLYT.mjs +2 -0
- package/dist/chunks/ru-DkP8YLYT.mjs.map +1 -0
- package/dist/chunks/ru-OKZRZ5c-.mjs +2 -0
- package/dist/chunks/ru-OKZRZ5c-.mjs.map +1 -0
- package/dist/chunks/ru-aYY1QVJS.mjs +2 -0
- package/dist/chunks/ru-aYY1QVJS.mjs.map +1 -0
- package/dist/chunks/ru-ejPBB15H.mjs +2 -0
- package/dist/chunks/ru-ejPBB15H.mjs.map +1 -0
- package/dist/chunks/ru-tp62bXSj.mjs +2 -0
- package/dist/chunks/ru-tp62bXSj.mjs.map +1 -0
- package/dist/chunks/shared-DJ08jwra.mjs +2 -0
- package/dist/chunks/shared-DJ08jwra.mjs.map +1 -0
- package/dist/chunks/src-dxsvbiql.mjs +2 -0
- package/dist/chunks/src-dxsvbiql.mjs.map +1 -0
- package/dist/chunks/text-direction-advanced-B71gUwvk.mjs +2 -0
- package/dist/chunks/text-direction-advanced-B71gUwvk.mjs.map +1 -0
- package/dist/chunks/zh-2gEqF3OX.mjs +2 -0
- package/dist/chunks/zh-2gEqF3OX.mjs.map +1 -0
- package/dist/chunks/zh-B5J1sSsk.mjs +2 -0
- package/dist/chunks/zh-B5J1sSsk.mjs.map +1 -0
- package/dist/chunks/zh-B5LmYVQ2.mjs +2 -0
- package/dist/chunks/zh-B5LmYVQ2.mjs.map +1 -0
- package/dist/chunks/zh-BBOheLpv.mjs +2 -0
- package/dist/chunks/zh-BBOheLpv.mjs.map +1 -0
- package/dist/chunks/zh-BOy5F5Jq.mjs +2 -0
- package/dist/chunks/zh-BOy5F5Jq.mjs.map +1 -0
- package/dist/chunks/zh-BRlo0ayI.mjs +2 -0
- package/dist/chunks/zh-BRlo0ayI.mjs.map +1 -0
- package/dist/chunks/zh-BgTAzt6l.mjs +2 -0
- package/dist/chunks/zh-BgTAzt6l.mjs.map +1 -0
- package/dist/chunks/zh-BjY4TNQf.mjs +2 -0
- package/dist/chunks/zh-BjY4TNQf.mjs.map +1 -0
- package/dist/chunks/zh-BtD9NFJS.mjs +2 -0
- package/dist/chunks/zh-BtD9NFJS.mjs.map +1 -0
- package/dist/chunks/zh-BvSLqJFE.mjs +2 -0
- package/dist/chunks/zh-BvSLqJFE.mjs.map +1 -0
- package/dist/chunks/zh-C4rxe0Zk.mjs +2 -0
- package/dist/chunks/zh-C4rxe0Zk.mjs.map +1 -0
- package/dist/chunks/zh-CyX2tIRP.mjs +2 -0
- package/dist/chunks/zh-CyX2tIRP.mjs.map +1 -0
- package/dist/chunks/zh-D9QN2C7q.mjs +2 -0
- package/dist/chunks/zh-D9QN2C7q.mjs.map +1 -0
- package/dist/chunks/zh-DTnSCP1F.mjs +2 -0
- package/dist/chunks/zh-DTnSCP1F.mjs.map +1 -0
- package/dist/chunks/zh-DWlBkrGZ.mjs +2 -0
- package/dist/chunks/zh-DWlBkrGZ.mjs.map +1 -0
- package/dist/chunks/zh-DcY4Ouin.mjs +2 -0
- package/dist/chunks/zh-DcY4Ouin.mjs.map +1 -0
- package/dist/chunks/zh-DovMZIDF.mjs +2 -0
- package/dist/chunks/zh-DovMZIDF.mjs.map +1 -0
- package/dist/chunks/zh-DtzwqBHS.mjs +2 -0
- package/dist/chunks/zh-DtzwqBHS.mjs.map +1 -0
- package/dist/chunks/zh-DunJzfVR.mjs +2 -0
- package/dist/chunks/zh-DunJzfVR.mjs.map +1 -0
- package/dist/chunks/zh-Pd1HqYSs.mjs +2 -0
- package/dist/chunks/zh-Pd1HqYSs.mjs.map +1 -0
- package/dist/chunks/zh-Yvqfkdln.mjs +2 -0
- package/dist/chunks/zh-Yvqfkdln.mjs.map +1 -0
- package/dist/chunks/zh-Z9seusJc.mjs +2 -0
- package/dist/chunks/zh-Z9seusJc.mjs.map +1 -0
- package/dist/chunks/zh-fAa_AbWI.mjs +2 -0
- package/dist/chunks/zh-fAa_AbWI.mjs.map +1 -0
- package/dist/commands/CommandHelpers.d.ts +0 -2
- package/dist/commands/CommandHelpers.d.ts.map +1 -1
- package/dist/commands/Commands.d.ts +1 -1
- package/dist/commands/Commands.d.ts.map +1 -1
- package/dist/commands/GapCursorCommands.d.ts.map +1 -1
- package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
- package/dist/commands/RangeIterator.d.ts +6 -0
- package/dist/commands/RangeIterator.d.ts.map +1 -1
- package/dist/editor/EditorInitializer.d.ts.map +1 -1
- package/dist/editor/styles/code-block.d.ts +1 -1
- package/dist/editor/styles/code-block.d.ts.map +1 -1
- package/dist/editor/styles/color-picker.d.ts +1 -1
- package/dist/editor/styles/color-picker.d.ts.map +1 -1
- package/dist/editor/styles/font-size-select.d.ts +1 -1
- package/dist/editor/styles/font-size-select.d.ts.map +1 -1
- package/dist/editor/styles/image.d.ts +1 -1
- package/dist/editor/styles/image.d.ts.map +1 -1
- package/dist/editor/styles/table.d.ts +1 -1
- package/dist/editor/styles/table.d.ts.map +1 -1
- package/dist/editor/styles/toolbar.d.ts +1 -1
- package/dist/editor/styles/toolbar.d.ts.map +1 -1
- package/dist/editor/theme/SyntaxTokenTypes.d.ts +26 -0
- package/dist/editor/theme/SyntaxTokenTypes.d.ts.map +1 -0
- package/dist/editor/theme/ThemeEngine.d.ts.map +1 -1
- package/dist/editor/theme/ThemeTokens.d.ts +6 -16
- package/dist/editor/theme/ThemeTokens.d.ts.map +1 -1
- package/dist/fonts.mjs +1 -2
- package/dist/full.d.ts +1 -0
- package/dist/full.d.ts.map +1 -1
- package/dist/full.mjs +1 -2
- package/dist/html.mjs +1 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/model/Document.d.ts +2 -0
- package/dist/model/Document.d.ts.map +1 -1
- package/dist/model/KeymapRegistry.d.ts.map +1 -1
- package/dist/notectl-core.mjs +1 -2
- package/dist/notectl-core.umd.js +2 -2
- package/dist/notectl-core.umd.js.map +1 -1
- package/dist/plugins/alignment.mjs +1 -2
- package/dist/plugins/blockquote.mjs +1 -2
- package/dist/plugins/caret-navigation.mjs +1 -2
- package/dist/plugins/code-block/CodeBlockCommands.d.ts +5 -0
- package/dist/plugins/code-block/CodeBlockCommands.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockLocale.d.ts +2 -0
- package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts +4 -0
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockTypes.d.ts +2 -1
- package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
- package/dist/plugins/code-block/highlighter/TokenizerTypes.d.ts +2 -4
- package/dist/plugins/code-block/highlighter/TokenizerTypes.d.ts.map +1 -1
- package/dist/plugins/code-block/highlighter/languages/index.d.ts +1 -0
- package/dist/plugins/code-block/highlighter/languages/index.d.ts.map +1 -1
- package/dist/plugins/code-block/highlighter/languages/java.d.ts +3 -0
- package/dist/plugins/code-block/highlighter/languages/java.d.ts.map +1 -0
- package/dist/plugins/code-block/highlighter/languages/xml.d.ts.map +1 -1
- package/dist/plugins/code-block/index.d.ts +1 -0
- package/dist/plugins/code-block/index.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/ar.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/de.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/es.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/fr.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/hi.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/pt.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/ru.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/zh.d.ts.map +1 -1
- package/dist/plugins/code-block.mjs +1 -2
- package/dist/plugins/font-size.mjs +1 -2
- package/dist/plugins/font.mjs +1 -2
- package/dist/plugins/gap-cursor.mjs +1 -2
- package/dist/plugins/hard-break.mjs +1 -2
- package/dist/plugins/heading.mjs +1 -2
- package/dist/plugins/highlight.mjs +1 -2
- package/dist/plugins/horizontal-rule.mjs +1 -2
- package/dist/plugins/image.mjs +1 -2
- package/dist/plugins/language/LanguageRegistry.d.ts +15 -0
- package/dist/plugins/language/LanguageRegistry.d.ts.map +1 -0
- package/dist/plugins/language/LanguageTypes.d.ts +54 -0
- package/dist/plugins/language/LanguageTypes.d.ts.map +1 -0
- package/dist/plugins/language/bundles/JavaSupport.d.ts +3 -0
- package/dist/plugins/language/bundles/JavaSupport.d.ts.map +1 -0
- package/dist/plugins/language/bundles/JsonSupport.d.ts +3 -0
- package/dist/plugins/language/bundles/JsonSupport.d.ts.map +1 -0
- package/dist/plugins/language/bundles/XmlSupport.d.ts +3 -0
- package/dist/plugins/language/bundles/XmlSupport.d.ts.map +1 -0
- package/dist/plugins/language/bundles/index.d.ts +4 -0
- package/dist/plugins/language/bundles/index.d.ts.map +1 -0
- package/dist/plugins/language/index.d.ts +4 -0
- package/dist/plugins/language/index.d.ts.map +1 -0
- package/dist/plugins/language.mjs +1 -0
- package/dist/plugins/link.mjs +1 -2
- package/dist/plugins/list/ListAttrsFactory.d.ts +5 -0
- package/dist/plugins/list/ListAttrsFactory.d.ts.map +1 -0
- package/dist/plugins/list/ListCommands.d.ts +13 -0
- package/dist/plugins/list/ListCommands.d.ts.map +1 -0
- package/dist/plugins/list/ListDefinitions.d.ts +9 -0
- package/dist/plugins/list/ListDefinitions.d.ts.map +1 -0
- package/dist/plugins/list/ListInputRules.d.ts +5 -0
- package/dist/plugins/list/ListInputRules.d.ts.map +1 -0
- package/dist/plugins/list/ListKeyboardHandlers.d.ts +4 -0
- package/dist/plugins/list/ListKeyboardHandlers.d.ts.map +1 -0
- package/dist/plugins/list/ListPlugin.d.ts +0 -22
- package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
- package/dist/plugins/list/ListToolbarItems.d.ts +6 -0
- package/dist/plugins/list/ListToolbarItems.d.ts.map +1 -0
- package/dist/plugins/list.mjs +1 -2
- package/dist/plugins/print/PrintContentPreparer.d.ts.map +1 -1
- package/dist/plugins/print.mjs +1 -2
- package/dist/plugins/shared/PopupPositioning.d.ts +20 -0
- package/dist/plugins/shared/PopupPositioning.d.ts.map +1 -1
- package/dist/plugins/shared.mjs +1 -2
- package/dist/plugins/smart-paste/ContentSplitter.d.ts +14 -0
- package/dist/plugins/smart-paste/ContentSplitter.d.ts.map +1 -0
- package/dist/plugins/smart-paste/SmartPasteLocale.d.ts +1 -0
- package/dist/plugins/smart-paste/SmartPasteLocale.d.ts.map +1 -1
- package/dist/plugins/smart-paste/SmartPastePlugin.d.ts +6 -1
- package/dist/plugins/smart-paste/SmartPastePlugin.d.ts.map +1 -1
- package/dist/plugins/smart-paste/SmartPasteTypes.d.ts +5 -0
- package/dist/plugins/smart-paste/SmartPasteTypes.d.ts.map +1 -1
- package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts +7 -0
- package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts.map +1 -0
- package/dist/plugins/smart-paste/index.d.ts +2 -1
- package/dist/plugins/smart-paste/index.d.ts.map +1 -1
- package/dist/plugins/smart-paste/locales/ar.d.ts.map +1 -1
- package/dist/plugins/smart-paste/locales/de.d.ts.map +1 -1
- package/dist/plugins/smart-paste/locales/es.d.ts.map +1 -1
- package/dist/plugins/smart-paste/locales/fr.d.ts.map +1 -1
- package/dist/plugins/smart-paste/locales/hi.d.ts.map +1 -1
- package/dist/plugins/smart-paste/locales/pt.d.ts.map +1 -1
- package/dist/plugins/smart-paste/locales/ru.d.ts.map +1 -1
- package/dist/plugins/smart-paste/locales/zh.d.ts.map +1 -1
- package/dist/plugins/smart-paste.mjs +1 -2
- package/dist/plugins/strikethrough.mjs +1 -2
- package/dist/plugins/super-sub.mjs +1 -2
- package/dist/plugins/table/TableCommands.d.ts.map +1 -1
- package/dist/plugins/table/TableContextMenu.d.ts.map +1 -1
- package/dist/plugins/table.mjs +1 -2
- package/dist/plugins/text-color.mjs +1 -2
- package/dist/plugins/text-direction-advanced.mjs +1 -2
- package/dist/plugins/text-direction.mjs +1 -2
- package/dist/plugins/text-formatting.mjs +1 -2
- package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -1
- package/dist/plugins/toolbar/ToolbarTooltip.d.ts.map +1 -1
- package/dist/plugins/toolbar.mjs +1 -2
- package/dist/presets/full.mjs +1 -2
- package/dist/presets/minimal.mjs +1 -2
- package/dist/presets.mjs +1 -2
- package/dist/view/CaretNavigation.d.ts +9 -2
- package/dist/view/CaretNavigation.d.ts.map +1 -1
- package/dist/view/DomPointUtils.d.ts +2 -3
- package/dist/view/DomPointUtils.d.ts.map +1 -1
- package/dist/view/EditorViewEvents.d.ts.map +1 -1
- package/dist/view/EditorViewNavigation.d.ts.map +1 -1
- package/package.json +8 -4
- package/dist/chunks/AttrRegistry-iNpjvcSG.mjs +0 -2
- package/dist/chunks/AttrRegistry-iNpjvcSG.mjs.map +0 -1
- package/dist/chunks/AttributedMarkCommands-BY1BSYWM.mjs +0 -2
- package/dist/chunks/AttributedMarkCommands-BY1BSYWM.mjs.map +0 -1
- package/dist/chunks/BlockInsertion-BJFhE0jA.mjs +0 -2
- package/dist/chunks/BlockInsertion-BJFhE0jA.mjs.map +0 -1
- package/dist/chunks/BlockTypePickerRegistry-DcSE6IXB.mjs +0 -2
- package/dist/chunks/BlockTypePickerRegistry-DcSE6IXB.mjs.map +0 -1
- package/dist/chunks/ColorGrid-CpkbKfXg.mjs +0 -2
- package/dist/chunks/ColorGrid-CpkbKfXg.mjs.map +0 -1
- package/dist/chunks/ColorPickerPopup-D6XjShhv.mjs +0 -2
- package/dist/chunks/ColorPickerPopup-D6XjShhv.mjs.map +0 -1
- package/dist/chunks/ColorValidation-DCSKq9B2.mjs +0 -2
- package/dist/chunks/ColorValidation-DCSKq9B2.mjs.map +0 -1
- package/dist/chunks/CommandHelpers-M6mPS6Ww.mjs +0 -2
- package/dist/chunks/CommandHelpers-M6mPS6Ww.mjs.map +0 -1
- package/dist/chunks/Commands-D_gMCnVa.mjs +0 -2
- package/dist/chunks/Commands-D_gMCnVa.mjs.map +0 -1
- package/dist/chunks/Decoration-D49mFXrH.mjs +0 -2
- package/dist/chunks/Decoration-D49mFXrH.mjs.map +0 -1
- package/dist/chunks/Document-3pNX7ear.mjs +0 -2
- package/dist/chunks/Document-3pNX7ear.mjs.map +0 -1
- package/dist/chunks/DocumentParser-LvzDQOd1.mjs +0 -2
- package/dist/chunks/DocumentParser-LvzDQOd1.mjs.map +0 -1
- package/dist/chunks/DomUtils-CznMAZZg.mjs +0 -2
- package/dist/chunks/DomUtils-CznMAZZg.mjs.map +0 -1
- package/dist/chunks/HTMLUtils-Cxy99Ak2.mjs +0 -2
- package/dist/chunks/HTMLUtils-Cxy99Ak2.mjs.map +0 -1
- package/dist/chunks/HeadingPlugin-BmkeUXj8.mjs +0 -2
- package/dist/chunks/HeadingPlugin-BmkeUXj8.mjs.map +0 -1
- package/dist/chunks/KeyboardNav-DsYhKKuV.mjs +0 -2
- package/dist/chunks/KeyboardNav-DsYhKKuV.mjs.map +0 -1
- package/dist/chunks/MarkCommands-CeCa4WSC.mjs +0 -2
- package/dist/chunks/MarkCommands-CeCa4WSC.mjs.map +0 -1
- package/dist/chunks/NavigationQueries-11qe4j9x.mjs +0 -2
- package/dist/chunks/NavigationQueries-11qe4j9x.mjs.map +0 -1
- package/dist/chunks/NodeResolver-z0ReCR34.mjs +0 -2
- package/dist/chunks/NodeResolver-z0ReCR34.mjs.map +0 -1
- package/dist/chunks/NodeSelectionCommands-CXrOcPtG.mjs +0 -2
- package/dist/chunks/NodeSelectionCommands-CXrOcPtG.mjs.map +0 -1
- package/dist/chunks/NotectlEditor-BJD7-FFx.mjs +0 -4
- package/dist/chunks/NotectlEditor-BJD7-FFx.mjs.map +0 -1
- package/dist/chunks/Platform-CU6itXZo.mjs +0 -2
- package/dist/chunks/Platform-CU6itXZo.mjs.map +0 -1
- package/dist/chunks/PluginHelpers-CdPR0MuT.mjs +0 -2
- package/dist/chunks/PluginHelpers-CdPR0MuT.mjs.map +0 -1
- package/dist/chunks/PopupManager-0b_Q0m7K.mjs +0 -2
- package/dist/chunks/PopupManager-0b_Q0m7K.mjs.map +0 -1
- package/dist/chunks/PopupPositioning-DtvqMSop.mjs +0 -2
- package/dist/chunks/PopupPositioning-DtvqMSop.mjs.map +0 -1
- package/dist/chunks/PrintTypes-DukwDSWS.mjs +0 -2
- package/dist/chunks/PrintTypes-DukwDSWS.mjs.map +0 -1
- package/dist/chunks/RangeIterator-XFN5FaYf.mjs +0 -2
- package/dist/chunks/RangeIterator-XFN5FaYf.mjs.map +0 -1
- package/dist/chunks/Selection-DhbizDM4.mjs +0 -2
- package/dist/chunks/Selection-DhbizDM4.mjs.map +0 -1
- package/dist/chunks/SelectionTransactions-DzIZxcuN.mjs +0 -2
- package/dist/chunks/SelectionTransactions-DzIZxcuN.mjs.map +0 -1
- package/dist/chunks/ShortcutFormatting-BLKS0Gys.mjs +0 -2
- package/dist/chunks/ShortcutFormatting-BLKS0Gys.mjs.map +0 -1
- package/dist/chunks/StyleRuntime-BmsLoEa8.mjs +0 -2
- package/dist/chunks/StyleRuntime-BmsLoEa8.mjs.map +0 -1
- package/dist/chunks/TextDirectionLocale-CKz0ZrH_.mjs +0 -2
- package/dist/chunks/TextDirectionLocale-CKz0ZrH_.mjs.map +0 -1
- package/dist/chunks/TypeBrands-Bp_Z_o5Y.mjs +0 -2
- package/dist/chunks/TypeBrands-Bp_Z_o5Y.mjs.map +0 -1
- package/dist/chunks/XmlPatterns-DxQXGjP8.mjs +0 -2
- package/dist/chunks/XmlPatterns-DxQXGjP8.mjs.map +0 -1
- package/dist/chunks/ar-B93SPJT7.mjs +0 -2
- package/dist/chunks/ar-B93SPJT7.mjs.map +0 -1
- package/dist/chunks/ar-BAmGa08u.mjs +0 -2
- package/dist/chunks/ar-BAmGa08u.mjs.map +0 -1
- package/dist/chunks/ar-BYNFEVLc.mjs +0 -2
- package/dist/chunks/ar-BYNFEVLc.mjs.map +0 -1
- package/dist/chunks/ar-Bnc7y8BP.mjs +0 -2
- package/dist/chunks/ar-Bnc7y8BP.mjs.map +0 -1
- package/dist/chunks/ar-Bp3rDZky.mjs +0 -2
- package/dist/chunks/ar-Bp3rDZky.mjs.map +0 -1
- package/dist/chunks/ar-BtOQ7lro.mjs +0 -2
- package/dist/chunks/ar-BtOQ7lro.mjs.map +0 -1
- package/dist/chunks/ar-C5JEHhw9.mjs +0 -2
- package/dist/chunks/ar-C5JEHhw9.mjs.map +0 -1
- package/dist/chunks/ar-CL3QL0tw.mjs +0 -2
- package/dist/chunks/ar-CL3QL0tw.mjs.map +0 -1
- package/dist/chunks/ar-CYtG-XlN.mjs +0 -2
- package/dist/chunks/ar-CYtG-XlN.mjs.map +0 -1
- package/dist/chunks/ar-CzVj8p__.mjs +0 -2
- package/dist/chunks/ar-CzVj8p__.mjs.map +0 -1
- package/dist/chunks/ar-D7PS3e2g.mjs +0 -2
- package/dist/chunks/ar-D7PS3e2g.mjs.map +0 -1
- package/dist/chunks/ar-D8adM2Uy.mjs +0 -2
- package/dist/chunks/ar-D8adM2Uy.mjs.map +0 -1
- package/dist/chunks/ar-D9jyShaB.mjs +0 -2
- package/dist/chunks/ar-D9jyShaB.mjs.map +0 -1
- package/dist/chunks/ar-DR6OA3ZO.mjs +0 -2
- package/dist/chunks/ar-DR6OA3ZO.mjs.map +0 -1
- package/dist/chunks/ar-Deibepjm.mjs +0 -2
- package/dist/chunks/ar-Deibepjm.mjs.map +0 -1
- package/dist/chunks/ar-Dlb5riUN.mjs +0 -2
- package/dist/chunks/ar-Dlb5riUN.mjs.map +0 -1
- package/dist/chunks/ar-DmmxE2W7.mjs +0 -2
- package/dist/chunks/ar-DmmxE2W7.mjs.map +0 -1
- package/dist/chunks/ar-Ds6Z2Gzf.mjs +0 -2
- package/dist/chunks/ar-Ds6Z2Gzf.mjs.map +0 -1
- package/dist/chunks/ar-DtIHQ8nU.mjs +0 -2
- package/dist/chunks/ar-DtIHQ8nU.mjs.map +0 -1
- package/dist/chunks/ar-J8B-on-0.mjs +0 -2
- package/dist/chunks/ar-J8B-on-0.mjs.map +0 -1
- package/dist/chunks/ar-b6VdnxAs.mjs +0 -2
- package/dist/chunks/ar-b6VdnxAs.mjs.map +0 -1
- package/dist/chunks/ar-iU02mRe5.mjs +0 -2
- package/dist/chunks/ar-iU02mRe5.mjs.map +0 -1
- package/dist/chunks/ar-mSCYQYnL.mjs +0 -2
- package/dist/chunks/ar-mSCYQYnL.mjs.map +0 -1
- package/dist/chunks/color-picker-Byjl_xr9.mjs +0 -2
- package/dist/chunks/color-picker-Byjl_xr9.mjs.map +0 -1
- package/dist/chunks/de-8aCC5jBM.mjs +0 -2
- package/dist/chunks/de-8aCC5jBM.mjs.map +0 -1
- package/dist/chunks/de-B4y4ndUw.mjs +0 -2
- package/dist/chunks/de-B4y4ndUw.mjs.map +0 -1
- package/dist/chunks/de-B5fcZ0FQ.mjs +0 -2
- package/dist/chunks/de-B5fcZ0FQ.mjs.map +0 -1
- package/dist/chunks/de-BT9VmwoJ.mjs +0 -2
- package/dist/chunks/de-BT9VmwoJ.mjs.map +0 -1
- package/dist/chunks/de-BZWSyJTG.mjs +0 -2
- package/dist/chunks/de-BZWSyJTG.mjs.map +0 -1
- package/dist/chunks/de-CFD_Wgik.mjs +0 -2
- package/dist/chunks/de-CFD_Wgik.mjs.map +0 -1
- package/dist/chunks/de-CLYtb6kD.mjs +0 -2
- package/dist/chunks/de-CLYtb6kD.mjs.map +0 -1
- package/dist/chunks/de-CP5v-98M.mjs +0 -2
- package/dist/chunks/de-CP5v-98M.mjs.map +0 -1
- package/dist/chunks/de-CYJ6uWno.mjs +0 -2
- package/dist/chunks/de-CYJ6uWno.mjs.map +0 -1
- package/dist/chunks/de-ChcKkF7A.mjs +0 -2
- package/dist/chunks/de-ChcKkF7A.mjs.map +0 -1
- package/dist/chunks/de-CicoU066.mjs +0 -2
- package/dist/chunks/de-CicoU066.mjs.map +0 -1
- package/dist/chunks/de-CjLAdBt2.mjs +0 -2
- package/dist/chunks/de-CjLAdBt2.mjs.map +0 -1
- package/dist/chunks/de-CtFvAXwF.mjs +0 -2
- package/dist/chunks/de-CtFvAXwF.mjs.map +0 -1
- package/dist/chunks/de-D1OAXtxJ.mjs +0 -2
- package/dist/chunks/de-D1OAXtxJ.mjs.map +0 -1
- package/dist/chunks/de-DBbzCQrm.mjs +0 -2
- package/dist/chunks/de-DBbzCQrm.mjs.map +0 -1
- package/dist/chunks/de-DOLwx_M7.mjs +0 -2
- package/dist/chunks/de-DOLwx_M7.mjs.map +0 -1
- package/dist/chunks/de-De2miMxo.mjs +0 -2
- package/dist/chunks/de-De2miMxo.mjs.map +0 -1
- package/dist/chunks/de-OTfhhinm.mjs +0 -2
- package/dist/chunks/de-OTfhhinm.mjs.map +0 -1
- package/dist/chunks/de-PZ9-LlBp.mjs +0 -2
- package/dist/chunks/de-PZ9-LlBp.mjs.map +0 -1
- package/dist/chunks/de-UREymH-5.mjs +0 -2
- package/dist/chunks/de-UREymH-5.mjs.map +0 -1
- package/dist/chunks/de-chYdoK9q.mjs +0 -2
- package/dist/chunks/de-chYdoK9q.mjs.map +0 -1
- package/dist/chunks/de-fXvs5vQT.mjs +0 -2
- package/dist/chunks/de-fXvs5vQT.mjs.map +0 -1
- package/dist/chunks/de-xJh5C_pk.mjs +0 -2
- package/dist/chunks/de-xJh5C_pk.mjs.map +0 -1
- package/dist/chunks/es-B9UhsaEI.mjs +0 -2
- package/dist/chunks/es-B9UhsaEI.mjs.map +0 -1
- package/dist/chunks/es-BHGwPgrP.mjs +0 -2
- package/dist/chunks/es-BHGwPgrP.mjs.map +0 -1
- package/dist/chunks/es-BTqy_aQ4.mjs +0 -2
- package/dist/chunks/es-BTqy_aQ4.mjs.map +0 -1
- package/dist/chunks/es-BbGOZGS_.mjs +0 -2
- package/dist/chunks/es-BbGOZGS_.mjs.map +0 -1
- package/dist/chunks/es-BjPsub0k.mjs +0 -2
- package/dist/chunks/es-BjPsub0k.mjs.map +0 -1
- package/dist/chunks/es-Bk0bRDFE.mjs +0 -2
- package/dist/chunks/es-Bk0bRDFE.mjs.map +0 -1
- package/dist/chunks/es-BkS6DsrM.mjs +0 -2
- package/dist/chunks/es-BkS6DsrM.mjs.map +0 -1
- package/dist/chunks/es-BzEpr4Bk.mjs +0 -2
- package/dist/chunks/es-BzEpr4Bk.mjs.map +0 -1
- package/dist/chunks/es-C2lnWyA0.mjs +0 -2
- package/dist/chunks/es-C2lnWyA0.mjs.map +0 -1
- package/dist/chunks/es-C7e35Muh.mjs +0 -2
- package/dist/chunks/es-C7e35Muh.mjs.map +0 -1
- package/dist/chunks/es-CBk43isB.mjs +0 -2
- package/dist/chunks/es-CBk43isB.mjs.map +0 -1
- package/dist/chunks/es-CE8t9fuM.mjs +0 -2
- package/dist/chunks/es-CE8t9fuM.mjs.map +0 -1
- package/dist/chunks/es-CFjzqIbS.mjs +0 -2
- package/dist/chunks/es-CFjzqIbS.mjs.map +0 -1
- package/dist/chunks/es-Ce-AEYxc.mjs +0 -2
- package/dist/chunks/es-Ce-AEYxc.mjs.map +0 -1
- package/dist/chunks/es-Co4AJr8Y.mjs +0 -2
- package/dist/chunks/es-Co4AJr8Y.mjs.map +0 -1
- package/dist/chunks/es-Cu5_OA4X.mjs +0 -2
- package/dist/chunks/es-Cu5_OA4X.mjs.map +0 -1
- package/dist/chunks/es-Cud6JXHf.mjs +0 -2
- package/dist/chunks/es-Cud6JXHf.mjs.map +0 -1
- package/dist/chunks/es-D-II7LZC.mjs +0 -2
- package/dist/chunks/es-D-II7LZC.mjs.map +0 -1
- package/dist/chunks/es-DBBSeOaD.mjs +0 -2
- package/dist/chunks/es-DBBSeOaD.mjs.map +0 -1
- package/dist/chunks/es-DCwjeUUu.mjs +0 -2
- package/dist/chunks/es-DCwjeUUu.mjs.map +0 -1
- package/dist/chunks/es-DvgH3-WZ.mjs +0 -2
- package/dist/chunks/es-DvgH3-WZ.mjs.map +0 -1
- package/dist/chunks/es-MgguVgIs.mjs +0 -2
- package/dist/chunks/es-MgguVgIs.mjs.map +0 -1
- package/dist/chunks/es-yXjjcxgb.mjs +0 -2
- package/dist/chunks/es-yXjjcxgb.mjs.map +0 -1
- package/dist/chunks/fr-B-_yKIAY.mjs +0 -2
- package/dist/chunks/fr-B-_yKIAY.mjs.map +0 -1
- package/dist/chunks/fr-BGyF2ym0.mjs +0 -2
- package/dist/chunks/fr-BGyF2ym0.mjs.map +0 -1
- package/dist/chunks/fr-BoRJ3B2-.mjs +0 -2
- package/dist/chunks/fr-BoRJ3B2-.mjs.map +0 -1
- package/dist/chunks/fr-BrKk4SPg.mjs +0 -2
- package/dist/chunks/fr-BrKk4SPg.mjs.map +0 -1
- package/dist/chunks/fr-C-y09LKg.mjs +0 -2
- package/dist/chunks/fr-C-y09LKg.mjs.map +0 -1
- package/dist/chunks/fr-C1W7jyd6.mjs +0 -2
- package/dist/chunks/fr-C1W7jyd6.mjs.map +0 -1
- package/dist/chunks/fr-C8CtmWBj.mjs +0 -2
- package/dist/chunks/fr-C8CtmWBj.mjs.map +0 -1
- package/dist/chunks/fr-C9oiPW0k.mjs +0 -2
- package/dist/chunks/fr-C9oiPW0k.mjs.map +0 -1
- package/dist/chunks/fr-CEkk4UyZ.mjs +0 -2
- package/dist/chunks/fr-CEkk4UyZ.mjs.map +0 -1
- package/dist/chunks/fr-Ccaetiwi.mjs +0 -2
- package/dist/chunks/fr-Ccaetiwi.mjs.map +0 -1
- package/dist/chunks/fr-Ccku5KzA.mjs +0 -2
- package/dist/chunks/fr-Ccku5KzA.mjs.map +0 -1
- package/dist/chunks/fr-CfUg1FxU.mjs +0 -2
- package/dist/chunks/fr-CfUg1FxU.mjs.map +0 -1
- package/dist/chunks/fr-DDkBcjmO.mjs +0 -2
- package/dist/chunks/fr-DDkBcjmO.mjs.map +0 -1
- package/dist/chunks/fr-DNwLChcm.mjs +0 -2
- package/dist/chunks/fr-DNwLChcm.mjs.map +0 -1
- package/dist/chunks/fr-DvneSjCf.mjs +0 -2
- package/dist/chunks/fr-DvneSjCf.mjs.map +0 -1
- package/dist/chunks/fr-Dx4Qqimj.mjs +0 -2
- package/dist/chunks/fr-Dx4Qqimj.mjs.map +0 -1
- package/dist/chunks/fr-RHXmueoO.mjs +0 -2
- package/dist/chunks/fr-RHXmueoO.mjs.map +0 -1
- package/dist/chunks/fr-VdiCNF4J.mjs +0 -2
- package/dist/chunks/fr-VdiCNF4J.mjs.map +0 -1
- package/dist/chunks/fr-Wiobfk5s.mjs +0 -2
- package/dist/chunks/fr-Wiobfk5s.mjs.map +0 -1
- package/dist/chunks/fr-YMiDtWuG.mjs +0 -2
- package/dist/chunks/fr-YMiDtWuG.mjs.map +0 -1
- package/dist/chunks/fr-_Oxf0k66.mjs +0 -2
- package/dist/chunks/fr-_Oxf0k66.mjs.map +0 -1
- package/dist/chunks/fr-gurfH-7T.mjs +0 -2
- package/dist/chunks/fr-gurfH-7T.mjs.map +0 -1
- package/dist/chunks/fr-zP7EjxDL.mjs +0 -2
- package/dist/chunks/fr-zP7EjxDL.mjs.map +0 -1
- package/dist/chunks/hi-B2W8pFqK.mjs +0 -2
- package/dist/chunks/hi-B2W8pFqK.mjs.map +0 -1
- package/dist/chunks/hi-B2m69ZCq.mjs +0 -2
- package/dist/chunks/hi-B2m69ZCq.mjs.map +0 -1
- package/dist/chunks/hi-BMIt3y_-.mjs +0 -2
- package/dist/chunks/hi-BMIt3y_-.mjs.map +0 -1
- package/dist/chunks/hi-BdtVhAzs.mjs +0 -2
- package/dist/chunks/hi-BdtVhAzs.mjs.map +0 -1
- package/dist/chunks/hi-BmkfaZpg.mjs +0 -2
- package/dist/chunks/hi-BmkfaZpg.mjs.map +0 -1
- package/dist/chunks/hi-C-l_R2SO.mjs +0 -2
- package/dist/chunks/hi-C-l_R2SO.mjs.map +0 -1
- package/dist/chunks/hi-C1LhM-oY.mjs +0 -2
- package/dist/chunks/hi-C1LhM-oY.mjs.map +0 -1
- package/dist/chunks/hi-CGEbGI1l.mjs +0 -2
- package/dist/chunks/hi-CGEbGI1l.mjs.map +0 -1
- package/dist/chunks/hi-CPuhj7IA.mjs +0 -2
- package/dist/chunks/hi-CPuhj7IA.mjs.map +0 -1
- package/dist/chunks/hi-CT5WERqi.mjs +0 -2
- package/dist/chunks/hi-CT5WERqi.mjs.map +0 -1
- package/dist/chunks/hi-CbLPPQ0b.mjs +0 -2
- package/dist/chunks/hi-CbLPPQ0b.mjs.map +0 -1
- package/dist/chunks/hi-ClvEtEKe.mjs +0 -2
- package/dist/chunks/hi-ClvEtEKe.mjs.map +0 -1
- package/dist/chunks/hi-CpBWHmYH.mjs +0 -2
- package/dist/chunks/hi-CpBWHmYH.mjs.map +0 -1
- package/dist/chunks/hi-DAfl8nU_.mjs +0 -2
- package/dist/chunks/hi-DAfl8nU_.mjs.map +0 -1
- package/dist/chunks/hi-DVof3w0y.mjs +0 -2
- package/dist/chunks/hi-DVof3w0y.mjs.map +0 -1
- package/dist/chunks/hi-DtlvSQkD.mjs +0 -2
- package/dist/chunks/hi-DtlvSQkD.mjs.map +0 -1
- package/dist/chunks/hi-FH3CAJuR.mjs +0 -2
- package/dist/chunks/hi-FH3CAJuR.mjs.map +0 -1
- package/dist/chunks/hi-Ga9h9a_1.mjs +0 -2
- package/dist/chunks/hi-Ga9h9a_1.mjs.map +0 -1
- package/dist/chunks/hi-Zc17M1T-.mjs +0 -2
- package/dist/chunks/hi-Zc17M1T-.mjs.map +0 -1
- package/dist/chunks/hi-g7i0bmig.mjs +0 -2
- package/dist/chunks/hi-g7i0bmig.mjs.map +0 -1
- package/dist/chunks/hi-js2P6byR.mjs +0 -2
- package/dist/chunks/hi-js2P6byR.mjs.map +0 -1
- package/dist/chunks/hi-ntUsOspQ.mjs +0 -2
- package/dist/chunks/hi-ntUsOspQ.mjs.map +0 -1
- package/dist/chunks/hi-yxAcR3w6.mjs +0 -2
- package/dist/chunks/hi-yxAcR3w6.mjs.map +0 -1
- package/dist/chunks/index-C-L4awHz.mjs +0 -2
- package/dist/chunks/index-C-L4awHz.mjs.map +0 -1
- package/dist/chunks/index-Cs9iqxhF.mjs +0 -2
- package/dist/chunks/index-Cs9iqxhF.mjs.map +0 -1
- package/dist/chunks/pt--IiroJQw.mjs +0 -2
- package/dist/chunks/pt--IiroJQw.mjs.map +0 -1
- package/dist/chunks/pt-BF72W8M5.mjs +0 -2
- package/dist/chunks/pt-BF72W8M5.mjs.map +0 -1
- package/dist/chunks/pt-BX_t4luI.mjs +0 -2
- package/dist/chunks/pt-BX_t4luI.mjs.map +0 -1
- package/dist/chunks/pt-B_XJ2s9X.mjs +0 -2
- package/dist/chunks/pt-B_XJ2s9X.mjs.map +0 -1
- package/dist/chunks/pt-C-Vp7Rxj.mjs +0 -2
- package/dist/chunks/pt-C-Vp7Rxj.mjs.map +0 -1
- package/dist/chunks/pt-CD2aCZXf.mjs +0 -2
- package/dist/chunks/pt-CD2aCZXf.mjs.map +0 -1
- package/dist/chunks/pt-CFjzqIbS.mjs +0 -2
- package/dist/chunks/pt-CFjzqIbS.mjs.map +0 -1
- package/dist/chunks/pt-CHjmBegF.mjs +0 -2
- package/dist/chunks/pt-CHjmBegF.mjs.map +0 -1
- package/dist/chunks/pt-CQRzEocL.mjs +0 -2
- package/dist/chunks/pt-CQRzEocL.mjs.map +0 -1
- package/dist/chunks/pt-Cem2WxUk.mjs +0 -2
- package/dist/chunks/pt-Cem2WxUk.mjs.map +0 -1
- package/dist/chunks/pt-D6kdF3fH.mjs +0 -2
- package/dist/chunks/pt-D6kdF3fH.mjs.map +0 -1
- package/dist/chunks/pt-DJfJVeY8.mjs +0 -2
- package/dist/chunks/pt-DJfJVeY8.mjs.map +0 -1
- package/dist/chunks/pt-DfB-IaYi.mjs +0 -2
- package/dist/chunks/pt-DfB-IaYi.mjs.map +0 -1
- package/dist/chunks/pt-DlNdH9pu.mjs +0 -2
- package/dist/chunks/pt-DlNdH9pu.mjs.map +0 -1
- package/dist/chunks/pt-DrJ0-8Yo.mjs +0 -2
- package/dist/chunks/pt-DrJ0-8Yo.mjs.map +0 -1
- package/dist/chunks/pt-DsBJpgpe.mjs +0 -2
- package/dist/chunks/pt-DsBJpgpe.mjs.map +0 -1
- package/dist/chunks/pt-DwdSYJzC.mjs +0 -2
- package/dist/chunks/pt-DwdSYJzC.mjs.map +0 -1
- package/dist/chunks/pt-Dx9UkZ3j.mjs +0 -2
- package/dist/chunks/pt-Dx9UkZ3j.mjs.map +0 -1
- package/dist/chunks/pt-K0BUlM9X.mjs +0 -2
- package/dist/chunks/pt-K0BUlM9X.mjs.map +0 -1
- package/dist/chunks/pt-TuA3_GDM.mjs +0 -2
- package/dist/chunks/pt-TuA3_GDM.mjs.map +0 -1
- package/dist/chunks/pt-cN6r-f7f.mjs +0 -2
- package/dist/chunks/pt-cN6r-f7f.mjs.map +0 -1
- package/dist/chunks/pt-uNGpVM3D.mjs +0 -2
- package/dist/chunks/pt-uNGpVM3D.mjs.map +0 -1
- package/dist/chunks/pt-v1E9u-Jx.mjs +0 -2
- package/dist/chunks/pt-v1E9u-Jx.mjs.map +0 -1
- package/dist/chunks/ru-0h51zrqE.mjs +0 -2
- package/dist/chunks/ru-0h51zrqE.mjs.map +0 -1
- package/dist/chunks/ru-4S8w6UN_.mjs +0 -2
- package/dist/chunks/ru-4S8w6UN_.mjs.map +0 -1
- package/dist/chunks/ru-B0cRw90L.mjs +0 -2
- package/dist/chunks/ru-B0cRw90L.mjs.map +0 -1
- package/dist/chunks/ru-B3O7WXNM.mjs +0 -2
- package/dist/chunks/ru-B3O7WXNM.mjs.map +0 -1
- package/dist/chunks/ru-B6zVAzvI.mjs +0 -2
- package/dist/chunks/ru-B6zVAzvI.mjs.map +0 -1
- package/dist/chunks/ru-B8teJin_.mjs +0 -2
- package/dist/chunks/ru-B8teJin_.mjs.map +0 -1
- package/dist/chunks/ru-BCriPw-8.mjs +0 -2
- package/dist/chunks/ru-BCriPw-8.mjs.map +0 -1
- package/dist/chunks/ru-BNOU16E5.mjs +0 -2
- package/dist/chunks/ru-BNOU16E5.mjs.map +0 -1
- package/dist/chunks/ru-BO6BIS5W.mjs +0 -2
- package/dist/chunks/ru-BO6BIS5W.mjs.map +0 -1
- package/dist/chunks/ru-Bdy1lLuc.mjs +0 -2
- package/dist/chunks/ru-Bdy1lLuc.mjs.map +0 -1
- package/dist/chunks/ru-BgBctNVm.mjs +0 -2
- package/dist/chunks/ru-BgBctNVm.mjs.map +0 -1
- package/dist/chunks/ru-CNLx7T3O.mjs +0 -2
- package/dist/chunks/ru-CNLx7T3O.mjs.map +0 -1
- package/dist/chunks/ru-CVSCT776.mjs +0 -2
- package/dist/chunks/ru-CVSCT776.mjs.map +0 -1
- package/dist/chunks/ru-CZvkdGnf.mjs +0 -2
- package/dist/chunks/ru-CZvkdGnf.mjs.map +0 -1
- package/dist/chunks/ru-CegMPuML.mjs +0 -2
- package/dist/chunks/ru-CegMPuML.mjs.map +0 -1
- package/dist/chunks/ru-CiLrD2Nz.mjs +0 -2
- package/dist/chunks/ru-CiLrD2Nz.mjs.map +0 -1
- package/dist/chunks/ru-ClEM6OKY.mjs +0 -2
- package/dist/chunks/ru-ClEM6OKY.mjs.map +0 -1
- package/dist/chunks/ru-CrbxCeQf.mjs +0 -2
- package/dist/chunks/ru-CrbxCeQf.mjs.map +0 -1
- package/dist/chunks/ru-D3j2x2xu.mjs +0 -2
- package/dist/chunks/ru-D3j2x2xu.mjs.map +0 -1
- package/dist/chunks/ru-DdHqb4Mh.mjs +0 -2
- package/dist/chunks/ru-DdHqb4Mh.mjs.map +0 -1
- package/dist/chunks/ru-DjgNdOdJ.mjs +0 -2
- package/dist/chunks/ru-DjgNdOdJ.mjs.map +0 -1
- package/dist/chunks/ru-Tzd5N37W.mjs +0 -2
- package/dist/chunks/ru-Tzd5N37W.mjs.map +0 -1
- package/dist/chunks/ru-XKNCzkR2.mjs +0 -2
- package/dist/chunks/ru-XKNCzkR2.mjs.map +0 -1
- package/dist/chunks/zh--oNSMazK.mjs +0 -2
- package/dist/chunks/zh--oNSMazK.mjs.map +0 -1
- package/dist/chunks/zh-BfeWdPIz.mjs +0 -2
- package/dist/chunks/zh-BfeWdPIz.mjs.map +0 -1
- package/dist/chunks/zh-BnOxGKxF.mjs +0 -2
- package/dist/chunks/zh-BnOxGKxF.mjs.map +0 -1
- package/dist/chunks/zh-BqMtE-jN.mjs +0 -2
- package/dist/chunks/zh-BqMtE-jN.mjs.map +0 -1
- package/dist/chunks/zh-C3aI7A2o.mjs +0 -2
- package/dist/chunks/zh-C3aI7A2o.mjs.map +0 -1
- package/dist/chunks/zh-C6YALJZt.mjs +0 -2
- package/dist/chunks/zh-C6YALJZt.mjs.map +0 -1
- package/dist/chunks/zh-CWdTbUOP.mjs +0 -2
- package/dist/chunks/zh-CWdTbUOP.mjs.map +0 -1
- package/dist/chunks/zh-CY01pMD4.mjs +0 -2
- package/dist/chunks/zh-CY01pMD4.mjs.map +0 -1
- package/dist/chunks/zh-Cmt7n9FY.mjs +0 -2
- package/dist/chunks/zh-Cmt7n9FY.mjs.map +0 -1
- package/dist/chunks/zh-CpP2kee3.mjs +0 -2
- package/dist/chunks/zh-CpP2kee3.mjs.map +0 -1
- package/dist/chunks/zh-Cpbg4evx.mjs +0 -2
- package/dist/chunks/zh-Cpbg4evx.mjs.map +0 -1
- package/dist/chunks/zh-Cqb55JWa.mjs +0 -2
- package/dist/chunks/zh-Cqb55JWa.mjs.map +0 -1
- package/dist/chunks/zh-DCQZ6gss.mjs +0 -2
- package/dist/chunks/zh-DCQZ6gss.mjs.map +0 -1
- package/dist/chunks/zh-DG2CNTUU.mjs +0 -2
- package/dist/chunks/zh-DG2CNTUU.mjs.map +0 -1
- package/dist/chunks/zh-DTiTJbzz.mjs +0 -2
- package/dist/chunks/zh-DTiTJbzz.mjs.map +0 -1
- package/dist/chunks/zh-Da1z6qbB.mjs +0 -2
- package/dist/chunks/zh-Da1z6qbB.mjs.map +0 -1
- package/dist/chunks/zh-Di3WqY4_.mjs +0 -2
- package/dist/chunks/zh-Di3WqY4_.mjs.map +0 -1
- package/dist/chunks/zh-DlBt06Pr.mjs +0 -2
- package/dist/chunks/zh-DlBt06Pr.mjs.map +0 -1
- package/dist/chunks/zh-Dt-wVrNr.mjs +0 -2
- package/dist/chunks/zh-Dt-wVrNr.mjs.map +0 -1
- package/dist/chunks/zh-ND6vW2M-.mjs +0 -2
- package/dist/chunks/zh-ND6vW2M-.mjs.map +0 -1
- package/dist/chunks/zh-Yd3GNsa0.mjs +0 -2
- package/dist/chunks/zh-Yd3GNsa0.mjs.map +0 -1
- package/dist/chunks/zh-lhynyH6Q.mjs +0 -2
- package/dist/chunks/zh-lhynyH6Q.mjs.map +0 -1
- package/dist/chunks/zh-v9NmlEIN.mjs +0 -2
- package/dist/chunks/zh-v9NmlEIN.mjs.map +0 -1
- package/dist/fonts.mjs.map +0 -1
- package/dist/full.mjs.map +0 -1
- package/dist/html.mjs.map +0 -1
- package/dist/notectl-core.mjs.map +0 -1
- package/dist/plugins/alignment.mjs.map +0 -1
- package/dist/plugins/blockquote.mjs.map +0 -1
- package/dist/plugins/caret-navigation.mjs.map +0 -1
- package/dist/plugins/code-block.mjs.map +0 -1
- package/dist/plugins/font-size.mjs.map +0 -1
- package/dist/plugins/font.mjs.map +0 -1
- package/dist/plugins/gap-cursor.mjs.map +0 -1
- package/dist/plugins/hard-break.mjs.map +0 -1
- package/dist/plugins/heading.mjs.map +0 -1
- package/dist/plugins/highlight.mjs.map +0 -1
- package/dist/plugins/horizontal-rule.mjs.map +0 -1
- package/dist/plugins/image.mjs.map +0 -1
- package/dist/plugins/link.mjs.map +0 -1
- package/dist/plugins/list.mjs.map +0 -1
- package/dist/plugins/print.mjs.map +0 -1
- package/dist/plugins/shared.mjs.map +0 -1
- package/dist/plugins/smart-paste.mjs.map +0 -1
- package/dist/plugins/strikethrough.mjs.map +0 -1
- package/dist/plugins/super-sub.mjs.map +0 -1
- package/dist/plugins/table.mjs.map +0 -1
- package/dist/plugins/text-color.mjs.map +0 -1
- package/dist/plugins/text-direction-advanced.mjs.map +0 -1
- package/dist/plugins/text-direction.mjs.map +0 -1
- package/dist/plugins/text-formatting.mjs.map +0 -1
- package/dist/plugins/toolbar.mjs.map +0 -1
- package/dist/presets/full.mjs.map +0 -1
- package/dist/presets/minimal.mjs.map +0 -1
- package/dist/presets.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"text-formatting.mjs","sources":["../../src/plugins/text-formatting/TextFormattingLocale.ts","../../src/plugins/text-formatting/TextFormattingPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the TextFormattingPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface TextFormattingLocale {\n\treadonly boldLabel: string;\n\treadonly italicLabel: string;\n\treadonly underlineLabel: string;\n}\n\n// --- Default English Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_EN: TextFormattingLocale = {\n\tboldLabel: 'Bold',\n\titalicLabel: 'Italic',\n\tunderlineLabel: 'Underline',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: TextFormattingLocale }>> =\n\timport.meta.glob<{ default: TextFormattingLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadTextFormattingLocale(lang: string): Promise<TextFormattingLocale> {\n\tif (lang === 'en') return TEXT_FORMATTING_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return TEXT_FORMATTING_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn TEXT_FORMATTING_LOCALE_EN;\n\t}\n}\n","/**\n * TextFormattingPlugin: registers inline marks (bold, italic, underline)\n * with their MarkSpecs, toggle commands, keyboard shortcuts, and toolbar items.\n *\n * This plugin is data-driven — each mark type is defined declaratively and\n * all registrations (MarkSpec, command, keymap, toolbar item) are derived\n * from the same definition.\n *\n * Supports two separate config dimensions:\n * - Feature config (bold/italic/underline): controls whether the mark is\n * registered in the schema. When disabled, the keyboard shortcut does nothing.\n * - Toolbar config: controls whether the toolbar button is visible.\n * When a feature is disabled but toolbar is enabled, the button renders as disabled.\n */\n\nimport { isMarkActive, toggleMark } from '../../commands/Commands.js';\nimport type { ParseRule } from '../../model/ParseRule.js';\nimport type { SanitizeConfig } from '../../model/SanitizeConfig.js';\nimport { markType as mkType } from '../../model/TypeBrands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale, toCommandName } from '../shared/PluginHelpers.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport {\n\tTEXT_FORMATTING_LOCALE_EN,\n\ttype TextFormattingLocale,\n\tloadTextFormattingLocale,\n} from './TextFormattingLocale.js';\n\n// --- Configuration ---\n\n/** Controls toolbar button visibility per mark. */\nexport interface TextFormattingToolbarConfig {\n\treadonly bold?: boolean;\n\treadonly italic?: boolean;\n\treadonly underline?: boolean;\n}\n\n/** Controls which inline marks are enabled and which toolbar buttons are shown. */\nexport interface TextFormattingConfig {\n\treadonly bold: boolean;\n\treadonly italic: boolean;\n\treadonly underline: boolean;\n\treadonly toolbar?: TextFormattingToolbarConfig;\n\treadonly locale?: TextFormattingLocale;\n}\n\nconst DEFAULT_CONFIG: TextFormattingConfig = {\n\tbold: true,\n\titalic: true,\n\tunderline: true,\n};\n\n// --- Mark Definitions ---\n\ninterface MarkDefinition {\n\treadonly type: string;\n\treadonly configKey: keyof Omit<TextFormattingConfig, 'toolbar' | 'locale'>;\n\treadonly rank: number;\n\treadonly tag: string;\n\treadonly icon: string;\n\treadonly keyBinding: string;\n\treadonly toHTMLString: (content: string) => string;\n\treadonly parseHTML: readonly ParseRule[];\n\treadonly sanitize: SanitizeConfig;\n}\n\nconst BOLD_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></svg>';\nconst ITALIC_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"/></svg>';\nconst UNDERLINE_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"/></svg>';\n\nconst MARK_DEFINITIONS: readonly MarkDefinition[] = [\n\t{\n\t\ttype: 'bold',\n\t\tconfigKey: 'bold',\n\t\trank: 0,\n\t\ttag: 'strong',\n\t\ticon: BOLD_ICON,\n\t\tkeyBinding: 'Mod-B',\n\t\ttoHTMLString: (content) => `<strong>${content}</strong>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'strong' },\n\t\t\t{\n\t\t\t\ttag: 'b',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\tconst fw: string = el.style.fontWeight;\n\t\t\t\t\treturn fw === 'normal' || fw === '400' ? false : {};\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\tconst fw: string = el.style.fontWeight;\n\t\t\t\t\tif (!fw) return false;\n\t\t\t\t\tif (fw === 'bold') return {};\n\t\t\t\t\tconst numeric: number = Number.parseInt(fw, 10);\n\t\t\t\t\treturn !Number.isNaN(numeric) && numeric >= 700 ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['strong', 'b'] },\n\t},\n\t{\n\t\ttype: 'italic',\n\t\tconfigKey: 'italic',\n\t\trank: 1,\n\t\ttag: 'em',\n\t\ticon: ITALIC_ICON,\n\t\tkeyBinding: 'Mod-I',\n\t\ttoHTMLString: (content) => `<em>${content}</em>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'em' },\n\t\t\t{ tag: 'i' },\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\treturn el.style.fontStyle === 'italic' ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['em', 'i'] },\n\t},\n\t{\n\t\ttype: 'underline',\n\t\tconfigKey: 'underline',\n\t\trank: 2,\n\t\ttag: 'u',\n\t\ticon: UNDERLINE_ICON,\n\t\tkeyBinding: 'Mod-U',\n\t\ttoHTMLString: (content) => `<u>${content}</u>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'u' },\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\treturn el.style.textDecoration.includes('underline') ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['u'] },\n\t},\n];\n\n// --- Plugin ---\n\nexport class TextFormattingPlugin implements Plugin {\n\treadonly id = 'text-formatting';\n\treadonly name = 'Text Formatting';\n\treadonly priority = 20;\n\n\tprivate readonly config: TextFormattingConfig;\n\tprivate locale!: TextFormattingLocale;\n\n\tconstructor(config?: Partial<TextFormattingConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tTEXT_FORMATTING_LOCALE_EN,\n\t\t\tloadTextFormattingLocale,\n\t\t);\n\n\t\tconst enabledMarks = MARK_DEFINITIONS.filter((def) => this.config[def.configKey]);\n\n\t\tfor (const def of enabledMarks) {\n\t\t\tthis.registerMark(context, def);\n\t\t}\n\n\t\tthis.registerKeymaps(context, enabledMarks);\n\n\t\t// Register disabled placeholder buttons for marks that are disabled\n\t\t// as features but explicitly requested in the toolbar config\n\t\tthis.registerDisabledToolbarItems(context);\n\t}\n\n\tprivate registerMark(context: PluginContext, def: MarkDefinition): void {\n\t\tconst commandName = toCommandName(def.type);\n\t\tconst toolbarVisible = this.isToolbarVisible(def.configKey);\n\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: def.type,\n\t\t\trank: def.rank,\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement(def.tag);\n\t\t\t},\n\t\t\ttoHTMLString: (_mark, content) => def.toHTMLString(content),\n\t\t\tparseHTML: def.parseHTML,\n\t\t\tsanitize: def.sanitize,\n\t\t});\n\n\t\tcontext.registerCommand(commandName, () => {\n\t\t\tconst tr = toggleMark(context.getState(), mkType(def.type));\n\t\t\tif (tr) {\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (toolbarVisible) {\n\t\t\tconst label: string = this.getMarkLabel(def.type);\n\t\t\tcontext.registerToolbarItem({\n\t\t\t\tid: def.type,\n\t\t\t\tgroup: 'format',\n\t\t\t\ticon: def.icon,\n\t\t\t\tlabel,\n\t\t\t\ttooltip: `${label} (${formatShortcut(def.keyBinding)})`,\n\t\t\t\tcommand: commandName,\n\t\t\t\tisActive: (state) => isMarkActive(state, mkType(def.type)),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate registerKeymaps(context: PluginContext, marks: readonly MarkDefinition[]): void {\n\t\tconst keymap: Record<string, () => boolean> = {};\n\t\tfor (const def of marks) {\n\t\t\tconst commandName = toCommandName(def.type);\n\t\t\tkeymap[def.keyBinding] = () => context.executeCommand(commandName);\n\t\t}\n\t\tif (Object.keys(keymap).length > 0) {\n\t\t\tcontext.registerKeymap(keymap);\n\t\t}\n\t}\n\n\t/**\n\t * Registers disabled toolbar buttons for marks whose feature is disabled\n\t * but whose toolbar button is explicitly requested.\n\t */\n\tprivate registerDisabledToolbarItems(context: PluginContext): void {\n\t\tif (!this.config.toolbar) return;\n\n\t\tfor (const def of MARK_DEFINITIONS) {\n\t\t\tconst featureEnabled = this.config[def.configKey];\n\t\t\tconst toolbarVisible = this.config.toolbar[def.configKey] ?? true;\n\n\t\t\tif (!featureEnabled && toolbarVisible) {\n\t\t\t\tcontext.registerToolbarItem({\n\t\t\t\t\tid: def.type,\n\t\t\t\t\tgroup: 'format',\n\t\t\t\t\ticon: def.icon,\n\t\t\t\t\tlabel: this.getMarkLabel(def.type),\n\t\t\t\t\tcommand: toCommandName(def.type),\n\t\t\t\t\tisEnabled: () => false,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getMarkLabel(type: string): string {\n\t\tconst key = `${type}Label` as keyof TextFormattingLocale;\n\t\treturn this.locale[key] as string;\n\t}\n\n\t/** Checks if a toolbar button should be visible for a given mark. */\n\tprivate isToolbarVisible(\n\t\tconfigKey: keyof Omit<TextFormattingConfig, 'toolbar' | 'locale'>,\n\t): boolean {\n\t\tif (!this.config.toolbar) return true;\n\t\treturn this.config.toolbar[configKey] ?? true;\n\t}\n}\n"],"names":["TEXT_FORMATTING_LOCALE_EN","boldLabel","italicLabel","underlineLabel","localeModules","assign","import","async","loadTextFormattingLocale","lang","loader","default","DEFAULT_CONFIG","bold","italic","underline","MARK_DEFINITIONS","type","configKey","rank","tag","icon","keyBinding","toHTMLString","content","parseHTML","getAttrs","el","fw","style","fontWeight","numeric","Number","parseInt","isNaN","sanitize","tags","fontStyle","textDecoration","includes","TextFormattingPlugin","id","name","priority","config","locale","constructor","this","init","context","resolveLocale","enabledMarks","filter","def","registerMark","registerKeymaps","registerDisabledToolbarItems","commandName","toCommandName","toolbarVisible","isToolbarVisible","registerMarkSpec","toDOM","document","createElement","_mark","registerCommand","tr","toggleMark","getState","mkType","dispatch","label","getMarkLabel","registerToolbarItem","group","tooltip","formatShortcut","command","isActive","state","isMarkActive","marks","keymap","executeCommand","Object","keys","length","registerKeymap","toolbar","featureEnabled","isEnabled","key"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar.mjs","sources":["../../src/plugins/toolbar/ToolbarRegistry.ts","../../src/plugins/toolbar/ToolbarKeyboardNav.ts","../../src/plugins/toolbar/ToolbarLocale.ts","../../src/plugins/toolbar/ToolbarOverflowBehavior.ts","../../src/plugins/toolbar/ToolbarOverflowController.ts","../../src/plugins/toolbar/ToolbarRenderers.ts","../../src/plugins/toolbar/ToolbarPopupController.ts","../../src/plugins/toolbar/ToolbarTooltip.ts","../../src/plugins/toolbar/ToolbarPlugin.ts","../../src/editor/styles/toolbar.ts"],"sourcesContent":["/**\n * ToolbarRegistry: manages plugin-registered toolbar items\n * with per-plugin tracking for clean teardown.\n */\n\nimport type { ToolbarItem } from './ToolbarItem.js';\n\nexport class ToolbarRegistry {\n\tprivate readonly _toolbarItems = new Map<string, ToolbarItem>();\n\tprivate readonly _toolbarItemPluginMap = new Map<string, string[]>();\n\n\tregisterToolbarItem(item: ToolbarItem, pluginId?: string): void {\n\t\tif (this._toolbarItems.has(item.id)) {\n\t\t\tthrow new Error(`ToolbarItem with id \"${item.id}\" is already registered.`);\n\t\t}\n\t\tthis._toolbarItems.set(item.id, item);\n\t\tif (pluginId) {\n\t\t\tconst ids = this._toolbarItemPluginMap.get(pluginId) ?? [];\n\t\t\tids.push(item.id);\n\t\t\tthis._toolbarItemPluginMap.set(pluginId, ids);\n\t\t}\n\t}\n\n\tgetToolbarItemsByPlugin(pluginId: string): ToolbarItem[] {\n\t\tconst ids = this._toolbarItemPluginMap.get(pluginId) ?? [];\n\t\tconst items: ToolbarItem[] = [];\n\t\tfor (const id of ids) {\n\t\t\tconst item = this._toolbarItems.get(id);\n\t\t\tif (item) items.push(item);\n\t\t}\n\t\treturn items;\n\t}\n\n\tgetToolbarItem(id: string): ToolbarItem | undefined {\n\t\treturn this._toolbarItems.get(id);\n\t}\n\n\tgetToolbarItems(): ToolbarItem[] {\n\t\treturn [...this._toolbarItems.values()];\n\t}\n\n\tremoveToolbarItem(id: string): void {\n\t\tthis._toolbarItems.delete(id);\n\t\tfor (const [pluginId, ids] of this._toolbarItemPluginMap) {\n\t\t\tconst idx = ids.indexOf(id);\n\t\t\tif (idx !== -1) {\n\t\t\t\tids.splice(idx, 1);\n\t\t\t\tif (ids.length === 0) this._toolbarItemPluginMap.delete(pluginId);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis._toolbarItems.clear();\n\t\tthis._toolbarItemPluginMap.clear();\n\t}\n}\n","/**\n * Keyboard navigation helpers for the toolbar (WAI-ARIA Toolbar pattern).\n * Also re-exports generic navigation helpers from `plugins/shared`.\n */\n\n/** Returns indices of all enabled buttons. */\nexport function getEnabledIndices(buttons: readonly HTMLButtonElement[]): number[] {\n\tconst result: number[] = [];\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tif (!buttons[i]?.disabled) {\n\t\t\tresult.push(i);\n\t\t}\n\t}\n\treturn result;\n}\n\n/** Finds the next enabled button index in the given direction (wraps around). */\nexport function findNextEnabled(\n\tbuttons: readonly HTMLButtonElement[],\n\tcurrent: number,\n\tdirection: 1 | -1,\n): number {\n\tconst len = buttons.length;\n\tif (len === 0) return -1;\n\n\tlet index = current;\n\tfor (let i = 0; i < len; i++) {\n\t\tindex = (index + direction + len) % len;\n\t\tif (!buttons[index]?.disabled) {\n\t\t\treturn index;\n\t\t}\n\t}\n\treturn current;\n}\n\n/** Finds the first enabled button index. */\nexport function findFirstEnabled(buttons: readonly HTMLButtonElement[]): number {\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tif (!buttons[i]?.disabled) return i;\n\t}\n\treturn -1;\n}\n\n/** Finds the last enabled button index. */\nexport function findLastEnabled(buttons: readonly HTMLButtonElement[]): number {\n\tfor (let i = buttons.length - 1; i >= 0; i--) {\n\t\tif (!buttons[i]?.disabled) return i;\n\t}\n\treturn -1;\n}\n\nexport {\n\tapplyRovingTabindex,\n\tfindNextDropdownItem,\n\tnavigateGrid,\n} from '../shared/KeyboardNav.js';\n\n/**\n * Resolves a horizontal navigation direction based on text direction.\n * In RTL, ArrowRight moves backward (-1) and ArrowLeft moves forward (1).\n */\nexport function resolveHorizontalDirection(\n\tkey: 'ArrowRight' | 'ArrowLeft',\n\tisRtl: boolean,\n): 1 | -1 {\n\tif (key === 'ArrowRight') return isRtl ? -1 : 1;\n\treturn isRtl ? 1 : -1;\n}\n","/** Locale interface and default English locale for the ToolbarPlugin. */\n\n// --- Locale Interface ---\n\nexport interface ToolbarLocale {\n\treadonly formattingOptionsAria: string;\n\treadonly moreToolsAria: string;\n\treadonly gridPickerLabel: (rows: number, cols: number) => string;\n}\n\n// --- Default English Locale ---\n\nexport const TOOLBAR_LOCALE_EN: ToolbarLocale = {\n\tformattingOptionsAria: 'Formatting options',\n\tmoreToolsAria: 'More tools',\n\tgridPickerLabel: (rows: number, cols: number) => `${rows} x ${cols}`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: ToolbarLocale }>> = import.meta.glob<{\n\tdefault: ToolbarLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadToolbarLocale(lang: string): Promise<ToolbarLocale> {\n\tif (lang === 'en') return TOOLBAR_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return TOOLBAR_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn TOOLBAR_LOCALE_EN;\n\t}\n}\n","/**\n * Controls how the toolbar responds when items exceed the available width.\n *\n * @example\n * ```typescript\n * const editor = await createEditor({\n * toolbar: {\n * groups: [[BoldPlugin, ItalicPlugin], [HeadingPlugin]],\n * overflow: ToolbarOverflowBehavior.Flow,\n * },\n * });\n * ```\n */\nexport const ToolbarOverflowBehavior = {\n\t/** Items that don't fit are hidden behind a \"...\" dropdown button. Default. */\n\tBurgerMenu: 'burger-menu',\n\t/** Toolbar wraps to additional rows when items overflow. Pure CSS, no JS measurement. */\n\tFlow: 'flow',\n\t/** No responsive behavior; the toolbar clips at the container boundary. */\n\tNone: 'none',\n} as const;\n\nexport type ToolbarOverflowBehavior =\n\t(typeof ToolbarOverflowBehavior)[keyof typeof ToolbarOverflowBehavior];\n","/**\n * ToolbarOverflowController: manages responsive toolbar overflow.\n * Uses ResizeObserver to detect when items exceed available width,\n * hides overflow items, and shows a \"more\" dropdown button.\n * Delegates popup lifecycle to PopupManager when available.\n */\n\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { findNextDropdownItem } from '../shared/KeyboardNav.js';\nimport type { PopupHandle, PopupManager } from '../shared/PopupManager.js';\nimport { appendToRoot } from '../shared/PopupPositioning.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\n\n// --- Types ---\n\ninterface OverflowEntry {\n\treadonly element: HTMLButtonElement;\n\treadonly item: ToolbarItem;\n}\n\ntype OnOverflowChange = (\n\tvisibleButtons: readonly HTMLButtonElement[],\n\toverflowButton: HTMLButtonElement | null,\n) => void;\n\ntype OnItemActivated = (overflowButton: HTMLButtonElement, item: ToolbarItem) => void;\n\nexport interface OverflowControllerConfig {\n\treadonly toolbar: HTMLElement;\n\treadonly ariaLabel: string;\n\treadonly context: PluginContext;\n\treadonly onOverflowChange: OnOverflowChange;\n\treadonly onItemActivated: OnItemActivated;\n\treadonly getActiveElement: () => Element | null;\n\treadonly popupManager?: PopupManager;\n}\n\n// --- Constants ---\n\nconst OVERFLOW_BTN_WIDTH = 34;\nconst GAP = 2;\nconst HIDDEN_BTN_CLASS = 'notectl-toolbar-btn--overflow-hidden';\nconst HIDDEN_SEP_CLASS = 'notectl-toolbar-separator--overflow-hidden';\nconst HIDDEN_OVERFLOW_CLASS = 'notectl-toolbar-overflow-btn--hidden';\nconst ELLIPSIS_SVG =\n\t'<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\"><circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/></svg>';\n\n// --- Controller ---\n\nexport class ToolbarOverflowController {\n\tprivate readonly toolbar: HTMLElement;\n\tprivate readonly context: PluginContext;\n\tprivate readonly onOverflowChange: OnOverflowChange;\n\tprivate readonly onItemActivated: OnItemActivated;\n\tprivate readonly getActiveElement: () => Element | null;\n\tprivate readonly ariaLabel: string;\n\tprivate readonly popupManager: PopupManager | null;\n\n\tprivate entries: OverflowEntry[] = [];\n\tprivate overflowButton: HTMLButtonElement | null = null;\n\tprivate overflowDropdown: HTMLElement | null = null;\n\tprivate overflowHandle: PopupHandle | null = null;\n\tprivate overflowEntries: OverflowEntry[] = [];\n\tprivate resizeObserver: ResizeObserver | null = null;\n\tprivate closeHandler: ((e: MouseEvent) => void) | null = null;\n\tprivate closeHandlerTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate closeHandlerAttached = false;\n\n\tconstructor(config: OverflowControllerConfig) {\n\t\tthis.toolbar = config.toolbar;\n\t\tthis.ariaLabel = config.ariaLabel;\n\t\tthis.context = config.context;\n\t\tthis.onOverflowChange = config.onOverflowChange;\n\t\tthis.onItemActivated = config.onItemActivated;\n\t\tthis.getActiveElement = config.getActiveElement;\n\t\tthis.popupManager = config.popupManager ?? null;\n\n\t\tthis.resizeObserver = new ResizeObserver(() => this.recalculate());\n\t\tthis.resizeObserver.observe(this.toolbar);\n\t}\n\n\t/** Called after renderItems() — stores button references and recalculates. */\n\tupdate(buttons: readonly { element: HTMLButtonElement; item: ToolbarItem }[]): void {\n\t\tthis.entries = buttons.map((b) => ({ element: b.element, item: b.item }));\n\t\tthis.recalculate();\n\t}\n\n\t/** Measures toolbar and redistributes items between visible and overflow. */\n\trecalculate(): void {\n\t\tif (this.entries.length === 0) return;\n\n\t\tthis.closeDropdown();\n\t\tthis.resetVisibility();\n\t\tthis.ensureOverflowButton();\n\t\tthis.setOverflowButtonVisible(false);\n\n\t\t// Phase 1 — Measure (reads only): batch all layout reads before any writes\n\t\tconst availableWidth: number = this.measureAvailableWidth();\n\t\tconst children: HTMLElement[] = Array.from(this.toolbar.children) as HTMLElement[];\n\t\tconst childWidths: Map<HTMLElement, number> = this.measureChildWidths(children);\n\n\t\t// Phase 2 — Apply (writes only): use cached widths, no layout reads\n\t\tconst maxWidth: number = availableWidth - OVERFLOW_BTN_WIDTH - GAP;\n\t\tlet usedWidth = 0;\n\t\tlet overflowing = false;\n\t\tconst overflowList: OverflowEntry[] = [];\n\n\t\tfor (const child of children) {\n\t\t\tif (child === this.overflowButton) continue;\n\n\t\t\tif (child.classList.contains('notectl-toolbar-separator')) {\n\t\t\t\tif (overflowing) {\n\t\t\t\t\tchild.classList.add(HIDDEN_SEP_CLASS);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst sepWidth: number = (childWidths.get(child) ?? 0) + GAP;\n\t\t\t\tif (usedWidth + sepWidth > maxWidth) {\n\t\t\t\t\toverflowing = true;\n\t\t\t\t\tchild.classList.add(HIDDEN_SEP_CLASS);\n\t\t\t\t} else {\n\t\t\t\t\tusedWidth += sepWidth;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst entry: OverflowEntry | undefined = this.entries.find((oe) => oe.element === child);\n\t\t\tif (!entry) continue;\n\n\t\t\tif (overflowing) {\n\t\t\t\tentry.element.classList.add(HIDDEN_BTN_CLASS);\n\t\t\t\toverflowList.push(entry);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst btnWidth: number = (childWidths.get(child) ?? 0) + GAP;\n\t\t\tif (usedWidth + btnWidth > maxWidth) {\n\t\t\t\toverflowing = true;\n\t\t\t\tentry.element.classList.add(HIDDEN_BTN_CLASS);\n\t\t\t\toverflowList.push(entry);\n\t\t\t} else {\n\t\t\t\tusedWidth += btnWidth;\n\t\t\t}\n\t\t}\n\n\t\tthis.overflowEntries = overflowList;\n\t\tthis.hideTrailingSeparators();\n\t\tthis.setOverflowButtonVisible(overflowList.length > 0);\n\t\tthis.notifyChange();\n\t}\n\n\t/** Updates active/disabled states for items in the open overflow dropdown. */\n\tupdateItemStates(state: EditorState): void {\n\t\tif (!this.overflowDropdown) return;\n\n\t\tconst menuItems: HTMLButtonElement[] = Array.from(\n\t\t\tthis.overflowDropdown.querySelectorAll('.notectl-dropdown__item'),\n\t\t) as HTMLButtonElement[];\n\n\t\tfor (const menuItem of menuItems) {\n\t\t\tconst itemId: string | null = menuItem.getAttribute('data-toolbar-item');\n\t\t\tconst entry: OverflowEntry | undefined = this.overflowEntries.find(\n\t\t\t\t(oe) => oe.item.id === itemId,\n\t\t\t);\n\t\t\tif (!entry) continue;\n\n\t\t\tconst active: boolean = entry.item.isActive?.(state) ?? false;\n\t\t\tconst enabled: boolean = entry.item.isEnabled?.(state) ?? true;\n\t\t\tmenuItem.classList.toggle('notectl-dropdown__item--active', active);\n\t\t\tmenuItem.disabled = !enabled;\n\n\t\t\tif (entry.item.popupType === 'combobox') {\n\t\t\t\tconst labelEl: HTMLSpanElement | null = menuItem.querySelector(\n\t\t\t\t\t'.notectl-dropdown__item-label',\n\t\t\t\t);\n\t\t\t\tif (labelEl) {\n\t\t\t\t\tlabelEl.textContent = entry.item.getLabel(state);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entry.item.getIcon) {\n\t\t\t\tconst newIcon: string = entry.item.getIcon(state);\n\t\t\t\tconst iconEl: HTMLSpanElement | null = menuItem.querySelector(\n\t\t\t\t\t'.notectl-dropdown__item-icon',\n\t\t\t\t);\n\t\t\t\tif (iconEl && iconEl.innerHTML !== newIcon) {\n\t\t\t\t\ticonEl.innerHTML = newIcon;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Cleans up ResizeObserver, DOM elements, and event listeners. */\n\tdestroy(): void {\n\t\tthis.resizeObserver?.disconnect();\n\t\tthis.resizeObserver = null;\n\t\tthis.closeDropdown();\n\t\tthis.overflowButton?.remove();\n\t\tthis.overflowButton = null;\n\t\tthis.entries = [];\n\t\tthis.overflowEntries = [];\n\t}\n\n\t// --- Measurement ---\n\n\tprivate measureChildWidths(children: readonly HTMLElement[]): Map<HTMLElement, number> {\n\t\tconst widths: Map<HTMLElement, number> = new Map();\n\t\tfor (const child of children) {\n\t\t\tif (child === this.overflowButton) continue;\n\t\t\twidths.set(child, child.offsetWidth);\n\t\t}\n\t\treturn widths;\n\t}\n\n\tprivate measureAvailableWidth(): number {\n\t\tconst toolbarStyle: CSSStyleDeclaration = getComputedStyle(this.toolbar);\n\t\tconst paddingLeft: number = Number.parseFloat(toolbarStyle.paddingLeft) || 0;\n\t\tconst paddingRight: number = Number.parseFloat(toolbarStyle.paddingRight) || 0;\n\t\treturn this.toolbar.clientWidth - paddingLeft - paddingRight;\n\t}\n\n\tprivate resetVisibility(): void {\n\t\tfor (const entry of this.entries) {\n\t\t\tentry.element.classList.remove(HIDDEN_BTN_CLASS);\n\t\t}\n\t\tconst separators: HTMLElement[] = Array.from(\n\t\t\tthis.toolbar.querySelectorAll('.notectl-toolbar-separator'),\n\t\t) as HTMLElement[];\n\t\tfor (const sep of separators) {\n\t\t\tsep.classList.remove(HIDDEN_SEP_CLASS);\n\t\t}\n\t}\n\n\t// --- Overflow Button ---\n\n\tprivate setOverflowButtonVisible(visible: boolean): void {\n\t\tif (!this.overflowButton) return;\n\t\tthis.overflowButton.classList.toggle(HIDDEN_OVERFLOW_CLASS, !visible);\n\t\tif (!visible) {\n\t\t\tthis.overflowButton.removeAttribute('tabindex');\n\t\t}\n\t}\n\n\tprivate ensureOverflowButton(): void {\n\t\tif (this.overflowButton) return;\n\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = 'notectl-toolbar-overflow-btn';\n\t\tbtn.setAttribute('aria-label', this.ariaLabel);\n\t\tbtn.setAttribute('aria-haspopup', 'true');\n\t\tbtn.setAttribute('aria-expanded', 'false');\n\t\tbtn.innerHTML = ELLIPSIS_SVG;\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tthis.toggleDropdown();\n\t\t});\n\n\t\tthis.toolbar.appendChild(btn);\n\t\tthis.overflowButton = btn;\n\t}\n\n\t// --- Dropdown ---\n\n\tprivate toggleDropdown(): void {\n\t\tif (this.overflowDropdown) {\n\t\t\tthis.closeDropdown();\n\t\t} else {\n\t\t\tthis.openDropdown();\n\t\t}\n\t}\n\n\tprivate openDropdown(): void {\n\t\tif (!this.overflowButton || this.overflowEntries.length === 0) return;\n\n\t\tconst dropdown: HTMLDivElement = document.createElement('div');\n\t\tdropdown.className = 'notectl-toolbar-popup notectl-dropdown';\n\t\tdropdown.setAttribute('role', 'menu');\n\n\t\tthis.renderDropdownItems(dropdown, this.context.getState());\n\n\t\tif (this.popupManager) {\n\t\t\tthis.overflowHandle = this.popupManager.open({\n\t\t\t\tanchor: this.overflowButton,\n\t\t\t\tclassName: 'notectl-toolbar-popup notectl-dropdown',\n\t\t\t\tariaRole: 'menu',\n\t\t\t\tposition: 'below-end',\n\t\t\t\treferenceNode: this.overflowButton,\n\t\t\t\trestoreFocusTo: this.overflowButton,\n\t\t\t\tonClose: () => {\n\t\t\t\t\tthis.overflowHandle = null;\n\t\t\t\t\tthis.overflowDropdown = null;\n\t\t\t\t\tif (this.overflowButton) {\n\t\t\t\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcontent: (popup: HTMLElement) => {\n\t\t\t\t\tthis.renderDropdownItems(popup, this.context.getState());\n\t\t\t\t\tthis.overflowDropdown = popup;\n\t\t\t\t\tpopup.addEventListener('keydown', (e: KeyboardEvent) => this.handleDropdownKeydown(e));\n\t\t\t\t},\n\t\t\t});\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'true');\n\t\t} else {\n\t\t\tthis.positionDropdown(dropdown);\n\t\t\tappendToRoot(dropdown, this.overflowButton);\n\t\t\tthis.overflowDropdown = dropdown;\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'true');\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst first: HTMLElement | null = dropdown.querySelector('[role=\"menuitem\"]');\n\t\t\t\tfirst?.focus();\n\t\t\t});\n\n\t\t\tdropdown.addEventListener('keydown', (e: KeyboardEvent) => this.handleDropdownKeydown(e));\n\t\t\tthis.registerCloseHandler();\n\t\t}\n\t}\n\n\tprivate renderDropdownItems(dropdown: HTMLElement, state: EditorState): void {\n\t\tlet lastGroup: string | null = null;\n\n\t\tfor (const entry of this.overflowEntries) {\n\t\t\tif (lastGroup !== null && entry.item.group !== lastGroup) {\n\t\t\t\tconst sep: HTMLDivElement = document.createElement('div');\n\t\t\t\tsep.className = 'notectl-dropdown__separator';\n\t\t\t\tsep.setAttribute('role', 'separator');\n\t\t\t\tdropdown.appendChild(sep);\n\t\t\t}\n\t\t\tlastGroup = entry.item.group;\n\n\t\t\tconst menuBtn: HTMLButtonElement = document.createElement('button');\n\t\t\tmenuBtn.type = 'button';\n\t\t\tmenuBtn.className = 'notectl-dropdown__item';\n\t\t\tmenuBtn.setAttribute('role', 'menuitem');\n\t\t\tmenuBtn.setAttribute('tabindex', '-1');\n\t\t\tmenuBtn.setAttribute('data-toolbar-item', entry.item.id);\n\n\t\t\tconst iconSpan: HTMLSpanElement = document.createElement('span');\n\t\t\ticonSpan.className = 'notectl-dropdown__item-icon';\n\t\t\tif (entry.item.popupType !== 'combobox') {\n\t\t\t\ticonSpan.innerHTML = entry.item.icon;\n\t\t\t}\n\t\t\tmenuBtn.appendChild(iconSpan);\n\n\t\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tlabelSpan.className = 'notectl-dropdown__item-label';\n\t\t\tlabelSpan.textContent =\n\t\t\t\tentry.item.popupType === 'combobox'\n\t\t\t\t\t? entry.item.getLabel(state)\n\t\t\t\t\t: (entry.item.tooltip ?? entry.item.label);\n\t\t\tmenuBtn.appendChild(labelSpan);\n\n\t\t\tmenuBtn.addEventListener('mousedown', (ev: MouseEvent) => {\n\t\t\t\tev.preventDefault();\n\t\t\t\tev.stopPropagation();\n\t\t\t\tthis.activateOverflowItem(entry);\n\t\t\t});\n\n\t\t\tdropdown.appendChild(menuBtn);\n\t\t}\n\t}\n\n\tprivate positionDropdown(dropdown: HTMLElement): void {\n\t\tif (!this.overflowButton) return;\n\n\t\tconst rect: DOMRect = this.overflowButton.getBoundingClientRect();\n\t\tconst rtl: boolean = isRtlContext(this.toolbar);\n\n\t\tif (rtl) {\n\t\t\tsetStyleProperties(dropdown, {\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: `${rect.bottom + 2}px`,\n\t\t\t\tleft: `${rect.left}px`,\n\t\t\t\tright: 'auto',\n\t\t\t\tzIndex: '10000',\n\t\t\t});\n\t\t} else {\n\t\t\tconst rightEdge: number = window.innerWidth - rect.right;\n\t\t\tsetStyleProperties(dropdown, {\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: `${rect.bottom + 2}px`,\n\t\t\t\tright: `${rightEdge}px`,\n\t\t\t\tleft: 'auto',\n\t\t\t\tzIndex: '10000',\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate registerCloseHandler(): void {\n\t\tthis.closeHandler = (ev: MouseEvent) => {\n\t\t\tconst path: EventTarget[] = ev.composedPath();\n\t\t\tif (\n\t\t\t\tthis.overflowDropdown &&\n\t\t\t\t!path.includes(this.overflowDropdown) &&\n\t\t\t\tthis.overflowButton &&\n\t\t\t\t!path.includes(this.overflowButton)\n\t\t\t) {\n\t\t\t\tthis.closeDropdown();\n\t\t\t}\n\t\t};\n\t\tthis.closeHandlerTimer = setTimeout(() => {\n\t\t\tthis.closeHandlerTimer = null;\n\t\t\tif (!this.closeHandler || !this.overflowDropdown) return;\n\t\t\tdocument.addEventListener('mousedown', this.closeHandler);\n\t\t\tthis.closeHandlerAttached = true;\n\t\t}, 0);\n\t}\n\n\tprivate closeDropdown(): void {\n\t\tif (this.overflowHandle) {\n\t\t\tconst handle: PopupHandle = this.overflowHandle;\n\t\t\tthis.overflowHandle = null;\n\t\t\tthis.overflowDropdown = null;\n\t\t\thandle.close();\n\t\t\tif (this.overflowButton) {\n\t\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.overflowDropdown) {\n\t\t\tthis.overflowDropdown.remove();\n\t\t\tthis.overflowDropdown = null;\n\t\t}\n\t\tif (this.overflowButton) {\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t}\n\t\tif (this.closeHandler) {\n\t\t\tif (this.closeHandlerTimer !== null) {\n\t\t\t\tclearTimeout(this.closeHandlerTimer);\n\t\t\t\tthis.closeHandlerTimer = null;\n\t\t\t}\n\t\t\tif (this.closeHandlerAttached) {\n\t\t\t\tdocument.removeEventListener('mousedown', this.closeHandler);\n\t\t\t\tthis.closeHandlerAttached = false;\n\t\t\t}\n\t\t\tthis.closeHandler = null;\n\t\t}\n\t}\n\n\tprivate activateOverflowItem(entry: OverflowEntry): void {\n\t\tthis.closeDropdown();\n\t\tif (entry.item.popupType && this.overflowButton) {\n\t\t\tthis.onItemActivated(this.overflowButton, entry.item);\n\t\t} else {\n\t\t\tthis.context.executeCommand(entry.item.command);\n\t\t}\n\t}\n\n\t// --- Keyboard Navigation ---\n\n\tprivate handleDropdownKeydown(e: KeyboardEvent): void {\n\t\tif (!this.overflowDropdown) return;\n\n\t\tif (e.key === 'Escape' || e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.closeDropdown();\n\t\t\tthis.overflowButton?.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst items: HTMLElement[] = Array.from(\n\t\t\tthis.overflowDropdown.querySelectorAll('[role=\"menuitem\"]'),\n\t\t) as HTMLElement[];\n\t\tconst current: number = items.indexOf(this.getActiveElement() as HTMLElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(items, current, 1);\n\t\t\t\titems[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(items, current, -1);\n\t\t\t\titems[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focusedItem: HTMLElement | undefined = items[current];\n\t\t\t\tif (!focusedItem) break;\n\t\t\t\tconst itemId: string | null = focusedItem.getAttribute('data-toolbar-item');\n\t\t\t\tconst entry: OverflowEntry | undefined = this.overflowEntries.find(\n\t\t\t\t\t(oe) => oe.item.id === itemId,\n\t\t\t\t);\n\t\t\t\tif (entry) this.activateOverflowItem(entry);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Helpers ---\n\n\tprivate hideTrailingSeparators(): void {\n\t\tconst children: HTMLElement[] = Array.from(this.toolbar.children) as HTMLElement[];\n\t\tfor (let i = children.length - 1; i >= 0; i--) {\n\t\t\tconst child: HTMLElement | undefined = children[i];\n\t\t\tif (!child || child === this.overflowButton) continue;\n\t\t\tif (child.classList.contains('notectl-toolbar-separator')) {\n\t\t\t\tif (!child.classList.contains(HIDDEN_SEP_CLASS)) {\n\t\t\t\t\tchild.classList.add(HIDDEN_SEP_CLASS);\n\t\t\t\t}\n\t\t\t} else if (!child.classList.contains(HIDDEN_BTN_CLASS)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate notifyChange(): void {\n\t\tconst visible: HTMLButtonElement[] = this.entries\n\t\t\t.filter((oe) => !oe.element.classList.contains(HIDDEN_BTN_CLASS))\n\t\t\t.map((oe) => oe.element);\n\t\tthis.onOverflowChange(visible, this.overflowEntries.length > 0 ? this.overflowButton : null);\n\t}\n}\n","/**\n * ToolbarRenderers: pure rendering functions for toolbar popup content.\n * Grid pickers, dropdown menus, and separator elements.\n */\n\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\nimport type { DropdownConfig, GridPickerConfig } from './ToolbarItem.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale } from './ToolbarLocale.js';\n\nconst HIGHLIGHTED_CLASS = 'notectl-grid-picker__cell--highlighted';\n\n/**\n * Renders a grid picker into the given container.\n * Calls `onClose` after a cell is selected so the popup can be dismissed.\n */\nexport function renderGridPicker(\n\tcontainer: HTMLElement,\n\tconfig: GridPickerConfig,\n\tonClose: () => void,\n\tlocale: ToolbarLocale = TOOLBAR_LOCALE_EN,\n): void {\n\tcontainer.className += ' notectl-grid-picker';\n\n\tconst grid: HTMLDivElement = document.createElement('div');\n\tgrid.className = 'notectl-grid-picker__grid';\n\tgrid.setAttribute('role', 'grid');\n\tsetStyleProperties(grid, {\n\t\tdisplay: 'grid',\n\t\tgridTemplateColumns: `repeat(${config.maxCols}, 1fr)`,\n\t\tgap: '2px',\n\t\tpadding: '8px',\n\t});\n\n\tconst label: HTMLDivElement = document.createElement('div');\n\tlabel.className = 'notectl-grid-picker__label';\n\tlabel.textContent = locale.gridPickerLabel(1, 1);\n\tsetStyleProperties(label, {\n\t\ttextAlign: 'center',\n\t\tpadding: '4px',\n\t\tfontSize: '12px',\n\t});\n\tlabel.setAttribute('aria-live', 'polite');\n\n\tfor (let r = 1; r <= config.maxRows; r++) {\n\t\tfor (let c = 1; c <= config.maxCols; c++) {\n\t\t\tconst cell: HTMLDivElement = document.createElement('div');\n\t\t\tcell.className = 'notectl-grid-picker__cell';\n\t\t\tcell.setAttribute('role', 'gridcell');\n\t\t\tcell.setAttribute('tabindex', '-1');\n\t\t\tcell.setAttribute('aria-label', locale.gridPickerLabel(r, c));\n\t\t\tsetStyleProperties(cell, {\n\t\t\t\twidth: '20px',\n\t\t\t\theight: '20px',\n\t\t\t\tborder: '1px solid #ccc',\n\t\t\t\tcursor: 'pointer',\n\t\t\t});\n\t\t\tcell.setAttribute('data-row', String(r));\n\t\t\tcell.setAttribute('data-col', String(c));\n\n\t\t\tcell.addEventListener('mouseenter', () => {\n\t\t\t\thighlightCells(grid, r, c);\n\t\t\t\tlabel.textContent = locale.gridPickerLabel(r, c);\n\t\t\t});\n\n\t\t\tcell.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t\tcell.addEventListener('click', () => {\n\t\t\t\tconfig.onSelect(r, c);\n\t\t\t\tonClose();\n\t\t\t});\n\n\t\t\tgrid.appendChild(cell);\n\t\t}\n\t}\n\n\tcontainer.appendChild(grid);\n\tcontainer.appendChild(label);\n}\n\n/**\n * Highlights grid cells up to the given row/col and updates the label.\n * Used by both mouse hover and keyboard navigation.\n */\nexport function highlightCells(grid: HTMLElement, targetRow: number, targetCol: number): void {\n\tconst cells: NodeListOf<Element> = grid.querySelectorAll('.notectl-grid-picker__cell');\n\tfor (const cell of cells) {\n\t\tconst r: number = Number(cell.getAttribute('data-row'));\n\t\tconst c: number = Number(cell.getAttribute('data-col'));\n\t\tcell.classList.toggle(HIGHLIGHTED_CLASS, r <= targetRow && c <= targetCol);\n\t}\n}\n\n/**\n * Renders a dropdown menu into the given container.\n * Calls `onClose` after an item is activated so the popup can be dismissed.\n */\nexport function renderDropdown(\n\tcontainer: HTMLElement,\n\tconfig: DropdownConfig,\n\texecuteCommand: (command: string) => void,\n\tonClose: () => void,\n): void {\n\tcontainer.classList.add('notectl-dropdown');\n\tcontainer.setAttribute('role', 'menu');\n\n\tfor (const item of config.items) {\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = 'notectl-dropdown__item';\n\t\tbtn.setAttribute('role', 'menuitem');\n\t\tbtn.setAttribute('tabindex', '-1');\n\n\t\tif (item.icon) {\n\t\t\tconst iconSpan: HTMLSpanElement = document.createElement('span');\n\t\t\ticonSpan.className = 'notectl-dropdown__item-icon';\n\t\t\ticonSpan.innerHTML = item.icon;\n\t\t\tbtn.appendChild(iconSpan);\n\t\t}\n\n\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\tlabelSpan.className = 'notectl-dropdown__item-label';\n\t\tlabelSpan.textContent = item.label;\n\t\tbtn.appendChild(labelSpan);\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tbtn.addEventListener('click', () => {\n\t\t\texecuteCommand(item.command);\n\t\t\tonClose();\n\t\t});\n\n\t\tcontainer.appendChild(btn);\n\t}\n}\n\n/** Creates a toolbar group separator element. */\nexport function createSeparator(): HTMLSpanElement {\n\tconst sep: HTMLSpanElement = document.createElement('span');\n\tsep.className = 'notectl-toolbar-separator';\n\tsep.setAttribute('role', 'separator');\n\treturn sep;\n}\n","/**\n * ToolbarPopupController: manages popup lifecycle, positioning, keyboard\n * navigation, and auto-close for toolbar popups (grid pickers, dropdowns,\n * and custom popups). Delegates lifecycle to PopupManager.\n */\n\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { findNextDropdownItem, navigateGrid } from '../shared/KeyboardNav.js';\nimport type { PopupCloseOptions, PopupHandle, PopupManager } from '../shared/PopupManager.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale } from './ToolbarLocale.js';\nimport { highlightCells, renderDropdown, renderGridPicker } from './ToolbarRenderers.js';\n\nexport class ToolbarPopupController {\n\tprivate activePopup: HTMLElement | null = null;\n\tprivate activePopupButton: HTMLButtonElement | null = null;\n\tprivate activeHandle: PopupHandle | null = null;\n\tprivate readonly getActiveElement: () => Element | null;\n\tprivate readonly locale: ToolbarLocale;\n\tprivate popupManager: PopupManager | null = null;\n\n\tconstructor(getActiveElement: () => Element | null, locale: ToolbarLocale = TOOLBAR_LOCALE_EN) {\n\t\tthis.getActiveElement = getActiveElement;\n\t\tthis.locale = locale;\n\t}\n\n\t/** Injects the PopupManager instance (called after service registration). */\n\tsetPopupManager(manager: PopupManager): void {\n\t\tthis.popupManager = manager;\n\t}\n\n\t/** Whether a popup is currently open. */\n\tisOpen(): boolean {\n\t\treturn this.activePopup !== null;\n\t}\n\n\t/** Toggles a popup for the given toolbar button. */\n\ttoggle(button: HTMLButtonElement, item: ToolbarItem, context: PluginContext): void {\n\t\tif (this.activePopup) {\n\t\t\tthis.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.openViaManager(button, item, context);\n\t}\n\n\t/** Closes the active popup and cleans up event listeners. */\n\tclose(): void {\n\t\tif (this.activeHandle) {\n\t\t\t// Prevent onClose callback from re-entering\n\t\t\tconst handle: PopupHandle = this.activeHandle;\n\t\t\tthis.activeHandle = null;\n\t\t\tthis.clearButtonState();\n\t\t\thandle.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearButtonState();\n\t\tif (this.activePopup) {\n\t\t\tthis.activePopup.remove();\n\t\t\tthis.activePopup = null;\n\t\t}\n\t}\n\n\t/** Closes popup and restores focus to the trigger button. */\n\tcloseAndRestoreFocus(): void {\n\t\tconst triggerBtn: HTMLButtonElement | null = this.activePopupButton;\n\t\tthis.close();\n\t\ttriggerBtn?.focus();\n\t}\n\n\tdestroy(): void {\n\t\tthis.close();\n\t}\n\n\t// --- PopupManager path ---\n\n\tprivate openViaManager(\n\t\tbutton: HTMLButtonElement,\n\t\titem: ToolbarItem,\n\t\tcontext: PluginContext,\n\t): void {\n\t\tif (!this.popupManager) return;\n\n\t\tthis.activePopupButton = button;\n\t\tbutton.classList.add('notectl-toolbar-btn--popup-open');\n\t\tbutton.setAttribute('aria-expanded', 'true');\n\n\t\tthis.activeHandle = this.popupManager.open({\n\t\t\tanchor: button,\n\t\t\tclassName: 'notectl-toolbar-popup',\n\t\t\treferenceNode: button,\n\t\t\trestoreFocusTo: button,\n\t\t\tposition: 'below-start',\n\t\t\tonClose: () => {\n\t\t\t\t// Called when PopupManager closes the popup (click-outside, etc.)\n\t\t\t\tthis.activeHandle = null;\n\t\t\t\tthis.clearButtonState();\n\t\t\t\tthis.activePopup = null;\n\t\t\t},\n\t\t\tcontent: (popup: HTMLElement, close: (options?: PopupCloseOptions) => void) => {\n\t\t\t\tthis.activePopup = popup;\n\t\t\t\tthis.renderPopupContent(popup, item, context, close);\n\t\t\t\tpopup.addEventListener('keydown', (e: KeyboardEvent) => this.handlePopupKeydown(e));\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- Shared rendering ---\n\n\tprivate renderPopupContent(\n\t\tpopup: HTMLElement,\n\t\titem: ToolbarItem,\n\t\tcontext: PluginContext,\n\t\tclose: (options?: PopupCloseOptions) => void,\n\t): void {\n\t\tconst closeAndFocusEditor = (): void => {\n\t\t\tclose({ restoreFocusTo: null });\n\t\t\tcontext.getContainer().focus();\n\t\t};\n\n\t\tswitch (item.popupType) {\n\t\t\tcase 'gridPicker':\n\t\t\t\trenderGridPicker(popup, item.popupConfig, closeAndFocusEditor, this.locale);\n\t\t\t\tbreak;\n\t\t\tcase 'dropdown':\n\t\t\t\trenderDropdown(\n\t\t\t\t\tpopup,\n\t\t\t\t\titem.popupConfig,\n\t\t\t\t\t(cmd: string) => context.executeCommand(cmd),\n\t\t\t\t\tcloseAndFocusEditor,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'custom':\n\t\t\t\titem.renderPopup(popup, context, close);\n\t\t\t\tbreak;\n\t\t\tcase 'combobox':\n\t\t\t\titem.renderPopup(popup, context, close);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// --- Button state ---\n\n\tprivate clearButtonState(): void {\n\t\tif (this.activePopupButton) {\n\t\t\tthis.activePopupButton.classList.remove('notectl-toolbar-btn--popup-open');\n\t\t\tthis.activePopupButton.setAttribute('aria-expanded', 'false');\n\t\t\tthis.activePopupButton = null;\n\t\t}\n\t}\n\n\t// --- Keyboard Navigation ---\n\n\tprivate handlePopupKeydown(e: KeyboardEvent): void {\n\t\tif (!this.activePopup) return;\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.closeAndRestoreFocus();\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\tthis.closeAndRestoreFocus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst menuItems: NodeListOf<Element> = this.activePopup.querySelectorAll('[role=\"menuitem\"]');\n\t\tif (menuItems.length > 0) {\n\t\t\tthis.handleDropdownKeydown(e, menuItems);\n\t\t\treturn;\n\t\t}\n\n\t\tconst hasGrid: boolean = this.activePopup.querySelector('.notectl-grid-picker__cell') !== null;\n\t\tif (hasGrid) {\n\t\t\tthis.handleGridKeydown(e);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.handleCustomPopupKeydown(e);\n\t}\n\n\tprivate handleDropdownKeydown(e: KeyboardEvent, items: NodeListOf<Element>): void {\n\t\tconst itemArr: HTMLElement[] = Array.from(items) as HTMLElement[];\n\t\tconst current: number = itemArr.indexOf(this.getActiveElement() as HTMLElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(itemArr, current, 1);\n\t\t\t\titemArr[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(itemArr, current, -1);\n\t\t\t\titemArr[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focused: HTMLElement | undefined = itemArr[current];\n\t\t\t\tif (focused) focused.click();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleGridKeydown(e: KeyboardEvent): void {\n\t\tconst focused: HTMLElement = this.getActiveElement() as HTMLElement;\n\t\tconst row: number = Number(focused?.getAttribute('data-row') ?? 1);\n\t\tconst col: number = Number(focused?.getAttribute('data-col') ?? 1);\n\n\t\tconst grid: Element | null =\n\t\t\tthis.activePopup?.querySelector('.notectl-grid-picker__grid') ?? null;\n\t\tif (!grid) return;\n\n\t\tconst lastCell: Element | null = grid.querySelector('.notectl-grid-picker__cell:last-child');\n\t\tconst maxCols: number = Number(lastCell?.getAttribute('data-col') ?? 1);\n\t\tconst maxRows: number = Number(lastCell?.getAttribute('data-row') ?? 1);\n\n\t\tif (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\tconst [newRow, newCol]: [number, number] = navigateGrid(\n\t\t\t\trow,\n\t\t\t\tcol,\n\t\t\t\tmaxRows,\n\t\t\t\tmaxCols,\n\t\t\t\te.key as 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n\t\t\t\tthis.activePopup ? isRtlContext(this.activePopup) : false,\n\t\t\t);\n\t\t\tconst target: HTMLElement | null = grid.querySelector(\n\t\t\t\t`.notectl-grid-picker__cell[data-row=\"${newRow}\"][data-col=\"${newCol}\"]`,\n\t\t\t);\n\t\t\ttarget?.focus();\n\n\t\t\thighlightCells(grid as HTMLElement, newRow, newCol);\n\t\t\tconst label: Element | null =\n\t\t\t\tthis.activePopup?.querySelector('.notectl-grid-picker__label') ?? null;\n\t\t\tif (label) label.textContent = this.locale.gridPickerLabel(newRow, newCol);\n\t\t}\n\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\tfocused?.click();\n\t\t}\n\t}\n\n\tprivate handleCustomPopupKeydown(e: KeyboardEvent): void {\n\t\tif (!this.activePopup) return;\n\t\tconst buttons: HTMLButtonElement[] = Array.from(this.activePopup.querySelectorAll('button'));\n\t\tif (buttons.length === 0) return;\n\t\tconst active: HTMLElement = this.getActiveElement() as HTMLElement;\n\t\tconst currentIdx: number = buttons.indexOf(active as HTMLButtonElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(buttons, currentIdx, 1);\n\t\t\t\tbuttons[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(buttons, currentIdx, -1);\n\t\t\t\tbuttons[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (active) {\n\t\t\t\t\tactive.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * ToolbarTooltip: manages the tooltip lifecycle for toolbar buttons.\n * Shows a tooltip after a short delay when hovering or focusing a button,\n * hides it when the cursor leaves or focus moves away.\n */\n\nimport { setStyleProperties, setStyleProperty } from '../../style/StyleRuntime.js';\n\nconst TOOLTIP_DELAY_MS = 500;\n\nexport class ToolbarTooltip {\n\tprivate readonly element: HTMLElement;\n\tprivate timer: ReturnType<typeof setTimeout> | null = null;\n\tprivate target: HTMLButtonElement | null = null;\n\tprivate readonly isPopupActive: () => boolean;\n\n\tstatic readonly TOOLTIP_ID = 'notectl-toolbar-tooltip';\n\n\tconstructor(isPopupActive: () => boolean) {\n\t\tthis.isPopupActive = isPopupActive;\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'notectl-toolbar-tooltip';\n\t\tthis.element.id = ToolbarTooltip.TOOLTIP_ID;\n\t\tthis.element.setAttribute('role', 'tooltip');\n\t\tsetStyleProperty(this.element, 'display', 'none');\n\t}\n\n\tshow(button: HTMLButtonElement): void {\n\t\tthis.hide();\n\n\t\tif (this.isPopupActive() || button.disabled) return;\n\n\t\tconst text: string | null = button.getAttribute('data-tooltip');\n\t\tif (!text) return;\n\n\t\tthis.target = button;\n\n\t\tthis.timer = setTimeout(() => {\n\t\t\tif (this.isPopupActive()) return;\n\n\t\t\tthis.element.textContent = text;\n\t\t\tsetStyleProperty(this.element, 'display', '');\n\n\t\t\tconst root: Node = button.getRootNode();\n\t\t\tif (root instanceof ShadowRoot && !this.element.parentNode) {\n\t\t\t\troot.appendChild(this.element);\n\t\t\t} else if (!(root instanceof ShadowRoot) && !this.element.parentNode) {\n\t\t\t\tdocument.body.appendChild(this.element);\n\t\t\t}\n\n\t\t\tbutton.setAttribute('aria-describedby', ToolbarTooltip.TOOLTIP_ID);\n\n\t\t\tconst rect: DOMRect = button.getBoundingClientRect();\n\t\t\tsetStyleProperties(this.element, {\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: `${rect.bottom + 6}px`,\n\t\t\t\tleft: `${rect.left + rect.width / 2}px`,\n\t\t\t\ttransform: 'translateX(-50%)',\n\t\t\t});\n\t\t}, TOOLTIP_DELAY_MS);\n\t}\n\n\thide(): void {\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = null;\n\t\t}\n\t\tif (this.target) {\n\t\t\tthis.target.removeAttribute('aria-describedby');\n\t\t\tthis.target = null;\n\t\t}\n\t\tsetStyleProperty(this.element, 'display', 'none');\n\t}\n\n\tdestroy(): void {\n\t\tthis.hide();\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * Toolbar plugin: renders toolbar items registered by other plugins.\n * Acts as a pure rendering engine — has no knowledge of specific features.\n * Supports buttons, dropdowns, grid pickers, and custom popups.\n * Implements WAI-ARIA Toolbar pattern with roving tabindex.\n */\n\nimport { TOOLBAR_CSS } from '../../editor/styles/toolbar.js';\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { ServiceKey } from '../Plugin.js';\nimport type { Plugin, PluginConfig, PluginContext } from '../Plugin.js';\nimport { applyRovingTabindex } from '../shared/KeyboardNav.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { PopupManager, PopupServiceKey } from '../shared/PopupManager.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\nimport {\n\tfindFirstEnabled,\n\tfindLastEnabled,\n\tfindNextEnabled,\n\tresolveHorizontalDirection,\n} from './ToolbarKeyboardNav.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale, loadToolbarLocale } from './ToolbarLocale.js';\nimport {\n\tToolbarOverflowBehavior,\n\ttype ToolbarOverflowBehavior as ToolbarOverflowBehaviorType,\n} from './ToolbarOverflowBehavior.js';\nimport { ToolbarOverflowController } from './ToolbarOverflowController.js';\nimport { ToolbarPopupController } from './ToolbarPopupController.js';\nimport { createSeparator } from './ToolbarRenderers.js';\nimport { ToolbarTooltip } from './ToolbarTooltip.js';\n\n// --- Layout Config ---\n\nexport interface ToolbarLayoutConfig {\n\treadonly groups: ReadonlyArray<ReadonlyArray<string>>;\n\t/**\n\t * Controls responsive overflow behavior when toolbar items exceed available width.\n\t * Defaults to `ToolbarOverflowBehavior.BurgerMenu`.\n\t */\n\treadonly overflow?: ToolbarOverflowBehaviorType;\n}\n\n// --- Typed Service API ---\n\nexport interface ToolbarServiceAPI {\n\t/** Re-reads isActive/isEnabled from state and updates all buttons. */\n\trefresh(): void;\n\t/** Closes the currently open popup, if any. */\n\tclosePopup(): void;\n}\n\nexport const ToolbarServiceKey = new ServiceKey<ToolbarServiceAPI>('toolbar');\n\n// --- Plugin ---\n\ninterface ToolbarButton {\n\telement: HTMLButtonElement;\n\titem: ToolbarItem;\n\tcomboLabelEl: HTMLSpanElement | null;\n}\n\nexport class ToolbarPlugin implements Plugin {\n\treadonly id = 'toolbar';\n\treadonly name = 'Toolbar';\n\treadonly priority = 10;\n\n\tprivate context: PluginContext | null = null;\n\tprivate toolbarElement: HTMLElement | null = null;\n\tprivate buttons: ToolbarButton[] = [];\n\tprivate readonly hiddenItems = new Set<string>();\n\tprivate readonly layoutConfig: ToolbarLayoutConfig | null;\n\tprivate overflowBehavior: ToolbarOverflowBehaviorType;\n\tprivate focusedIndex = 0;\n\tprivate tooltip: ToolbarTooltip | null = null;\n\tprivate popupController: ToolbarPopupController | null = null;\n\tprivate popupManager: PopupManager | null = null;\n\tprivate overflowController: ToolbarOverflowController | null = null;\n\tprivate visibleElements: HTMLButtonElement[] = [];\n\tprivate locale!: ToolbarLocale;\n\n\tconstructor(layoutConfig?: ToolbarLayoutConfig) {\n\t\tthis.layoutConfig = layoutConfig ?? null;\n\t\tthis.overflowBehavior = layoutConfig?.overflow ?? ToolbarOverflowBehavior.BurgerMenu;\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(context, undefined, TOOLBAR_LOCALE_EN, loadToolbarLocale);\n\t\tcontext.registerStyleSheet(TOOLBAR_CSS);\n\t\tthis.context = context;\n\n\t\tthis.popupManager = new PopupManager(context.getContainer());\n\t\tcontext.registerService(PopupServiceKey, this.popupManager);\n\n\t\tthis.popupController = new ToolbarPopupController(() => this.getActiveElement(), this.locale);\n\t\tthis.popupController.setPopupManager(this.popupManager);\n\t\tthis.tooltip = new ToolbarTooltip(() => this.popupController?.isOpen() ?? false);\n\n\t\tcontext.registerService(ToolbarServiceKey, {\n\t\t\trefresh: () => this.updateButtonStates(context.getState()),\n\t\t\tclosePopup: () => this.popupController?.close(),\n\t\t});\n\n\t\tthis.createToolbarElement();\n\t}\n\n\t/** Returns the current overflow behavior. */\n\tgetOverflowBehavior(): ToolbarOverflowBehaviorType {\n\t\treturn this.overflowBehavior;\n\t}\n\n\t/** Switches the overflow behavior at runtime. */\n\tsetOverflowBehavior(behavior: ToolbarOverflowBehaviorType): void {\n\t\tif (behavior === this.overflowBehavior) return;\n\n\t\tthis.overflowBehavior = behavior;\n\t\tthis.applyOverflowBehavior();\n\t\tthis.renderItems();\n\t}\n\n\tonReady(): void {\n\t\tthis.renderItems();\n\t}\n\n\tdestroy(): void {\n\t\tthis.overflowController?.destroy();\n\t\tthis.overflowController = null;\n\t\tthis.popupController?.destroy();\n\t\tthis.popupController = null;\n\t\tthis.popupManager?.destroy();\n\t\tthis.popupManager = null;\n\t\tthis.tooltip?.destroy();\n\t\tthis.tooltip = null;\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.remove();\n\t\t\tthis.toolbarElement = null;\n\t\t}\n\t\tthis.buttons = [];\n\t\tthis.visibleElements = [];\n\t\tthis.context = null;\n\t}\n\n\tonStateChange(_oldState: EditorState, newState: EditorState, _tr: Transaction): void {\n\t\tthis.updateButtonStates(newState);\n\t}\n\n\tonReadOnlyChange(readonly: boolean): void {\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.hidden = readonly;\n\t\t}\n\t}\n\n\tonConfigure(config: PluginConfig): void {\n\t\tfor (const [key, value] of Object.entries(config)) {\n\t\t\tif (value === false) {\n\t\t\t\tthis.hiddenItems.add(key);\n\t\t\t} else {\n\t\t\t\tthis.hiddenItems.delete(key);\n\t\t\t}\n\t\t}\n\t\tthis.renderItems();\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate createToolbarElement(): void {\n\t\tif (!this.context) return;\n\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.remove();\n\t\t}\n\t\tthis.buttons = [];\n\n\t\tconst container: HTMLElement = this.context.getPluginContainer('top');\n\t\tthis.toolbarElement = document.createElement('div');\n\t\tthis.toolbarElement.setAttribute('role', 'toolbar');\n\t\tthis.toolbarElement.setAttribute('aria-label', this.locale.formattingOptionsAria);\n\t\tthis.toolbarElement.setAttribute('data-notectl-no-print', '');\n\t\tthis.toolbarElement.className = 'notectl-toolbar';\n\n\t\tthis.toolbarElement.addEventListener('keydown', (e) => this.handleToolbarKeydown(e));\n\n\t\tthis.applyOverflowBehavior();\n\t\tcontainer.appendChild(this.toolbarElement);\n\t}\n\n\t/** Applies the current overflow behavior: creates/destroys the overflow controller and sets the data attribute. */\n\tprivate applyOverflowBehavior(): void {\n\t\tif (!this.toolbarElement || !this.context) return;\n\n\t\t// Tear down existing overflow controller\n\t\tthis.overflowController?.destroy();\n\t\tthis.overflowController = null;\n\n\t\tthis.toolbarElement.setAttribute('data-overflow', this.overflowBehavior);\n\n\t\tif (this.overflowBehavior === ToolbarOverflowBehavior.BurgerMenu) {\n\t\t\tthis.overflowController = new ToolbarOverflowController({\n\t\t\t\ttoolbar: this.toolbarElement,\n\t\t\t\tariaLabel: this.locale.moreToolsAria,\n\t\t\t\tcontext: this.context,\n\t\t\t\tpopupManager: this.popupManager ?? undefined,\n\t\t\t\tonOverflowChange: (visibleButtons, overflowBtn) => {\n\t\t\t\t\tthis.visibleElements = overflowBtn\n\t\t\t\t\t\t? [...visibleButtons, overflowBtn]\n\t\t\t\t\t\t: [...visibleButtons];\n\t\t\t\t\tthis.initRovingTabindex();\n\t\t\t\t},\n\t\t\t\tonItemActivated: (btn: HTMLButtonElement, item: ToolbarItem) => {\n\t\t\t\t\tthis.activateButton(btn, item);\n\t\t\t\t},\n\t\t\t\tgetActiveElement: () => this.getActiveElement(),\n\t\t\t});\n\t\t} else {\n\t\t\t// Flow and None modes: all buttons are visible for roving tabindex\n\t\t\tthis.visibleElements = [];\n\t\t}\n\t}\n\n\tprivate renderItems(): void {\n\t\tif (!this.context || !this.toolbarElement) return;\n\n\t\tfor (const btn of this.buttons) {\n\t\t\tbtn.element.remove();\n\t\t}\n\t\tthis.buttons = [];\n\n\t\tfor (const sep of this.toolbarElement.querySelectorAll('.notectl-toolbar-separator')) {\n\t\t\tsep.remove();\n\t\t}\n\n\t\tif (this.layoutConfig) {\n\t\t\tthis.renderItemsByLayout();\n\t\t} else {\n\t\t\tthis.renderItemsByGroup();\n\t\t}\n\n\t\tif (this.buttons.length > 0 && !this.toolbarElement.parentElement) {\n\t\t\tconst container: HTMLElement = this.context.getPluginContainer('top');\n\t\t\tcontainer.appendChild(this.toolbarElement);\n\t\t}\n\n\t\tthis.overflowController?.update(this.buttons);\n\t\tthis.initRovingTabindex();\n\t\tthis.updateButtonStates(this.context.getState());\n\t}\n\n\t// --- Roving Tabindex ---\n\n\tprivate getTabElements(): HTMLButtonElement[] {\n\t\treturn this.visibleElements.length > 0\n\t\t\t? this.visibleElements\n\t\t\t: this.buttons.map((b) => b.element);\n\t}\n\n\tprivate initRovingTabindex(): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tconst first: number = findFirstEnabled(elements);\n\t\tthis.focusedIndex = first >= 0 ? first : 0;\n\t\tapplyRovingTabindex(elements, this.focusedIndex);\n\t}\n\n\tprivate setRovingFocus(index: number): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tif (index < 0 || index >= elements.length) return;\n\t\tthis.focusedIndex = index;\n\t\tapplyRovingTabindex(elements, index);\n\t\telements[index]?.focus();\n\t}\n\n\t/** Returns the active element, respecting shadow DOM boundaries. */\n\tprivate getActiveElement(): Element | null {\n\t\tconst root: Node | undefined = this.toolbarElement?.getRootNode();\n\t\tif (root instanceof ShadowRoot) {\n\t\t\treturn root.activeElement;\n\t\t}\n\t\treturn document.activeElement;\n\t}\n\n\tprivate syncFocusedIndex(): void {\n\t\tconst active: Element | null = this.getActiveElement();\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tconst idx: number = elements.findIndex((el) => el === active);\n\t\tif (idx >= 0) {\n\t\t\tthis.focusedIndex = idx;\n\t\t}\n\t}\n\n\t// --- Toolbar Keyboard ---\n\n\tprivate handleToolbarKeydown(e: KeyboardEvent): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tif (elements.length === 0) return;\n\n\t\tthis.syncFocusedIndex();\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowLeft': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst rtl: boolean = this.toolbarElement ? isRtlContext(this.toolbarElement) : false;\n\t\t\t\tconst dir: 1 | -1 = resolveHorizontalDirection(e.key, rtl);\n\t\t\t\tconst next: number = findNextEnabled(elements, this.focusedIndex, dir);\n\t\t\t\tthis.setRovingFocus(next);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Home': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst first: number = findFirstEnabled(elements);\n\t\t\t\tif (first >= 0) this.setRovingFocus(first);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'End': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst last: number = findLastEnabled(elements);\n\t\t\t\tif (last >= 0) this.setRovingFocus(last);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focused: HTMLButtonElement | undefined = elements[this.focusedIndex];\n\t\t\t\tconst btn: ToolbarButton | undefined = this.buttons.find((b) => b.element === focused);\n\t\t\t\tif (btn) this.activateButton(btn.element, btn.item);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Activates a toolbar button (shared between mouse click and keyboard). */\n\tprivate activateButton(btn: HTMLButtonElement, item: ToolbarItem): void {\n\t\tthis.tooltip?.hide();\n\t\tif (item.popupType && this.context) {\n\t\t\tthis.popupController?.toggle(btn, item, this.context);\n\t\t} else {\n\t\t\tthis.context?.executeCommand(item.command);\n\t\t}\n\t}\n\n\t// --- Layout Rendering ---\n\n\tprivate renderItemsByLayout(): void {\n\t\tif (!this.context || !this.toolbarElement || !this.layoutConfig) return;\n\n\t\tconst toolbarReg = this.context.getToolbarRegistry();\n\t\tlet firstGroup = true;\n\n\t\tfor (const groupPluginIds of this.layoutConfig.groups) {\n\t\t\tconst groupItems: ToolbarItem[] = [];\n\t\t\tfor (const pId of groupPluginIds) {\n\t\t\t\tconst items: ToolbarItem[] = toolbarReg\n\t\t\t\t\t.getToolbarItemsByPlugin(pId)\n\t\t\t\t\t.filter((item) => !this.hiddenItems.has(item.id));\n\t\t\t\tgroupItems.push(...items);\n\t\t\t}\n\n\t\t\tif (groupItems.length === 0) continue;\n\n\t\t\tif (!firstGroup) {\n\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t}\n\t\t\tfirstGroup = false;\n\n\t\t\tfor (const item of groupItems) {\n\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\tthis.toolbarElement.appendChild(btn.element);\n\t\t\t\tthis.buttons.push(btn);\n\t\t\t}\n\t\t}\n\n\t\tif (this.buttons.length === 0) {\n\t\t\tthis.toolbarElement.remove();\n\t\t}\n\t}\n\n\tprivate renderItemsByGroup(): void {\n\t\tif (!this.context || !this.toolbarElement) return;\n\n\t\tconst toolbarRegistry = this.context.getToolbarRegistry();\n\t\tconst items: ToolbarItem[] = toolbarRegistry\n\t\t\t.getToolbarItems()\n\t\t\t.filter((item) => !this.hiddenItems.has(item.id));\n\t\tif (items.length === 0) {\n\t\t\tthis.toolbarElement.remove();\n\t\t\treturn;\n\t\t}\n\n\t\tconst groups = new Map<string, ToolbarItem[]>();\n\t\tfor (const item of items) {\n\t\t\tconst list: ToolbarItem[] = groups.get(item.group) ?? [];\n\t\t\tlist.push(item);\n\t\t\tgroups.set(item.group, list);\n\t\t}\n\n\t\tlet firstGroup = true;\n\t\tfor (const [, groupItems] of groups) {\n\t\t\tif (!firstGroup) {\n\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t}\n\t\t\tfirstGroup = false;\n\n\t\t\tfor (const item of groupItems) {\n\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\tthis.toolbarElement.appendChild(btn.element);\n\t\t\t\tthis.buttons.push(btn);\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Button Creation ---\n\n\tprivate createButton(item: ToolbarItem): ToolbarButton {\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = `notectl-toolbar-btn notectl-toolbar-btn--${item.id}`;\n\t\tbtn.setAttribute('aria-pressed', 'false');\n\t\tbtn.setAttribute('aria-label', item.label);\n\t\tbtn.setAttribute('data-toolbar-item', item.id);\n\t\tbtn.setAttribute('data-tooltip', item.tooltip ?? item.label);\n\n\t\tlet comboLabelEl: HTMLSpanElement | null = null;\n\n\t\tif (item.popupType === 'combobox') {\n\t\t\tbtn.setAttribute('role', 'combobox');\n\t\t\tbtn.setAttribute('aria-haspopup', 'listbox');\n\t\t\tbtn.setAttribute('aria-expanded', 'false');\n\n\t\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tlabelSpan.className = 'notectl-toolbar-combobox__label';\n\t\t\tconst state: EditorState | undefined = this.context?.getState();\n\t\t\tif (state) {\n\t\t\t\tlabelSpan.textContent = item.getLabel(state);\n\t\t\t}\n\t\t\tbtn.appendChild(labelSpan);\n\t\t\tcomboLabelEl = labelSpan;\n\n\t\t\tconst arrowSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tarrowSpan.className = 'notectl-toolbar-combobox__arrow';\n\t\t\tarrowSpan.setAttribute('aria-hidden', 'true');\n\t\t\tarrowSpan.textContent = '\\u25BE';\n\t\t\tbtn.appendChild(arrowSpan);\n\t\t} else {\n\t\t\tif (item.popupType) {\n\t\t\t\tbtn.setAttribute('aria-haspopup', 'true');\n\t\t\t\tbtn.setAttribute('aria-expanded', 'false');\n\t\t\t}\n\n\t\t\tconst span: HTMLSpanElement = document.createElement('span');\n\t\t\tspan.className = 'notectl-toolbar-btn__icon';\n\t\t\tspan.innerHTML = item.icon;\n\t\t\tbtn.appendChild(span);\n\t\t}\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tthis.activateButton(btn, item);\n\t\t});\n\n\t\tbtn.addEventListener('mouseenter', () => this.tooltip?.show(btn));\n\t\tbtn.addEventListener('mouseleave', () => this.tooltip?.hide());\n\t\tbtn.addEventListener('focus', () => this.tooltip?.show(btn));\n\t\tbtn.addEventListener('blur', () => this.tooltip?.hide());\n\n\t\treturn { element: btn, item, comboLabelEl };\n\t}\n\n\t// --- Button State Updates ---\n\n\tprivate updateButtonStates(state: EditorState): void {\n\t\tfor (const btn of this.buttons) {\n\t\t\tconst active: boolean = btn.item.isActive?.(state) ?? false;\n\t\t\tconst enabled: boolean = btn.item.isEnabled?.(state) ?? true;\n\t\t\tbtn.element.setAttribute('aria-pressed', String(active));\n\t\t\tbtn.element.classList.toggle('notectl-toolbar-btn--active', active);\n\t\t\tbtn.element.disabled = !enabled;\n\t\t\tif (!enabled) {\n\t\t\t\tbtn.element.setAttribute('aria-disabled', 'true');\n\t\t\t} else {\n\t\t\t\tbtn.element.removeAttribute('aria-disabled');\n\t\t\t}\n\t\t\tif (btn.comboLabelEl && btn.item.popupType === 'combobox') {\n\t\t\t\tbtn.comboLabelEl.textContent = btn.item.getLabel(state);\n\t\t\t}\n\t\t\tif (btn.item.getIcon) {\n\t\t\t\tconst newIcon: string = btn.item.getIcon(state);\n\t\t\t\tconst iconEl: HTMLSpanElement | null = btn.element.querySelector(\n\t\t\t\t\t'.notectl-toolbar-btn__icon',\n\t\t\t\t);\n\t\t\t\tif (iconEl && iconEl.innerHTML !== newIcon) {\n\t\t\t\t\ticonEl.innerHTML = newIcon;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.overflowController?.updateItemStates(state);\n\t}\n}\n","/** Toolbar styles — buttons, separators, tooltips, popups, dropdowns. */\nexport const TOOLBAR_CSS = `\n/* Toolbar */\n.notectl-plugin-container--top {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\tborder-bottom: 1px solid var(--notectl-border);\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tmin-height: 40px;\n}\n\n.notectl-toolbar {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n\tflex: 1;\n\tmin-width: 0;\n\tgap: 2px;\n\tpadding: 4px 8px;\n}\n\n.notectl-toolbar[hidden] {\n\tdisplay: none;\n}\n\n.notectl-toolbar-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n\tfont-size: 14px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-btn--active {\n\tbackground: var(--notectl-active-bg);\n\tborder-color: var(--notectl-primary-muted);\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-toolbar-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n.notectl-toolbar-btn:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:disabled:hover {\n\t\tbackground: transparent;\n\t\tborder-color: transparent;\n\t}\n}\n\n.notectl-toolbar-btn__icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpointer-events: none;\n}\n\n.notectl-toolbar-btn__icon svg {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tfill: currentColor;\n}\n\n/* Tooltip (rendered as fixed-position element in shadow root) */\n.notectl-toolbar-tooltip {\n\tposition: fixed;\n\tpadding: 4px 8px;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 10001;\n\tline-height: 1.4;\n\tletter-spacing: 0.01em;\n\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.notectl-toolbar-separator {\n\tdisplay: inline-block;\n\twidth: 1px;\n\theight: 20px;\n\tbackground: var(--notectl-border);\n\tmargin: 0 4px;\n\tvertical-align: middle;\n}\n\n/* Toolbar Popups */\n.notectl-toolbar-popup {\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 12px var(--notectl-shadow);\n\toverflow: hidden;\n}\n\n/* Grid Picker */\n.notectl-grid-picker__cell:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-grid-picker__cell--highlighted {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n}\n\n/* Dropdown */\n.notectl-dropdown {\n\tmin-width: 160px;\n\tpadding: 4px 0;\n}\n\n.notectl-dropdown__item {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tpadding: 8px 12px;\n\ttext-align: start;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\tfont-family: inherit;\n\twhite-space: nowrap;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-dropdown__item:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\toutline: none;\n}\n\n.notectl-dropdown__item-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-fg-muted);\n\tflex-shrink: 0;\n}\n\n.notectl-dropdown__item-label {\n\tflex: 1;\n}\n\n/* Overflow behavior: flow mode — toolbar wraps to additional rows */\n.notectl-toolbar[data-overflow=\"flow\"] {\n\tflex-wrap: wrap;\n\toverflow: visible;\n}\n\n/* Overflow behavior: none — toolbar clips without any responsive behavior */\n.notectl-toolbar[data-overflow=\"none\"] {\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n}\n\n/* Overflow: hidden items (burger-menu mode) */\n.notectl-toolbar-btn--overflow-hidden,\n.notectl-toolbar-separator--overflow-hidden {\n\tdisplay: none;\n}\n\n/* Overflow \"more\" button */\n.notectl-toolbar-overflow-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n\tfont-size: 16px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\tmargin-inline-start: auto;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-overflow-btn:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-overflow-btn--hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-overflow-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n/* Dropdown item states shared by all dropdown menus (including overflow) */\n.notectl-dropdown__item:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:disabled:hover {\n\t\tbackground: none;\n\t}\n}\n\n.notectl-dropdown__item--active {\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-dropdown__item-icon svg {\n\tdisplay: block;\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n.notectl-dropdown__separator {\n\theight: 1px;\n\tbackground: var(--notectl-border);\n\tmargin: 4px 0;\n}\n\n/* Combobox-style toolbar buttons (shared base for font, fontSize, heading, etc.) */\n.notectl-toolbar-btn[role=\"combobox\"] {\n\twidth: auto;\n\tpadding: 0 8px;\n\tgap: 4px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn[role=\"combobox\"]:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-fg-muted);\n\t}\n}\n\n.notectl-toolbar-btn[role=\"combobox\"].notectl-toolbar-btn--active {\n\tbackground: var(--notectl-bg);\n\tborder-color: var(--notectl-primary-muted);\n}\n\n.notectl-toolbar-combobox__label {\n\tflex: 1;\n\tfont-size: 13px;\n\tfont-weight: 500;\n\tcolor: var(--notectl-fg);\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: start;\n\tline-height: 30px;\n}\n\n.notectl-toolbar-combobox__arrow {\n\tflex-shrink: 0;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tline-height: 30px;\n}\n\n/* Link Popup */\n.notectl-link-popup {\n\tpadding: 8px;\n\tmin-width: 200px;\n}\n\n.notectl-link-popup__input {\n\twidth: 100%;\n\tpadding: 4px;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-bg);\n}\n\n.notectl-link-popup__input:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-link-popup__button {\n\twidth: 100%;\n\tpadding: 6px 12px;\n\tcursor: pointer;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n\tcolor: var(--notectl-fg);\n\tfont-size: 13px;\n}\n\n.notectl-link-popup__button--apply {\n\tmargin-top: 4px;\n}\n\n@media (hover: hover) {\n\t.notectl-link-popup__button:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-link-popup__button:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n`;\n"],"names":["ToolbarRegistry","_toolbarItems","Map","_toolbarItemPluginMap","registerToolbarItem","item","pluginId","this","has","id","Error","set","ids","get","push","getToolbarItemsByPlugin","items","getToolbarItem","getToolbarItems","values","removeToolbarItem","delete","idx","indexOf","splice","length","clear","findFirstEnabled","buttons","i","disabled","TOOLBAR_LOCALE_EN","formattingOptionsAria","moreToolsAria","gridPickerLabel","rows","cols","localeModules","assign","import","async","loadToolbarLocale","lang","loader","default","ToolbarOverflowBehavior","BurgerMenu","Flow","None","HIDDEN_BTN_CLASS","HIDDEN_SEP_CLASS","ToolbarOverflowController","toolbar","context","onOverflowChange","onItemActivated","getActiveElement","ariaLabel","popupManager","entries","overflowButton","overflowDropdown","overflowHandle","overflowEntries","resizeObserver","closeHandler","closeHandlerTimer","closeHandlerAttached","constructor","config","ResizeObserver","recalculate","observe","update","map","b","element","closeDropdown","resetVisibility","ensureOverflowButton","setOverflowButtonVisible","availableWidth","measureAvailableWidth","children","Array","from","childWidths","measureChildWidths","maxWidth","usedWidth","overflowing","overflowList","child","classList","contains","add","sepWidth","entry","find","oe","btnWidth","hideTrailingSeparators","notifyChange","updateItemStates","state","menuItems","querySelectorAll","menuItem","itemId","getAttribute","active","isActive","enabled","isEnabled","toggle","popupType","labelEl","querySelector","textContent","getLabel","getIcon","newIcon","iconEl","innerHTML","destroy","disconnect","remove","widths","offsetWidth","toolbarStyle","getComputedStyle","paddingLeft","Number","parseFloat","paddingRight","clientWidth","separators","sep","visible","removeAttribute","btn","document","createElement","type","className","setAttribute","addEventListener","e","preventDefault","toggleDropdown","appendChild","openDropdown","dropdown","renderDropdownItems","getState","open","anchor","ariaRole","position","referenceNode","restoreFocusTo","onClose","content","popup","handleDropdownKeydown","positionDropdown","appendToRoot","requestAnimationFrame","first","focus","registerCloseHandler","lastGroup","group","menuBtn","iconSpan","icon","labelSpan","tooltip","label","ev","stopPropagation","activateOverflowItem","rect","getBoundingClientRect","isRtlContext","setStyleProperties","top","bottom","left","right","zIndex","rightEdge","window","innerWidth","path","composedPath","includes","setTimeout","handle","close","clearTimeout","removeEventListener","executeCommand","command","key","current","next","findNextDropdownItem","prev","focusedItem","filter","highlightCells","grid","targetRow","targetCol","cells","cell","r","c","createSeparator","ToolbarPopupController","activePopup","activePopupButton","activeHandle","locale","setPopupManager","manager","isOpen","button","openViaManager","clearButtonState","closeAndRestoreFocus","triggerBtn","renderPopupContent","handlePopupKeydown","closeAndFocusEditor","getContainer","container","display","gridTemplateColumns","maxCols","gap","padding","textAlign","fontSize","maxRows","width","height","border","cursor","String","onSelect","renderGridPicker","popupConfig","cmd","renderDropdown","renderPopup","handleGridKeydown","handleCustomPopupKeydown","itemArr","focused","click","row","col","lastCell","newRow","newCol","navigateGrid","target","currentIdx","dispatchEvent","MouseEvent","bubbles","cancelable","ToolbarTooltip","timer","isPopupActive","static","TOOLTIP_ID","setStyleProperty","show","hide","text","root","getRootNode","ShadowRoot","parentNode","body","transform","ToolbarServiceKey","ServiceKey","ToolbarPlugin","name","priority","toolbarElement","hiddenItems","Set","layoutConfig","overflowBehavior","focusedIndex","popupController","overflowController","visibleElements","overflow","init","resolveLocale","registerStyleSheet","PopupManager","registerService","PopupServiceKey","refresh","updateButtonStates","closePopup","createToolbarElement","getOverflowBehavior","setOverflowBehavior","behavior","applyOverflowBehavior","renderItems","onReady","onStateChange","_oldState","newState","_tr","onReadOnlyChange","readonly","hidden","onConfigure","value","Object","getPluginContainer","handleToolbarKeydown","visibleButtons","overflowBtn","initRovingTabindex","activateButton","renderItemsByLayout","renderItemsByGroup","parentElement","getTabElements","elements","applyRovingTabindex","setRovingFocus","index","activeElement","syncFocusedIndex","findIndex","el","isRtl","dir","direction","len","findNextEnabled","last","findLastEnabled","toolbarReg","getToolbarRegistry","firstGroup","groupPluginIds","groups","groupItems","pId","createButton","list","comboLabelEl","arrowSpan","span"],"mappings":"mXAOO,MAAMA,EACKC,iCAAoBC,IACpBC,yCAA4BD,IAE7C,mBAAAE,CAAoBC,EAAmBC,GACtC,GAAIC,KAAKN,cAAcO,IAAIH,EAAKI,IAC/B,MAAM,IAAIC,MAAM,wBAAwBL,EAAKI,8BAG9C,GADAF,KAAKN,cAAcU,IAAIN,EAAKI,GAAIJ,GAC5BC,EAAU,CACb,MAAMM,EAAML,KAAKJ,sBAAsBU,IAAIP,IAAa,GACxDM,EAAIE,KAAKT,EAAKI,IACdF,KAAKJ,sBAAsBQ,IAAIL,EAAUM,EAC1C,CACD,CAEA,uBAAAG,CAAwBT,GACvB,MAAMM,EAAML,KAAKJ,sBAAsBU,IAAIP,IAAa,GAClDU,EAAuB,GAC7B,IAAA,MAAWP,KAAMG,EAAK,CACrB,MAAMP,EAAOE,KAAKN,cAAcY,IAAIJ,GAChCJ,GAAMW,EAAMF,KAAKT,EACtB,CACA,OAAOW,CACR,CAEA,cAAAC,CAAeR,GACd,OAAOF,KAAKN,cAAcY,IAAIJ,EAC/B,CAEA,eAAAS,GACC,MAAO,IAAIX,KAAKN,cAAckB,SAC/B,CAEA,iBAAAC,CAAkBX,GACjBF,KAAKN,cAAcoB,OAAOZ,GAC1B,IAAA,MAAYH,EAAUM,KAAQL,KAAKJ,sBAAuB,CACzD,MAAMmB,EAAMV,EAAIW,QAAQd,GACxB,IAAY,IAARa,EAAY,CACfV,EAAIY,OAAOF,EAAK,GACG,IAAfV,EAAIa,QAAclB,KAAKJ,sBAAsBkB,OAAOf,GACxD,KACD,CACD,CACD,CAEA,KAAAoB,GACCnB,KAAKN,cAAcyB,QACnBnB,KAAKJ,sBAAsBuB,OAC5B,ECpBM,SAASC,EAAiBC,GAChC,IAAA,IAASC,EAAI,EAAGA,EAAID,EAAQH,OAAQI,IACnC,IAAKD,EAAQC,IAAIC,SAAU,OAAOD,EAEnC,OAAO,CACR,CC7BO,MAAME,EAAmC,CAC/CC,sBAAuB,qBACvBC,cAAe,aACfC,gBAAiB,CAACC,EAAcC,IAAiB,GAAGD,OAAUC,KAKzDC,wBAA2EC,OAAA,CAAA,kBAAA,IAAAC,OAAA,6BAAA,kBAAA,IAAAA,OAAA,6BAAA,kBAAA,IAAAA,OAAA,6BAAA,kBAAA,IAAAA,OAAA,6BAAA,kBAAA,IAAAA,OAAA,6BAAA,kBAAA,IAAAA,OAAA,6BAAA,kBAAA,IAAAA,OAAA,6BAAA,kBAAA,IAAAA,OAAA,+BAIjFC,eAAsBC,EAAkBC,GACvC,GAAa,OAATA,EAAe,OAAOX,EAC1B,MAAMY,EAASN,EAAc,aAAaK,QAC1C,IAAKC,EAAQ,OAAOZ,EACpB,IAEC,aADkBY,KACPC,OACZ,CAAA,MACC,OAAOb,CACR,CACD,CCrBO,MAAMc,EAA0B,CAEtCC,WAAY,cAEZC,KAAM,OAENC,KAAM,QCyBDC,EAAmB,uCACnBC,EAAmB,6CAOlB,MAAMC,EACKC,QACAC,QACAC,iBACAC,gBACAC,iBACAC,UACAC,aAETC,QAA2B,GAC3BC,eAA2C,KAC3CC,iBAAuC,KACvCC,eAAqC,KACrCC,gBAAmC,GACnCC,eAAwC,KACxCC,aAAiD,KACjDC,kBAA0D,KAC1DC,sBAAuB,EAE/B,WAAAC,CAAYC,GACX9D,KAAK6C,QAAUiB,EAAOjB,QACtB7C,KAAKkD,UAAYY,EAAOZ,UACxBlD,KAAK8C,QAAUgB,EAAOhB,QACtB9C,KAAK+C,iBAAmBe,EAAOf,iBAC/B/C,KAAKgD,gBAAkBc,EAAOd,gBAC9BhD,KAAKiD,iBAAmBa,EAAOb,iBAC/BjD,KAAKmD,aAAeW,EAAOX,cAAgB,KAE3CnD,KAAKyD,eAAiB,IAAIM,eAAe,IAAM/D,KAAKgE,eACpDhE,KAAKyD,eAAeQ,QAAQjE,KAAK6C,QAClC,CAGA,MAAAqB,CAAO7C,GACNrB,KAAKoD,QAAU/B,EAAQ8C,IAAKC,IAAA,CAASC,QAASD,EAAEC,QAASvE,KAAMsE,EAAEtE,QACjEE,KAAKgE,aACN,CAGA,WAAAA,GACC,GAA4B,IAAxBhE,KAAKoD,QAAQlC,OAAc,OAE/BlB,KAAKsE,gBACLtE,KAAKuE,kBACLvE,KAAKwE,uBACLxE,KAAKyE,0BAAyB,GAG9B,MAAMC,EAAyB1E,KAAK2E,wBAC9BC,EAA0BC,MAAMC,KAAK9E,KAAK6C,QAAQ+B,UAClDG,EAAwC/E,KAAKgF,mBAAmBJ,GAGhEK,EAAmBP,EA/DA,GACf,EA+DV,IAAIQ,EAAY,EACZC,GAAc,EAClB,MAAMC,EAAgC,GAEtC,IAAA,MAAWC,KAAST,EAAU,CAC7B,GAAIS,IAAUrF,KAAKqD,eAAgB,SAEnC,GAAIgC,EAAMC,UAAUC,SAAS,6BAA8B,CAC1D,GAAIJ,EAAa,CAChBE,EAAMC,UAAUE,IAAI7C,GACpB,QACD,CACA,MAAM8C,GAAoBV,EAAYzE,IAAI+E,IAAU,GA3E5C,EA4EJH,EAAYO,EAAWR,GAC1BE,GAAc,EACdE,EAAMC,UAAUE,IAAI7C,IAEpBuC,GAAaO,EAEd,QACD,CAEA,MAAMC,EAAmC1F,KAAKoD,QAAQuC,KAAMC,GAAOA,EAAGvB,UAAYgB,GAClF,IAAKK,EAAO,SAEZ,GAAIP,EAAa,CAChBO,EAAMrB,QAAQiB,UAAUE,IAAI9C,GAC5B0C,EAAa7E,KAAKmF,GAClB,QACD,CAEA,MAAMG,GAAoBd,EAAYzE,IAAI+E,IAAU,GA9F3C,EA+FLH,EAAYW,EAAWZ,GAC1BE,GAAc,EACdO,EAAMrB,QAAQiB,UAAUE,IAAI9C,GAC5B0C,EAAa7E,KAAKmF,IAElBR,GAAaW,CAEf,CAEA7F,KAAKwD,gBAAkB4B,EACvBpF,KAAK8F,yBACL9F,KAAKyE,yBAAyBW,EAAalE,OAAS,GACpDlB,KAAK+F,cACN,CAGA,gBAAAC,CAAiBC,GAChB,IAAKjG,KAAKsD,iBAAkB,OAE5B,MAAM4C,EAAiCrB,MAAMC,KAC5C9E,KAAKsD,iBAAiB6C,iBAAiB,4BAGxC,IAAA,MAAWC,KAAYF,EAAW,CACjC,MAAMG,EAAwBD,EAASE,aAAa,qBAC9CZ,EAAmC1F,KAAKwD,gBAAgBmC,KAC5DC,GAAOA,EAAG9F,KAAKI,KAAOmG,GAExB,IAAKX,EAAO,SAEZ,MAAMa,EAAkBb,EAAM5F,KAAK0G,WAAWP,KAAU,EAClDQ,EAAmBf,EAAM5F,KAAK4G,YAAYT,KAAU,EAI1D,GAHAG,EAASd,UAAUqB,OAAO,iCAAkCJ,GAC5DH,EAAS7E,UAAYkF,EAEQ,aAAzBf,EAAM5F,KAAK8G,UAA0B,CACxC,MAAMC,EAAkCT,EAASU,cAChD,iCAEGD,IACHA,EAAQE,YAAcrB,EAAM5F,KAAKkH,SAASf,GAE5C,CACA,GAAIP,EAAM5F,KAAKmH,QAAS,CACvB,MAAMC,EAAkBxB,EAAM5F,KAAKmH,QAAQhB,GACrCkB,EAAiCf,EAASU,cAC/C,gCAEGK,GAAUA,EAAOC,YAAcF,IAClCC,EAAOC,UAAYF,EAErB,CACD,CACD,CAGA,OAAAG,GACCrH,KAAKyD,gBAAgB6D,aACrBtH,KAAKyD,eAAiB,KACtBzD,KAAKsE,gBACLtE,KAAKqD,gBAAgBkE,SACrBvH,KAAKqD,eAAiB,KACtBrD,KAAKoD,QAAU,GACfpD,KAAKwD,gBAAkB,EACxB,CAIQ,kBAAAwB,CAAmBJ,GAC1B,MAAM4C,qBAAuC7H,IAC7C,IAAA,MAAW0F,KAAST,EACfS,IAAUrF,KAAKqD,gBACnBmE,EAAOpH,IAAIiF,EAAOA,EAAMoC,aAEzB,OAAOD,CACR,CAEQ,qBAAA7C,GACP,MAAM+C,EAAoCC,iBAAiB3H,KAAK6C,SAC1D+E,EAAsBC,OAAOC,WAAWJ,EAAaE,cAAgB,EACrEG,EAAuBF,OAAOC,WAAWJ,EAAaK,eAAiB,EAC7E,OAAO/H,KAAK6C,QAAQmF,YAAcJ,EAAcG,CACjD,CAEQ,eAAAxD,GACP,IAAA,MAAWmB,KAAS1F,KAAKoD,QACxBsC,EAAMrB,QAAQiB,UAAUiC,OAAO7E,GAEhC,MAAMuF,EAA4BpD,MAAMC,KACvC9E,KAAK6C,QAAQsD,iBAAiB,+BAE/B,IAAA,MAAW+B,KAAOD,EACjBC,EAAI5C,UAAUiC,OAAO5E,EAEvB,CAIQ,wBAAA8B,CAAyB0D,GAC3BnI,KAAKqD,iBACVrD,KAAKqD,eAAeiC,UAAUqB,OAhMF,wCAgMiCwB,GACxDA,GACJnI,KAAKqD,eAAe+E,gBAAgB,YAEtC,CAEQ,oBAAA5D,GACP,GAAIxE,KAAKqD,eAAgB,OAEzB,MAAMgF,EAAyBC,SAASC,cAAc,UACtDF,EAAIG,KAAO,SACXH,EAAII,UAAY,+BAChBJ,EAAIK,aAAa,aAAc1I,KAAKkD,WACpCmF,EAAIK,aAAa,gBAAiB,QAClCL,EAAIK,aAAa,gBAAiB,SAClCL,EAAIjB,UA7ML,mNA+MCiB,EAAIM,iBAAiB,YAAcC,IAClCA,EAAEC,iBACF7I,KAAK8I,mBAGN9I,KAAK6C,QAAQkG,YAAYV,GACzBrI,KAAKqD,eAAiBgF,CACvB,CAIQ,cAAAS,GACH9I,KAAKsD,iBACRtD,KAAKsE,gBAELtE,KAAKgJ,cAEP,CAEQ,YAAAA,GACP,IAAKhJ,KAAKqD,gBAAkD,IAAhCrD,KAAKwD,gBAAgBtC,OAAc,OAE/D,MAAM+H,EAA2BX,SAASC,cAAc,OACxDU,EAASR,UAAY,yCACrBQ,EAASP,aAAa,OAAQ,QAE9B1I,KAAKkJ,oBAAoBD,EAAUjJ,KAAK8C,QAAQqG,YAE5CnJ,KAAKmD,cACRnD,KAAKuD,eAAiBvD,KAAKmD,aAAaiG,KAAK,CAC5CC,OAAQrJ,KAAKqD,eACboF,UAAW,yCACXa,SAAU,OACVC,SAAU,YACVC,cAAexJ,KAAKqD,eACpBoG,eAAgBzJ,KAAKqD,eACrBqG,QAAS,KACR1J,KAAKuD,eAAiB,KACtBvD,KAAKsD,iBAAmB,KACpBtD,KAAKqD,gBACRrD,KAAKqD,eAAeqF,aAAa,gBAAiB,UAGpDiB,QAAUC,IACT5J,KAAKkJ,oBAAoBU,EAAO5J,KAAK8C,QAAQqG,YAC7CnJ,KAAKsD,iBAAmBsG,EACxBA,EAAMjB,iBAAiB,UAAYC,GAAqB5I,KAAK6J,sBAAsBjB,OAGrF5I,KAAKqD,eAAeqF,aAAa,gBAAiB,UAElD1I,KAAK8J,iBAAiBb,GACtBc,EAAad,EAAUjJ,KAAKqD,gBAC5BrD,KAAKsD,iBAAmB2F,EACxBjJ,KAAKqD,eAAeqF,aAAa,gBAAiB,QAElDsB,sBAAsB,KACrB,MAAMC,EAA4BhB,EAASnC,cAAc,qBACzDmD,GAAOC,UAGRjB,EAASN,iBAAiB,UAAYC,GAAqB5I,KAAK6J,sBAAsBjB,IACtF5I,KAAKmK,uBAEP,CAEQ,mBAAAjB,CAAoBD,EAAuBhD,GAClD,IAAImE,EAA2B,KAE/B,IAAA,MAAW1E,KAAS1F,KAAKwD,gBAAiB,CACzC,GAAkB,OAAd4G,GAAsB1E,EAAM5F,KAAKuK,QAAUD,EAAW,CACzD,MAAMlC,EAAsBI,SAASC,cAAc,OACnDL,EAAIO,UAAY,8BAChBP,EAAIQ,aAAa,OAAQ,aACzBO,EAASF,YAAYb,EACtB,CACAkC,EAAY1E,EAAM5F,KAAKuK,MAEvB,MAAMC,EAA6BhC,SAASC,cAAc,UAC1D+B,EAAQ9B,KAAO,SACf8B,EAAQ7B,UAAY,yBACpB6B,EAAQ5B,aAAa,OAAQ,YAC7B4B,EAAQ5B,aAAa,WAAY,MACjC4B,EAAQ5B,aAAa,oBAAqBhD,EAAM5F,KAAKI,IAErD,MAAMqK,EAA4BjC,SAASC,cAAc,QACzDgC,EAAS9B,UAAY,8BACQ,aAAzB/C,EAAM5F,KAAK8G,YACd2D,EAASnD,UAAY1B,EAAM5F,KAAK0K,MAEjCF,EAAQvB,YAAYwB,GAEpB,MAAME,EAA6BnC,SAASC,cAAc,QAC1DkC,EAAUhC,UAAY,+BACtBgC,EAAU1D,YACgB,aAAzBrB,EAAM5F,KAAK8G,UACRlB,EAAM5F,KAAKkH,SAASf,GACnBP,EAAM5F,KAAK4K,SAAWhF,EAAM5F,KAAK6K,MACtCL,EAAQvB,YAAY0B,GAEpBH,EAAQ3B,iBAAiB,YAAciC,IACtCA,EAAG/B,iBACH+B,EAAGC,kBACH7K,KAAK8K,qBAAqBpF,KAG3BuD,EAASF,YAAYuB,EACtB,CACD,CAEQ,gBAAAR,CAAiBb,GACxB,IAAKjJ,KAAKqD,eAAgB,OAE1B,MAAM0H,EAAgB/K,KAAKqD,eAAe2H,wBAG1C,GAFqBC,EAAajL,KAAK6C,SAGtCqI,EAAmBjC,EAAU,CAC5BM,SAAU,QACV4B,IAAK,GAAGJ,EAAKK,OAAS,MACtBC,KAAM,GAAGN,EAAKM,SACdC,MAAO,OACPC,OAAQ,cAEH,CACN,MAAMC,EAAoBC,OAAOC,WAAaX,EAAKO,MACnDJ,EAAmBjC,EAAU,CAC5BM,SAAU,QACV4B,IAAK,GAAGJ,EAAKK,OAAS,MACtBE,MAAO,GAAGE,MACVH,KAAM,OACNE,OAAQ,SAEV,CACD,CAEQ,oBAAApB,GACPnK,KAAK0D,aAAgBkH,IACpB,MAAMe,EAAsBf,EAAGgB,eAE9B5L,KAAKsD,mBACJqI,EAAKE,SAAS7L,KAAKsD,mBACpBtD,KAAKqD,iBACJsI,EAAKE,SAAS7L,KAAKqD,iBAEpBrD,KAAKsE,iBAGPtE,KAAK2D,kBAAoBmI,WAAW,KACnC9L,KAAK2D,kBAAoB,KACpB3D,KAAK0D,cAAiB1D,KAAKsD,mBAChCgF,SAASK,iBAAiB,YAAa3I,KAAK0D,cAC5C1D,KAAK4D,sBAAuB,IAC1B,EACJ,CAEQ,aAAAU,GACP,GAAItE,KAAKuD,eAAgB,CACxB,MAAMwI,EAAsB/L,KAAKuD,eAOjC,OANAvD,KAAKuD,eAAiB,KACtBvD,KAAKsD,iBAAmB,KACxByI,EAAOC,aACHhM,KAAKqD,gBACRrD,KAAKqD,eAAeqF,aAAa,gBAAiB,SAGpD,CAEI1I,KAAKsD,mBACRtD,KAAKsD,iBAAiBiE,SACtBvH,KAAKsD,iBAAmB,MAErBtD,KAAKqD,gBACRrD,KAAKqD,eAAeqF,aAAa,gBAAiB,SAE/C1I,KAAK0D,eACuB,OAA3B1D,KAAK2D,oBACRsI,aAAajM,KAAK2D,mBAClB3D,KAAK2D,kBAAoB,MAEtB3D,KAAK4D,uBACR0E,SAAS4D,oBAAoB,YAAalM,KAAK0D,cAC/C1D,KAAK4D,sBAAuB,GAE7B5D,KAAK0D,aAAe,KAEtB,CAEQ,oBAAAoH,CAAqBpF,GAC5B1F,KAAKsE,gBACDoB,EAAM5F,KAAK8G,WAAa5G,KAAKqD,eAChCrD,KAAKgD,gBAAgBhD,KAAKqD,eAAgBqC,EAAM5F,MAEhDE,KAAK8C,QAAQqJ,eAAezG,EAAM5F,KAAKsM,QAEzC,CAIQ,qBAAAvC,CAAsBjB,GAC7B,IAAK5I,KAAKsD,iBAAkB,OAE5B,GAAc,WAAVsF,EAAEyD,KAA8B,QAAVzD,EAAEyD,IAK3B,OAJAzD,EAAEC,iBACFD,EAAEiC,kBACF7K,KAAKsE,qBACLtE,KAAKqD,gBAAgB6G,QAItB,MAAMzJ,EAAuBoE,MAAMC,KAClC9E,KAAKsD,iBAAiB6C,iBAAiB,sBAElCmG,EAAkB7L,EAAMO,QAAQhB,KAAKiD,oBAE3C,OAAQ2F,EAAEyD,KACT,IAAK,YAAa,CACjBzD,EAAEC,iBACF,MAAM0D,EAAeC,EAAqB/L,EAAO6L,EAAS,GAC1D7L,EAAM8L,IAAOrC,QACb,KACD,CACA,IAAK,UAAW,CACftB,EAAEC,iBACF,MAAM4D,EAAeD,EAAqB/L,EAAO6L,GAAS,GAC1D7L,EAAMgM,IAAOvC,QACb,KACD,CACA,IAAK,QACL,IAAK,IAAK,CACTtB,EAAEC,iBACF,MAAM6D,EAAuCjM,EAAM6L,GACnD,IAAKI,EAAa,MAClB,MAAMrG,EAAwBqG,EAAYpG,aAAa,qBACjDZ,EAAmC1F,KAAKwD,gBAAgBmC,KAC5DC,GAAOA,EAAG9F,KAAKI,KAAOmG,GAEpBX,GAAO1F,KAAK8K,qBAAqBpF,GACrC,KACD,EAEF,CAIQ,sBAAAI,GACP,MAAMlB,EAA0BC,MAAMC,KAAK9E,KAAK6C,QAAQ+B,UACxD,IAAA,IAAStD,EAAIsD,EAAS1D,OAAS,EAAGI,GAAK,EAAGA,IAAK,CAC9C,MAAM+D,EAAiCT,EAAStD,GAChD,GAAK+D,GAASA,IAAUrF,KAAKqD,eAC7B,GAAIgC,EAAMC,UAAUC,SAAS,6BACvBF,EAAMC,UAAUC,SAAS5C,IAC7B0C,EAAMC,UAAUE,IAAI7C,YAEV0C,EAAMC,UAAUC,SAAS7C,GACpC,KAEF,CACD,CAEQ,YAAAqD,GACP,MAAMoC,EAA+BnI,KAAKoD,QACxCuJ,OAAQ/G,IAAQA,EAAGvB,QAAQiB,UAAUC,SAAS7C,IAC9CyB,IAAKyB,GAAOA,EAAGvB,SACjBrE,KAAK+C,iBAAiBoF,EAASnI,KAAKwD,gBAAgBtC,OAAS,EAAIlB,KAAKqD,eAAiB,KACxF,EClbM,SAASuJ,EAAeC,EAAmBC,EAAmBC,GACpE,MAAMC,EAA6BH,EAAK1G,iBAAiB,8BACzD,IAAA,MAAW8G,KAAQD,EAAO,CACzB,MAAME,EAAYrF,OAAOoF,EAAK3G,aAAa,aACrC6G,EAAYtF,OAAOoF,EAAK3G,aAAa,aAC3C2G,EAAK3H,UAAUqB,OAlFS,yCAkFiBuG,GAAKJ,GAAaK,GAAKJ,EACjE,CACD,CAiDO,SAASK,IACf,MAAMlF,EAAuBI,SAASC,cAAc,QAGpD,OAFAL,EAAIO,UAAY,4BAChBP,EAAIQ,aAAa,OAAQ,aAClBR,CACR,CCrIO,MAAMmF,EACJC,YAAkC,KAClCC,kBAA8C,KAC9CC,aAAmC,KAC1BvK,iBACAwK,OACTtK,aAAoC,KAE5C,WAAAU,CAAYZ,EAAwCwK,EAAwBjM,GAC3ExB,KAAKiD,iBAAmBA,EACxBjD,KAAKyN,OAASA,CACf,CAGA,eAAAC,CAAgBC,GACf3N,KAAKmD,aAAewK,CACrB,CAGA,MAAAC,GACC,OAA4B,OAArB5N,KAAKsN,WACb,CAGA,MAAA3G,CAAOkH,EAA2B/N,EAAmBgD,GAChD9C,KAAKsN,YACRtN,KAAKgM,QAINhM,KAAK8N,eAAeD,EAAQ/N,EAAMgD,EACnC,CAGA,KAAAkJ,GACC,GAAIhM,KAAKwN,aAAc,CAEtB,MAAMzB,EAAsB/L,KAAKwN,aAIjC,OAHAxN,KAAKwN,aAAe,KACpBxN,KAAK+N,wBACLhC,EAAOC,OAER,CAEAhM,KAAK+N,mBACD/N,KAAKsN,cACRtN,KAAKsN,YAAY/F,SACjBvH,KAAKsN,YAAc,KAErB,CAGA,oBAAAU,GACC,MAAMC,EAAuCjO,KAAKuN,kBAClDvN,KAAKgM,QACLiC,GAAY/D,OACb,CAEA,OAAA7C,GACCrH,KAAKgM,OACN,CAIQ,cAAA8B,CACPD,EACA/N,EACAgD,GAEK9C,KAAKmD,eAEVnD,KAAKuN,kBAAoBM,EACzBA,EAAOvI,UAAUE,IAAI,mCACrBqI,EAAOnF,aAAa,gBAAiB,QAErC1I,KAAKwN,aAAexN,KAAKmD,aAAaiG,KAAK,CAC1CC,OAAQwE,EACRpF,UAAW,wBACXe,cAAeqE,EACfpE,eAAgBoE,EAChBtE,SAAU,cACVG,QAAS,KAER1J,KAAKwN,aAAe,KACpBxN,KAAK+N,mBACL/N,KAAKsN,YAAc,MAEpB3D,QAAS,CAACC,EAAoBoC,KAC7BhM,KAAKsN,YAAc1D,EACnB5J,KAAKkO,mBAAmBtE,EAAO9J,EAAMgD,EAASkJ,GAC9CpC,EAAMjB,iBAAiB,UAAYC,GAAqB5I,KAAKmO,mBAAmBvF,OAGnF,CAIQ,kBAAAsF,CACPtE,EACA9J,EACAgD,EACAkJ,GAEA,MAAMoC,EAAsB,KAC3BpC,EAAM,CAAEvC,eAAgB,OACxB3G,EAAQuL,eAAenE,SAGxB,OAAQpK,EAAK8G,WACZ,IAAK,cD5GD,SACN0H,EACAxK,EACA4F,EACA+D,EAAwBjM,GAExB8M,EAAU7F,WAAa,uBAEvB,MAAMoE,EAAuBvE,SAASC,cAAc,OACpDsE,EAAKpE,UAAY,4BACjBoE,EAAKnE,aAAa,OAAQ,QAC1BwC,EAAmB2B,EAAM,CACxB0B,QAAS,OACTC,oBAAqB,UAAU1K,EAAO2K,gBACtCC,IAAK,MACLC,QAAS,QAGV,MAAMhE,EAAwBrC,SAASC,cAAc,OACrDoC,EAAMlC,UAAY,6BAClBkC,EAAM5D,YAAc0G,EAAO9L,gBAAgB,EAAG,GAC9CuJ,EAAmBP,EAAO,CACzBiE,UAAW,SACXD,QAAS,MACTE,SAAU,SAEXlE,EAAMjC,aAAa,YAAa,UAEhC,IAAA,IAASwE,EAAI,EAAGA,GAAKpJ,EAAOgL,QAAS5B,IACpC,IAAA,IAASC,EAAI,EAAGA,GAAKrJ,EAAO2K,QAAStB,IAAK,CACzC,MAAMF,EAAuB3E,SAASC,cAAc,OACpD0E,EAAKxE,UAAY,4BACjBwE,EAAKvE,aAAa,OAAQ,YAC1BuE,EAAKvE,aAAa,WAAY,MAC9BuE,EAAKvE,aAAa,aAAc+E,EAAO9L,gBAAgBuL,EAAGC,IAC1DjC,EAAmB+B,EAAM,CACxB8B,MAAO,OACPC,OAAQ,OACRC,OAAQ,iBACRC,OAAQ,YAETjC,EAAKvE,aAAa,WAAYyG,OAAOjC,IACrCD,EAAKvE,aAAa,WAAYyG,OAAOhC,IAErCF,EAAKtE,iBAAiB,aAAc,KACnCiE,EAAeC,EAAMK,EAAGC,GACxBxC,EAAM5D,YAAc0G,EAAO9L,gBAAgBuL,EAAGC,KAG/CF,EAAKtE,iBAAiB,YAAcC,IACnCA,EAAEC,iBACFD,EAAEiC,oBAGHoC,EAAKtE,iBAAiB,QAAS,KAC9B7E,EAAOsL,SAASlC,EAAGC,GACnBzD,MAGDmD,EAAK9D,YAAYkE,EAClB,CAGDqB,EAAUvF,YAAY8D,GACtByB,EAAUvF,YAAY4B,EACvB,CC4CI0E,CAAiBzF,EAAO9J,EAAKwP,YAAalB,EAAqBpO,KAAKyN,QACpE,MACD,IAAK,YD3BD,SACNa,EACAxK,EACAqI,EACAzC,GAEA4E,EAAUhJ,UAAUE,IAAI,oBACxB8I,EAAU5F,aAAa,OAAQ,QAE/B,IAAA,MAAW5I,KAAQgE,EAAOrD,MAAO,CAChC,MAAM4H,EAAyBC,SAASC,cAAc,UAMtD,GALAF,EAAIG,KAAO,SACXH,EAAII,UAAY,yBAChBJ,EAAIK,aAAa,OAAQ,YACzBL,EAAIK,aAAa,WAAY,MAEzB5I,EAAK0K,KAAM,CACd,MAAMD,EAA4BjC,SAASC,cAAc,QACzDgC,EAAS9B,UAAY,8BACrB8B,EAASnD,UAAYtH,EAAK0K,KAC1BnC,EAAIU,YAAYwB,EACjB,CAEA,MAAME,EAA6BnC,SAASC,cAAc,QAC1DkC,EAAUhC,UAAY,+BACtBgC,EAAU1D,YAAcjH,EAAK6K,MAC7BtC,EAAIU,YAAY0B,GAEhBpC,EAAIM,iBAAiB,YAAcC,IAClCA,EAAEC,iBACFD,EAAEiC,oBAGHxC,EAAIM,iBAAiB,QAAS,KCF3B,IAAC4G,IDGYzP,EAAKsM,QCHDtJ,EAAQqJ,eAAeoD,GDI1C7F,MAGD4E,EAAUvF,YAAYV,EACvB,CACD,CCZImH,CACC5F,EACA9J,EAAKwP,YACL,EACAlB,GAED,MACD,IAAK,SAGL,IAAK,WACJtO,EAAK2P,YAAY7F,EAAO9G,EAASkJ,GAGpC,CAIQ,gBAAA+B,GACH/N,KAAKuN,oBACRvN,KAAKuN,kBAAkBjI,UAAUiC,OAAO,mCACxCvH,KAAKuN,kBAAkB7E,aAAa,gBAAiB,SACrD1I,KAAKuN,kBAAoB,KAE3B,CAIQ,kBAAAY,CAAmBvF,GAC1B,IAAK5I,KAAKsN,YAAa,OAEvB,GAAc,WAAV1E,EAAEyD,IAIL,OAHAzD,EAAEC,iBACFD,EAAEiC,uBACF7K,KAAKgO,uBAIN,GAAc,QAAVpF,EAAEyD,IAGL,OAFAzD,EAAEC,sBACF7I,KAAKgO,uBAIN,MAAM9H,EAAiClG,KAAKsN,YAAYnH,iBAAiB,qBACrED,EAAUhF,OAAS,EACtBlB,KAAK6J,sBAAsBjB,EAAG1C,GAI2D,OAAjElG,KAAKsN,YAAYxG,cAAc,8BAEvD9G,KAAK0P,kBAAkB9G,GAIxB5I,KAAK2P,yBAAyB/G,EAC/B,CAEQ,qBAAAiB,CAAsBjB,EAAkBnI,GAC/C,MAAMmP,EAAyB/K,MAAMC,KAAKrE,GACpC6L,EAAkBsD,EAAQ5O,QAAQhB,KAAKiD,oBAE7C,OAAQ2F,EAAEyD,KACT,IAAK,YAAa,CACjBzD,EAAEC,iBACF,MAAM0D,EAAeC,EAAqBoD,EAAStD,EAAS,GAC5DsD,EAAQrD,IAAOrC,QACf,KACD,CACA,IAAK,UAAW,CACftB,EAAEC,iBACF,MAAM4D,EAAeD,EAAqBoD,EAAStD,GAAS,GAC5DsD,EAAQnD,IAAOvC,QACf,KACD,CACA,IAAK,QACL,IAAK,IAAK,CACTtB,EAAEC,iBACF,MAAMgH,EAAmCD,EAAQtD,GAC7CuD,KAAiBC,QACrB,KACD,EAEF,CAEQ,iBAAAJ,CAAkB9G,GACzB,MAAMiH,EAAuB7P,KAAKiD,mBAC5B8M,EAAclI,OAAOgI,GAASvJ,aAAa,aAAe,GAC1D0J,EAAcnI,OAAOgI,GAASvJ,aAAa,aAAe,GAE1DuG,EACL7M,KAAKsN,aAAaxG,cAAc,+BAAiC,KAClE,IAAK+F,EAAM,OAEX,MAAMoD,EAA2BpD,EAAK/F,cAAc,yCAC9C2H,EAAkB5G,OAAOoI,GAAU3J,aAAa,aAAe,GAC/DwI,EAAkBjH,OAAOoI,GAAU3J,aAAa,aAAe,GAErE,GAAI,CAAC,UAAW,YAAa,YAAa,cAAcuF,SAASjD,EAAEyD,KAAM,CACxEzD,EAAEC,iBACF,MAAOqH,EAAQC,GAA4BC,EAC1CL,EACAC,EACAlB,EACAL,EACA7F,EAAEyD,MACFrM,KAAKsN,aAAcrC,EAAajL,KAAKsN,cAEhC+C,EAA6BxD,EAAK/F,cACvC,wCAAwCoJ,iBAAsBC,OAE/DE,GAAQnG,QAER0C,EAAeC,EAAqBqD,EAAQC,GAC5C,MAAMxF,EACL3K,KAAKsN,aAAaxG,cAAc,gCAAkC,KAC/D6D,IAAOA,EAAM5D,YAAc/G,KAAKyN,OAAO9L,gBAAgBuO,EAAQC,GACpE,CAEc,UAAVvH,EAAEyD,KAA6B,MAAVzD,EAAEyD,MAC1BzD,EAAEC,iBACFgH,GAASC,QAEX,CAEQ,wBAAAH,CAAyB/G,GAChC,IAAK5I,KAAKsN,YAAa,OACvB,MAAMjM,EAA+BwD,MAAMC,KAAK9E,KAAKsN,YAAYnH,iBAAiB,WAClF,GAAuB,IAAnB9E,EAAQH,OAAc,OAC1B,MAAMqF,EAAsBvG,KAAKiD,mBAC3BqN,EAAqBjP,EAAQL,QAAQuF,GAE3C,OAAQqC,EAAEyD,KACT,IAAK,YAAa,CACjBzD,EAAEC,iBACF,MAAM0D,EAAeC,EAAqBnL,EAASiP,EAAY,GAC/DjP,EAAQkL,IAAOrC,QACf,KACD,CACA,IAAK,UAAW,CACftB,EAAEC,iBACF,MAAM4D,EAAeD,EAAqBnL,EAASiP,GAAY,GAC/DjP,EAAQoL,IAAOvC,QACf,KACD,CACA,IAAK,QACL,IAAK,IACJtB,EAAEC,iBACEtC,GACHA,EAAOgK,cAAc,IAAIC,WAAW,YAAa,CAAEC,SAAS,EAAMC,YAAY,KAKlF,EChRM,MAAMC,EACKtM,QACTuM,MAA8C,KAC9CP,OAAmC,KAC1BQ,cAEjBC,kBAA6B,0BAE7B,WAAAjN,CAAYgN,GACX7Q,KAAK6Q,cAAgBA,EACrB7Q,KAAKqE,QAAUiE,SAASC,cAAc,OACtCvI,KAAKqE,QAAQoE,UAAY,0BACzBzI,KAAKqE,QAAQnE,GAAKyQ,EAAeI,WACjC/Q,KAAKqE,QAAQqE,aAAa,OAAQ,WAClCsI,EAAiBhR,KAAKqE,QAAS,UAAW,OAC3C,CAEA,IAAA4M,CAAKpD,GAGJ,GAFA7N,KAAKkR,OAEDlR,KAAK6Q,iBAAmBhD,EAAOtM,SAAU,OAE7C,MAAM4P,EAAsBtD,EAAOvH,aAAa,gBAC3C6K,IAELnR,KAAKqQ,OAASxC,EAEd7N,KAAK4Q,MAAQ9E,WAAW,KACvB,GAAI9L,KAAK6Q,gBAAiB,OAE1B7Q,KAAKqE,QAAQ0C,YAAcoK,EAC3BH,EAAiBhR,KAAKqE,QAAS,UAAW,IAE1C,MAAM+M,EAAavD,EAAOwD,cACtBD,aAAgBE,aAAetR,KAAKqE,QAAQkN,WAC/CH,EAAKrI,YAAY/I,KAAKqE,SACV+M,aAAgBE,YAAgBtR,KAAKqE,QAAQkN,YACzDjJ,SAASkJ,KAAKzI,YAAY/I,KAAKqE,SAGhCwJ,EAAOnF,aAAa,mBAAoBiI,EAAeI,YAEvD,MAAMhG,EAAgB8C,EAAO7C,wBAC7BE,EAAmBlL,KAAKqE,QAAS,CAChCkF,SAAU,QACV4B,IAAK,GAAGJ,EAAKK,OAAS,MACtBC,KAAM,GAAGN,EAAKM,KAAON,EAAKgE,MAAQ,MAClC0C,UAAW,sBAjDU,KAoDxB,CAEA,IAAAP,GACKlR,KAAK4Q,QACR3E,aAAajM,KAAK4Q,OAClB5Q,KAAK4Q,MAAQ,MAEV5Q,KAAKqQ,SACRrQ,KAAKqQ,OAAOjI,gBAAgB,oBAC5BpI,KAAKqQ,OAAS,MAEfW,EAAiBhR,KAAKqE,QAAS,UAAW,OAC3C,CAEA,OAAAgD,GACCrH,KAAKkR,OACLlR,KAAKqE,QAAQkD,QACd,ECxBM,MAAMmK,EAAoB,IAAIC,EAA8B,WAU5D,MAAMC,EACH1R,GAAK,UACL2R,KAAO,UACPC,SAAW,GAEZhP,QAAgC,KAChCiP,eAAqC,KACrC1Q,QAA2B,GAClB2Q,+BAAkBC,IAClBC,aACTC,iBACAC,aAAe,EACf1H,QAAiC,KACjC2H,gBAAiD,KACjDlP,aAAoC,KACpCmP,mBAAuD,KACvDC,gBAAuC,GACvC9E,OAER,WAAA5J,CAAYqO,GACXlS,KAAKkS,aAAeA,GAAgB,KACpClS,KAAKmS,iBAAmBD,GAAcM,UAAYlQ,EAAwBC,UAC3E,CAEA,UAAMkQ,CAAK3P,GACV9C,KAAKyN,aAAeiF,EAAc5P,OAAS,EAAWtB,EAAmBU,GACzEY,EAAQ6P,mBCxFiB,k/ODyFzB3S,KAAK8C,QAAUA,EAEf9C,KAAKmD,aAAe,IAAIyP,EAAa9P,EAAQuL,gBAC7CvL,EAAQ+P,gBAAgBC,EAAiB9S,KAAKmD,cAE9CnD,KAAKqS,gBAAkB,IAAIhF,EAAuB,IAAMrN,KAAKiD,mBAAoBjD,KAAKyN,QACtFzN,KAAKqS,gBAAgB3E,gBAAgB1N,KAAKmD,cAC1CnD,KAAK0K,QAAU,IAAIiG,EAAe,IAAM3Q,KAAKqS,iBAAiBzE,WAAY,GAE1E9K,EAAQ+P,gBAAgBnB,EAAmB,CAC1CqB,QAAS,IAAM/S,KAAKgT,mBAAmBlQ,EAAQqG,YAC/C8J,WAAY,IAAMjT,KAAKqS,iBAAiBrG,UAGzChM,KAAKkT,sBACN,CAGA,mBAAAC,GACC,OAAOnT,KAAKmS,gBACb,CAGA,mBAAAiB,CAAoBC,GACfA,IAAarT,KAAKmS,mBAEtBnS,KAAKmS,iBAAmBkB,EACxBrT,KAAKsT,wBACLtT,KAAKuT,cACN,CAEA,OAAAC,GACCxT,KAAKuT,aACN,CAEA,OAAAlM,GACCrH,KAAKsS,oBAAoBjL,UACzBrH,KAAKsS,mBAAqB,KAC1BtS,KAAKqS,iBAAiBhL,UACtBrH,KAAKqS,gBAAkB,KACvBrS,KAAKmD,cAAckE,UACnBrH,KAAKmD,aAAe,KACpBnD,KAAK0K,SAASrD,UACdrH,KAAK0K,QAAU,KACX1K,KAAK+R,iBACR/R,KAAK+R,eAAexK,SACpBvH,KAAK+R,eAAiB,MAEvB/R,KAAKqB,QAAU,GACfrB,KAAKuS,gBAAkB,GACvBvS,KAAK8C,QAAU,IAChB,CAEA,aAAA2Q,CAAcC,EAAwBC,EAAuBC,GAC5D5T,KAAKgT,mBAAmBW,EACzB,CAEA,gBAAAE,CAAiBC,GACZ9T,KAAK+R,iBACR/R,KAAK+R,eAAegC,OAASD,EAE/B,CAEA,WAAAE,CAAYlQ,GACX,IAAA,MAAYuI,EAAK4H,KAAUC,OAAO9Q,QAAQU,IAC3B,IAAVmQ,EACHjU,KAAKgS,YAAYxM,IAAI6G,GAErBrM,KAAKgS,YAAYlR,OAAOuL,GAG1BrM,KAAKuT,aACN,CAIQ,oBAAAL,GACP,IAAKlT,KAAK8C,QAAS,OAEf9C,KAAK+R,gBACR/R,KAAK+R,eAAexK,SAErBvH,KAAKqB,QAAU,GAEf,MAAMiN,EAAyBtO,KAAK8C,QAAQqR,mBAAmB,OAC/DnU,KAAK+R,eAAiBzJ,SAASC,cAAc,OAC7CvI,KAAK+R,eAAerJ,aAAa,OAAQ,WACzC1I,KAAK+R,eAAerJ,aAAa,aAAc1I,KAAKyN,OAAOhM,uBAC3DzB,KAAK+R,eAAerJ,aAAa,wBAAyB,IAC1D1I,KAAK+R,eAAetJ,UAAY,kBAEhCzI,KAAK+R,eAAepJ,iBAAiB,UAAYC,GAAM5I,KAAKoU,qBAAqBxL,IAEjF5I,KAAKsT,wBACLhF,EAAUvF,YAAY/I,KAAK+R,eAC5B,CAGQ,qBAAAuB,GACFtT,KAAK+R,gBAAmB/R,KAAK8C,UAGlC9C,KAAKsS,oBAAoBjL,UACzBrH,KAAKsS,mBAAqB,KAE1BtS,KAAK+R,eAAerJ,aAAa,gBAAiB1I,KAAKmS,kBAEnDnS,KAAKmS,mBAAqB7P,EAAwBC,WACrDvC,KAAKsS,mBAAqB,IAAI1P,EAA0B,CACvDC,QAAS7C,KAAK+R,eACd7O,UAAWlD,KAAKyN,OAAO/L,cACvBoB,QAAS9C,KAAK8C,QACdK,aAAcnD,KAAKmD,mBAAgB,EACnCJ,iBAAkB,CAACsR,EAAgBC,KAClCtU,KAAKuS,gBAAkB+B,EACpB,IAAID,EAAgBC,GACpB,IAAID,GACPrU,KAAKuU,sBAENvR,gBAAiB,CAACqF,EAAwBvI,KACzCE,KAAKwU,eAAenM,EAAKvI,IAE1BmD,iBAAkB,IAAMjD,KAAKiD,qBAI9BjD,KAAKuS,gBAAkB,GAEzB,CAEQ,WAAAgB,GACP,GAAKvT,KAAK8C,SAAY9C,KAAK+R,eAA3B,CAEA,IAAA,MAAW1J,KAAOrI,KAAKqB,QACtBgH,EAAIhE,QAAQkD,SAEbvH,KAAKqB,QAAU,GAEf,IAAA,MAAW6G,KAAOlI,KAAK+R,eAAe5L,iBAAiB,8BACtD+B,EAAIX,SAGDvH,KAAKkS,aACRlS,KAAKyU,sBAELzU,KAAK0U,qBAGF1U,KAAKqB,QAAQH,OAAS,IAAMlB,KAAK+R,eAAe4C,eACpB3U,KAAK8C,QAAQqR,mBAAmB,OACrDpL,YAAY/I,KAAK+R,gBAG5B/R,KAAKsS,oBAAoBpO,OAAOlE,KAAKqB,SACrCrB,KAAKuU,qBACLvU,KAAKgT,mBAAmBhT,KAAK8C,QAAQqG,WAxBM,CAyB5C,CAIQ,cAAAyL,GACP,OAAO5U,KAAKuS,gBAAgBrR,OAAS,EAClClB,KAAKuS,gBACLvS,KAAKqB,QAAQ8C,IAAKC,GAAMA,EAAEC,QAC9B,CAEQ,kBAAAkQ,GACP,MAAMM,EAAgC7U,KAAK4U,iBACrC3K,EAAgB7I,EAAiByT,GACvC7U,KAAKoS,aAAenI,GAAS,EAAIA,EAAQ,EACzC6K,EAAoBD,EAAU7U,KAAKoS,aACpC,CAEQ,cAAA2C,CAAeC,GACtB,MAAMH,EAAgC7U,KAAK4U,iBACvCI,EAAQ,GAAKA,GAASH,EAAS3T,SACnClB,KAAKoS,aAAe4C,EACpBF,EAAoBD,EAAUG,GAC9BH,EAASG,IAAQ9K,QAClB,CAGQ,gBAAAjH,GACP,MAAMmO,EAAyBpR,KAAK+R,gBAAgBV,cACpD,OAAID,aAAgBE,WACZF,EAAK6D,cAEN3M,SAAS2M,aACjB,CAEQ,gBAAAC,GACP,MAAM3O,EAAyBvG,KAAKiD,mBAE9BlC,EADgCf,KAAK4U,iBACdO,UAAWC,GAAOA,IAAO7O,GAClDxF,GAAO,IACVf,KAAKoS,aAAerR,EAEtB,CAIQ,oBAAAqT,CAAqBxL,GAC5B,MAAMiM,EAAgC7U,KAAK4U,iBPvOtC,IAENS,EOsOC,GAAwB,IAApBR,EAAS3T,OAIb,OAFAlB,KAAKkV,mBAEGtM,EAAEyD,KACT,IAAK,aACL,IAAK,YAAa,CACjBzD,EAAEC,iBACF,MACMyM,GP/OTD,IO8OwBrV,KAAK+R,gBAAiB9G,EAAajL,KAAK+R,gBP5OpD,eO6OsCnJ,EAAEyD,IP7OnBgJ,GAAQ,EAAK,EACvCA,EAAQ,GAAI,GO6OV9I,EP9RH,SACNlL,EACAiL,EACAiJ,GAEA,MAAMC,EAAMnU,EAAQH,OACpB,GAAY,IAARsU,EAAW,OAAO,EAEtB,IAAIR,EAAQ1I,EACZ,IAAA,IAAShL,EAAI,EAAGA,EAAIkU,EAAKlU,IAExB,GADA0T,GAASA,EAAQO,EAAYC,GAAOA,GAC/BnU,EAAQ2T,IAAQzT,SACpB,OAAOyT,EAGT,OAAO1I,CACR,CO8QyBmJ,CAAgBZ,EAAU7U,KAAKoS,aAAckD,GAClEtV,KAAK+U,eAAexI,GACpB,KACD,CACA,IAAK,OAAQ,CACZ3D,EAAEC,iBACF,MAAMoB,EAAgB7I,EAAiByT,GACnC5K,GAAS,GAAGjK,KAAK+U,eAAe9K,GACpC,KACD,CACA,IAAK,MAAO,CACXrB,EAAEC,iBACF,MAAM6M,EP/QH,SAAyBrU,GAC/B,IAAA,IAASC,EAAID,EAAQH,OAAS,EAAGI,GAAK,EAAGA,IACxC,IAAKD,EAAQC,IAAIC,SAAU,OAAOD,EAEnC,OAAO,CACR,CO0QyBqU,CAAgBd,GACjCa,GAAQ,GAAG1V,KAAK+U,eAAeW,GACnC,KACD,CACA,IAAK,QACL,IAAK,IAAK,CACT9M,EAAEC,iBACF,MAAMgH,EAAyCgF,EAAS7U,KAAKoS,cACvD/J,EAAiCrI,KAAKqB,QAAQsE,KAAMvB,GAAMA,EAAEC,UAAYwL,GAC1ExH,GAAKrI,KAAKwU,eAAenM,EAAIhE,QAASgE,EAAIvI,MAC9C,KACD,EAEF,CAGQ,cAAA0U,CAAenM,EAAwBvI,GAC9CE,KAAK0K,SAASwG,OACVpR,EAAK8G,WAAa5G,KAAK8C,QAC1B9C,KAAKqS,iBAAiB1L,OAAO0B,EAAKvI,EAAME,KAAK8C,SAE7C9C,KAAK8C,SAASqJ,eAAerM,EAAKsM,QAEpC,CAIQ,mBAAAqI,GACP,IAAKzU,KAAK8C,UAAY9C,KAAK+R,iBAAmB/R,KAAKkS,aAAc,OAEjE,MAAM0D,EAAa5V,KAAK8C,QAAQ+S,qBAChC,IAAIC,GAAa,EAEjB,IAAA,MAAWC,KAAkB/V,KAAKkS,aAAa8D,OAAQ,CACtD,MAAMC,EAA4B,GAClC,IAAA,MAAWC,KAAOH,EAAgB,CACjC,MAAMtV,EAAuBmV,EAC3BpV,wBAAwB0V,GACxBvJ,OAAQ7M,IAAUE,KAAKgS,YAAY/R,IAAIH,EAAKI,KAC9C+V,EAAW1V,QAAQE,EACpB,CAEA,GAA0B,IAAtBwV,EAAW/U,OAAf,CAEK4U,GACJ9V,KAAK+R,eAAehJ,YAAYqE,KAEjC0I,GAAa,EAEb,IAAA,MAAWhW,KAAQmW,EAAY,CAC9B,MAAM5N,EAAqBrI,KAAKmW,aAAarW,GAC7CE,KAAK+R,eAAehJ,YAAYV,EAAIhE,SACpCrE,KAAKqB,QAAQd,KAAK8H,EACnB,CAX6B,CAY9B,CAE4B,IAAxBrI,KAAKqB,QAAQH,QAChBlB,KAAK+R,eAAexK,QAEtB,CAEQ,kBAAAmN,GACP,IAAK1U,KAAK8C,UAAY9C,KAAK+R,eAAgB,OAE3C,MACMtR,EADkBT,KAAK8C,QAAQ+S,qBAEnClV,kBACAgM,OAAQ7M,IAAUE,KAAKgS,YAAY/R,IAAIH,EAAKI,KAC9C,GAAqB,IAAjBO,EAAMS,OAET,YADAlB,KAAK+R,eAAexK,SAIrB,MAAMyO,qBAAarW,IACnB,IAAA,MAAWG,KAAQW,EAAO,CACzB,MAAM2V,EAAsBJ,EAAO1V,IAAIR,EAAKuK,QAAU,GACtD+L,EAAK7V,KAAKT,GACVkW,EAAO5V,IAAIN,EAAKuK,MAAO+L,EACxB,CAEA,IAAIN,GAAa,EACjB,IAAA,MAAW,CAAGG,KAAeD,EAAQ,CAC/BF,GACJ9V,KAAK+R,eAAehJ,YAAYqE,KAEjC0I,GAAa,EAEb,IAAA,MAAWhW,KAAQmW,EAAY,CAC9B,MAAM5N,EAAqBrI,KAAKmW,aAAarW,GAC7CE,KAAK+R,eAAehJ,YAAYV,EAAIhE,SACpCrE,KAAKqB,QAAQd,KAAK8H,EACnB,CACD,CACD,CAIQ,YAAA8N,CAAarW,GACpB,MAAMuI,EAAyBC,SAASC,cAAc,UACtDF,EAAIG,KAAO,SACXH,EAAII,UAAY,4CAA4C3I,EAAKI,KACjEmI,EAAIK,aAAa,eAAgB,SACjCL,EAAIK,aAAa,aAAc5I,EAAK6K,OACpCtC,EAAIK,aAAa,oBAAqB5I,EAAKI,IAC3CmI,EAAIK,aAAa,eAAgB5I,EAAK4K,SAAW5K,EAAK6K,OAEtD,IAAI0L,EAAuC,KAE3C,GAAuB,aAAnBvW,EAAK8G,UAA0B,CAClCyB,EAAIK,aAAa,OAAQ,YACzBL,EAAIK,aAAa,gBAAiB,WAClCL,EAAIK,aAAa,gBAAiB,SAElC,MAAM+B,EAA6BnC,SAASC,cAAc,QAC1DkC,EAAUhC,UAAY,kCACtB,MAAMxC,EAAiCjG,KAAK8C,SAASqG,WACjDlD,IACHwE,EAAU1D,YAAcjH,EAAKkH,SAASf,IAEvCoC,EAAIU,YAAY0B,GAChB4L,EAAe5L,EAEf,MAAM6L,EAA6BhO,SAASC,cAAc,QAC1D+N,EAAU7N,UAAY,kCACtB6N,EAAU5N,aAAa,cAAe,QACtC4N,EAAUvP,YAAc,IACxBsB,EAAIU,YAAYuN,EACjB,KAAO,CACFxW,EAAK8G,YACRyB,EAAIK,aAAa,gBAAiB,QAClCL,EAAIK,aAAa,gBAAiB,UAGnC,MAAM6N,EAAwBjO,SAASC,cAAc,QACrDgO,EAAK9N,UAAY,4BACjB8N,EAAKnP,UAAYtH,EAAK0K,KACtBnC,EAAIU,YAAYwN,EACjB,CAYA,OAVAlO,EAAIM,iBAAiB,YAAcC,IAClCA,EAAEC,iBACF7I,KAAKwU,eAAenM,EAAKvI,KAG1BuI,EAAIM,iBAAiB,aAAc,IAAM3I,KAAK0K,SAASuG,KAAK5I,IAC5DA,EAAIM,iBAAiB,aAAc,IAAM3I,KAAK0K,SAASwG,QACvD7I,EAAIM,iBAAiB,QAAS,IAAM3I,KAAK0K,SAASuG,KAAK5I,IACvDA,EAAIM,iBAAiB,OAAQ,IAAM3I,KAAK0K,SAASwG,QAE1C,CAAE7M,QAASgE,EAAKvI,OAAMuW,eAC9B,CAIQ,kBAAArD,CAAmB/M,GAC1B,IAAA,MAAWoC,KAAOrI,KAAKqB,QAAS,CAC/B,MAAMkF,EAAkB8B,EAAIvI,KAAK0G,WAAWP,KAAU,EAChDQ,EAAmB4B,EAAIvI,KAAK4G,YAAYT,KAAU,EAYxD,GAXAoC,EAAIhE,QAAQqE,aAAa,eAAgByG,OAAO5I,IAChD8B,EAAIhE,QAAQiB,UAAUqB,OAAO,8BAA+BJ,GAC5D8B,EAAIhE,QAAQ9C,UAAYkF,EACnBA,EAGJ4B,EAAIhE,QAAQ+D,gBAAgB,iBAF5BC,EAAIhE,QAAQqE,aAAa,gBAAiB,QAIvCL,EAAIgO,cAAuC,aAAvBhO,EAAIvI,KAAK8G,YAChCyB,EAAIgO,aAAatP,YAAcsB,EAAIvI,KAAKkH,SAASf,IAE9CoC,EAAIvI,KAAKmH,QAAS,CACrB,MAAMC,EAAkBmB,EAAIvI,KAAKmH,QAAQhB,GACnCkB,EAAiCkB,EAAIhE,QAAQyC,cAClD,8BAEGK,GAAUA,EAAOC,YAAcF,IAClCC,EAAOC,UAAYF,EAErB,CACD,CACAlH,KAAKsS,oBAAoBtM,iBAAiBC,EAC3C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"full.mjs","sources":["../../src/presets/FullPreset.ts"],"sourcesContent":["/**\n * Full preset: a fully-featured editor with all standard plugins.\n */\n\nimport { AlignmentPlugin } from '../plugins/alignment/AlignmentPlugin.js';\nimport { BlockquotePlugin } from '../plugins/blockquote/BlockquotePlugin.js';\nimport { CodeBlockPlugin } from '../plugins/code-block/CodeBlockPlugin.js';\nimport { FontSizePlugin } from '../plugins/font-size/FontSizePlugin.js';\nimport { FontPlugin } from '../plugins/font/FontPlugin.js';\nimport { HardBreakPlugin } from '../plugins/hard-break/HardBreakPlugin.js';\nimport { HeadingPlugin } from '../plugins/heading/HeadingPlugin.js';\nimport { HighlightPlugin } from '../plugins/highlight/HighlightPlugin.js';\nimport { HorizontalRulePlugin } from '../plugins/horizontal-rule/HorizontalRulePlugin.js';\nimport { ImagePlugin } from '../plugins/image/ImagePlugin.js';\nimport { LinkPlugin } from '../plugins/link/LinkPlugin.js';\nimport { ListPlugin } from '../plugins/list/ListPlugin.js';\nimport { PrintPlugin } from '../plugins/print/PrintPlugin.js';\nimport { SmartPastePlugin } from '../plugins/smart-paste/SmartPastePlugin.js';\nimport { StrikethroughPlugin } from '../plugins/strikethrough/StrikethroughPlugin.js';\nimport { SuperSubPlugin } from '../plugins/super-sub/SuperSubPlugin.js';\nimport { TablePlugin } from '../plugins/table/TablePlugin.js';\nimport { TextColorPlugin } from '../plugins/text-color/TextColorPlugin.js';\nimport { TextDirectionCorePlugin } from '../plugins/text-direction/TextDirectionCorePlugin.js';\nimport { TextFormattingPlugin } from '../plugins/text-formatting/TextFormattingPlugin.js';\nimport type { FullPresetOptions, PresetConfig } from './PresetTypes.js';\n\n/**\n * Creates a fully-featured editor preset with all standard plugins.\n *\n * Pass `font.fonts` to supply font definitions (e.g. `STARTER_FONTS`).\n * Without explicit fonts, the font picker toolbar renders empty.\n *\n * Toolbar groups:\n * 1. Typography: Font, FontSize\n * 2. Inline marks: TextFormatting, Strikethrough, SuperSub\n * 3. Colors: TextColor, Highlight\n * 4. Block types: Heading, Blockquote, CodeBlock\n * 5. Paragraph layout: Alignment, TextDirection\n * 6. Lists: List\n * 7. Insert objects: Link, Table, HorizontalRule, Image\n * 8. Utility: Print\n */\nexport function createFullPreset(options?: FullPresetOptions): PresetConfig {\n\treturn {\n\t\ttoolbar: [\n\t\t\t[new FontPlugin({ fonts: [], ...options?.font }), new FontSizePlugin(options?.fontSize)],\n\t\t\t[\n\t\t\t\tnew TextFormattingPlugin(options?.textFormatting),\n\t\t\t\tnew StrikethroughPlugin(options?.strikethrough),\n\t\t\t\tnew SuperSubPlugin(options?.superSub),\n\t\t\t],\n\t\t\t[new TextColorPlugin(options?.textColor), new HighlightPlugin(options?.highlight)],\n\t\t\t[\n\t\t\t\tnew HeadingPlugin(options?.heading),\n\t\t\t\tnew BlockquotePlugin(options?.blockquote),\n\t\t\t\tnew CodeBlockPlugin(options?.codeBlock),\n\t\t\t],\n\t\t\t[\n\t\t\t\tnew AlignmentPlugin(options?.alignment),\n\t\t\t\tnew TextDirectionCorePlugin(options?.textDirection),\n\t\t\t],\n\t\t\t[new ListPlugin(options?.list)],\n\t\t\t[\n\t\t\t\tnew LinkPlugin(options?.link),\n\t\t\t\tnew TablePlugin(options?.table),\n\t\t\t\tnew HorizontalRulePlugin(options?.horizontalRule),\n\t\t\t\tnew ImagePlugin(options?.image),\n\t\t\t],\n\t\t\t[new PrintPlugin(options?.print)],\n\t\t],\n\t\tplugins: [new HardBreakPlugin(), new SmartPastePlugin(options?.smartPaste)],\n\t};\n}\n"],"names":["createFullPreset","options","toolbar","FontPlugin","fonts","font","FontSizePlugin","fontSize","TextFormattingPlugin","textFormatting","StrikethroughPlugin","strikethrough","SuperSubPlugin","superSub","TextColorPlugin","textColor","HighlightPlugin","highlight","HeadingPlugin","heading","BlockquotePlugin","blockquote","CodeBlockPlugin","codeBlock","AlignmentPlugin","alignment","TextDirectionCorePlugin","textDirection","ListPlugin","list","LinkPlugin","link","TablePlugin","table","HorizontalRulePlugin","horizontalRule","ImagePlugin","image","PrintPlugin","print","plugins","HardBreakPlugin","SmartPastePlugin","smartPaste"],"mappings":"ipCA0CO,SAASA,EAAiBC,GAChC,MAAO,CACNC,QAAS,CACR,CAAC,IAAIC,EAAW,CAAEC,MAAO,MAAOH,GAASI,OAAS,IAAIC,EAAeL,GAASM,WAC9E,CACC,IAAIC,EAAqBP,GAASQ,gBAClC,IAAIC,EAAoBT,GAASU,eACjC,IAAIC,EAAeX,GAASY,WAE7B,CAAC,IAAIC,EAAgBb,GAASc,WAAY,IAAIC,EAAgBf,GAASgB,YACvE,CACC,IAAIC,EAAcjB,GAASkB,SAC3B,IAAIC,EAAiBnB,GAASoB,YAC9B,IAAIC,EAAgBrB,GAASsB,YAE9B,CACC,IAAIC,EAAgBvB,GAASwB,WAC7B,IAAIC,EAAwBzB,GAAS0B,gBAEtC,CAAC,IAAIC,EAAW3B,GAAS4B,OACzB,CACC,IAAIC,EAAW7B,GAAS8B,MACxB,IAAIC,EAAY/B,GAASgC,OACzB,IAAIC,EAAqBjC,GAASkC,gBAClC,IAAIC,EAAYnC,GAASoC,QAE1B,CAAC,IAAIC,EAAYrC,GAASsC,SAE3BC,QAAS,CAAC,IAAIC,EAAmB,IAAIC,EAAiBzC,GAAS0C,aAEjE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"minimal.mjs","sources":["../../src/presets/MinimalPreset.ts"],"sourcesContent":["/**\n * Minimal preset: a lightweight editor with only font selection.\n */\n\nimport { FontPlugin } from '../plugins/font/FontPlugin.js';\nimport type { MinimalPresetOptions, PresetConfig } from './PresetTypes.js';\n\n/**\n * Creates a minimal editor preset with font selection only.\n * CaretNavigation and GapCursor are auto-registered by the editor.\n *\n * Pass `font.fonts` to supply font definitions (e.g. `STARTER_FONTS`).\n * Without explicit fonts, the font picker toolbar renders empty.\n */\nexport function createMinimalPreset(options?: MinimalPresetOptions): PresetConfig {\n\tconst fontPlugin: FontPlugin = new FontPlugin({\n\t\tfonts: [],\n\t\t...options?.font,\n\t});\n\n\treturn {\n\t\ttoolbar: [[fontPlugin]],\n\t\tplugins: [],\n\t};\n}\n"],"names":["createMinimalPreset","options","toolbar","FontPlugin","fonts","font","plugins"],"mappings":"iDAcO,SAASA,EAAoBC,GAMnC,MAAO,CACNC,QAAS,CAAC,CANoB,IAAIC,EAAW,CAC7CC,MAAO,MACJH,GAASI,SAKZC,QAAS,GAEX"}
|
package/dist/presets.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presets.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|