@notectl/core 2.0.6 → 2.0.7
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/dist/chunks/AlignmentPlugin-CD11uRY3.mjs +2 -0
- package/dist/chunks/AlignmentPlugin-CD11uRY3.mjs.map +1 -0
- package/dist/chunks/AttrRegistry-nDKtHK87.mjs +2 -0
- package/dist/chunks/AttrRegistry-nDKtHK87.mjs.map +1 -0
- package/dist/chunks/AttributedMarkCommands-D_PYkbBt.mjs +2 -0
- package/dist/chunks/AttributedMarkCommands-D_PYkbBt.mjs.map +1 -0
- package/dist/chunks/BlockInsertion-DaG_4D31.mjs +2 -0
- package/dist/chunks/BlockInsertion-DaG_4D31.mjs.map +1 -0
- package/dist/chunks/BlockTypePickerRegistry-C_jLddOz.mjs +2 -0
- package/dist/chunks/BlockTypePickerRegistry-C_jLddOz.mjs.map +1 -0
- package/dist/chunks/BlockquotePlugin-DpMA33pk.mjs +2 -0
- package/dist/chunks/BlockquotePlugin-DpMA33pk.mjs.map +1 -0
- package/dist/chunks/CaretNavigationPlugin-BxU2lMwX.mjs +2 -0
- package/dist/chunks/CaretNavigationPlugin-BxU2lMwX.mjs.map +1 -0
- package/dist/chunks/CodeBlockPlugin-CSb6Fxce.mjs +2 -0
- package/dist/chunks/CodeBlockPlugin-CSb6Fxce.mjs.map +1 -0
- package/dist/chunks/ColorGrid-BNDaG3b2.mjs +2 -0
- package/dist/chunks/ColorGrid-BNDaG3b2.mjs.map +1 -0
- package/dist/chunks/ColorPickerPopup-BwU_WZHh.mjs +2 -0
- package/dist/chunks/ColorPickerPopup-BwU_WZHh.mjs.map +1 -0
- package/dist/chunks/ColorValidation-CiGxVsqd.mjs +2 -0
- package/dist/chunks/ColorValidation-CiGxVsqd.mjs.map +1 -0
- package/dist/chunks/CommandHelpers-BoRO1KfE.mjs +2 -0
- package/dist/chunks/CommandHelpers-BoRO1KfE.mjs.map +1 -0
- package/dist/chunks/Commands-C7zBYmhA.mjs +2 -0
- package/dist/chunks/Commands-C7zBYmhA.mjs.map +1 -0
- package/dist/chunks/Decoration-oeHDjWWq.mjs +2 -0
- package/dist/chunks/Decoration-oeHDjWWq.mjs.map +1 -0
- package/dist/chunks/Document-_qdGR4vh.mjs +2 -0
- package/dist/chunks/Document-_qdGR4vh.mjs.map +1 -0
- package/dist/chunks/DocumentParser-Cq_bFYAS.mjs +2 -0
- package/dist/chunks/DocumentParser-Cq_bFYAS.mjs.map +1 -0
- package/dist/chunks/DomUtils-RKbAVBQz.mjs +2 -0
- package/dist/chunks/DomUtils-RKbAVBQz.mjs.map +1 -0
- package/dist/chunks/FontPlugin-CUVcS-40.mjs +2 -0
- package/dist/chunks/FontPlugin-CUVcS-40.mjs.map +1 -0
- package/dist/chunks/FontSizePlugin-a8YyFsjf.mjs +2 -0
- package/dist/chunks/FontSizePlugin-a8YyFsjf.mjs.map +1 -0
- package/dist/chunks/GapCursorNavigation-PhJeqELx.mjs +2 -0
- package/dist/chunks/GapCursorNavigation-PhJeqELx.mjs.map +1 -0
- package/dist/chunks/GapCursorPlugin-9V0Ne0Sw.mjs +2 -0
- package/dist/chunks/GapCursorPlugin-9V0Ne0Sw.mjs.map +1 -0
- package/dist/chunks/HTMLUtils-B8xj8Z1x.mjs +2 -0
- package/dist/chunks/HTMLUtils-B8xj8Z1x.mjs.map +1 -0
- package/dist/chunks/HardBreakPlugin-BzAU3DoJ.mjs +2 -0
- package/dist/chunks/HardBreakPlugin-BzAU3DoJ.mjs.map +1 -0
- package/dist/chunks/HeadingPlugin-1BVn57NF.mjs +2 -0
- package/dist/chunks/HeadingPlugin-1BVn57NF.mjs.map +1 -0
- package/dist/chunks/HighlightPlugin-7S6Y_IFY.mjs +2 -0
- package/dist/chunks/HighlightPlugin-7S6Y_IFY.mjs.map +1 -0
- package/dist/chunks/HorizontalRulePlugin-bZ4nat7E.mjs +2 -0
- package/dist/chunks/HorizontalRulePlugin-bZ4nat7E.mjs.map +1 -0
- package/dist/chunks/ImagePlugin-wz0SBhFQ.mjs +2 -0
- package/dist/chunks/ImagePlugin-wz0SBhFQ.mjs.map +1 -0
- package/dist/chunks/InlineCodePlugin-DW5_oiac.mjs +2 -0
- package/dist/chunks/InlineCodePlugin-DW5_oiac.mjs.map +1 -0
- package/dist/chunks/KeyboardNav-CsdlWnNl.mjs +2 -0
- package/dist/chunks/KeyboardNav-CsdlWnNl.mjs.map +1 -0
- package/dist/chunks/LinkPlugin-pWzPs-dS.mjs +2 -0
- package/dist/chunks/LinkPlugin-pWzPs-dS.mjs.map +1 -0
- package/dist/chunks/ListPlugin-Datp4nPR.mjs +2 -0
- package/dist/chunks/ListPlugin-Datp4nPR.mjs.map +1 -0
- package/dist/chunks/NavigationQueries-_xQtPALX.mjs +2 -0
- package/dist/chunks/NavigationQueries-_xQtPALX.mjs.map +1 -0
- package/dist/chunks/NodeResolver-DVPpO5nC.mjs +2 -0
- package/dist/chunks/NodeResolver-DVPpO5nC.mjs.map +1 -0
- package/dist/chunks/NodeSelectionCommands-BFHLrE5I.mjs +2 -0
- package/dist/chunks/NodeSelectionCommands-BFHLrE5I.mjs.map +1 -0
- package/dist/chunks/Platform-D9TRT4Mn.mjs +2 -0
- package/dist/chunks/Platform-D9TRT4Mn.mjs.map +1 -0
- package/dist/chunks/Plugin-BUNGKupW.mjs +2 -0
- package/dist/chunks/Plugin-BUNGKupW.mjs.map +1 -0
- package/dist/chunks/PluginHelpers-Db50-BRE.mjs +2 -0
- package/dist/chunks/PluginHelpers-Db50-BRE.mjs.map +1 -0
- package/dist/chunks/PopupManager-DaTySyZl.mjs +2 -0
- package/dist/chunks/PopupManager-DaTySyZl.mjs.map +1 -0
- package/dist/chunks/PopupPositioning-DRNwWB0U.mjs +2 -0
- package/dist/chunks/PopupPositioning-DRNwWB0U.mjs.map +1 -0
- package/dist/chunks/PrintPlugin-Dv8_E40e.mjs +2 -0
- package/dist/chunks/PrintPlugin-Dv8_E40e.mjs.map +1 -0
- package/dist/chunks/PrintTypes-DTV3-mSe.mjs +2 -0
- package/dist/chunks/PrintTypes-DTV3-mSe.mjs.map +1 -0
- package/dist/chunks/RangeIterator-CVUeIB4P.mjs +2 -0
- package/dist/chunks/RangeIterator-CVUeIB4P.mjs.map +1 -0
- package/dist/chunks/Selection-aeiSsvhe.mjs +2 -0
- package/dist/chunks/Selection-aeiSsvhe.mjs.map +1 -0
- package/dist/chunks/ShortcutFormatting-DE6B8iGs.mjs +2 -0
- package/dist/chunks/ShortcutFormatting-DE6B8iGs.mjs.map +1 -0
- package/dist/chunks/SmartPastePlugin-PCLFN5yA.mjs +2 -0
- package/dist/chunks/SmartPastePlugin-PCLFN5yA.mjs.map +1 -0
- package/dist/chunks/StrikethroughPlugin-J5eDn_sY.mjs +2 -0
- package/dist/chunks/StrikethroughPlugin-J5eDn_sY.mjs.map +1 -0
- package/dist/chunks/StyleRuntime-D3d1XFFe.mjs +2 -0
- package/dist/chunks/StyleRuntime-D3d1XFFe.mjs.map +1 -0
- package/dist/chunks/SuperSubPlugin-uSLscUwN.mjs +2 -0
- package/dist/chunks/SuperSubPlugin-uSLscUwN.mjs.map +1 -0
- package/dist/chunks/SyntaxTokenTypes-CVUAMov0.mjs +2 -0
- package/dist/chunks/SyntaxTokenTypes-CVUAMov0.mjs.map +1 -0
- package/dist/chunks/TablePlugin-DJHHWTD2.mjs +2 -0
- package/dist/chunks/TablePlugin-DJHHWTD2.mjs.map +1 -0
- package/dist/chunks/TextColorPlugin-CawTv5pV.mjs +2 -0
- package/dist/chunks/TextColorPlugin-CawTv5pV.mjs.map +1 -0
- package/dist/chunks/TextDirectionCorePlugin-CXCxX532.mjs +2 -0
- package/dist/chunks/TextDirectionCorePlugin-CXCxX532.mjs.map +1 -0
- package/dist/chunks/TextDirectionLocale-Kh3r4XQS.mjs +2 -0
- package/dist/chunks/TextDirectionLocale-Kh3r4XQS.mjs.map +1 -0
- package/dist/chunks/TextFormattingPlugin-DKgwX4Gy.mjs +2 -0
- package/dist/chunks/TextFormattingPlugin-DKgwX4Gy.mjs.map +1 -0
- package/dist/chunks/ToolbarPlugin-BipA0zez.mjs +2 -0
- package/dist/chunks/ToolbarPlugin-BipA0zez.mjs.map +1 -0
- package/dist/chunks/TypeBrands-BZDKMjR-.mjs +2 -0
- package/dist/chunks/TypeBrands-BZDKMjR-.mjs.map +1 -0
- package/dist/chunks/WordBoundary-DI0G6Wk2.mjs +2 -0
- package/dist/chunks/WordBoundary-DI0G6Wk2.mjs.map +1 -0
- package/dist/chunks/XmlDetector-DlRdJOIX.mjs +2 -0
- package/dist/chunks/XmlDetector-DlRdJOIX.mjs.map +1 -0
- package/dist/chunks/XmlPatterns-Dwmn4nrg.mjs +2 -0
- package/dist/chunks/XmlPatterns-Dwmn4nrg.mjs.map +1 -0
- package/dist/chunks/XmlSupport-UA-iNWTl.mjs +2 -0
- package/dist/chunks/XmlSupport-UA-iNWTl.mjs.map +1 -0
- package/dist/chunks/ar-13q9ejck.mjs +2 -0
- package/dist/chunks/ar-13q9ejck.mjs.map +1 -0
- package/dist/chunks/ar-7XO2HmsM.mjs +2 -0
- package/dist/chunks/ar-7XO2HmsM.mjs.map +1 -0
- package/dist/chunks/ar-B-n_gMXb.mjs +2 -0
- package/dist/chunks/ar-B-n_gMXb.mjs.map +1 -0
- package/dist/chunks/ar-BXeE6tKj.mjs +2 -0
- package/dist/chunks/ar-BXeE6tKj.mjs.map +1 -0
- package/dist/chunks/ar-Bs3sx3Oz.mjs +2 -0
- package/dist/chunks/ar-Bs3sx3Oz.mjs.map +1 -0
- package/dist/chunks/ar-ByNQ-o3t.mjs +2 -0
- package/dist/chunks/ar-ByNQ-o3t.mjs.map +1 -0
- package/dist/chunks/ar-C9AnO0uV.mjs +2 -0
- package/dist/chunks/ar-C9AnO0uV.mjs.map +1 -0
- package/dist/chunks/ar-CL-NsFoh.mjs +2 -0
- package/dist/chunks/ar-CL-NsFoh.mjs.map +1 -0
- package/dist/chunks/ar-COx4cFpT.mjs +2 -0
- package/dist/chunks/ar-COx4cFpT.mjs.map +1 -0
- package/dist/chunks/ar-CYZYoqcc.mjs +2 -0
- package/dist/chunks/ar-CYZYoqcc.mjs.map +1 -0
- package/dist/chunks/ar-ChOxTdPI.mjs +2 -0
- package/dist/chunks/ar-ChOxTdPI.mjs.map +1 -0
- package/dist/chunks/ar-Cj6amEs9.mjs +2 -0
- package/dist/chunks/ar-Cj6amEs9.mjs.map +1 -0
- package/dist/chunks/ar-CsH2S6Vd.mjs +2 -0
- package/dist/chunks/ar-CsH2S6Vd.mjs.map +1 -0
- package/dist/chunks/ar-D2y_YvMP.mjs +2 -0
- package/dist/chunks/ar-D2y_YvMP.mjs.map +1 -0
- package/dist/chunks/ar-D57VZrg2.mjs +2 -0
- package/dist/chunks/ar-D57VZrg2.mjs.map +1 -0
- package/dist/chunks/ar-DH06YQkP.mjs +2 -0
- package/dist/chunks/ar-DH06YQkP.mjs.map +1 -0
- package/dist/chunks/ar-DJ6K9HnU.mjs +2 -0
- package/dist/chunks/ar-DJ6K9HnU.mjs.map +1 -0
- package/dist/chunks/ar-DLxmSv7R.mjs +2 -0
- package/dist/chunks/ar-DLxmSv7R.mjs.map +1 -0
- package/dist/chunks/ar-DMNNIim-.mjs +2 -0
- package/dist/chunks/ar-DMNNIim-.mjs.map +1 -0
- package/dist/chunks/ar-DW0Inc7r.mjs +2 -0
- package/dist/chunks/ar-DW0Inc7r.mjs.map +1 -0
- package/dist/chunks/ar-SwJ-tyIu.mjs +2 -0
- package/dist/chunks/ar-SwJ-tyIu.mjs.map +1 -0
- package/dist/chunks/ar-Vfk7XFaz.mjs +2 -0
- package/dist/chunks/ar-Vfk7XFaz.mjs.map +1 -0
- package/dist/chunks/ar-izXCtb2I.mjs +2 -0
- package/dist/chunks/ar-izXCtb2I.mjs.map +1 -0
- package/dist/chunks/ar-jsznaXQ0.mjs +2 -0
- package/dist/chunks/ar-jsznaXQ0.mjs.map +1 -0
- package/dist/chunks/color-picker-D4Vi72Z_.mjs +2 -0
- package/dist/chunks/color-picker-D4Vi72Z_.mjs.map +1 -0
- package/dist/chunks/de-3PJCshB7.mjs +2 -0
- package/dist/chunks/de-3PJCshB7.mjs.map +1 -0
- package/dist/chunks/de-B92lssMU.mjs +2 -0
- package/dist/chunks/de-B92lssMU.mjs.map +1 -0
- package/dist/chunks/de-BJ8Lo9rY.mjs +2 -0
- package/dist/chunks/de-BJ8Lo9rY.mjs.map +1 -0
- package/dist/chunks/de-BjNoeX05.mjs +2 -0
- package/dist/chunks/de-BjNoeX05.mjs.map +1 -0
- package/dist/chunks/de-Bktm7FKk.mjs +2 -0
- package/dist/chunks/de-Bktm7FKk.mjs.map +1 -0
- package/dist/chunks/de-BnhP65y3.mjs +2 -0
- package/dist/chunks/de-BnhP65y3.mjs.map +1 -0
- package/dist/chunks/de-BqHw2LVH.mjs +2 -0
- package/dist/chunks/de-BqHw2LVH.mjs.map +1 -0
- package/dist/chunks/de-BzjqF_j0.mjs +2 -0
- package/dist/chunks/de-BzjqF_j0.mjs.map +1 -0
- package/dist/chunks/de-CWsXH4_J.mjs +2 -0
- package/dist/chunks/de-CWsXH4_J.mjs.map +1 -0
- package/dist/chunks/de-CWwHCIzX.mjs +2 -0
- package/dist/chunks/de-CWwHCIzX.mjs.map +1 -0
- package/dist/chunks/de-ChHR-g0q.mjs +2 -0
- package/dist/chunks/de-ChHR-g0q.mjs.map +1 -0
- package/dist/chunks/de-CqJFzINs.mjs +2 -0
- package/dist/chunks/de-CqJFzINs.mjs.map +1 -0
- package/dist/chunks/de-DAPQek-i.mjs +2 -0
- package/dist/chunks/de-DAPQek-i.mjs.map +1 -0
- package/dist/chunks/de-DPzOP2Ge.mjs +2 -0
- package/dist/chunks/de-DPzOP2Ge.mjs.map +1 -0
- package/dist/chunks/de-DhenqH4M.mjs +2 -0
- package/dist/chunks/de-DhenqH4M.mjs.map +1 -0
- package/dist/chunks/de-Ds6tfD71.mjs +2 -0
- package/dist/chunks/de-Ds6tfD71.mjs.map +1 -0
- package/dist/chunks/de-DxyfCVlM.mjs +2 -0
- package/dist/chunks/de-DxyfCVlM.mjs.map +1 -0
- package/dist/chunks/de-RSzW4zsb.mjs +2 -0
- package/dist/chunks/de-RSzW4zsb.mjs.map +1 -0
- package/dist/chunks/de-YiJZ87p6.mjs +2 -0
- package/dist/chunks/de-YiJZ87p6.mjs.map +1 -0
- package/dist/chunks/de-e7G64WBM.mjs +2 -0
- package/dist/chunks/de-e7G64WBM.mjs.map +1 -0
- package/dist/chunks/de-oeen0lTL.mjs +2 -0
- package/dist/chunks/de-oeen0lTL.mjs.map +1 -0
- package/dist/chunks/de-p1zboXJW.mjs +2 -0
- package/dist/chunks/de-p1zboXJW.mjs.map +1 -0
- package/dist/chunks/de-q2xHBWVU.mjs +2 -0
- package/dist/chunks/de-q2xHBWVU.mjs.map +1 -0
- package/dist/chunks/de-zjzkzZs9.mjs +2 -0
- package/dist/chunks/de-zjzkzZs9.mjs.map +1 -0
- package/dist/chunks/es-2U-tuiWo.mjs +2 -0
- package/dist/chunks/es-2U-tuiWo.mjs.map +1 -0
- package/dist/chunks/es-8kEYE5eN.mjs +2 -0
- package/dist/chunks/es-8kEYE5eN.mjs.map +1 -0
- package/dist/chunks/es-B2B0W46I.mjs +2 -0
- package/dist/chunks/es-B2B0W46I.mjs.map +1 -0
- package/dist/chunks/es-B8Ne6vhS.mjs +2 -0
- package/dist/chunks/es-B8Ne6vhS.mjs.map +1 -0
- package/dist/chunks/es-BBaS8xrI.mjs +2 -0
- package/dist/chunks/es-BBaS8xrI.mjs.map +1 -0
- package/dist/chunks/es-BJibD3UW.mjs +2 -0
- package/dist/chunks/es-BJibD3UW.mjs.map +1 -0
- package/dist/chunks/es-BL7KuLOg.mjs +2 -0
- package/dist/chunks/es-BL7KuLOg.mjs.map +1 -0
- package/dist/chunks/es-BUIOf37N.mjs +2 -0
- package/dist/chunks/es-BUIOf37N.mjs.map +1 -0
- package/dist/chunks/es-BcEc0JEI.mjs +2 -0
- package/dist/chunks/es-BcEc0JEI.mjs.map +1 -0
- package/dist/chunks/es-BjomAlG3.mjs +2 -0
- package/dist/chunks/es-BjomAlG3.mjs.map +1 -0
- package/dist/chunks/es-BpgE28ol.mjs +2 -0
- package/dist/chunks/es-BpgE28ol.mjs.map +1 -0
- package/dist/chunks/es-Bq_XkuDG.mjs +2 -0
- package/dist/chunks/es-Bq_XkuDG.mjs.map +1 -0
- package/dist/chunks/es-BtTQw2t5.mjs +2 -0
- package/dist/chunks/es-BtTQw2t5.mjs.map +1 -0
- package/dist/chunks/es-Bwy7v223.mjs +2 -0
- package/dist/chunks/es-Bwy7v223.mjs.map +1 -0
- package/dist/chunks/es-C0Jm_n57.mjs +2 -0
- package/dist/chunks/es-C0Jm_n57.mjs.map +1 -0
- package/dist/chunks/es-C49UmQIT.mjs +2 -0
- package/dist/chunks/es-C49UmQIT.mjs.map +1 -0
- package/dist/chunks/es-CCAT_-nb.mjs +2 -0
- package/dist/chunks/es-CCAT_-nb.mjs.map +1 -0
- package/dist/chunks/es-CGGqdLIQ.mjs +2 -0
- package/dist/chunks/es-CGGqdLIQ.mjs.map +1 -0
- package/dist/chunks/es-CYKm6CQM.mjs +2 -0
- package/dist/chunks/es-CYKm6CQM.mjs.map +1 -0
- package/dist/chunks/es-C_L1Wdfi.mjs +2 -0
- package/dist/chunks/es-C_L1Wdfi.mjs.map +1 -0
- package/dist/chunks/es-DEo4yDI6.mjs +2 -0
- package/dist/chunks/es-DEo4yDI6.mjs.map +1 -0
- package/dist/chunks/es-D_6MYvFK.mjs +2 -0
- package/dist/chunks/es-D_6MYvFK.mjs.map +1 -0
- package/dist/chunks/es-DcYIJR0T.mjs +2 -0
- package/dist/chunks/es-DcYIJR0T.mjs.map +1 -0
- package/dist/chunks/es-y2SZmX3P.mjs +2 -0
- package/dist/chunks/es-y2SZmX3P.mjs.map +1 -0
- package/dist/chunks/fonts-B3hiRKxQ.mjs +2 -0
- package/dist/chunks/fonts-B3hiRKxQ.mjs.map +1 -0
- package/dist/chunks/fr-Ame1k629.mjs +2 -0
- package/dist/chunks/fr-Ame1k629.mjs.map +1 -0
- package/dist/chunks/fr-BCN045Ph.mjs +2 -0
- package/dist/chunks/fr-BCN045Ph.mjs.map +1 -0
- package/dist/chunks/fr-BQaiAAa6.mjs +2 -0
- package/dist/chunks/fr-BQaiAAa6.mjs.map +1 -0
- package/dist/chunks/fr-BR61Uevp.mjs +2 -0
- package/dist/chunks/fr-BR61Uevp.mjs.map +1 -0
- package/dist/chunks/fr-Bb-xVkAd.mjs +2 -0
- package/dist/chunks/fr-Bb-xVkAd.mjs.map +1 -0
- package/dist/chunks/fr-BhM3Ykql.mjs +2 -0
- package/dist/chunks/fr-BhM3Ykql.mjs.map +1 -0
- package/dist/chunks/fr-BqQRlsfW.mjs +2 -0
- package/dist/chunks/fr-BqQRlsfW.mjs.map +1 -0
- package/dist/chunks/fr-C81THS0v.mjs +2 -0
- package/dist/chunks/fr-C81THS0v.mjs.map +1 -0
- package/dist/chunks/fr-CXzpB6GU.mjs +2 -0
- package/dist/chunks/fr-CXzpB6GU.mjs.map +1 -0
- package/dist/chunks/fr-CjLyVnG3.mjs +2 -0
- package/dist/chunks/fr-CjLyVnG3.mjs.map +1 -0
- package/dist/chunks/fr-D66EEW9-.mjs +2 -0
- package/dist/chunks/fr-D66EEW9-.mjs.map +1 -0
- package/dist/chunks/fr-DHDNGQpl.mjs +2 -0
- package/dist/chunks/fr-DHDNGQpl.mjs.map +1 -0
- package/dist/chunks/fr-DOcFqSiX.mjs +2 -0
- package/dist/chunks/fr-DOcFqSiX.mjs.map +1 -0
- package/dist/chunks/fr-DPPHZ6H7.mjs +2 -0
- package/dist/chunks/fr-DPPHZ6H7.mjs.map +1 -0
- package/dist/chunks/fr-DVteHTTh.mjs +2 -0
- package/dist/chunks/fr-DVteHTTh.mjs.map +1 -0
- package/dist/chunks/fr-Dkeg9Am0.mjs +2 -0
- package/dist/chunks/fr-Dkeg9Am0.mjs.map +1 -0
- package/dist/chunks/fr-DnP_hh5Q.mjs +2 -0
- package/dist/chunks/fr-DnP_hh5Q.mjs.map +1 -0
- package/dist/chunks/fr-GSoPohxY.mjs +2 -0
- package/dist/chunks/fr-GSoPohxY.mjs.map +1 -0
- package/dist/chunks/fr-aDJE54Is.mjs +2 -0
- package/dist/chunks/fr-aDJE54Is.mjs.map +1 -0
- package/dist/chunks/fr-hStmLXCS.mjs +2 -0
- package/dist/chunks/fr-hStmLXCS.mjs.map +1 -0
- package/dist/chunks/fr-hUF51sR5.mjs +2 -0
- package/dist/chunks/fr-hUF51sR5.mjs.map +1 -0
- package/dist/chunks/fr-tK6rWhoz.mjs +2 -0
- package/dist/chunks/fr-tK6rWhoz.mjs.map +1 -0
- package/dist/chunks/fr-wqbTMwkj.mjs +2 -0
- package/dist/chunks/fr-wqbTMwkj.mjs.map +1 -0
- package/dist/chunks/fr-zO4UIZj_.mjs +2 -0
- package/dist/chunks/fr-zO4UIZj_.mjs.map +1 -0
- package/dist/chunks/full-DCZ8MMpe.mjs +2 -0
- package/dist/chunks/full-DCZ8MMpe.mjs.map +1 -0
- package/dist/chunks/hi-B7zs2lw-.mjs +2 -0
- package/dist/chunks/hi-B7zs2lw-.mjs.map +1 -0
- package/dist/chunks/hi-BE4pkSYX.mjs +2 -0
- package/dist/chunks/hi-BE4pkSYX.mjs.map +1 -0
- package/dist/chunks/hi-BEBdteKo.mjs +2 -0
- package/dist/chunks/hi-BEBdteKo.mjs.map +1 -0
- package/dist/chunks/hi-BFBRjxgB.mjs +2 -0
- package/dist/chunks/hi-BFBRjxgB.mjs.map +1 -0
- package/dist/chunks/hi-BGMkRr1l.mjs +2 -0
- package/dist/chunks/hi-BGMkRr1l.mjs.map +1 -0
- package/dist/chunks/hi-BKJbF0k9.mjs +2 -0
- package/dist/chunks/hi-BKJbF0k9.mjs.map +1 -0
- package/dist/chunks/hi-Bj-wENIe.mjs +2 -0
- package/dist/chunks/hi-Bj-wENIe.mjs.map +1 -0
- package/dist/chunks/hi-Bo_sc83d.mjs +2 -0
- package/dist/chunks/hi-Bo_sc83d.mjs.map +1 -0
- package/dist/chunks/hi-BqdojmVi.mjs +2 -0
- package/dist/chunks/hi-BqdojmVi.mjs.map +1 -0
- package/dist/chunks/hi-C2HFcJ8H.mjs +2 -0
- package/dist/chunks/hi-C2HFcJ8H.mjs.map +1 -0
- package/dist/chunks/hi-C9hGhR9D.mjs +2 -0
- package/dist/chunks/hi-C9hGhR9D.mjs.map +1 -0
- package/dist/chunks/hi-CRsCP_UU.mjs +2 -0
- package/dist/chunks/hi-CRsCP_UU.mjs.map +1 -0
- package/dist/chunks/hi-CSatC6e_.mjs +2 -0
- package/dist/chunks/hi-CSatC6e_.mjs.map +1 -0
- package/dist/chunks/hi-CTb2tu17.mjs +2 -0
- package/dist/chunks/hi-CTb2tu17.mjs.map +1 -0
- package/dist/chunks/hi-Cik-gmhU.mjs +2 -0
- package/dist/chunks/hi-Cik-gmhU.mjs.map +1 -0
- package/dist/chunks/hi-Co2ThMh7.mjs +2 -0
- package/dist/chunks/hi-Co2ThMh7.mjs.map +1 -0
- package/dist/chunks/hi-CrATuZJr.mjs +2 -0
- package/dist/chunks/hi-CrATuZJr.mjs.map +1 -0
- package/dist/chunks/hi-D-r5tA_n.mjs +2 -0
- package/dist/chunks/hi-D-r5tA_n.mjs.map +1 -0
- package/dist/chunks/hi-D0RKvhDO.mjs +2 -0
- package/dist/chunks/hi-D0RKvhDO.mjs.map +1 -0
- package/dist/chunks/hi-DOSbCXy_.mjs +2 -0
- package/dist/chunks/hi-DOSbCXy_.mjs.map +1 -0
- package/dist/chunks/hi-DTUY7wlZ.mjs +2 -0
- package/dist/chunks/hi-DTUY7wlZ.mjs.map +1 -0
- package/dist/chunks/hi-FhcxnL2S.mjs +2 -0
- package/dist/chunks/hi-FhcxnL2S.mjs.map +1 -0
- package/dist/chunks/hi-K71sKi2-.mjs +2 -0
- package/dist/chunks/hi-K71sKi2-.mjs.map +1 -0
- package/dist/chunks/hi-xjChf5ZY.mjs +2 -0
- package/dist/chunks/hi-xjChf5ZY.mjs.map +1 -0
- package/dist/chunks/minimal-DmYfqOxb.mjs +2 -0
- package/dist/chunks/minimal-DmYfqOxb.mjs.map +1 -0
- package/dist/chunks/pt-6uTV9TBd.mjs +2 -0
- package/dist/chunks/pt-6uTV9TBd.mjs.map +1 -0
- package/dist/chunks/pt-7ZYOqmC4.mjs +2 -0
- package/dist/chunks/pt-7ZYOqmC4.mjs.map +1 -0
- package/dist/chunks/pt-B65Mk0F_.mjs +2 -0
- package/dist/chunks/pt-B65Mk0F_.mjs.map +1 -0
- package/dist/chunks/pt-B9c20zi-.mjs +2 -0
- package/dist/chunks/pt-B9c20zi-.mjs.map +1 -0
- package/dist/chunks/pt-BRQRHBoW.mjs +2 -0
- package/dist/chunks/pt-BRQRHBoW.mjs.map +1 -0
- package/dist/chunks/pt-BYsPmDNG.mjs +2 -0
- package/dist/chunks/pt-BYsPmDNG.mjs.map +1 -0
- package/dist/chunks/pt-BattAVOq.mjs +2 -0
- package/dist/chunks/pt-BattAVOq.mjs.map +1 -0
- package/dist/chunks/pt-Bau_d96t.mjs +2 -0
- package/dist/chunks/pt-Bau_d96t.mjs.map +1 -0
- package/dist/chunks/pt-Bb3sODVO.mjs +2 -0
- package/dist/chunks/pt-Bb3sODVO.mjs.map +1 -0
- package/dist/chunks/pt-BieXcDHi.mjs +2 -0
- package/dist/chunks/pt-BieXcDHi.mjs.map +1 -0
- package/dist/chunks/pt-BzJZ6tis.mjs +2 -0
- package/dist/chunks/pt-BzJZ6tis.mjs.map +1 -0
- package/dist/chunks/pt-CDBahjbg.mjs +2 -0
- package/dist/chunks/pt-CDBahjbg.mjs.map +1 -0
- package/dist/chunks/pt-CQIn2xA5.mjs +2 -0
- package/dist/chunks/pt-CQIn2xA5.mjs.map +1 -0
- package/dist/chunks/pt-Cx3gdB5p.mjs +2 -0
- package/dist/chunks/pt-Cx3gdB5p.mjs.map +1 -0
- package/dist/chunks/pt-D7n_VUMD.mjs +2 -0
- package/dist/chunks/pt-D7n_VUMD.mjs.map +1 -0
- package/dist/chunks/pt-DEg_u7oB.mjs +2 -0
- package/dist/chunks/pt-DEg_u7oB.mjs.map +1 -0
- package/dist/chunks/pt-DchozfDf.mjs +2 -0
- package/dist/chunks/pt-DchozfDf.mjs.map +1 -0
- package/dist/chunks/pt-DnHYzWZI.mjs +2 -0
- package/dist/chunks/pt-DnHYzWZI.mjs.map +1 -0
- package/dist/chunks/pt-Dne18ay-.mjs +2 -0
- package/dist/chunks/pt-Dne18ay-.mjs.map +1 -0
- package/dist/chunks/pt-DxTZELCn.mjs +2 -0
- package/dist/chunks/pt-DxTZELCn.mjs.map +1 -0
- package/dist/chunks/pt-FnLj_fwL.mjs +2 -0
- package/dist/chunks/pt-FnLj_fwL.mjs.map +1 -0
- package/dist/chunks/pt-QZcGM_AW.mjs +2 -0
- package/dist/chunks/pt-QZcGM_AW.mjs.map +1 -0
- package/dist/chunks/pt-X4oj0zCg.mjs +2 -0
- package/dist/chunks/pt-X4oj0zCg.mjs.map +1 -0
- package/dist/chunks/pt-hgZhGt5D.mjs +2 -0
- package/dist/chunks/pt-hgZhGt5D.mjs.map +1 -0
- package/dist/chunks/ru-333jycve.mjs +2 -0
- package/dist/chunks/ru-333jycve.mjs.map +1 -0
- package/dist/chunks/ru-B278yBd4.mjs +2 -0
- package/dist/chunks/ru-B278yBd4.mjs.map +1 -0
- package/dist/chunks/ru-B2dlVf3F.mjs +2 -0
- package/dist/chunks/ru-B2dlVf3F.mjs.map +1 -0
- package/dist/chunks/ru-BHZdR6yk.mjs +2 -0
- package/dist/chunks/ru-BHZdR6yk.mjs.map +1 -0
- package/dist/chunks/ru-BhXqR_wI.mjs +2 -0
- package/dist/chunks/ru-BhXqR_wI.mjs.map +1 -0
- package/dist/chunks/ru-BkhY_-Tu.mjs +2 -0
- package/dist/chunks/ru-BkhY_-Tu.mjs.map +1 -0
- package/dist/chunks/ru-BqJmK6DG.mjs +2 -0
- package/dist/chunks/ru-BqJmK6DG.mjs.map +1 -0
- package/dist/chunks/ru-BscEW-yr.mjs +2 -0
- package/dist/chunks/ru-BscEW-yr.mjs.map +1 -0
- package/dist/chunks/ru-C91kg2w_.mjs +2 -0
- package/dist/chunks/ru-C91kg2w_.mjs.map +1 -0
- package/dist/chunks/ru-CQoFJYQk.mjs +2 -0
- package/dist/chunks/ru-CQoFJYQk.mjs.map +1 -0
- package/dist/chunks/ru-CYMaDdFA.mjs +2 -0
- package/dist/chunks/ru-CYMaDdFA.mjs.map +1 -0
- package/dist/chunks/ru-ClE-ByL-.mjs +2 -0
- package/dist/chunks/ru-ClE-ByL-.mjs.map +1 -0
- package/dist/chunks/ru-CmLLEJJV.mjs +2 -0
- package/dist/chunks/ru-CmLLEJJV.mjs.map +1 -0
- package/dist/chunks/ru-CmlYwIPH.mjs +2 -0
- package/dist/chunks/ru-CmlYwIPH.mjs.map +1 -0
- package/dist/chunks/ru-D74ItjLR.mjs +2 -0
- package/dist/chunks/ru-D74ItjLR.mjs.map +1 -0
- package/dist/chunks/ru-DR7ji_U_.mjs +2 -0
- package/dist/chunks/ru-DR7ji_U_.mjs.map +1 -0
- package/dist/chunks/ru-DZ0titlK.mjs +2 -0
- package/dist/chunks/ru-DZ0titlK.mjs.map +1 -0
- package/dist/chunks/ru-DftPghQ8.mjs +2 -0
- package/dist/chunks/ru-DftPghQ8.mjs.map +1 -0
- package/dist/chunks/ru-L3ML505C.mjs +2 -0
- package/dist/chunks/ru-L3ML505C.mjs.map +1 -0
- package/dist/chunks/ru-U-UhwubV.mjs +2 -0
- package/dist/chunks/ru-U-UhwubV.mjs.map +1 -0
- package/dist/chunks/ru-VAZhjO4q.mjs +2 -0
- package/dist/chunks/ru-VAZhjO4q.mjs.map +1 -0
- package/dist/chunks/ru-afocv3DK.mjs +2 -0
- package/dist/chunks/ru-afocv3DK.mjs.map +1 -0
- package/dist/chunks/ru-gUXymxbh.mjs +2 -0
- package/dist/chunks/ru-gUXymxbh.mjs.map +1 -0
- package/dist/chunks/ru-qL1ebv4O.mjs +2 -0
- package/dist/chunks/ru-qL1ebv4O.mjs.map +1 -0
- package/dist/chunks/shared-BLU27F7-.mjs +2 -0
- package/dist/chunks/shared-BLU27F7-.mjs.map +1 -0
- package/dist/chunks/src-CgbuJfYr.mjs +2 -0
- package/dist/chunks/src-CgbuJfYr.mjs.map +1 -0
- package/dist/chunks/text-direction-advanced-CkFu0K_I.mjs +2 -0
- package/dist/chunks/text-direction-advanced-CkFu0K_I.mjs.map +1 -0
- package/dist/chunks/zh-B3geJFGW.mjs +2 -0
- package/dist/chunks/zh-B3geJFGW.mjs.map +1 -0
- package/dist/chunks/zh-B4p7M6XB.mjs +2 -0
- package/dist/chunks/zh-B4p7M6XB.mjs.map +1 -0
- package/dist/chunks/zh-BkwaMj9a.mjs +2 -0
- package/dist/chunks/zh-BkwaMj9a.mjs.map +1 -0
- package/dist/chunks/zh-BogAT6ZW.mjs +2 -0
- package/dist/chunks/zh-BogAT6ZW.mjs.map +1 -0
- package/dist/chunks/zh-BvMEmsyF.mjs +2 -0
- package/dist/chunks/zh-BvMEmsyF.mjs.map +1 -0
- package/dist/chunks/zh-BzLh1p5b.mjs +2 -0
- package/dist/chunks/zh-BzLh1p5b.mjs.map +1 -0
- package/dist/chunks/zh-CBMpL9ha.mjs +2 -0
- package/dist/chunks/zh-CBMpL9ha.mjs.map +1 -0
- package/dist/chunks/zh-CIFsVnFl.mjs +2 -0
- package/dist/chunks/zh-CIFsVnFl.mjs.map +1 -0
- package/dist/chunks/zh-CP6_YzAc.mjs +2 -0
- package/dist/chunks/zh-CP6_YzAc.mjs.map +1 -0
- package/dist/chunks/zh-CT4V3EmW.mjs +2 -0
- package/dist/chunks/zh-CT4V3EmW.mjs.map +1 -0
- package/dist/chunks/zh-CZCIluI_.mjs +2 -0
- package/dist/chunks/zh-CZCIluI_.mjs.map +1 -0
- package/dist/chunks/zh-CcMLjYrk.mjs +2 -0
- package/dist/chunks/zh-CcMLjYrk.mjs.map +1 -0
- package/dist/chunks/zh-CfCQsLZa.mjs +2 -0
- package/dist/chunks/zh-CfCQsLZa.mjs.map +1 -0
- package/dist/chunks/zh-CsyBlhtm.mjs +2 -0
- package/dist/chunks/zh-CsyBlhtm.mjs.map +1 -0
- package/dist/chunks/zh-DSfxjb4Y.mjs +2 -0
- package/dist/chunks/zh-DSfxjb4Y.mjs.map +1 -0
- package/dist/chunks/zh-Dj5jzeIJ.mjs +2 -0
- package/dist/chunks/zh-Dj5jzeIJ.mjs.map +1 -0
- package/dist/chunks/zh-DjY-jmYn.mjs +2 -0
- package/dist/chunks/zh-DjY-jmYn.mjs.map +1 -0
- package/dist/chunks/zh-Dt7zL1Bl.mjs +2 -0
- package/dist/chunks/zh-Dt7zL1Bl.mjs.map +1 -0
- package/dist/chunks/zh-TXVgSc3H.mjs +2 -0
- package/dist/chunks/zh-TXVgSc3H.mjs.map +1 -0
- package/dist/chunks/zh-bkCXy34A.mjs +2 -0
- package/dist/chunks/zh-bkCXy34A.mjs.map +1 -0
- package/dist/chunks/zh-cRqBrQM8.mjs +2 -0
- package/dist/chunks/zh-cRqBrQM8.mjs.map +1 -0
- package/dist/chunks/zh-cUJdRfxu.mjs +2 -0
- package/dist/chunks/zh-cUJdRfxu.mjs.map +1 -0
- package/dist/chunks/zh-qo4_i9Vd.mjs +2 -0
- package/dist/chunks/zh-qo4_i9Vd.mjs.map +1 -0
- package/dist/chunks/zh-tpUU3oJa.mjs +2 -0
- package/dist/chunks/zh-tpUU3oJa.mjs.map +1 -0
- package/dist/editor/ContentSerializer.d.ts +2 -2
- package/dist/editor/ContentSerializer.d.ts.map +1 -1
- package/dist/editor/styles/base.d.ts +1 -1
- package/dist/editor/styles/base.d.ts.map +1 -1
- package/dist/editor/theme/ThemeEngine.d.ts.map +1 -1
- package/dist/editor/theme/ThemeTokens.d.ts +7 -0
- package/dist/editor/theme/ThemeTokens.d.ts.map +1 -1
- package/dist/fonts.mjs +1 -1
- package/dist/full.d.ts +1 -0
- package/dist/full.d.ts.map +1 -1
- package/dist/full.mjs +1 -1
- package/dist/html.mjs +1 -1
- package/dist/notectl-core.mjs +1 -1
- package/dist/notectl-core.umd.js +1 -1
- package/dist/notectl-core.umd.js.map +1 -1
- package/dist/plugins/CommandRegistry.d.ts +19 -0
- package/dist/plugins/CommandRegistry.d.ts.map +1 -0
- package/dist/plugins/MiddlewareChain.d.ts +39 -0
- package/dist/plugins/MiddlewareChain.d.ts.map +1 -0
- package/dist/plugins/PluginLifecycle.d.ts +56 -0
- package/dist/plugins/PluginLifecycle.d.ts.map +1 -0
- package/dist/plugins/PluginManager.d.ts +9 -63
- package/dist/plugins/PluginManager.d.ts.map +1 -1
- package/dist/plugins/RegistrationTracker.d.ts +38 -0
- package/dist/plugins/RegistrationTracker.d.ts.map +1 -0
- package/dist/plugins/ServiceRegistry.d.ts +14 -0
- package/dist/plugins/ServiceRegistry.d.ts.map +1 -0
- package/dist/plugins/alignment.mjs +1 -1
- package/dist/plugins/blockquote.mjs +1 -1
- package/dist/plugins/caret-navigation.mjs +1 -1
- package/dist/plugins/code-block/CodeBlockTypes.d.ts +1 -1
- package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
- package/dist/plugins/code-block.mjs +1 -1
- package/dist/plugins/font-size.mjs +1 -1
- package/dist/plugins/font.mjs +1 -1
- package/dist/plugins/gap-cursor.mjs +1 -1
- package/dist/plugins/hard-break.mjs +1 -1
- package/dist/plugins/heading.mjs +1 -1
- package/dist/plugins/highlight.mjs +1 -1
- package/dist/plugins/horizontal-rule.mjs +1 -1
- package/dist/plugins/image.mjs +1 -1
- package/dist/plugins/inline-code/InlineCodeLocale.d.ts +10 -0
- package/dist/plugins/inline-code/InlineCodeLocale.d.ts.map +1 -0
- package/dist/plugins/inline-code/InlineCodePlugin.d.ts +39 -0
- package/dist/plugins/inline-code/InlineCodePlugin.d.ts.map +1 -0
- package/dist/plugins/inline-code/index.d.ts +4 -0
- package/dist/plugins/inline-code/index.d.ts.map +1 -0
- package/dist/plugins/inline-code/locales/ar.d.ts +4 -0
- package/dist/plugins/inline-code/locales/ar.d.ts.map +1 -0
- package/dist/plugins/inline-code/locales/de.d.ts +4 -0
- package/dist/plugins/inline-code/locales/de.d.ts.map +1 -0
- package/dist/plugins/inline-code/locales/es.d.ts +4 -0
- package/dist/plugins/inline-code/locales/es.d.ts.map +1 -0
- package/dist/plugins/inline-code/locales/fr.d.ts +4 -0
- package/dist/plugins/inline-code/locales/fr.d.ts.map +1 -0
- package/dist/plugins/inline-code/locales/hi.d.ts +4 -0
- package/dist/plugins/inline-code/locales/hi.d.ts.map +1 -0
- package/dist/plugins/inline-code/locales/pt.d.ts +4 -0
- package/dist/plugins/inline-code/locales/pt.d.ts.map +1 -0
- package/dist/plugins/inline-code/locales/ru.d.ts +4 -0
- package/dist/plugins/inline-code/locales/ru.d.ts.map +1 -0
- package/dist/plugins/inline-code/locales/zh.d.ts +4 -0
- package/dist/plugins/inline-code/locales/zh.d.ts.map +1 -0
- package/dist/plugins/inline-code.mjs +1 -0
- package/dist/plugins/language.mjs +1 -1
- package/dist/plugins/link.mjs +1 -1
- package/dist/plugins/list.mjs +1 -1
- package/dist/plugins/print/PrintStyleCollector.d.ts +7 -1
- package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -1
- package/dist/plugins/print/PrintTypes.d.ts +5 -0
- package/dist/plugins/print/PrintTypes.d.ts.map +1 -1
- package/dist/plugins/print.mjs +1 -1
- package/dist/plugins/shared.mjs +1 -1
- package/dist/plugins/smart-paste.mjs +1 -1
- package/dist/plugins/strikethrough.mjs +1 -1
- package/dist/plugins/super-sub.mjs +1 -1
- package/dist/plugins/table.mjs +1 -1
- package/dist/plugins/text-color.mjs +1 -1
- package/dist/plugins/text-direction-advanced.mjs +1 -1
- package/dist/plugins/text-direction.mjs +1 -1
- package/dist/plugins/text-formatting.mjs +1 -1
- package/dist/plugins/toolbar.mjs +1 -1
- package/dist/presets/FullPreset.d.ts +1 -1
- package/dist/presets/FullPreset.d.ts.map +1 -1
- package/dist/presets/PresetTypes.d.ts +2 -0
- package/dist/presets/PresetTypes.d.ts.map +1 -1
- package/dist/presets/full.mjs +1 -1
- package/dist/presets/minimal.mjs +1 -1
- package/dist/presets.mjs +1 -1
- package/dist/serialization/DocumentParser.d.ts.map +1 -1
- package/package.json +11 -1
- package/dist/chunks/AlignmentPlugin-DGb1VtCU.mjs +0 -2
- package/dist/chunks/AlignmentPlugin-DGb1VtCU.mjs.map +0 -1
- package/dist/chunks/AttrRegistry-DvqbnJ6T.mjs +0 -2
- package/dist/chunks/AttrRegistry-DvqbnJ6T.mjs.map +0 -1
- package/dist/chunks/AttributedMarkCommands-BiJtiHpx.mjs +0 -2
- package/dist/chunks/AttributedMarkCommands-BiJtiHpx.mjs.map +0 -1
- package/dist/chunks/BlockInsertion-Q8B21SaG.mjs +0 -2
- package/dist/chunks/BlockInsertion-Q8B21SaG.mjs.map +0 -1
- package/dist/chunks/BlockTypePickerRegistry-5fFlS2i0.mjs +0 -2
- package/dist/chunks/BlockTypePickerRegistry-5fFlS2i0.mjs.map +0 -1
- package/dist/chunks/BlockquotePlugin-Dz8Pny1r.mjs +0 -2
- package/dist/chunks/BlockquotePlugin-Dz8Pny1r.mjs.map +0 -1
- package/dist/chunks/CaretNavigationPlugin-C-6zNBbl.mjs +0 -2
- package/dist/chunks/CaretNavigationPlugin-C-6zNBbl.mjs.map +0 -1
- package/dist/chunks/CodeBlockPlugin-C8H0nfF6.mjs +0 -2
- package/dist/chunks/CodeBlockPlugin-C8H0nfF6.mjs.map +0 -1
- package/dist/chunks/ColorGrid-CcF0bH26.mjs +0 -2
- package/dist/chunks/ColorGrid-CcF0bH26.mjs.map +0 -1
- package/dist/chunks/ColorPickerPopup-BZxMBDxy.mjs +0 -2
- package/dist/chunks/ColorPickerPopup-BZxMBDxy.mjs.map +0 -1
- package/dist/chunks/ColorValidation-rOrJxBBt.mjs +0 -2
- package/dist/chunks/ColorValidation-rOrJxBBt.mjs.map +0 -1
- package/dist/chunks/CommandHelpers-G6M-qXJR.mjs +0 -2
- package/dist/chunks/CommandHelpers-G6M-qXJR.mjs.map +0 -1
- package/dist/chunks/Commands-ByBjgD3-.mjs +0 -2
- package/dist/chunks/Commands-ByBjgD3-.mjs.map +0 -1
- package/dist/chunks/Decoration-D-yB-H5v.mjs +0 -2
- package/dist/chunks/Decoration-D-yB-H5v.mjs.map +0 -1
- package/dist/chunks/Document-DnPKbcPE.mjs +0 -2
- package/dist/chunks/Document-DnPKbcPE.mjs.map +0 -1
- package/dist/chunks/DocumentParser-KuBaEZN6.mjs +0 -2
- package/dist/chunks/DocumentParser-KuBaEZN6.mjs.map +0 -1
- package/dist/chunks/DocumentSerializer-DgdiJsES.mjs +0 -2
- package/dist/chunks/DocumentSerializer-DgdiJsES.mjs.map +0 -1
- package/dist/chunks/DomUtils-BkyCg-OO.mjs +0 -2
- package/dist/chunks/DomUtils-BkyCg-OO.mjs.map +0 -1
- package/dist/chunks/FontPlugin-BDjM9v3y.mjs +0 -2
- package/dist/chunks/FontPlugin-BDjM9v3y.mjs.map +0 -1
- package/dist/chunks/FontSizePlugin-CGlH-S6g.mjs +0 -2
- package/dist/chunks/FontSizePlugin-CGlH-S6g.mjs.map +0 -1
- package/dist/chunks/GapCursorNavigation-uytzcZ6C.mjs +0 -2
- package/dist/chunks/GapCursorNavigation-uytzcZ6C.mjs.map +0 -1
- package/dist/chunks/GapCursorPlugin-BQ2_-7i6.mjs +0 -2
- package/dist/chunks/GapCursorPlugin-BQ2_-7i6.mjs.map +0 -1
- package/dist/chunks/HTMLUtils-BLwp5G4f.mjs +0 -2
- package/dist/chunks/HTMLUtils-BLwp5G4f.mjs.map +0 -1
- package/dist/chunks/HardBreakPlugin-CCrP_Kec.mjs +0 -2
- package/dist/chunks/HardBreakPlugin-CCrP_Kec.mjs.map +0 -1
- package/dist/chunks/HeadingPlugin-BiDNuBmw.mjs +0 -2
- package/dist/chunks/HeadingPlugin-BiDNuBmw.mjs.map +0 -1
- package/dist/chunks/HighlightPlugin-CwrtRVfS.mjs +0 -2
- package/dist/chunks/HighlightPlugin-CwrtRVfS.mjs.map +0 -1
- package/dist/chunks/HorizontalRulePlugin-CKIkbVwn.mjs +0 -2
- package/dist/chunks/HorizontalRulePlugin-CKIkbVwn.mjs.map +0 -1
- package/dist/chunks/ImagePlugin-BqRAKlG1.mjs +0 -2
- package/dist/chunks/ImagePlugin-BqRAKlG1.mjs.map +0 -1
- package/dist/chunks/KeyboardNav-IMWHB6wc.mjs +0 -2
- package/dist/chunks/KeyboardNav-IMWHB6wc.mjs.map +0 -1
- package/dist/chunks/LinkPlugin-Cb2cpFe8.mjs +0 -2
- package/dist/chunks/LinkPlugin-Cb2cpFe8.mjs.map +0 -1
- package/dist/chunks/ListPlugin-C_YjbVjT.mjs +0 -2
- package/dist/chunks/ListPlugin-C_YjbVjT.mjs.map +0 -1
- package/dist/chunks/NavigationQueries-CgYPG6oY.mjs +0 -2
- package/dist/chunks/NavigationQueries-CgYPG6oY.mjs.map +0 -1
- package/dist/chunks/NodeResolver-BkOsZnuU.mjs +0 -2
- package/dist/chunks/NodeResolver-BkOsZnuU.mjs.map +0 -1
- package/dist/chunks/NodeSelectionCommands-U8xEdaE4.mjs +0 -2
- package/dist/chunks/NodeSelectionCommands-U8xEdaE4.mjs.map +0 -1
- package/dist/chunks/Platform-wPvKFB9m.mjs +0 -2
- package/dist/chunks/Platform-wPvKFB9m.mjs.map +0 -1
- package/dist/chunks/Plugin-C4cBw3bs.mjs +0 -2
- package/dist/chunks/Plugin-C4cBw3bs.mjs.map +0 -1
- package/dist/chunks/PluginHelpers-BZU5rE44.mjs +0 -2
- package/dist/chunks/PluginHelpers-BZU5rE44.mjs.map +0 -1
- package/dist/chunks/PopupManager-S2qQtTxR.mjs +0 -2
- package/dist/chunks/PopupManager-S2qQtTxR.mjs.map +0 -1
- package/dist/chunks/PopupPositioning-BdSCai19.mjs +0 -2
- package/dist/chunks/PopupPositioning-BdSCai19.mjs.map +0 -1
- package/dist/chunks/PrintPlugin-80SINLGF.mjs +0 -2
- package/dist/chunks/PrintPlugin-80SINLGF.mjs.map +0 -1
- package/dist/chunks/PrintTypes-CWIAfEaX.mjs +0 -2
- package/dist/chunks/PrintTypes-CWIAfEaX.mjs.map +0 -1
- package/dist/chunks/RangeIterator-DEuX1xKV.mjs +0 -2
- package/dist/chunks/RangeIterator-DEuX1xKV.mjs.map +0 -1
- package/dist/chunks/Selection-B14e7gd0.mjs +0 -2
- package/dist/chunks/Selection-B14e7gd0.mjs.map +0 -1
- package/dist/chunks/ShortcutFormatting-c0IajwWG.mjs +0 -2
- package/dist/chunks/ShortcutFormatting-c0IajwWG.mjs.map +0 -1
- package/dist/chunks/SmartPastePlugin-pejM1Zyk.mjs +0 -2
- package/dist/chunks/SmartPastePlugin-pejM1Zyk.mjs.map +0 -1
- package/dist/chunks/StrikethroughPlugin-XBOGv5Oi.mjs +0 -2
- package/dist/chunks/StrikethroughPlugin-XBOGv5Oi.mjs.map +0 -1
- package/dist/chunks/StyleRuntime-Bwde5icB.mjs +0 -2
- package/dist/chunks/StyleRuntime-Bwde5icB.mjs.map +0 -1
- package/dist/chunks/SuperSubPlugin-CVjU4W9y.mjs +0 -2
- package/dist/chunks/SuperSubPlugin-CVjU4W9y.mjs.map +0 -1
- package/dist/chunks/SyntaxTokenTypes-CY2-rJCA.mjs +0 -2
- package/dist/chunks/SyntaxTokenTypes-CY2-rJCA.mjs.map +0 -1
- package/dist/chunks/TablePlugin-BHpp6h9H.mjs +0 -2
- package/dist/chunks/TablePlugin-BHpp6h9H.mjs.map +0 -1
- package/dist/chunks/TextColorPlugin-CGbyMGTr.mjs +0 -2
- package/dist/chunks/TextColorPlugin-CGbyMGTr.mjs.map +0 -1
- package/dist/chunks/TextDirectionCorePlugin-DPU7wy6g.mjs +0 -2
- package/dist/chunks/TextDirectionCorePlugin-DPU7wy6g.mjs.map +0 -1
- package/dist/chunks/TextDirectionLocale-DxOfFixh.mjs +0 -2
- package/dist/chunks/TextDirectionLocale-DxOfFixh.mjs.map +0 -1
- package/dist/chunks/TextFormattingPlugin-CYVnhHH4.mjs +0 -2
- package/dist/chunks/TextFormattingPlugin-CYVnhHH4.mjs.map +0 -1
- package/dist/chunks/ToolbarPlugin-CWDkWXE8.mjs +0 -2
- package/dist/chunks/ToolbarPlugin-CWDkWXE8.mjs.map +0 -1
- package/dist/chunks/TypeBrands-BQR8dEYU.mjs +0 -2
- package/dist/chunks/TypeBrands-BQR8dEYU.mjs.map +0 -1
- package/dist/chunks/WordBoundary-BkxXn2JA.mjs +0 -2
- package/dist/chunks/WordBoundary-BkxXn2JA.mjs.map +0 -1
- package/dist/chunks/XmlDetector-B1y1NzDL.mjs +0 -2
- package/dist/chunks/XmlDetector-B1y1NzDL.mjs.map +0 -1
- package/dist/chunks/XmlPatterns-B-V-mHF4.mjs +0 -2
- package/dist/chunks/XmlPatterns-B-V-mHF4.mjs.map +0 -1
- package/dist/chunks/XmlSupport-DRkIIe34.mjs +0 -2
- package/dist/chunks/XmlSupport-DRkIIe34.mjs.map +0 -1
- package/dist/chunks/ar-BARk0vUs.mjs +0 -2
- package/dist/chunks/ar-BARk0vUs.mjs.map +0 -1
- package/dist/chunks/ar-BVnwjtBO.mjs +0 -2
- package/dist/chunks/ar-BVnwjtBO.mjs.map +0 -1
- package/dist/chunks/ar-BaLVMaVO.mjs +0 -2
- package/dist/chunks/ar-BaLVMaVO.mjs.map +0 -1
- package/dist/chunks/ar-BbXyJVxi.mjs +0 -2
- package/dist/chunks/ar-BbXyJVxi.mjs.map +0 -1
- package/dist/chunks/ar-Bj_U3O6Y.mjs +0 -2
- package/dist/chunks/ar-Bj_U3O6Y.mjs.map +0 -1
- package/dist/chunks/ar-CLEiZlfu.mjs +0 -2
- package/dist/chunks/ar-CLEiZlfu.mjs.map +0 -1
- package/dist/chunks/ar-CaE825oi.mjs +0 -2
- package/dist/chunks/ar-CaE825oi.mjs.map +0 -1
- package/dist/chunks/ar-CaRHAfkM.mjs +0 -2
- package/dist/chunks/ar-CaRHAfkM.mjs.map +0 -1
- package/dist/chunks/ar-Cg1wGAxo.mjs +0 -2
- package/dist/chunks/ar-Cg1wGAxo.mjs.map +0 -1
- package/dist/chunks/ar-Cp9qv7la.mjs +0 -2
- package/dist/chunks/ar-Cp9qv7la.mjs.map +0 -1
- package/dist/chunks/ar-CpZXocgF.mjs +0 -2
- package/dist/chunks/ar-CpZXocgF.mjs.map +0 -1
- package/dist/chunks/ar-CqD9pUY0.mjs +0 -2
- package/dist/chunks/ar-CqD9pUY0.mjs.map +0 -1
- package/dist/chunks/ar-D1DiKwV_.mjs +0 -2
- package/dist/chunks/ar-D1DiKwV_.mjs.map +0 -1
- package/dist/chunks/ar-D714r_62.mjs +0 -2
- package/dist/chunks/ar-D714r_62.mjs.map +0 -1
- package/dist/chunks/ar-D8hT58sd.mjs +0 -2
- package/dist/chunks/ar-D8hT58sd.mjs.map +0 -1
- package/dist/chunks/ar-DYA1zADy.mjs +0 -2
- package/dist/chunks/ar-DYA1zADy.mjs.map +0 -1
- package/dist/chunks/ar-Dc2VufjD.mjs +0 -2
- package/dist/chunks/ar-Dc2VufjD.mjs.map +0 -1
- package/dist/chunks/ar-DsmIDxDt.mjs +0 -2
- package/dist/chunks/ar-DsmIDxDt.mjs.map +0 -1
- package/dist/chunks/ar-M3QzJIS8.mjs +0 -2
- package/dist/chunks/ar-M3QzJIS8.mjs.map +0 -1
- package/dist/chunks/ar-UKi-TYFz.mjs +0 -2
- package/dist/chunks/ar-UKi-TYFz.mjs.map +0 -1
- package/dist/chunks/ar-UfrdJzT6.mjs +0 -2
- package/dist/chunks/ar-UfrdJzT6.mjs.map +0 -1
- package/dist/chunks/ar-fGsuiCw5.mjs +0 -2
- package/dist/chunks/ar-fGsuiCw5.mjs.map +0 -1
- package/dist/chunks/ar-fSElw9mJ.mjs +0 -2
- package/dist/chunks/ar-fSElw9mJ.mjs.map +0 -1
- package/dist/chunks/color-picker-iPmE48jm.mjs +0 -2
- package/dist/chunks/color-picker-iPmE48jm.mjs.map +0 -1
- package/dist/chunks/de-B4BcTYnc.mjs +0 -2
- package/dist/chunks/de-B4BcTYnc.mjs.map +0 -1
- package/dist/chunks/de-B7H06L3l.mjs +0 -2
- package/dist/chunks/de-B7H06L3l.mjs.map +0 -1
- package/dist/chunks/de-BWk2-9In.mjs +0 -2
- package/dist/chunks/de-BWk2-9In.mjs.map +0 -1
- package/dist/chunks/de-ByDTr_of.mjs +0 -2
- package/dist/chunks/de-ByDTr_of.mjs.map +0 -1
- package/dist/chunks/de-C5If_e7l.mjs +0 -2
- package/dist/chunks/de-C5If_e7l.mjs.map +0 -1
- package/dist/chunks/de-CAmM7IT5.mjs +0 -2
- package/dist/chunks/de-CAmM7IT5.mjs.map +0 -1
- package/dist/chunks/de-CF7zshOE.mjs +0 -2
- package/dist/chunks/de-CF7zshOE.mjs.map +0 -1
- package/dist/chunks/de-CXAESa_f.mjs +0 -2
- package/dist/chunks/de-CXAESa_f.mjs.map +0 -1
- package/dist/chunks/de-ChvJQZeC.mjs +0 -2
- package/dist/chunks/de-ChvJQZeC.mjs.map +0 -1
- package/dist/chunks/de-ClJaNWJr.mjs +0 -2
- package/dist/chunks/de-ClJaNWJr.mjs.map +0 -1
- package/dist/chunks/de-CpNFM0EP.mjs +0 -2
- package/dist/chunks/de-CpNFM0EP.mjs.map +0 -1
- package/dist/chunks/de-CwSQIBLx.mjs +0 -2
- package/dist/chunks/de-CwSQIBLx.mjs.map +0 -1
- package/dist/chunks/de-D3lxYgJa.mjs +0 -2
- package/dist/chunks/de-D3lxYgJa.mjs.map +0 -1
- package/dist/chunks/de-D8gRtvU4.mjs +0 -2
- package/dist/chunks/de-D8gRtvU4.mjs.map +0 -1
- package/dist/chunks/de-D_9IOrAk.mjs +0 -2
- package/dist/chunks/de-D_9IOrAk.mjs.map +0 -1
- package/dist/chunks/de-DcwZkO0v.mjs +0 -2
- package/dist/chunks/de-DcwZkO0v.mjs.map +0 -1
- package/dist/chunks/de-DeSVCxbd.mjs +0 -2
- package/dist/chunks/de-DeSVCxbd.mjs.map +0 -1
- package/dist/chunks/de-DqxnR2Y8.mjs +0 -2
- package/dist/chunks/de-DqxnR2Y8.mjs.map +0 -1
- package/dist/chunks/de-J82qPFkV.mjs +0 -2
- package/dist/chunks/de-J82qPFkV.mjs.map +0 -1
- package/dist/chunks/de-QDbUiCAO.mjs +0 -2
- package/dist/chunks/de-QDbUiCAO.mjs.map +0 -1
- package/dist/chunks/de-eAQXJdL9.mjs +0 -2
- package/dist/chunks/de-eAQXJdL9.mjs.map +0 -1
- package/dist/chunks/de-hneXQd4z.mjs +0 -2
- package/dist/chunks/de-hneXQd4z.mjs.map +0 -1
- package/dist/chunks/de-wXAi5Jyt.mjs +0 -2
- package/dist/chunks/de-wXAi5Jyt.mjs.map +0 -1
- package/dist/chunks/es-5c_5O95N.mjs +0 -2
- package/dist/chunks/es-5c_5O95N.mjs.map +0 -1
- package/dist/chunks/es-B2QB6DHA.mjs +0 -2
- package/dist/chunks/es-B2QB6DHA.mjs.map +0 -1
- package/dist/chunks/es-BEcu8DtV.mjs +0 -2
- package/dist/chunks/es-BEcu8DtV.mjs.map +0 -1
- package/dist/chunks/es-BXTkzYVW.mjs +0 -2
- package/dist/chunks/es-BXTkzYVW.mjs.map +0 -1
- package/dist/chunks/es-BemQV8dI.mjs +0 -2
- package/dist/chunks/es-BemQV8dI.mjs.map +0 -1
- package/dist/chunks/es-BfJM5zJ5.mjs +0 -2
- package/dist/chunks/es-BfJM5zJ5.mjs.map +0 -1
- package/dist/chunks/es-CnqxzYfU.mjs +0 -2
- package/dist/chunks/es-CnqxzYfU.mjs.map +0 -1
- package/dist/chunks/es-CrZtAd3-.mjs +0 -2
- package/dist/chunks/es-CrZtAd3-.mjs.map +0 -1
- package/dist/chunks/es-CsCCy0S5.mjs +0 -2
- package/dist/chunks/es-CsCCy0S5.mjs.map +0 -1
- package/dist/chunks/es-D62AfyHC.mjs +0 -2
- package/dist/chunks/es-D62AfyHC.mjs.map +0 -1
- package/dist/chunks/es-DA_zUbSs.mjs +0 -2
- package/dist/chunks/es-DA_zUbSs.mjs.map +0 -1
- package/dist/chunks/es-DFCDhXJb.mjs +0 -2
- package/dist/chunks/es-DFCDhXJb.mjs.map +0 -1
- package/dist/chunks/es-DHMIpSfB.mjs +0 -2
- package/dist/chunks/es-DHMIpSfB.mjs.map +0 -1
- package/dist/chunks/es-DIH9KVn1.mjs +0 -2
- package/dist/chunks/es-DIH9KVn1.mjs.map +0 -1
- package/dist/chunks/es-DOHIPZYT.mjs +0 -2
- package/dist/chunks/es-DOHIPZYT.mjs.map +0 -1
- package/dist/chunks/es-DPyejgTk.mjs +0 -2
- package/dist/chunks/es-DPyejgTk.mjs.map +0 -1
- package/dist/chunks/es-DUVk_Wkc.mjs +0 -2
- package/dist/chunks/es-DUVk_Wkc.mjs.map +0 -1
- package/dist/chunks/es-Di4t0cUf.mjs +0 -2
- package/dist/chunks/es-Di4t0cUf.mjs.map +0 -1
- package/dist/chunks/es-DjwvgN1j.mjs +0 -2
- package/dist/chunks/es-DjwvgN1j.mjs.map +0 -1
- package/dist/chunks/es-Nawgghri.mjs +0 -2
- package/dist/chunks/es-Nawgghri.mjs.map +0 -1
- package/dist/chunks/es-SuOzBFT7.mjs +0 -2
- package/dist/chunks/es-SuOzBFT7.mjs.map +0 -1
- package/dist/chunks/es-gB6GcNGB.mjs +0 -2
- package/dist/chunks/es-gB6GcNGB.mjs.map +0 -1
- package/dist/chunks/es-xSr9miNk.mjs +0 -2
- package/dist/chunks/es-xSr9miNk.mjs.map +0 -1
- package/dist/chunks/fonts-CG_dDwvT.mjs +0 -2
- package/dist/chunks/fonts-CG_dDwvT.mjs.map +0 -1
- package/dist/chunks/fr-B35gBW5Z.mjs +0 -2
- package/dist/chunks/fr-B35gBW5Z.mjs.map +0 -1
- package/dist/chunks/fr-BFngqWSa.mjs +0 -2
- package/dist/chunks/fr-BFngqWSa.mjs.map +0 -1
- package/dist/chunks/fr-BZRak2_s.mjs +0 -2
- package/dist/chunks/fr-BZRak2_s.mjs.map +0 -1
- package/dist/chunks/fr-Bj_GziCv.mjs +0 -2
- package/dist/chunks/fr-Bj_GziCv.mjs.map +0 -1
- package/dist/chunks/fr-BushvDBo.mjs +0 -2
- package/dist/chunks/fr-BushvDBo.mjs.map +0 -1
- package/dist/chunks/fr-Bz2JMdw5.mjs +0 -2
- package/dist/chunks/fr-Bz2JMdw5.mjs.map +0 -1
- package/dist/chunks/fr-C2y-quYa.mjs +0 -2
- package/dist/chunks/fr-C2y-quYa.mjs.map +0 -1
- package/dist/chunks/fr-C5g40qHr.mjs +0 -2
- package/dist/chunks/fr-C5g40qHr.mjs.map +0 -1
- package/dist/chunks/fr-CRPVlCtC.mjs +0 -2
- package/dist/chunks/fr-CRPVlCtC.mjs.map +0 -1
- package/dist/chunks/fr-Cf0xNw5j.mjs +0 -2
- package/dist/chunks/fr-Cf0xNw5j.mjs.map +0 -1
- package/dist/chunks/fr-Cr62KfH7.mjs +0 -2
- package/dist/chunks/fr-Cr62KfH7.mjs.map +0 -1
- package/dist/chunks/fr-D6XZTFJa.mjs +0 -2
- package/dist/chunks/fr-D6XZTFJa.mjs.map +0 -1
- package/dist/chunks/fr-D9u2mcht.mjs +0 -2
- package/dist/chunks/fr-D9u2mcht.mjs.map +0 -1
- package/dist/chunks/fr-DEWFKFrW.mjs +0 -2
- package/dist/chunks/fr-DEWFKFrW.mjs.map +0 -1
- package/dist/chunks/fr-DGBuhK3D.mjs +0 -2
- package/dist/chunks/fr-DGBuhK3D.mjs.map +0 -1
- package/dist/chunks/fr-DQBLPLlz.mjs +0 -2
- package/dist/chunks/fr-DQBLPLlz.mjs.map +0 -1
- package/dist/chunks/fr-DQM130Rf.mjs +0 -2
- package/dist/chunks/fr-DQM130Rf.mjs.map +0 -1
- package/dist/chunks/fr-Dg5SMkMo.mjs +0 -2
- package/dist/chunks/fr-Dg5SMkMo.mjs.map +0 -1
- package/dist/chunks/fr-Dv0GIx7Q.mjs +0 -2
- package/dist/chunks/fr-Dv0GIx7Q.mjs.map +0 -1
- package/dist/chunks/fr-DyGGhKFe.mjs +0 -2
- package/dist/chunks/fr-DyGGhKFe.mjs.map +0 -1
- package/dist/chunks/fr-DzQfRP8y.mjs +0 -2
- package/dist/chunks/fr-DzQfRP8y.mjs.map +0 -1
- package/dist/chunks/fr-SxdLDSEQ.mjs +0 -2
- package/dist/chunks/fr-SxdLDSEQ.mjs.map +0 -1
- package/dist/chunks/fr-VGC8qZxr.mjs +0 -2
- package/dist/chunks/fr-VGC8qZxr.mjs.map +0 -1
- package/dist/chunks/full-NtKyNKJ6.mjs +0 -2
- package/dist/chunks/full-NtKyNKJ6.mjs.map +0 -1
- package/dist/chunks/hi-8AQg9KKV.mjs +0 -2
- package/dist/chunks/hi-8AQg9KKV.mjs.map +0 -1
- package/dist/chunks/hi-B0EvMNl3.mjs +0 -2
- package/dist/chunks/hi-B0EvMNl3.mjs.map +0 -1
- package/dist/chunks/hi-B5sPMUNb.mjs +0 -2
- package/dist/chunks/hi-B5sPMUNb.mjs.map +0 -1
- package/dist/chunks/hi-BOfcnulc.mjs +0 -2
- package/dist/chunks/hi-BOfcnulc.mjs.map +0 -1
- package/dist/chunks/hi-BUveHWCk.mjs +0 -2
- package/dist/chunks/hi-BUveHWCk.mjs.map +0 -1
- package/dist/chunks/hi-BZ_n8-zx.mjs +0 -2
- package/dist/chunks/hi-BZ_n8-zx.mjs.map +0 -1
- package/dist/chunks/hi-BeLhPZ5d.mjs +0 -2
- package/dist/chunks/hi-BeLhPZ5d.mjs.map +0 -1
- package/dist/chunks/hi-Bg8jWcjX.mjs +0 -2
- package/dist/chunks/hi-Bg8jWcjX.mjs.map +0 -1
- package/dist/chunks/hi-BktVy4Yc.mjs +0 -2
- package/dist/chunks/hi-BktVy4Yc.mjs.map +0 -1
- package/dist/chunks/hi-Btg6DNgW.mjs +0 -2
- package/dist/chunks/hi-Btg6DNgW.mjs.map +0 -1
- package/dist/chunks/hi-C20PmckT.mjs +0 -2
- package/dist/chunks/hi-C20PmckT.mjs.map +0 -1
- package/dist/chunks/hi-C2DDsttW.mjs +0 -2
- package/dist/chunks/hi-C2DDsttW.mjs.map +0 -1
- package/dist/chunks/hi-CCDCfQV0.mjs +0 -2
- package/dist/chunks/hi-CCDCfQV0.mjs.map +0 -1
- package/dist/chunks/hi-CWX5sDy1.mjs +0 -2
- package/dist/chunks/hi-CWX5sDy1.mjs.map +0 -1
- package/dist/chunks/hi-ClSwgZfK.mjs +0 -2
- package/dist/chunks/hi-ClSwgZfK.mjs.map +0 -1
- package/dist/chunks/hi-D-apR3ri.mjs +0 -2
- package/dist/chunks/hi-D-apR3ri.mjs.map +0 -1
- package/dist/chunks/hi-D6ZQ_R6m.mjs +0 -2
- package/dist/chunks/hi-D6ZQ_R6m.mjs.map +0 -1
- package/dist/chunks/hi-D_rhcSL3.mjs +0 -2
- package/dist/chunks/hi-D_rhcSL3.mjs.map +0 -1
- package/dist/chunks/hi-DcA0CxZR.mjs +0 -2
- package/dist/chunks/hi-DcA0CxZR.mjs.map +0 -1
- package/dist/chunks/hi-Dd2GOD9r.mjs +0 -2
- package/dist/chunks/hi-Dd2GOD9r.mjs.map +0 -1
- package/dist/chunks/hi-DkEmvBok.mjs +0 -2
- package/dist/chunks/hi-DkEmvBok.mjs.map +0 -1
- package/dist/chunks/hi-nfmm9uwI.mjs +0 -2
- package/dist/chunks/hi-nfmm9uwI.mjs.map +0 -1
- package/dist/chunks/hi-wBX612X_.mjs +0 -2
- package/dist/chunks/hi-wBX612X_.mjs.map +0 -1
- package/dist/chunks/minimal-gSvMMQTU.mjs +0 -2
- package/dist/chunks/minimal-gSvMMQTU.mjs.map +0 -1
- package/dist/chunks/pt-BGQ7Sh6p.mjs +0 -2
- package/dist/chunks/pt-BGQ7Sh6p.mjs.map +0 -1
- package/dist/chunks/pt-BGQj9xok.mjs +0 -2
- package/dist/chunks/pt-BGQj9xok.mjs.map +0 -1
- package/dist/chunks/pt-BL5xNIhC.mjs +0 -2
- package/dist/chunks/pt-BL5xNIhC.mjs.map +0 -1
- package/dist/chunks/pt-BM8sUzpI.mjs +0 -2
- package/dist/chunks/pt-BM8sUzpI.mjs.map +0 -1
- package/dist/chunks/pt-BVLuZULN.mjs +0 -2
- package/dist/chunks/pt-BVLuZULN.mjs.map +0 -1
- package/dist/chunks/pt-BlGlrx3M.mjs +0 -2
- package/dist/chunks/pt-BlGlrx3M.mjs.map +0 -1
- package/dist/chunks/pt-CKaXK1FK.mjs +0 -2
- package/dist/chunks/pt-CKaXK1FK.mjs.map +0 -1
- package/dist/chunks/pt-CMpzmrVu.mjs +0 -2
- package/dist/chunks/pt-CMpzmrVu.mjs.map +0 -1
- package/dist/chunks/pt-Cw77qSTP.mjs +0 -2
- package/dist/chunks/pt-Cw77qSTP.mjs.map +0 -1
- package/dist/chunks/pt-DBNe2BiX.mjs +0 -2
- package/dist/chunks/pt-DBNe2BiX.mjs.map +0 -1
- package/dist/chunks/pt-DCfJFt-v.mjs +0 -2
- package/dist/chunks/pt-DCfJFt-v.mjs.map +0 -1
- package/dist/chunks/pt-DEs0I6eo.mjs +0 -2
- package/dist/chunks/pt-DEs0I6eo.mjs.map +0 -1
- package/dist/chunks/pt-DKONqS4g.mjs +0 -2
- package/dist/chunks/pt-DKONqS4g.mjs.map +0 -1
- package/dist/chunks/pt-DO4FbPvV.mjs +0 -2
- package/dist/chunks/pt-DO4FbPvV.mjs.map +0 -1
- package/dist/chunks/pt-DbDOQjV-.mjs +0 -2
- package/dist/chunks/pt-DbDOQjV-.mjs.map +0 -1
- package/dist/chunks/pt-DiYv0Ubf.mjs +0 -2
- package/dist/chunks/pt-DiYv0Ubf.mjs.map +0 -1
- package/dist/chunks/pt-Dk4Mr4yC.mjs +0 -2
- package/dist/chunks/pt-Dk4Mr4yC.mjs.map +0 -1
- package/dist/chunks/pt-DpLB51hL.mjs +0 -2
- package/dist/chunks/pt-DpLB51hL.mjs.map +0 -1
- package/dist/chunks/pt-Q5jXPjWo.mjs +0 -2
- package/dist/chunks/pt-Q5jXPjWo.mjs.map +0 -1
- package/dist/chunks/pt-kFy3gqNp.mjs +0 -2
- package/dist/chunks/pt-kFy3gqNp.mjs.map +0 -1
- package/dist/chunks/pt-ncNSxrVp.mjs +0 -2
- package/dist/chunks/pt-ncNSxrVp.mjs.map +0 -1
- package/dist/chunks/pt-tUVNk-7W.mjs +0 -2
- package/dist/chunks/pt-tUVNk-7W.mjs.map +0 -1
- package/dist/chunks/pt-zzij5vS0.mjs +0 -2
- package/dist/chunks/pt-zzij5vS0.mjs.map +0 -1
- package/dist/chunks/rolldown-runtime-B8Ku5yk6.mjs +0 -1
- package/dist/chunks/ru-B-XR4L6x.mjs +0 -2
- package/dist/chunks/ru-B-XR4L6x.mjs.map +0 -1
- package/dist/chunks/ru-B00ZXSqu.mjs +0 -2
- package/dist/chunks/ru-B00ZXSqu.mjs.map +0 -1
- package/dist/chunks/ru-B5wvkAtV.mjs +0 -2
- package/dist/chunks/ru-B5wvkAtV.mjs.map +0 -1
- package/dist/chunks/ru-BA5-gdMK.mjs +0 -2
- package/dist/chunks/ru-BA5-gdMK.mjs.map +0 -1
- package/dist/chunks/ru-BNTSKpWh.mjs +0 -2
- package/dist/chunks/ru-BNTSKpWh.mjs.map +0 -1
- package/dist/chunks/ru-BRy-L-TF.mjs +0 -2
- package/dist/chunks/ru-BRy-L-TF.mjs.map +0 -1
- package/dist/chunks/ru-BZrPeSDg.mjs +0 -2
- package/dist/chunks/ru-BZrPeSDg.mjs.map +0 -1
- package/dist/chunks/ru-B_8ujIHK.mjs +0 -2
- package/dist/chunks/ru-B_8ujIHK.mjs.map +0 -1
- package/dist/chunks/ru-BbgvH6r3.mjs +0 -2
- package/dist/chunks/ru-BbgvH6r3.mjs.map +0 -1
- package/dist/chunks/ru-CDm5R5CV.mjs +0 -2
- package/dist/chunks/ru-CDm5R5CV.mjs.map +0 -1
- package/dist/chunks/ru-CWLFWYwd.mjs +0 -2
- package/dist/chunks/ru-CWLFWYwd.mjs.map +0 -1
- package/dist/chunks/ru-CqsCwBQ_.mjs +0 -2
- package/dist/chunks/ru-CqsCwBQ_.mjs.map +0 -1
- package/dist/chunks/ru-CsFv_mi4.mjs +0 -2
- package/dist/chunks/ru-CsFv_mi4.mjs.map +0 -1
- package/dist/chunks/ru-Cv9Zbbn2.mjs +0 -2
- package/dist/chunks/ru-Cv9Zbbn2.mjs.map +0 -1
- package/dist/chunks/ru-CyTNK9dE.mjs +0 -2
- package/dist/chunks/ru-CyTNK9dE.mjs.map +0 -1
- package/dist/chunks/ru-DEkLlarB.mjs +0 -2
- package/dist/chunks/ru-DEkLlarB.mjs.map +0 -1
- package/dist/chunks/ru-DZge62_-.mjs +0 -2
- package/dist/chunks/ru-DZge62_-.mjs.map +0 -1
- package/dist/chunks/ru-DiVRD-Ds.mjs +0 -2
- package/dist/chunks/ru-DiVRD-Ds.mjs.map +0 -1
- package/dist/chunks/ru-DkP8YLYT.mjs +0 -2
- package/dist/chunks/ru-DkP8YLYT.mjs.map +0 -1
- package/dist/chunks/ru-OKZRZ5c-.mjs +0 -2
- package/dist/chunks/ru-OKZRZ5c-.mjs.map +0 -1
- package/dist/chunks/ru-aYY1QVJS.mjs +0 -2
- package/dist/chunks/ru-aYY1QVJS.mjs.map +0 -1
- package/dist/chunks/ru-ejPBB15H.mjs +0 -2
- package/dist/chunks/ru-ejPBB15H.mjs.map +0 -1
- package/dist/chunks/ru-tp62bXSj.mjs +0 -2
- package/dist/chunks/ru-tp62bXSj.mjs.map +0 -1
- package/dist/chunks/shared-DJ08jwra.mjs +0 -2
- package/dist/chunks/shared-DJ08jwra.mjs.map +0 -1
- package/dist/chunks/src-CHVVMZB_.mjs +0 -2
- package/dist/chunks/src-CHVVMZB_.mjs.map +0 -1
- package/dist/chunks/text-direction-advanced-B71gUwvk.mjs +0 -2
- package/dist/chunks/text-direction-advanced-B71gUwvk.mjs.map +0 -1
- package/dist/chunks/zh-2gEqF3OX.mjs +0 -2
- package/dist/chunks/zh-2gEqF3OX.mjs.map +0 -1
- package/dist/chunks/zh-B5J1sSsk.mjs +0 -2
- package/dist/chunks/zh-B5J1sSsk.mjs.map +0 -1
- package/dist/chunks/zh-B5LmYVQ2.mjs +0 -2
- package/dist/chunks/zh-B5LmYVQ2.mjs.map +0 -1
- package/dist/chunks/zh-BBOheLpv.mjs +0 -2
- package/dist/chunks/zh-BBOheLpv.mjs.map +0 -1
- package/dist/chunks/zh-BOy5F5Jq.mjs +0 -2
- package/dist/chunks/zh-BOy5F5Jq.mjs.map +0 -1
- package/dist/chunks/zh-BRlo0ayI.mjs +0 -2
- package/dist/chunks/zh-BRlo0ayI.mjs.map +0 -1
- package/dist/chunks/zh-BgTAzt6l.mjs +0 -2
- package/dist/chunks/zh-BgTAzt6l.mjs.map +0 -1
- package/dist/chunks/zh-BjY4TNQf.mjs +0 -2
- package/dist/chunks/zh-BjY4TNQf.mjs.map +0 -1
- package/dist/chunks/zh-BtD9NFJS.mjs +0 -2
- package/dist/chunks/zh-BtD9NFJS.mjs.map +0 -1
- package/dist/chunks/zh-BvSLqJFE.mjs +0 -2
- package/dist/chunks/zh-BvSLqJFE.mjs.map +0 -1
- package/dist/chunks/zh-C4rxe0Zk.mjs +0 -2
- package/dist/chunks/zh-C4rxe0Zk.mjs.map +0 -1
- package/dist/chunks/zh-CyX2tIRP.mjs +0 -2
- package/dist/chunks/zh-CyX2tIRP.mjs.map +0 -1
- package/dist/chunks/zh-D9QN2C7q.mjs +0 -2
- package/dist/chunks/zh-D9QN2C7q.mjs.map +0 -1
- package/dist/chunks/zh-DTnSCP1F.mjs +0 -2
- package/dist/chunks/zh-DTnSCP1F.mjs.map +0 -1
- package/dist/chunks/zh-DWlBkrGZ.mjs +0 -2
- package/dist/chunks/zh-DWlBkrGZ.mjs.map +0 -1
- package/dist/chunks/zh-DcY4Ouin.mjs +0 -2
- package/dist/chunks/zh-DcY4Ouin.mjs.map +0 -1
- package/dist/chunks/zh-DovMZIDF.mjs +0 -2
- package/dist/chunks/zh-DovMZIDF.mjs.map +0 -1
- package/dist/chunks/zh-DtzwqBHS.mjs +0 -2
- package/dist/chunks/zh-DtzwqBHS.mjs.map +0 -1
- package/dist/chunks/zh-DunJzfVR.mjs +0 -2
- package/dist/chunks/zh-DunJzfVR.mjs.map +0 -1
- package/dist/chunks/zh-Pd1HqYSs.mjs +0 -2
- package/dist/chunks/zh-Pd1HqYSs.mjs.map +0 -1
- package/dist/chunks/zh-Yvqfkdln.mjs +0 -2
- package/dist/chunks/zh-Yvqfkdln.mjs.map +0 -1
- package/dist/chunks/zh-Z9seusJc.mjs +0 -2
- package/dist/chunks/zh-Z9seusJc.mjs.map +0 -1
- package/dist/chunks/zh-fAa_AbWI.mjs +0 -2
- package/dist/chunks/zh-fAa_AbWI.mjs.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as t}from"./TypeBrands-BQR8dEYU.mjs";import{r as e}from"./HTMLUtils-BLwp5G4f.mjs";import{i as n,n as o,r as i,t as r}from"./AttributedMarkCommands-BiJtiHpx.mjs";import{s}from"./StyleRuntime-Bwde5icB.mjs";import{i as a}from"./PluginHelpers-BZU5rE44.mjs";import{r as l}from"./ColorValidation-rOrJxBBt.mjs";var c={label:"Font Size",tooltip:"Font Size",customFontSizeAria:"Custom font size",fontSizesAria:"Font sizes"},p=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-CaRHAfkM.mjs"),"./locales/de.ts":()=>import("./de-ByDTr_of.mjs"),"./locales/es.ts":()=>import("./es-BemQV8dI.mjs"),"./locales/fr.ts":()=>import("./fr-DQM130Rf.mjs"),"./locales/hi.ts":()=>import("./hi-BktVy4Yc.mjs"),"./locales/pt.ts":()=>import("./pt-CMpzmrVu.mjs"),"./locales/ru.ts":()=>import("./ru-CyTNK9dE.mjs"),"./locales/zh.ts":()=>import("./zh-BtD9NFJS.mjs")});async function u(t){if("en"===t)return c;const e=p[`./locales/${t}.ts`];if(!e)return c;try{return(await e()).default}catch{return c}}function f(t,e){const n=function(t){return o(t,"fontSize",t=>t.attrs.size??null)}(t);if(!n)return e;const i=Number.parseInt(n,10);return Number.isNaN(i)?e:i}function m(e,n,o){const i=r(n,{type:t("fontSize"),attrs:{size:o}});return!!i&&(e.dispatch(i),!0)}function d(e,o){const i=n(o,t("fontSize"));return!!i&&(e.dispatch(i),!0)}function z(t,e,n,o,i){const r=function(t,e,n){if("up"===e){for(const e of n)if(e>t)return e;return null}for(let o=n.length-1;o>=0;o--){const e=n[o];if(void 0!==e&&e<t)return e}return null}(f(e,i),n,o);return null!==r&&(r===i?d(t,e):m(t,e,`${r}px`))}function g(t,e,n){e===n?t.executeCommand("removeFontSize"):m(t,t.getState(),`${e}px`)}function h(t,e){const n=document.createElement("button");n.type="button",n.id=`notectl-font-size-option-${t}`,n.className="notectl-font-size-picker__item",n.setAttribute("role","option"),n.setAttribute("aria-selected",String(e)),e&&n.classList.add("notectl-font-size-picker__item--active");const o=document.createElement("span");o.className="notectl-font-size-picker__check",o.textContent=e?"✓":"",n.appendChild(o);const i=document.createElement("span");return i.className="notectl-font-size-picker__label",i.textContent=String(t),n.appendChild(i),n}var S=[8,9,10,11,12,14,16,18,20,24,28,32,36,48,64,72,96],b=class{id="fontSize";name="Font Size";priority=21;config;sizes;defaultSize;locale;constructor(t){var e;this.config={...t},this.sizes=function(t){if(!t||0===t.length)return S;const e=[...new Set(t)].filter(t=>Number.isInteger(t)&&t>0);return e.sort((t,e)=>t-e),e.length>0?e:S}(t?.sizes),this.defaultSize=(e=t?.defaultSize,void 0===e?16:Number.isInteger(e)&&e>0?e:16)}async init(t){this.locale=await a(t,this.config.locale,c,u),t.registerStyleSheet("\n/* Font Size Select — Width overrides for combobox button */\n.notectl-toolbar-btn--fontSize {\n\tmin-width: 60px;\n\tmax-width: 80px;\n}\n\n/* Font Size Picker Popup */\n.notectl-font-size-picker {\n\tmin-width: 140px;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.notectl-font-size-picker__input-wrapper {\n\tpadding: 8px 8px 4px;\n}\n\n.notectl-font-size-picker__input {\n\twidth: 100%;\n\tpadding: 6px 8px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tfont-family: inherit;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-surface-overlay);\n\toutline: none;\n\tbox-sizing: border-box;\n\t-moz-appearance: textfield;\n}\n\n.notectl-font-size-picker__input::-webkit-inner-spin-button,\n.notectl-font-size-picker__input::-webkit-outer-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\n\n.notectl-font-size-picker__input:focus {\n\tborder-color: var(--notectl-border-focus);\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.notectl-font-size-picker__list {\n\tmax-height: 280px;\n\toverflow-y: auto;\n\tpadding: 4px 0;\n}\n\n.notectl-font-size-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n\toutline: none;\n}\n\n@media (hover: hover) {\n\t.notectl-font-size-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-font-size-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-font-size-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-font-size-picker__item--focused {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: -2px;\n}\n\n.notectl-font-size-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-font-size-picker__label {\n\tflex: 1;\n}\n"),this.registerMarkSpec(t),this.registerCommands(t),this.registerKeymaps(t),this.registerToolbarItem(t),this.applyDefaultSizeToContainer(t)}destroy(){}registerMarkSpec(t){t.registerMarkSpec({type:"fontSize",rank:4,attrs:{size:{default:""}},toDOM(t){const e=document.createElement("span"),n=t.attrs?.size??"";return n&&s(e,"fontSize",n),e},toHTMLString:(t,n,o)=>{const i=String(t.attrs?.size??"");if(!i||!l(i))return n;const r=`font-size: ${e(i)}`;return`<span${o?.styleAttr(r)??` style="${r}"`}>${n}</span>`},toHTMLStyle:t=>{const n=String(t.attrs?.size??"");return n&&l(n)?`font-size: ${e(n)}`:null},parseHTML:[{tag:"span",getAttrs:t=>{const e=t.style.fontSize;return!!e&&{size:e}}}],sanitize:{tags:["span"]}})}registerCommands(t){t.registerCommand("removeFontSize",()=>d(t,t.getState())),t.registerCommand("setFontSize",()=>!1),t.registerCommand("increaseFontSize",()=>z(t,t.getState(),"up",this.sizes,this.defaultSize)),t.registerCommand("decreaseFontSize",()=>z(t,t.getState(),"down",this.sizes,this.defaultSize))}registerKeymaps(t){t.registerKeymap({"Mod-Shift-+":()=>z(t,t.getState(),"up",this.sizes,this.defaultSize),"Mod-Shift-_":()=>z(t,t.getState(),"down",this.sizes,this.defaultSize)})}registerToolbarItem(t){t.registerToolbarItem({id:"fontSize",group:"format",label:this.locale.label,tooltip:this.locale.tooltip,command:"removeFontSize",popupType:"combobox",getLabel:t=>String(f(t,this.defaultSize)),renderPopup:(t,e,n)=>{!function(t,e,n){t.classList.add("notectl-font-size-picker");const o=f(e.getState(),n.defaultSize),i=function(t,e){const n=document.createElement("input");return n.type="number",n.className="notectl-font-size-picker__input",n.min=String(1),n.max=String(400),n.value=String(t),n.setAttribute("aria-label",e.locale.customFontSizeAria),n}(o,n);!function(t,e){const n=document.createElement("div");n.className="notectl-font-size-picker__input-wrapper",n.appendChild(e),t.appendChild(n)}(t,i);const{list:r,items:s}=function(t,e,n,o){const i=document.createElement("div");i.className="notectl-font-size-picker__list",i.setAttribute("role","listbox"),i.setAttribute("aria-label",o.locale.fontSizesAria);const r=[];for(const s of t){const t=h(s,s===e);t.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),g(n,s,o.defaultSize),o.onClose({restoreFocusTo:o.contentElement})}),r.push(t),i.appendChild(t)}return{list:i,items:r}}(n.sizes,o,e,n);t.appendChild(r),function(t,e,n,o){const i=e.indexOf(n);if(i<0)return;const r=t[i];r&&(requestAnimationFrame(()=>{r.scrollIntoView({block:"nearest"})}),o.setAttribute("aria-activedescendant",r.id))}(s,n.sizes,o,r),function(t,e,n,o,i){let r=-1;const s=t=>{r>=0&&r<n.length&&n[r]?.classList.remove("notectl-font-size-picker__item--focused"),r=t;const o=n[r];r>=0&&r<n.length&&o&&(o.classList.add("notectl-font-size-picker__item--focused"),o.scrollIntoView({block:"nearest"}),e.setAttribute("aria-activedescendant",o.id))};t.addEventListener("keydown",e=>{if("Enter"===e.key){e.preventDefault();const n=Number.parseInt(t.value,10);!Number.isNaN(n)&&n>=1&&n<=400&&(g(o,n,i.defaultSize),i.onClose({restoreFocusTo:i.contentElement}))}else"ArrowDown"===e.key?(e.preventDefault(),s(0),n[0]?.focus()):"Escape"===e.key&&(e.preventDefault(),i.onClose({restoreFocusTo:i.contentElement}))}),e.addEventListener("keydown",e=>{if("ArrowDown"===e.key)e.preventDefault(),r<n.length-1&&(s(r+1),n[r]?.focus());else if("ArrowUp"===e.key)e.preventDefault(),r>0?(s(r-1),n[r]?.focus()):(s(-1),t.focus());else if("Enter"===e.key){e.preventDefault();const t=i.sizes[r];r>=0&&r<i.sizes.length&&void 0!==t&&(g(o,t,i.defaultSize),i.onClose({restoreFocusTo:i.contentElement}))}else"Escape"===e.key&&(e.preventDefault(),i.onClose({restoreFocusTo:i.contentElement}))})}(i,r,s,e,n)}(t,e,{sizes:this.sizes,defaultSize:this.defaultSize,onClose:n,contentElement:e.getContainer(),locale:this.locale})},isActive:t=>function(t){return i(t,"fontSize")}(t)})}applyDefaultSizeToContainer(t){s(t.getContainer(),"fontSize",`${this.defaultSize}px`)}};export{c as n,u as r,b as t};
|
|
2
|
-
//# sourceMappingURL=FontSizePlugin-CGlH-S6g.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FontSizePlugin-CGlH-S6g.mjs","names":[],"sources":["../../src/editor/styles/font-size-select.ts","../../src/plugins/font-size/FontSizeLocale.ts","../../src/plugins/font-size/FontSizeOperations.ts","../../src/plugins/font-size/FontSizePopup.ts","../../src/plugins/font-size/FontSizePlugin.ts"],"sourcesContent":["/** Font size picker toolbar combobox + popup styles. */\nexport const FONT_SIZE_SELECT_CSS = `\n/* Font Size Select — Width overrides for combobox button */\n.notectl-toolbar-btn--fontSize {\n\tmin-width: 60px;\n\tmax-width: 80px;\n}\n\n/* Font Size Picker Popup */\n.notectl-font-size-picker {\n\tmin-width: 140px;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.notectl-font-size-picker__input-wrapper {\n\tpadding: 8px 8px 4px;\n}\n\n.notectl-font-size-picker__input {\n\twidth: 100%;\n\tpadding: 6px 8px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tfont-family: inherit;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-surface-overlay);\n\toutline: none;\n\tbox-sizing: border-box;\n\t-moz-appearance: textfield;\n}\n\n.notectl-font-size-picker__input::-webkit-inner-spin-button,\n.notectl-font-size-picker__input::-webkit-outer-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\n\n.notectl-font-size-picker__input:focus {\n\tborder-color: var(--notectl-border-focus);\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.notectl-font-size-picker__list {\n\tmax-height: 280px;\n\toverflow-y: auto;\n\tpadding: 4px 0;\n}\n\n.notectl-font-size-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n\toutline: none;\n}\n\n@media (hover: hover) {\n\t.notectl-font-size-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-font-size-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-font-size-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-font-size-picker__item--focused {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: -2px;\n}\n\n.notectl-font-size-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-font-size-picker__label {\n\tflex: 1;\n}\n`;\n","/** Locale interface and default English locale for the FontSizePlugin. */\n\n// --- Locale Interface ---\n\nexport interface FontSizeLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly customFontSizeAria: string;\n\treadonly fontSizesAria: string;\n}\n\n// --- Default English Locale ---\n\nexport const FONT_SIZE_LOCALE_EN: FontSizeLocale = {\n\tlabel: 'Font Size',\n\ttooltip: 'Font Size',\n\tcustomFontSizeAria: 'Custom font size',\n\tfontSizesAria: 'Font sizes',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: FontSizeLocale }>> = import.meta.glob<{\n\tdefault: FontSizeLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadFontSizeLocale(lang: string): Promise<FontSizeLocale> {\n\tif (lang === 'en') return FONT_SIZE_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return FONT_SIZE_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn FONT_SIZE_LOCALE_EN;\n\t}\n}\n","/**\n * Pure business logic for font-size state queries and transaction builders.\n * All functions are DOM-free and operate on EditorState / PluginContext.\n *\n * Delegates to the generic AttributedMarkCommands helpers for the\n * collapsed-vs-range branching logic.\n */\n\nimport {\n\tapplyAttributedMark,\n\tgetMarkAttrAtSelection,\n\tisAttributedMarkActive,\n\tremoveAttributedMark,\n} from '../../commands/AttributedMarkCommands.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\n\n// --- State Queries ---\n\n/** Returns the raw fontSize CSS value at the current selection, or null. */\nexport function getActiveSize(state: EditorState): string | null {\n\treturn getMarkAttrAtSelection(state, 'fontSize', (m) => m.attrs.size ?? null);\n}\n\n/** Returns the active font size as a number, falling back to defaultSize. */\nexport function getActiveSizeNumeric(state: EditorState, defaultSize: number): number {\n\tconst raw: string | null = getActiveSize(state);\n\tif (!raw) return defaultSize;\n\tconst parsed: number = Number.parseInt(raw, 10);\n\treturn Number.isNaN(parsed) ? defaultSize : parsed;\n}\n\n/** Returns true when the selection carries a fontSize mark. */\nexport function isFontSizeActive(state: EditorState): boolean {\n\treturn isAttributedMarkActive(state, 'fontSize');\n}\n\n// --- Commands ---\n\n/** Applies a fontSize mark with the given CSS size string to the selection. */\nexport function applyFontSize(context: PluginContext, state: EditorState, size: string): boolean {\n\tconst mark = { type: markType('fontSize'), attrs: { size } };\n\tconst tr = applyAttributedMark(state, mark);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Removes the fontSize mark from the current selection. */\nexport function removeFontSize(context: PluginContext, state: EditorState): boolean {\n\tconst tr = removeAttributedMark(state, markType('fontSize'));\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Steps the font size up or down through the preset list. */\nexport function stepFontSize(\n\tcontext: PluginContext,\n\tstate: EditorState,\n\tdirection: 'up' | 'down',\n\tsizes: readonly number[],\n\tdefaultSize: number,\n): boolean {\n\tconst current: number = getActiveSizeNumeric(state, defaultSize);\n\tconst next: number | null = getNextPresetSize(current, direction, sizes);\n\tif (next === null) return false;\n\n\tif (next === defaultSize) {\n\t\treturn removeFontSize(context, state);\n\t}\n\treturn applyFontSize(context, state, `${next}px`);\n}\n\n/**\n * Selects a specific font size: removes the mark when size equals the\n * default, otherwise applies the new size.\n */\nexport function selectSize(context: PluginContext, size: number, defaultSize: number): void {\n\tif (size === defaultSize) {\n\t\tcontext.executeCommand('removeFontSize');\n\t} else {\n\t\tapplyFontSize(context, context.getState(), `${size}px`);\n\t}\n}\n\n// --- Helpers ---\n\n/** Finds the next preset size in the given direction, or null at boundaries. */\nexport function getNextPresetSize(\n\tcurrent: number,\n\tdirection: 'up' | 'down',\n\tsizes: readonly number[],\n): number | null {\n\tif (direction === 'up') {\n\t\tfor (const size of sizes) {\n\t\t\tif (size > current) return size;\n\t\t}\n\t\treturn null;\n\t}\n\tfor (let i: number = sizes.length - 1; i >= 0; i--) {\n\t\tconst size: number | undefined = sizes[i];\n\t\tif (size !== undefined && size < current) return size;\n\t}\n\treturn null;\n}\n","/**\n * Renders the font-size picker popup with a custom numeric input\n * and an accessible preset list with keyboard navigation.\n */\n\nimport type { PluginContext } from '../Plugin.js';\nimport type { PopupCloseOptions } from '../shared/PopupManager.js';\nimport type { FontSizeLocale } from './FontSizeLocale.js';\nimport { getActiveSizeNumeric, selectSize } from './FontSizeOperations.js';\n\n// --- Constants ---\n\nconst MIN_CUSTOM_SIZE = 1;\nconst MAX_CUSTOM_SIZE = 400;\n\n// --- Config ---\n\nexport interface FontSizePopupConfig {\n\treadonly sizes: readonly number[];\n\treadonly defaultSize: number;\n\treadonly onClose: (options?: PopupCloseOptions) => void;\n\treadonly contentElement: HTMLElement;\n\treadonly locale: FontSizeLocale;\n}\n\n// --- Public Entry Point ---\n\n/** Builds the font-size picker DOM inside the given container. */\nexport function renderFontSizePopup(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tconfig: FontSizePopupConfig,\n): void {\n\tcontainer.classList.add('notectl-font-size-picker');\n\n\tconst currentSize: number = getActiveSizeNumeric(context.getState(), config.defaultSize);\n\n\tconst input: HTMLInputElement = buildCustomInput(currentSize, config);\n\tappendInputWrapper(container, input);\n\n\tconst { list, items } = buildSizeList(config.sizes, currentSize, context, config);\n\tcontainer.appendChild(list);\n\n\tscrollActiveIntoView(items, config.sizes, currentSize, list);\n\tattachKeyboardNavigation(input, list, items, context, config);\n}\n\n// --- Custom Input ---\n\nfunction buildCustomInput(currentSize: number, config: FontSizePopupConfig): HTMLInputElement {\n\tconst input: HTMLInputElement = document.createElement('input');\n\tinput.type = 'number';\n\tinput.className = 'notectl-font-size-picker__input';\n\tinput.min = String(MIN_CUSTOM_SIZE);\n\tinput.max = String(MAX_CUSTOM_SIZE);\n\tinput.value = String(currentSize);\n\tinput.setAttribute('aria-label', config.locale.customFontSizeAria);\n\treturn input;\n}\n\nfunction appendInputWrapper(container: HTMLElement, input: HTMLInputElement): void {\n\tconst wrapper: HTMLDivElement = document.createElement('div');\n\twrapper.className = 'notectl-font-size-picker__input-wrapper';\n\twrapper.appendChild(input);\n\tcontainer.appendChild(wrapper);\n}\n\n// --- Size List ---\n\ninterface SizeListResult {\n\treadonly list: HTMLDivElement;\n\treadonly items: HTMLButtonElement[];\n}\n\nfunction buildSizeList(\n\tsizes: readonly number[],\n\tcurrentSize: number,\n\tcontext: PluginContext,\n\tconfig: FontSizePopupConfig,\n): SizeListResult {\n\tconst list: HTMLDivElement = document.createElement('div');\n\tlist.className = 'notectl-font-size-picker__list';\n\tlist.setAttribute('role', 'listbox');\n\tlist.setAttribute('aria-label', config.locale.fontSizesAria);\n\n\tconst items: HTMLButtonElement[] = [];\n\n\tfor (const size of sizes) {\n\t\tconst isActive: boolean = size === currentSize;\n\t\tconst item: HTMLButtonElement = buildSizeItem(size, isActive);\n\n\t\titem.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tselectSize(context, size, config.defaultSize);\n\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t});\n\n\t\titems.push(item);\n\t\tlist.appendChild(item);\n\t}\n\n\treturn { list, items };\n}\n\nfunction buildSizeItem(size: number, isActive: boolean): HTMLButtonElement {\n\tconst item: HTMLButtonElement = document.createElement('button');\n\titem.type = 'button';\n\titem.id = `notectl-font-size-option-${size}`;\n\titem.className = 'notectl-font-size-picker__item';\n\titem.setAttribute('role', 'option');\n\titem.setAttribute('aria-selected', String(isActive));\n\n\tif (isActive) {\n\t\titem.classList.add('notectl-font-size-picker__item--active');\n\t}\n\n\tconst check: HTMLSpanElement = document.createElement('span');\n\tcheck.className = 'notectl-font-size-picker__check';\n\tcheck.textContent = isActive ? '\\u2713' : '';\n\titem.appendChild(check);\n\n\tconst label: HTMLSpanElement = document.createElement('span');\n\tlabel.className = 'notectl-font-size-picker__label';\n\tlabel.textContent = String(size);\n\titem.appendChild(label);\n\n\treturn item;\n}\n\n// --- Scroll ---\n\nfunction scrollActiveIntoView(\n\titems: HTMLButtonElement[],\n\tsizes: readonly number[],\n\tcurrentSize: number,\n\tlist: HTMLDivElement,\n): void {\n\tconst activeIdx: number = sizes.indexOf(currentSize);\n\tif (activeIdx < 0) return;\n\n\tconst activeItem: HTMLButtonElement | undefined = items[activeIdx];\n\tif (!activeItem) return;\n\n\trequestAnimationFrame(() => {\n\t\tactiveItem.scrollIntoView({ block: 'nearest' });\n\t});\n\tlist.setAttribute('aria-activedescendant', activeItem.id);\n}\n\n// --- Keyboard Navigation ---\n\nfunction attachKeyboardNavigation(\n\tinput: HTMLInputElement,\n\tlist: HTMLDivElement,\n\titems: HTMLButtonElement[],\n\tcontext: PluginContext,\n\tconfig: FontSizePopupConfig,\n): void {\n\tlet focusedIndex = -1;\n\n\tconst setFocused = (idx: number): void => {\n\t\tif (focusedIndex >= 0 && focusedIndex < items.length) {\n\t\t\titems[focusedIndex]?.classList.remove('notectl-font-size-picker__item--focused');\n\t\t}\n\t\tfocusedIndex = idx;\n\t\tconst el: HTMLButtonElement | undefined = items[focusedIndex];\n\t\tif (focusedIndex >= 0 && focusedIndex < items.length && el) {\n\t\t\tel.classList.add('notectl-font-size-picker__item--focused');\n\t\t\tel.scrollIntoView({ block: 'nearest' });\n\t\t\tlist.setAttribute('aria-activedescendant', el.id);\n\t\t}\n\t};\n\n\tinput.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\t\t\tconst val: number = Number.parseInt(input.value, 10);\n\t\t\tif (!Number.isNaN(val) && val >= MIN_CUSTOM_SIZE && val <= MAX_CUSTOM_SIZE) {\n\t\t\t\tselectSize(context, val, config.defaultSize);\n\t\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t\t}\n\t\t} else if (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsetFocused(0);\n\t\t\titems[0]?.focus();\n\t\t} else if (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t}\n\t});\n\n\tlist.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tif (focusedIndex < items.length - 1) {\n\t\t\t\tsetFocused(focusedIndex + 1);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t}\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tif (focusedIndex > 0) {\n\t\t\t\tsetFocused(focusedIndex - 1);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t} else {\n\t\t\t\tsetFocused(-1);\n\t\t\t\tinput.focus();\n\t\t\t}\n\t\t} else if (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\t\t\tconst selectedSize: number | undefined = config.sizes[focusedIndex];\n\t\t\tif (focusedIndex >= 0 && focusedIndex < config.sizes.length && selectedSize !== undefined) {\n\t\t\t\tselectSize(context, selectedSize, config.defaultSize);\n\t\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t\t}\n\t\t} else if (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t}\n\t});\n}\n","/**\n * FontSizePlugin: registers a fontSize mark with attrs, a combobox-style\n * toolbar selector with WCAG-accessible popup, and commands for\n * increasing / decreasing font size.\n */\n\nimport { FONT_SIZE_SELECT_CSS } from '../../editor/styles/font-size-select.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isValidCSSFontSize } from '../shared/ColorValidation.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { FONT_SIZE_LOCALE_EN, type FontSizeLocale, loadFontSizeLocale } from './FontSizeLocale.js';\nimport {\n\tgetActiveSizeNumeric,\n\tisFontSizeActive,\n\tremoveFontSize,\n\tstepFontSize,\n} from './FontSizeOperations.js';\nimport { renderFontSizePopup } from './FontSizePopup.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tfontSize: { size: string };\n\t}\n}\n\n// --- Constants ---\n\n/** Default preset sizes shown in the font size dropdown. */\nexport const DEFAULT_FONT_SIZES: readonly number[] = [\n\t8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 48, 64, 72, 96,\n];\n\nconst DEFAULT_FONT_SIZE = 16;\n\n// --- Configuration ---\n\nexport interface FontSizeConfig {\n\t/**\n\t * Preset sizes shown in the font size dropdown.\n\t * Must contain positive integers. Values are sorted and deduplicated automatically.\n\t * Defaults to {@link DEFAULT_FONT_SIZES} when omitted or empty.\n\t */\n\treadonly sizes?: readonly number[];\n\t/**\n\t * The base font size that text has when no fontSize mark is applied.\n\t * Shown as the initial value in the toolbar combo and used as the\n\t * \"neutral\" size — selecting it removes the mark instead of applying one.\n\t * Defaults to 16.\n\t */\n\treadonly defaultSize?: number;\n\treadonly locale?: FontSizeLocale;\n}\n\n// --- Plugin ---\n\nexport class FontSizePlugin implements Plugin {\n\treadonly id = 'fontSize';\n\treadonly name = 'Font Size';\n\treadonly priority = 21;\n\n\tprivate readonly config: FontSizeConfig;\n\tprivate readonly sizes: readonly number[];\n\tprivate readonly defaultSize: number;\n\tprivate locale!: FontSizeLocale;\n\n\tconstructor(config?: Partial<FontSizeConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.sizes = resolveSizes(config?.sizes);\n\t\tthis.defaultSize = resolveDefaultSize(config?.defaultSize);\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\tFONT_SIZE_LOCALE_EN,\n\t\t\tloadFontSizeLocale,\n\t\t);\n\n\t\tcontext.registerStyleSheet(FONT_SIZE_SELECT_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymaps(context);\n\t\tthis.registerToolbarItem(context);\n\t\tthis.applyDefaultSizeToContainer(context);\n\t}\n\n\tdestroy(): void {\n\t\t// no-op: nothing to clean up\n\t}\n\n\t// --- Schema ---\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'fontSize',\n\t\t\trank: 4,\n\t\t\tattrs: {\n\t\t\t\tsize: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span: HTMLElement = document.createElement('span');\n\t\t\t\tconst size: string = mark.attrs?.size ?? '';\n\t\t\t\tif (size) {\n\t\t\t\t\tsetStyleProperty(span, 'fontSize', size);\n\t\t\t\t}\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content, ctx?: HTMLExportContext) => {\n\t\t\t\tconst size: string = String(mark.attrs?.size ?? '');\n\t\t\t\tif (!size || !isValidCSSFontSize(size)) return content;\n\t\t\t\tconst decl: string = `font-size: ${escapeHTML(size)}`;\n\t\t\t\tconst attr: string = ctx?.styleAttr(decl) ?? ` style=\"${decl}\"`;\n\t\t\t\treturn `<span${attr}>${content}</span>`;\n\t\t\t},\n\t\t\ttoHTMLStyle: (mark) => {\n\t\t\t\tconst size: string = String(mark.attrs?.size ?? '');\n\t\t\t\tif (!size || !isValidCSSFontSize(size)) return null;\n\t\t\t\treturn `font-size: ${escapeHTML(size)}`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst size: string = el.style.fontSize;\n\t\t\t\t\t\tif (!size) return false;\n\t\t\t\t\t\treturn { size };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\t// --- Commands ---\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeFontSize', () => {\n\t\t\treturn removeFontSize(context, context.getState());\n\t\t});\n\n\t\tcontext.registerCommand('setFontSize', () => {\n\t\t\treturn false;\n\t\t});\n\n\t\tcontext.registerCommand('increaseFontSize', () => {\n\t\t\treturn stepFontSize(context, context.getState(), 'up', this.sizes, this.defaultSize);\n\t\t});\n\n\t\tcontext.registerCommand('decreaseFontSize', () => {\n\t\t\treturn stepFontSize(context, context.getState(), 'down', this.sizes, this.defaultSize);\n\t\t});\n\t}\n\n\t// --- Keymaps ---\n\n\tprivate registerKeymaps(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift-+': () => {\n\t\t\t\treturn stepFontSize(context, context.getState(), 'up', this.sizes, this.defaultSize);\n\t\t\t},\n\t\t\t'Mod-Shift-_': () => {\n\t\t\t\treturn stepFontSize(context, context.getState(), 'down', this.sizes, this.defaultSize);\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'fontSize',\n\t\t\tgroup: 'format',\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeFontSize',\n\t\t\tpopupType: 'combobox',\n\t\t\tgetLabel: (state: EditorState): string =>\n\t\t\t\tString(getActiveSizeNumeric(state, this.defaultSize)),\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderFontSizePopup(container, ctx, {\n\t\t\t\t\tsizes: this.sizes,\n\t\t\t\t\tdefaultSize: this.defaultSize,\n\t\t\t\t\tonClose,\n\t\t\t\t\tcontentElement: ctx.getContainer(),\n\t\t\t\t\tlocale: this.locale,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state) => isFontSizeActive(state),\n\t\t});\n\t}\n\n\t/**\n\t * Sets the configured default font size on the editor content container\n\t * so that unformatted text renders at the correct size instead of the\n\t * browser default (16px).\n\t */\n\tprivate applyDefaultSizeToContainer(context: PluginContext): void {\n\t\tconst container: HTMLElement = context.getContainer();\n\t\tsetStyleProperty(container, 'fontSize', `${this.defaultSize}px`);\n\t}\n}\n\n// --- Helpers ---\n\nfunction resolveSizes(sizes: readonly number[] | undefined): readonly number[] {\n\tif (!sizes || sizes.length === 0) return DEFAULT_FONT_SIZES;\n\tconst unique: number[] = [...new Set(sizes)].filter((n) => Number.isInteger(n) && n > 0);\n\tunique.sort((a, b) => a - b);\n\treturn unique.length > 0 ? unique : DEFAULT_FONT_SIZES;\n}\n\nfunction resolveDefaultSize(size: number | undefined): number {\n\tif (size === undefined) return DEFAULT_FONT_SIZE;\n\treturn Number.isInteger(size) && size > 0 ? size : DEFAULT_FONT_SIZE;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as t}from"./Document-DnPKbcPE.mjs";import{a as e,c as r,r as n,t as o}from"./Selection-B14e7gd0.mjs";import{n as s}from"./NodeResolver-BkOsZnuU.mjs";import{i}from"./NavigationQueries-CgYPG6oY.mjs";import{t as l}from"./Platform-wPvKFB9m.mjs";function u(t,e,r){return t.transaction("input").setSelection(o(e,r)).setStoredMarks(null,t.storedMarks).build()}function c(t,e){const r=s(t.doc,e)??[];return t.transaction("input").setSelection(n(e,r)).setStoredMarks(null,t.storedMarks).build()}function a(t,r,n,o,s){return t.transaction("input").setSelection(e({blockId:r,offset:n},{blockId:o,offset:s})).setStoredMarks(null,t.storedMarks).build()}function f(e,n,o){const s=e.selection;if(!r(s))return null;const a=e.getBlockOrder(),f=a.indexOf(s.blockId);if(f<0)return null;const d=function(t,e,r){if(!r)return t;if("left"!==t&&"right"!==t)return t;const n=r.querySelector(`[data-block-id="${e}"]`);return n instanceof HTMLElement?"rtl"!==l(n)?t:"left"===t?"right":"left":t}(n,s.blockId,o);if("before"===s.side&&("right"===d||"down"===d)||"after"===s.side&&("left"===d||"up"===d))return c(e,s.blockId);const m="before"===s.side?f-1:f+1;if(m<0||m>=a.length)return null;const k=a[m];if(!k)return null;if(i(e,k))return c(e,k);const b=e.getBlock(k);return b?u(e,k,"left"===d||"up"===d?t(b):0):null}export{c as i,a as n,u as r,f as t};
|
|
2
|
-
//# sourceMappingURL=GapCursorNavigation-uytzcZ6C.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GapCursorNavigation-uytzcZ6C.mjs","names":[],"sources":["../../src/state/SelectionTransactions.ts","../../src/view/GapCursorNavigation.ts"],"sourcesContent":["/**\n * Shared transaction builders for cursor and selection movement.\n *\n * These helpers encapsulate the common pattern of building a transaction\n * that sets a new selection and clears storedMarks.\n */\n\nimport { findNodePath } from '../model/NodeResolver.js';\nimport {\n\tcreateCollapsedSelection,\n\tcreateNodeSelection,\n\tcreateSelection,\n} from '../model/Selection.js';\nimport type { BlockId } from '../model/TypeBrands.js';\nimport type { EditorState } from './EditorState.js';\nimport type { Transaction } from './Transaction.js';\n\n/** Builds a collapsed-cursor transaction that clears storedMarks. */\nexport function moveTx(state: EditorState, blockId: BlockId, offset: number): Transaction {\n\treturn state\n\t\t.transaction('input')\n\t\t.setSelection(createCollapsedSelection(blockId, offset))\n\t\t.setStoredMarks(null, state.storedMarks)\n\t\t.build();\n}\n\n/** Builds a NodeSelection transaction that clears storedMarks. */\nexport function nodeSelTx(state: EditorState, targetId: BlockId): Transaction {\n\tconst path: BlockId[] = (findNodePath(state.doc, targetId) ?? []) as BlockId[];\n\treturn state\n\t\t.transaction('input')\n\t\t.setSelection(createNodeSelection(targetId, path))\n\t\t.setStoredMarks(null, state.storedMarks)\n\t\t.build();\n}\n\n/** Builds a range-selection transaction that clears storedMarks. */\nexport function extendTx(\n\tstate: EditorState,\n\tanchorBlockId: BlockId,\n\tanchorOffset: number,\n\theadBlockId: BlockId,\n\theadOffset: number,\n): Transaction {\n\treturn state\n\t\t.transaction('input')\n\t\t.setSelection(\n\t\t\tcreateSelection(\n\t\t\t\t{ blockId: anchorBlockId, offset: anchorOffset },\n\t\t\t\t{ blockId: headBlockId, offset: headOffset },\n\t\t\t),\n\t\t)\n\t\t.setStoredMarks(null, state.storedMarks)\n\t\t.build();\n}\n","import { getBlockLength } from '../model/Document.js';\nimport { isGapCursor } from '../model/Selection.js';\nimport type { BlockId } from '../model/TypeBrands.js';\nimport { getTextDirection } from '../platform/Platform.js';\nimport type { EditorState } from '../state/EditorState.js';\nimport { isVoidBlock } from '../state/NavigationQueries.js';\nimport { moveTx, nodeSelTx } from '../state/SelectionTransactions.js';\nimport type { Transaction } from '../state/Transaction.js';\n\nexport type GapCursorDirection = 'left' | 'right' | 'up' | 'down';\n\n/**\n * Navigates from a GapCursor position.\n *\n * - Arrow toward the adjacent void block -> NodeSelection of that block.\n * - Arrow away from the void block -> find next block: void -> NodeSelection,\n * text -> TextSelection, document boundary -> no-op.\n */\nexport function navigateFromGapCursor(\n\tstate: EditorState,\n\tdirection: GapCursorDirection,\n\tcontainer?: HTMLElement,\n): Transaction | null {\n\tconst sel = state.selection;\n\tif (!isGapCursor(sel)) return null;\n\n\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\tconst blockIdx: number = blockOrder.indexOf(sel.blockId);\n\tif (blockIdx < 0) return null;\n\n\t// Resolve effective horizontal direction for RTL blocks\n\tconst effectiveDir: GapCursorDirection = resolveEffectiveDirection(\n\t\tdirection,\n\t\tsel.blockId,\n\t\tcontainer,\n\t);\n\n\tconst towardVoid: boolean =\n\t\t(sel.side === 'before' && (effectiveDir === 'right' || effectiveDir === 'down')) ||\n\t\t(sel.side === 'after' && (effectiveDir === 'left' || effectiveDir === 'up'));\n\n\tif (towardVoid) return nodeSelTx(state, sel.blockId);\n\n\t// Moving away from the void block - find the neighbor in the other direction\n\tconst awayIdx: number = sel.side === 'before' ? blockIdx - 1 : blockIdx + 1;\n\tif (awayIdx < 0 || awayIdx >= blockOrder.length) return null;\n\n\tconst targetId: BlockId | undefined = blockOrder[awayIdx];\n\tif (!targetId) return null;\n\n\tif (isVoidBlock(state, targetId)) return nodeSelTx(state, targetId);\n\n\t// Text block: place cursor at start or end\n\tconst targetBlock = state.getBlock(targetId);\n\tif (!targetBlock) return null;\n\n\tconst targetOffset: number =\n\t\teffectiveDir === 'left' || effectiveDir === 'up' ? getBlockLength(targetBlock) : 0;\n\treturn moveTx(state, targetId, targetOffset);\n}\n\n/**\n * Resolves the effective navigation direction by flipping left/right\n * when the block is RTL. Vertical directions are unaffected.\n */\nfunction resolveEffectiveDirection(\n\tdirection: GapCursorDirection,\n\tblockId: BlockId,\n\tcontainer?: HTMLElement,\n): GapCursorDirection {\n\tif (!container) return direction;\n\tif (direction !== 'left' && direction !== 'right') return direction;\n\n\tconst blockEl: Element | null = container.querySelector(`[data-block-id=\"${blockId}\"]`);\n\tif (!(blockEl instanceof HTMLElement)) return direction;\n\n\tconst isRtl: boolean = getTextDirection(blockEl) === 'rtl';\n\tif (!isRtl) return direction;\n\n\treturn direction === 'left' ? 'right' : 'left';\n}\n"],"mappings":"0PAkBA,SAAgB,EAAO,EAAoB,EAAkB,GAC5D,OAAO,EACL,YAAY,SACZ,aAAa,EAAyB,EAAS,IAC/C,eAAe,KAAM,EAAM,aAC3B,QAIH,SAAgB,EAAU,EAAoB,GAC7C,MAAM,EAAmB,EAAa,EAAM,IAAK,IAAa,GAC9D,OAAO,EACL,YAAY,SACZ,aAAa,EAAoB,EAAU,IAC3C,eAAe,KAAM,EAAM,aAC3B,QAIH,SAAgB,EACf,EACA,EACA,EACA,EACA,GAEA,OAAO,EACL,YAAY,SACZ,aACA,EACC,CAAE,QAAS,EAAe,OAAQ,GAClC,CAAE,QAAS,EAAa,OAAQ,KAGjC,eAAe,KAAM,EAAM,aAC3B,QCnCH,SAAgB,EACf,EACA,EACA,GAEA,MAAM,EAAM,EAAM,UAClB,IAAK,EAAY,GAAM,OAAO,KAE9B,MAAM,EAAiC,EAAM,gBACvC,EAAmB,EAAW,QAAQ,EAAI,SAChD,GAAI,EAAW,EAAG,OAAO,KAGzB,MAAM,EAkCP,SACC,EACA,EACA,GAEA,IAAK,EAAW,OAAO,EACvB,GAAkB,SAAd,GAAsC,UAAd,EAAuB,OAAO,EAE1D,MAAM,EAA0B,EAAU,cAAc,mBAAmB,OAC3E,OAAM,aAAmB,YAE4B,QAA9B,EAAiB,GACrB,EAEE,SAAd,EAAuB,QAAU,OALM,EA3CL,CACxC,EACA,EAAI,QACJ,GAOD,GAHe,WAAb,EAAI,OAAuC,UAAjB,GAA6C,SAAjB,IACzC,UAAb,EAAI,OAAsC,SAAjB,GAA4C,OAAjB,GAEtC,OAAO,EAAU,EAAO,EAAI,SAG5C,MAAM,EAA+B,WAAb,EAAI,KAAoB,EAAW,EAAI,EAAW,EAC1E,GAAI,EAAU,GAAK,GAAW,EAAW,OAAQ,OAAO,KAExD,MAAM,EAAgC,EAAW,GACjD,IAAK,EAAU,OAAO,KAEtB,GAAI,EAAY,EAAO,GAAW,OAAO,EAAU,EAAO,GAG1D,MAAM,EAAc,EAAM,SAAS,GACnC,OAAK,EAIE,EAAO,EAAO,EADH,SAAjB,GAA4C,OAAjB,EAAwB,EAAe,GAAe,GAHzD"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as t}from"./Selection-B14e7gd0.mjs";import{t as e}from"./GapCursorNavigation-uytzcZ6C.mjs";import{i as n}from"./PluginHelpers-BZU5rE44.mjs";var o={gapCursorActive:"Gap cursor active. Type to insert new paragraph."},r=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-D714r_62.mjs"),"./locales/de.ts":()=>import("./de-C5If_e7l.mjs"),"./locales/es.ts":()=>import("./es-gB6GcNGB.mjs"),"./locales/fr.ts":()=>import("./fr-D9u2mcht.mjs"),"./locales/hi.ts":()=>import("./hi-C20PmckT.mjs"),"./locales/pt.ts":()=>import("./pt-DO4FbPvV.mjs"),"./locales/ru.ts":()=>import("./ru-B00ZXSqu.mjs"),"./locales/zh.ts":()=>import("./zh-C4rxe0Zk.mjs")});async function s(t){if("en"===t)return o;const e=r[`./locales/${t}.ts`];if(!e)return o;try{return(await e()).default}catch{return o}}var i=class{id="gap-cursor";name="Gap Cursor";priority=5;context=null;activeCursorBlockId=null;activeCursorSide=null;locale=o;async init(r){this.locale=await n(r,void 0,o,s),this.context=r,r.registerStyleSheet("\n.notectl-gap-cursor--before,\n.notectl-gap-cursor--after {\n\tposition: relative;\n}\n.notectl-gap-cursor--before::before {\n\tcontent: '';\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: currentColor;\n\ttransform: translateY(-50%);\n\tpointer-events: none;\n\tz-index: 1;\n\tanimation: notectl-gap-blink 1.1s step-end infinite;\n}\n.notectl-gap-cursor--after::after {\n\tcontent: '';\n\tdisplay: block;\n\tposition: absolute;\n\tbottom: 0;\n\tinset-inline-start: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: currentColor;\n\ttransform: translateY(50%);\n\tpointer-events: none;\n\tz-index: 1;\n\tanimation: notectl-gap-blink 1.1s step-end infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n\t.notectl-gap-cursor--before::before,\n\t.notectl-gap-cursor--after::after {\n\t\tanimation: none;\n\t}\n}\n@keyframes notectl-gap-blink {\n\t50% { opacity: 0; }\n}\n");const i={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"},a={};for(const[n,o]of Object.entries(i))a[n]=()=>{const n=r.getState();if(!t(n.selection))return!1;const s=e(n,o,r.getContainer());return!!s&&(r.dispatch(s),!0)};r.registerKeymap(a,{priority:"navigation"})}onReady(){this.context&&this.syncCursorClass(this.context.getState())}onStateChange(e,n,o){this.context&&(this.syncCursorClass(n),!t(e.selection)&&t(n.selection)&&this.context.announce(this.locale.gapCursorActive))}destroy(){this.clearCursorClass(),this.context=null}syncCursorClass(e){if(this.clearCursorClass(),!t(e.selection)||!this.context)return;const n="before"===e.selection.side?"notectl-gap-cursor--before":"notectl-gap-cursor--after",o=this.context.getContainer().querySelector(`[data-block-id="${e.selection.blockId}"]`);o instanceof HTMLElement&&(o.classList.add(n),this.activeCursorBlockId=e.selection.blockId,this.activeCursorSide=e.selection.side)}clearCursorClass(){if(!this.context||!this.activeCursorBlockId||!this.activeCursorSide)return;const t=this.context.getContainer().querySelector(`[data-block-id="${this.activeCursorBlockId}"]`);t instanceof HTMLElement&&t.classList.remove("notectl-gap-cursor--before","notectl-gap-cursor--after"),this.activeCursorBlockId=null,this.activeCursorSide=null}};export{i as t};
|
|
2
|
-
//# sourceMappingURL=GapCursorPlugin-BQ2_-7i6.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GapCursorPlugin-BQ2_-7i6.mjs","names":[],"sources":["../../src/plugins/gap-cursor/GapCursorLocale.ts","../../src/plugins/gap-cursor/GapCursorPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the GapCursorPlugin. */\n\n// --- Locale Interface ---\n\nexport interface GapCursorLocale {\n\treadonly gapCursorActive: string;\n}\n\n// --- Default English Locale ---\n\nexport const GAP_CURSOR_LOCALE_EN: GapCursorLocale = {\n\tgapCursorActive: 'Gap cursor active. Type to insert new paragraph.',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: GapCursorLocale }>> =\n\timport.meta.glob<{ default: GapCursorLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadGapCursorLocale(lang: string): Promise<GapCursorLocale> {\n\tif (lang === 'en') return GAP_CURSOR_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return GAP_CURSOR_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn GAP_CURSOR_LOCALE_EN;\n\t}\n}\n","/**\n * GapCursorPlugin: renders a virtual cursor at boundaries of void blocks\n * where no native browser caret can exist (e.g. between two HRs or at\n * the document edge adjacent to a void block).\n */\n\nimport { isGapCursor } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { navigateFromGapCursor } from '../../view/GapCursorNavigation.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tGAP_CURSOR_LOCALE_EN,\n\ttype GapCursorLocale,\n\tloadGapCursorLocale,\n} from './GapCursorLocale.js';\n\nconst GAP_CURSOR_CSS = `\n.notectl-gap-cursor--before,\n.notectl-gap-cursor--after {\n\tposition: relative;\n}\n.notectl-gap-cursor--before::before {\n\tcontent: '';\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: currentColor;\n\ttransform: translateY(-50%);\n\tpointer-events: none;\n\tz-index: 1;\n\tanimation: notectl-gap-blink 1.1s step-end infinite;\n}\n.notectl-gap-cursor--after::after {\n\tcontent: '';\n\tdisplay: block;\n\tposition: absolute;\n\tbottom: 0;\n\tinset-inline-start: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: currentColor;\n\ttransform: translateY(50%);\n\tpointer-events: none;\n\tz-index: 1;\n\tanimation: notectl-gap-blink 1.1s step-end infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n\t.notectl-gap-cursor--before::before,\n\t.notectl-gap-cursor--after::after {\n\t\tanimation: none;\n\t}\n}\n@keyframes notectl-gap-blink {\n\t50% { opacity: 0; }\n}\n`;\n\nexport class GapCursorPlugin implements Plugin {\n\treadonly id = 'gap-cursor';\n\treadonly name = 'Gap Cursor';\n\treadonly priority = 5;\n\n\tprivate context: PluginContext | null = null;\n\tprivate activeCursorBlockId: BlockId | null = null;\n\tprivate activeCursorSide: 'before' | 'after' | null = null;\n\tprivate locale: GapCursorLocale = GAP_CURSOR_LOCALE_EN;\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tundefined,\n\t\t\tGAP_CURSOR_LOCALE_EN,\n\t\t\tloadGapCursorLocale,\n\t\t);\n\n\t\tthis.context = context;\n\n\t\tcontext.registerStyleSheet(GAP_CURSOR_CSS);\n\n\t\tconst directions: Record<string, 'left' | 'right' | 'up' | 'down'> = {\n\t\t\tArrowLeft: 'left',\n\t\t\tArrowRight: 'right',\n\t\t\tArrowUp: 'up',\n\t\t\tArrowDown: 'down',\n\t\t};\n\n\t\tconst keymap: Record<string, () => boolean> = {};\n\t\tfor (const [key, dir] of Object.entries(directions)) {\n\t\t\tkeymap[key] = (): boolean => {\n\t\t\t\tconst state: EditorState = context.getState();\n\t\t\t\tif (!isGapCursor(state.selection)) return false;\n\n\t\t\t\tconst container: HTMLElement = context.getContainer();\n\t\t\t\tconst tr: Transaction | null = navigateFromGapCursor(state, dir, container);\n\t\t\t\tif (tr) {\n\t\t\t\t\tcontext.dispatch(tr);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}\n\n\t\tcontext.registerKeymap(keymap, { priority: 'navigation' });\n\t}\n\n\tonReady(): void {\n\t\tif (!this.context) return;\n\t\tthis.syncCursorClass(this.context.getState());\n\t}\n\n\tonStateChange(oldState: EditorState, newState: EditorState, _tr: Transaction): void {\n\t\tif (!this.context) return;\n\n\t\tthis.syncCursorClass(newState);\n\n\t\tif (!isGapCursor(oldState.selection) && isGapCursor(newState.selection)) {\n\t\t\tthis.context.announce(this.locale.gapCursorActive);\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.clearCursorClass();\n\t\tthis.context = null;\n\t}\n\n\tprivate syncCursorClass(state: EditorState): void {\n\t\tthis.clearCursorClass();\n\t\tif (!isGapCursor(state.selection) || !this.context) return;\n\n\t\tconst className: string =\n\t\t\tstate.selection.side === 'before'\n\t\t\t\t? 'notectl-gap-cursor--before'\n\t\t\t\t: 'notectl-gap-cursor--after';\n\n\t\tconst blockEl: Element | null = this.context\n\t\t\t.getContainer()\n\t\t\t.querySelector(`[data-block-id=\"${state.selection.blockId}\"]`);\n\t\tif (!(blockEl instanceof HTMLElement)) return;\n\n\t\tblockEl.classList.add(className);\n\t\tthis.activeCursorBlockId = state.selection.blockId;\n\t\tthis.activeCursorSide = state.selection.side;\n\t}\n\n\tprivate clearCursorClass(): void {\n\t\tif (!this.context || !this.activeCursorBlockId || !this.activeCursorSide) return;\n\n\t\tconst blockEl: Element | null = this.context\n\t\t\t.getContainer()\n\t\t\t.querySelector(`[data-block-id=\"${this.activeCursorBlockId}\"]`);\n\t\tif (blockEl instanceof HTMLElement) {\n\t\t\tblockEl.classList.remove('notectl-gap-cursor--before', 'notectl-gap-cursor--after');\n\t\t}\n\n\t\tthis.activeCursorBlockId = null;\n\t\tthis.activeCursorSide = null;\n\t}\n}\n"],"mappings":"qJAUA,IAAa,EAAwC,CACpD,gBAAiB,oDAKZ,iBACL,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAED,eAAsB,EAAoB,GACzC,GAAa,OAAT,EAAe,OAAO,EAC1B,MAAM,EAAS,EAAc,aAAa,QAC1C,IAAK,EAAQ,OAAO,EACpB,IAEC,aADkB,KACP,cAEX,OAAO,GCRT,IA4Ca,EAAb,MACC,GAAc,aACd,KAAgB,aAChB,SAAoB,EAEpB,QAAwC,KACxC,oBAA8C,KAC9C,iBAAsD,KACtD,OAAkC,EAElC,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,OACA,EACA,EACA,GAGD,KAAK,QAAU,EAEf,EAAQ,mBAhEa,07BAkErB,MAAM,EAA+D,CACpE,UAAW,OACX,WAAY,QACZ,QAAS,KACT,UAAW,QAGN,EAAwC,CAAA,EAC9C,IAAK,MAAO,EAAK,KAAQ,OAAO,QAAQ,GACvC,EAAO,GAAA,KACN,MAAM,EAAqB,EAAQ,WACnC,IAAK,EAAY,EAAM,WAAY,OAAO,EAG1C,MAAM,EAAyB,EAAsB,EAAO,EAD7B,EAAQ,gBAEvC,QAAI,IACH,EAAQ,SAAS,IACV,IAMV,EAAQ,eAAe,EAAQ,CAAE,SAAU,eAG5C,OAAA,GACM,KAAK,SACV,KAAK,gBAAgB,KAAK,QAAQ,YAGnC,aAAA,CAAc,EAAuB,EAAuB,GACtD,KAAK,UAEV,KAAK,gBAAgB,IAEhB,EAAY,EAAS,YAAc,EAAY,EAAS,YAC5D,KAAK,QAAQ,SAAS,KAAK,OAAO,kBAIpC,OAAA,GACC,KAAK,mBACL,KAAK,QAAU,KAGhB,eAAA,CAAwB,GAEvB,GADA,KAAK,oBACA,EAAY,EAAM,aAAe,KAAK,QAAS,OAEpD,MAAM,EACoB,WAAzB,EAAM,UAAU,KACb,6BACA,4BAEE,EAA0B,KAAK,QACnC,eACA,cAAc,mBAAmB,EAAM,UAAU,aAC7C,aAAmB,cAEzB,EAAQ,UAAU,IAAI,GACtB,KAAK,oBAAsB,EAAM,UAAU,QAC3C,KAAK,iBAAmB,EAAM,UAAU,MAGzC,gBAAA,GACC,IAAK,KAAK,UAAY,KAAK,sBAAwB,KAAK,iBAAkB,OAE1E,MAAM,EAA0B,KAAK,QACnC,eACA,cAAc,mBAAmB,KAAK,yBACpC,aAAmB,aACtB,EAAQ,UAAU,OAAO,6BAA8B,6BAGxD,KAAK,oBAAsB,KAC3B,KAAK,iBAAmB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var t=/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|blob|data):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i;function e(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}var n=e,o=new Set(["p","div","h1","h2","h3","h4","h5","h6","ul","ol","li","blockquote","table","thead","tbody","tfoot","tr","td","th","pre","figure","figcaption","section","article","header","footer"]),a=new Set(["br","hr","img","input","col","area","meta","link"]);function r(t,e=" "){const n=function(t){const e=[];let n=0,o=0;for(;o<t.length;){if("<"!==t[o]){o+=1;continue}let a=o+1;a<t.length&&"/"===t[a]&&(a+=1);const r=t[a];if(a>=t.length||!r||!s(r)){o+=1;continue}const l=i(t,a+1);if(void 0===l)break;o>n&&e.push(t.slice(n,o)),e.push(t.slice(o,l+1)),o=l+1,n=o}return n<t.length&&e.push(t.slice(n)),e}(t),r=[];let c=0,h="";const u=()=>{const t=h.trim();t.length>0&&r.push(`${e.repeat(c)}${t}`),h=""};for(const i of n){const t=i.startsWith("<")?l(i):"",n=o.has(t),s=a.has(t);n||s?(u(),i.startsWith("</")?(c=Math.max(0,c-1),r.push(`${e.repeat(c)}${i}`)):(r.push(`${e.repeat(c)}${i}`),!n||s||i.endsWith("/>")||(c+=1))):h+=i}return u(),r.join("\n")}function i(t,e){let n;for(let o=e;o<t.length;o+=1){const e=t[o]??"";if(n)e===n&&(n=void 0);else if('"'!==e&&"'"!==e){if(">"===e)return o}else n=e}}function s(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"}function l(t){return t.match(/^<\/?([a-zA-Z][a-zA-Z0-9]*)/)?.[1]?.toLowerCase()??""}export{r as i,n,e as r,t};
|
|
2
|
-
//# sourceMappingURL=HTMLUtils-BLwp5G4f.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HTMLUtils-BLwp5G4f.mjs","names":[],"sources":["../../src/model/HTMLUtils.ts"],"sourcesContent":["/**\n * HTML string escaping and formatting utilities shared across serialization and parsing.\n */\n\n/**\n * URI scheme regex for DOMPurify that extends the default allowlist with `blob:` and `data:`.\n * `blob:` is needed to preserve same-origin blob URLs (e.g. uploaded images) through\n * clipboard round-trips and HTML serialization.\n */\nexport const SAFE_URI_REGEXP: RegExp =\n\t/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|blob|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i;\n\n/** Escapes special HTML characters in text content. */\nexport function escapeHTML(text: string): string {\n\treturn text\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"');\n}\n\n/** Escapes a value for safe interpolation into an HTML attribute (double-quoted). */\nexport const escapeAttr: (value: string) => string = escapeHTML;\n\n/** Block-level HTML tags that should appear on their own line with indentation. */\nconst BLOCK_TAGS: ReadonlySet<string> = new Set([\n\t'p',\n\t'div',\n\t'h1',\n\t'h2',\n\t'h3',\n\t'h4',\n\t'h5',\n\t'h6',\n\t'ul',\n\t'ol',\n\t'li',\n\t'blockquote',\n\t'table',\n\t'thead',\n\t'tbody',\n\t'tfoot',\n\t'tr',\n\t'td',\n\t'th',\n\t'pre',\n\t'figure',\n\t'figcaption',\n\t'section',\n\t'article',\n\t'header',\n\t'footer',\n]);\n\n/** Void (self-closing) HTML tags that never have children. */\nconst VOID_TAGS: ReadonlySet<string> = new Set([\n\t'br',\n\t'hr',\n\t'img',\n\t'input',\n\t'col',\n\t'area',\n\t'meta',\n\t'link',\n]);\n\n/**\n * Pretty-prints an HTML string with indentation and line breaks for block-level elements.\n * Inline content (e.g. `<strong>bold</strong> text`) stays on a single line.\n */\nexport function formatHTML(html: string, indent = ' '): string {\n\tconst tokens: readonly string[] = tokenizeHTML(html);\n\tconst lines: string[] = [];\n\tlet depth = 0;\n\tlet inlineBuffer = '';\n\n\tconst flushInline = (): void => {\n\t\tconst trimmed: string = inlineBuffer.trim();\n\t\tif (trimmed.length > 0) {\n\t\t\tlines.push(`${indent.repeat(depth)}${trimmed}`);\n\t\t}\n\t\tinlineBuffer = '';\n\t};\n\n\tfor (const token of tokens) {\n\t\tconst tag: string = token.startsWith('<') ? extractTagName(token) : '';\n\t\tconst isBlock: boolean = BLOCK_TAGS.has(tag);\n\t\tconst isVoid: boolean = VOID_TAGS.has(tag);\n\n\t\tif (isBlock || isVoid) {\n\t\t\tflushInline();\n\n\t\t\tif (token.startsWith('</')) {\n\t\t\t\tdepth = Math.max(0, depth - 1);\n\t\t\t\tlines.push(`${indent.repeat(depth)}${token}`);\n\t\t\t} else {\n\t\t\t\tlines.push(`${indent.repeat(depth)}${token}`);\n\t\t\t\tif (isBlock && !isVoid && !token.endsWith('/>')) {\n\t\t\t\t\tdepth += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tinlineBuffer += token;\n\t\t}\n\t}\n\n\tflushInline();\n\treturn lines.join('\\n');\n}\n\n/** Splits HTML into a flat list of tokens: tags and text segments between block boundaries. */\nfunction tokenizeHTML(html: string): readonly string[] {\n\tconst tokens: string[] = [];\n\tlet textStart = 0;\n\tlet i = 0;\n\twhile (i < html.length) {\n\t\tif (html[i] !== '<') {\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet nameStart = i + 1;\n\t\tif (nameStart < html.length && html[nameStart] === '/') {\n\t\t\tnameStart += 1;\n\t\t}\n\t\tconst nameChar: string | undefined = html[nameStart];\n\t\tif (nameStart >= html.length || !nameChar || !isASCIILetter(nameChar)) {\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst tagEnd: number | undefined = findTagEnd(html, nameStart + 1);\n\t\tif (tagEnd === undefined) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (i > textStart) {\n\t\t\ttokens.push(html.slice(textStart, i));\n\t\t}\n\t\ttokens.push(html.slice(i, tagEnd + 1));\n\t\ti = tagEnd + 1;\n\t\ttextStart = i;\n\t}\n\n\tif (textStart < html.length) {\n\t\ttokens.push(html.slice(textStart));\n\t}\n\treturn tokens;\n}\n\nfunction findTagEnd(html: string, from: number): number | undefined {\n\tlet quote: '\"' | \"'\" | undefined;\n\tfor (let i = from; i < html.length; i += 1) {\n\t\tconst char: string = html[i] ?? '';\n\t\tif (quote) {\n\t\t\tif (char === quote) {\n\t\t\t\tquote = undefined;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tquote = char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '>') {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction isASCIILetter(char: string): boolean {\n\treturn (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z');\n}\n\n/** Extracts the tag name from an HTML tag string like `<p>` or `</div class=\"x\">`. */\nfunction extractTagName(tag: string): string {\n\tconst match: RegExpMatchArray | null = tag.match(/^<\\/?([a-zA-Z][a-zA-Z0-9]*)/);\n\treturn match?.[1]?.toLowerCase() ?? '';\n}\n"],"mappings":"AASA,IAAa,EACZ,sGAGD,SAAgB,EAAW,GAC1B,OAAO,EACL,QAAQ,KAAM,SACd,QAAQ,KAAM,QACd,QAAQ,KAAM,QACd,QAAQ,KAAM,UAIjB,IAAa,EAAwC,EAG/C,EAAkC,IAAI,IAAI,CAC/C,IACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,aACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,MACA,SACA,aACA,UACA,UACA,SACA,WAIK,EAAiC,IAAI,IAAI,CAC9C,KACA,KACA,MACA,QACA,MACA,OACA,OACA,SAOD,SAAgB,EAAW,EAAc,EAAS,MACjD,MAAM,EAwCP,SAAsB,GACrB,MAAM,EAAmB,GACzB,IAAI,EAAY,EACZ,EAAI,EACR,KAAO,EAAI,EAAK,QAAQ,CACvB,GAAgB,MAAZ,EAAK,GAAY,CACpB,GAAK,EACL,SAGD,IAAI,EAAY,EAAI,EAChB,EAAY,EAAK,QAA8B,MAApB,EAAK,KACnC,GAAa,GAEd,MAAM,EAA+B,EAAK,GAC1C,GAAI,GAAa,EAAK,SAAW,IAAa,EAAc,GAAW,CACtE,GAAK,EACL,SAGD,MAAM,EAA6B,EAAW,EAAM,EAAY,GAChE,QAAe,IAAX,EACH,MAGG,EAAI,GACP,EAAO,KAAK,EAAK,MAAM,EAAW,IAEnC,EAAO,KAAK,EAAK,MAAM,EAAG,EAAS,IACnC,EAAI,EAAS,EACb,EAAY,EAMb,OAHI,EAAY,EAAK,QACpB,EAAO,KAAK,EAAK,MAAM,IAEjB,EA5E2B,CAAa,GACzC,EAAkB,GACxB,IAAI,EAAQ,EACR,EAAe,GAEnB,MAAM,EAAA,KACL,MAAM,EAAkB,EAAa,OACjC,EAAQ,OAAS,GACpB,EAAM,KAAK,GAAG,EAAO,OAAO,KAAS,KAEtC,EAAe,IAGhB,IAAK,MAAM,KAAS,EAAQ,CAC3B,MAAM,EAAc,EAAM,WAAW,KAAO,EAAe,GAAS,GAC9D,EAAmB,EAAW,IAAI,GAClC,EAAkB,EAAU,IAAI,GAElC,GAAW,GACd,IAEI,EAAM,WAAW,OACpB,EAAQ,KAAK,IAAI,EAAG,EAAQ,GAC5B,EAAM,KAAK,GAAG,EAAO,OAAO,KAAS,OAErC,EAAM,KAAK,GAAG,EAAO,OAAO,KAAS,MACjC,GAAY,GAAW,EAAM,SAAS,QACzC,GAAS,KAIX,GAAgB,EAKlB,OADA,IACO,EAAM,KAAK,MA2CnB,SAAS,EAAW,EAAc,GACjC,IAAI,EACJ,IAAK,IAAI,EAAI,EAAM,EAAI,EAAK,OAAQ,GAAK,EAAG,CAC3C,MAAM,EAAe,EAAK,IAAM,GAChC,GAAI,EACC,IAAS,IACZ,OAAQ,QAIV,GAAa,MAAT,GAAyB,MAAT,GAIpB,GAAa,MAAT,EACH,OAAO,OAJP,EAAQ,GAUX,SAAS,EAAc,GACtB,OAAQ,GAAQ,KAAO,GAAQ,KAAS,GAAQ,KAAO,GAAQ,IAIhE,SAAS,EAAe,GAEvB,OADuC,EAAI,MAAM,iCAClC,IAAI,eAAiB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./Commands-ByBjgD3-.mjs";var r=class{id="hard-break";name="Hard Break";priority=10;init(e){this.registerInlineNodeSpec(e),this.registerCommands(e),this.registerKeymap(e)}registerInlineNodeSpec(e){e.registerInlineNodeSpec({type:"hard_break",toDOM:()=>document.createElement("br"),toHTMLString:()=>"<br>",parseHTML:[{tag:"br"}],sanitize:{tags:["br"]}})}registerCommands(r){r.registerCommand("insertHardBreak",()=>{const t=e(r.getState());return!!t&&(r.dispatch(t),!0)})}registerKeymap(r){r.registerKeymap({"Shift-Enter":()=>{const t=e(r.getState());return!!t&&(r.dispatch(t),!0)}})}};export{r as t};
|
|
2
|
-
//# sourceMappingURL=HardBreakPlugin-CCrP_Kec.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HardBreakPlugin-CCrP_Kec.mjs","names":[],"sources":["../../src/plugins/hard-break/HardBreakPlugin.ts"],"sourcesContent":["/**\n * HardBreakPlugin: registers a hard line break (Shift+Enter → `<br>`)\n * as an InlineNode, with command and keymap bindings.\n */\n\nimport { insertHardBreakCommand } from '../../commands/Commands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface InlineNodeAttrRegistry {\n\t\thard_break: Record<string, never>;\n\t}\n}\n\n// --- Plugin ---\n\nexport class HardBreakPlugin implements Plugin {\n\treadonly id = 'hard-break';\n\treadonly name = 'Hard Break';\n\treadonly priority = 10;\n\n\tinit(context: PluginContext): void {\n\t\tthis.registerInlineNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t}\n\n\tprivate registerInlineNodeSpec(context: PluginContext): void {\n\t\tcontext.registerInlineNodeSpec({\n\t\t\ttype: 'hard_break',\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement('br');\n\t\t\t},\n\t\t\ttoHTMLString() {\n\t\t\t\treturn '<br>';\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'br' }],\n\t\t\tsanitize: { tags: ['br'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('insertHardBreak', () => {\n\t\t\tconst state = context.getState();\n\t\t\tconst tr = insertHardBreakCommand(state);\n\t\t\tif (!tr) return false;\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Shift-Enter': () => {\n\t\t\t\tconst state = context.getState();\n\t\t\t\tconst tr = insertHardBreakCommand(state);\n\t\t\t\tif (!tr) return false;\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t});\n\t}\n}\n"],"mappings":"4CAkBA,IAAa,EAAb,MACC,GAAc,aACd,KAAgB,aAChB,SAAoB,GAEpB,IAAA,CAAK,GACJ,KAAK,uBAAuB,GAC5B,KAAK,iBAAiB,GACtB,KAAK,eAAe,GAGrB,sBAAA,CAA+B,GAC9B,EAAQ,uBAAuB,CAC9B,KAAM,aACN,MAAA,IACQ,SAAS,cAAc,MAE/B,aAAA,IACQ,OAER,UAAW,CAAC,CAAE,IAAK,OACnB,SAAU,CAAE,KAAM,CAAC,SAIrB,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,kBAAA,KAEvB,MAAM,EAAK,EADG,EAAQ,YAEtB,QAAK,IACL,EAAQ,SAAS,IACV,KAIT,cAAA,CAAuB,GACtB,EAAQ,eAAe,CACtB,cAAA,KAEC,MAAM,EAAK,EADG,EAAQ,YAEtB,QAAK,IACL,EAAQ,SAAS,IACV"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{S as t,c as e,d as n,g as o,m as i}from"./Document-DnPKbcPE.mjs";import{o as r,t as a,u as s}from"./Selection-B14e7gd0.mjs";import{a as c}from"./TypeBrands-BQR8dEYU.mjs";import{n as l}from"./DomUtils-BkyCg-OO.mjs";import{o as g}from"./StyleRuntime-Bwde5icB.mjs";import{i as p}from"./PluginHelpers-BZU5rE44.mjs";function d(t,e,n,o){const i=document.createElement("button");i.type="button",i.className="notectl-heading-picker__item",i.setAttribute("role","option"),i.setAttribute("aria-selected",String(e)),e&&i.classList.add("notectl-heading-picker__item--active");const r=document.createElement("span");r.className="notectl-heading-picker__check",r.textContent=e?"✓":"",i.appendChild(r);const a=document.createElement("span");return a.className="notectl-heading-picker__label",a.textContent=t,o&&g(a,{fontSize:o.fontSize,fontWeight:o.fontWeight}),i.appendChild(a),i.addEventListener("mousedown",n),i}function h(t,e){return t[`heading${e}`]}function u(t,e){const n=t.getState();if(!s(n.selection))return!1;const o=n.getBlock(n.selection.anchor.blockId);return!!o&&(o.type===e?m(t,c("paragraph")):m(t,c(e)))}function f(t,e){const n=t.getState(),o=n.selection;if(!s(o))return!1;const i=n.getBlock(o.anchor.blockId);return!!i&&("heading"===i.type&&i.attrs?.level===e?m(t,c("paragraph")):m(t,c("heading"),{level:e}))}function m(e,i,r){const a=e.getState(),c=a.selection;if(!s(c))return!1;const l=a.getBlock(c.anchor.blockId);if(!l)return!1;const g=a.transaction("command"),p=e.getSchemaRegistry().getNodeSpec(i);p?.excludeMarks&&p.excludeMarks.length>0&&(function(e,i,r){if(0===n(i))return;const a=new Set(r),s=o(i);let c=0;for(const n of s)if(t(n)){if(n.text.length>0)for(const t of n.marks)a.has(t.type)&&e.removeMark(i.id,c,c+n.text.length,t);c+=n.text.length}else c+=1}(g,l,p.excludeMarks),function(t,e,n){if(!e.storedMarks)return;const o=new Set(n),i=e.storedMarks.filter(t=>!o.has(t.type));i.length!==e.storedMarks.length&&t.setStoredMarks(i.length>0?i:null,e.storedMarks)}(g,a,p.excludeMarks));const d=g.setBlockType(c.anchor.blockId,i,r).setSelection(c).build();return e.dispatch(d),!0}var k=new Set(["heading","title","subtitle"]);var b={paragraph:"Paragraph",title:"Title",subtitle:"Subtitle",heading1:"Heading 1",heading2:"Heading 2",heading3:"Heading 3",heading4:"Heading 4",heading5:"Heading 5",heading6:"Heading 6",blockTypeLabel:"Block Type",blockTypesAria:"Block types"},y=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-fSElw9mJ.mjs"),"./locales/de.ts":()=>import("./de-DcwZkO0v.mjs"),"./locales/es.ts":()=>import("./es-BEcu8DtV.mjs"),"./locales/fr.ts":()=>import("./fr-DEWFKFrW.mjs"),"./locales/hi.ts":()=>import("./hi-Dd2GOD9r.mjs"),"./locales/pt.ts":()=>import("./pt-DbDOQjV-.mjs"),"./locales/ru.ts":()=>import("./ru-CqsCwBQ_.mjs"),"./locales/zh.ts":()=>import("./zh-BOy5F5Jq.mjs")});async function v(t){if("en"===t)return b;const e=y[`./locales/${t}.ts`];if(!e)return b;try{return(await e()).default}catch{return b}}var x={levels:[1,2,3,4,5,6]},S={1:"h1",2:"h2",3:"h3",4:"h4",5:"h5",6:"h6"},T=class{id="heading";name="Heading";priority=30;config;locale;constructor(t){this.config={...x,...t}}async init(t){this.locale=await p(t,this.config.locale,b,v),t.registerStyleSheet("\n/* Heading Select — Width overrides for combobox button */\n.notectl-toolbar-btn--heading {\n\tmin-width: 100px;\n\tmax-width: 160px;\n}\n\n/* Heading Picker Popup */\n.notectl-heading-picker {\n\tmin-width: 200px;\n\tmax-height: 320px;\n\toverflow-y: auto;\n}\n\n.notectl-heading-picker__list {\n\tpadding: 4px 0;\n}\n\n.notectl-heading-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-heading-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-heading-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-heading-picker__label {\n\tflex: 1;\n}\n"),this.registerNodeSpecs(t),function(t,e){t.registerCommand("setTitle",()=>u(t,"title")),t.registerCommand("setSubtitle",()=>u(t,"subtitle"));for(const n of e.levels)t.registerCommand(`setHeading${n}`,()=>f(t,n));t.registerCommand("toggleHeading",()=>f(t,1)),t.registerCommand("setParagraph",()=>m(t,c("paragraph")))}(t,this.config),function(t,o){const l={Enter:()=>function(t){return function(t,e){const n=t.getState();if(!s(n.selection))return!1;const o=n.selection;if(!r(o))return!1;const i=n.getBlock(o.anchor.blockId);return!(!i||!k.has(i.type))&&e({state:n,block:i,blockId:o.anchor.blockId,offset:o.anchor.offset})}(t,o=>{if(""===i(o.block)){const e=o.state.transaction("input").setBlockType(o.blockId,c("paragraph")).setSelection(o.state.selection).build();return t.dispatch(e),!0}const r=n(o.block);if(o.offset>=r){const n=e(),i=o.state.transaction("input").splitBlock(o.blockId,o.offset,n).setBlockType(n,c("paragraph")).setSelection(a(n,0)).build();return t.dispatch(i),!0}return!1})}(t)};for(const e of o.levels)e<=6&&(l[`Mod-Shift-${e}`]=()=>t.executeCommand(`setHeading${e}`));t.registerKeymap(l)}(t,this.config),function(t,e){for(const n of e.levels){const e="#".repeat(n),o=new RegExp(`^${e} $`);t.registerInputRule({pattern:o,handler(t,e,o,i){const l=t.selection;if(!s(l))return null;if(!r(l))return null;const g=t.getBlock(l.anchor.blockId);return g&&"paragraph"===g.type?t.transaction("input").deleteTextAt(l.anchor.blockId,o,o+n+1).setBlockType(l.anchor.blockId,c("heading"),{level:n}).setSelection(a(l.anchor.blockId,0)).build():null}})}}(t,this.config),function(t,e,n){t.registerBlockTypePickerEntry({id:"paragraph",label:n.paragraph,command:"setParagraph",priority:10,isActive:t=>!!s(t.selection)&&"paragraph"===t.getBlock(t.selection.anchor.blockId)?.type}),t.registerBlockTypePickerEntry({id:"title",label:n.title,command:"setTitle",priority:20,style:{fontSize:"1.6em",fontWeight:"700"},isActive:t=>!!s(t.selection)&&"title"===t.getBlock(t.selection.anchor.blockId)?.type}),t.registerBlockTypePickerEntry({id:"subtitle",label:n.subtitle,command:"setSubtitle",priority:30,style:{fontSize:"1.3em",fontWeight:"500"},isActive:t=>!!s(t.selection)&&"subtitle"===t.getBlock(t.selection.anchor.blockId)?.type});for(const o of e.levels)t.registerBlockTypePickerEntry({id:`heading-${o}`,label:h(n,o),command:`setHeading${o}`,priority:100+o,style:{fontSize:1.4-.1*o+"em",fontWeight:"600"},isActive:t=>{if(!s(t.selection))return!1;const e=t.getBlock(t.selection.anchor.blockId);return"heading"===e?.type&&e.attrs?.level===o}})}(t,this.config,this.locale),function(t,e){t.registerToolbarItem({id:"heading",group:"block",label:e.blockTypeLabel,tooltip:e.blockTypeLabel,command:"setParagraph",popupType:"combobox",getLabel:n=>function(t,e,n){if(!s(t.selection))return n.paragraph;const o=e.getBlockTypePickerRegistry().getBlockTypePickerEntries();for(const i of o)if(i.isActive(t))return i.label;return n.paragraph}(n,t,e),renderPopup:(t,n,o)=>{!function(t,e,n,o){t.classList.add("notectl-heading-picker");const i=e.getState();if(!s(i.selection))return;const r=e.getContainer(),a=document.createElement("div");a.className="notectl-heading-picker__list",a.setAttribute("role","listbox"),a.setAttribute("aria-label",n.blockTypesAria);const c=e.getBlockTypePickerRegistry().getBlockTypePickerEntries();for(const s of c){const t=s.isActive(i);a.appendChild(d(s.label,t,t=>{t.preventDefault(),t.stopPropagation(),e.executeCommand(s.command),o({restoreFocusTo:r})},s.style))}t.appendChild(a)}(t,n,e,o)},isActive:e=>t.getBlockTypePickerRegistry().getBlockTypePickerEntries().some(t=>"paragraph"!==t.id&&t.isActive(e))})}(t,this.locale)}registerNodeSpecs(t){t.registerNodeSpec({type:"title",group:"block",content:{allow:["text"]},excludeMarks:["fontSize"],toDOM(t){const e=l("h1",t.id);return e.classList.add("notectl-title"),e},toHTML:(t,e)=>`<h1 class="notectl-title">${e||"<br>"}</h1>`,parseHTML:[{tag:"h1",priority:60,getAttrs:t=>!!t.classList.contains("notectl-title")&&{}}],sanitize:{tags:["h1"],attrs:["class"]}}),t.registerNodeSpec({type:"subtitle",group:"block",content:{allow:["text"]},excludeMarks:["fontSize"],toDOM(t){const e=l("h2",t.id);return e.classList.add("notectl-subtitle"),e},toHTML:(t,e)=>`<h2 class="notectl-subtitle">${e||"<br>"}</h2>`,parseHTML:[{tag:"h2",priority:60,getAttrs:t=>!!t.classList.contains("notectl-subtitle")&&{}}],sanitize:{tags:["h2"],attrs:["class"]}}),t.registerNodeSpec({type:"heading",group:"block",content:{allow:["text"]},excludeMarks:["fontSize"],attrs:{level:{default:1}},toDOM:t=>l(S[t.attrs?.level??1]??"h1",t.id),toHTML(t,e){const n=S[t.attrs?.level??1]??"h1";return`<${n}>${e||"<br>"}</${n}>`},parseHTML:[{tag:"h1",getAttrs:()=>({level:1})},{tag:"h2",getAttrs:()=>({level:2})},{tag:"h3",getAttrs:()=>({level:3})},{tag:"h4",getAttrs:()=>({level:4})},{tag:"h5",getAttrs:()=>({level:5})},{tag:"h6",getAttrs:()=>({level:6})}],sanitize:{tags:["h1","h2","h3","h4","h5","h6"]}})}};export{b as n,v as r,T as t};
|
|
2
|
-
//# sourceMappingURL=HeadingPlugin-BiDNuBmw.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HeadingPlugin-BiDNuBmw.mjs","names":[],"sources":["../../src/editor/styles/heading-select.ts","../../src/plugins/heading/HeadingBlockTypePicker.ts","../../src/plugins/heading/HeadingCommands.ts","../../src/plugins/heading/HeadingInputRules.ts","../../src/plugins/heading/HeadingKeyboardHandlers.ts","../../src/plugins/heading/HeadingLocale.ts","../../src/plugins/heading/HeadingPlugin.ts"],"sourcesContent":["/** Heading picker toolbar combobox + popup styles. */\nexport const HEADING_SELECT_CSS = `\n/* Heading Select — Width overrides for combobox button */\n.notectl-toolbar-btn--heading {\n\tmin-width: 100px;\n\tmax-width: 160px;\n}\n\n/* Heading Picker Popup */\n.notectl-heading-picker {\n\tmin-width: 200px;\n\tmax-height: 320px;\n\toverflow-y: auto;\n}\n\n.notectl-heading-picker__list {\n\tpadding: 4px 0;\n}\n\n.notectl-heading-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-heading-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-heading-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-heading-picker__label {\n\tflex: 1;\n}\n`;\n","/**\n * Block type picker entries and toolbar dropdown for heading block types.\n * Registers picker entries for paragraph, title, subtitle, and all heading levels,\n * plus a combobox-style toolbar item with a custom popup.\n */\n\nimport { isTextSelection } from '../../model/Selection.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { PopupCloseOptions } from '../shared/PopupManager.js';\nimport type { PickerEntryStyle } from './BlockTypePickerEntry.js';\nimport type { HeadingLocale } from './HeadingLocale.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\nimport type { HeadingLevel } from './HeadingPlugin.js';\n\n// --- Picker Entry Registration ---\n\n/** Registers block type picker entries for paragraph, title, subtitle, and heading levels. */\nexport function registerHeadingPickerEntries(\n\tcontext: PluginContext,\n\tconfig: HeadingConfig,\n\tlocale: HeadingLocale,\n): void {\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'paragraph',\n\t\tlabel: locale.paragraph,\n\t\tcommand: 'setParagraph',\n\t\tpriority: 10,\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'paragraph';\n\t\t},\n\t});\n\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'title',\n\t\tlabel: locale.title,\n\t\tcommand: 'setTitle',\n\t\tpriority: 20,\n\t\tstyle: { fontSize: '1.6em', fontWeight: '700' },\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'title';\n\t\t},\n\t});\n\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'subtitle',\n\t\tlabel: locale.subtitle,\n\t\tcommand: 'setSubtitle',\n\t\tpriority: 30,\n\t\tstyle: { fontSize: '1.3em', fontWeight: '500' },\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'subtitle';\n\t\t},\n\t});\n\n\tfor (const level of config.levels) {\n\t\tcontext.registerBlockTypePickerEntry({\n\t\t\tid: `heading-${level}`,\n\t\t\tlabel: getHeadingLabel(locale, level),\n\t\t\tcommand: `setHeading${level}`,\n\t\t\tpriority: 100 + level,\n\t\t\tstyle: { fontSize: `${1.4 - level * 0.1}em`, fontWeight: '600' },\n\t\t\tisActive: (state) => {\n\t\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\t\treturn block?.type === 'heading' && block.attrs?.level === level;\n\t\t\t},\n\t\t});\n\t}\n}\n\n// --- Toolbar Item ---\n\n/** Registers the heading toolbar dropdown with a combobox picker popup. */\nexport function registerHeadingToolbarItem(context: PluginContext, locale: HeadingLocale): void {\n\tcontext.registerToolbarItem({\n\t\tid: 'heading',\n\t\tgroup: 'block',\n\t\tlabel: locale.blockTypeLabel,\n\t\ttooltip: locale.blockTypeLabel,\n\t\tcommand: 'setParagraph',\n\t\tpopupType: 'combobox',\n\t\tgetLabel: (state: EditorState): string => getActiveLabel(state, context, locale),\n\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\trenderHeadingPopup(container, ctx, locale, onClose);\n\t\t},\n\t\tisActive: (state) => {\n\t\t\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\t\t\treturn entries.some((entry) => entry.id !== 'paragraph' && entry.isActive(state));\n\t\t},\n\t});\n}\n\n// --- Popup Rendering ---\n\nfunction renderHeadingPopup(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tlocale: HeadingLocale,\n\tonClose: (options?: PopupCloseOptions) => void,\n): void {\n\tcontainer.classList.add('notectl-heading-picker');\n\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return;\n\n\tconst contentElement: HTMLElement = context.getContainer();\n\n\tconst list: HTMLDivElement = document.createElement('div');\n\tlist.className = 'notectl-heading-picker__list';\n\tlist.setAttribute('role', 'listbox');\n\tlist.setAttribute('aria-label', locale.blockTypesAria);\n\n\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\tfor (const entry of entries) {\n\t\tconst active: boolean = entry.isActive(state);\n\t\tlist.appendChild(\n\t\t\tcreatePickerItem(\n\t\t\t\tentry.label,\n\t\t\t\tactive,\n\t\t\t\t(e: MouseEvent) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tcontext.executeCommand(entry.command);\n\t\t\t\t\tonClose({ restoreFocusTo: contentElement });\n\t\t\t\t},\n\t\t\t\tentry.style,\n\t\t\t),\n\t\t);\n\t}\n\n\tcontainer.appendChild(list);\n}\n\nfunction createPickerItem(\n\tlabel: string,\n\tisActive: boolean,\n\thandler: (e: MouseEvent) => void,\n\tstyle?: PickerEntryStyle,\n): HTMLButtonElement {\n\tconst item: HTMLButtonElement = document.createElement('button');\n\titem.type = 'button';\n\titem.className = 'notectl-heading-picker__item';\n\titem.setAttribute('role', 'option');\n\titem.setAttribute('aria-selected', String(isActive));\n\n\tif (isActive) {\n\t\titem.classList.add('notectl-heading-picker__item--active');\n\t}\n\n\tconst check: HTMLSpanElement = document.createElement('span');\n\tcheck.className = 'notectl-heading-picker__check';\n\tcheck.textContent = isActive ? '\\u2713' : '';\n\titem.appendChild(check);\n\n\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\tlabelSpan.className = 'notectl-heading-picker__label';\n\tlabelSpan.textContent = label;\n\tif (style) {\n\t\tsetStyleProperties(labelSpan, {\n\t\t\tfontSize: style.fontSize,\n\t\t\tfontWeight: style.fontWeight,\n\t\t});\n\t}\n\titem.appendChild(labelSpan);\n\n\titem.addEventListener('mousedown', handler);\n\treturn item;\n}\n\n// --- Helpers ---\n\nfunction getHeadingLabel(locale: HeadingLocale, level: HeadingLevel): string {\n\tconst key = `heading${level}` as keyof HeadingLocale;\n\treturn locale[key] as string;\n}\n\nfunction getActiveLabel(state: EditorState, context: PluginContext, locale: HeadingLocale): string {\n\tif (!isTextSelection(state.selection)) return locale.paragraph;\n\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\tfor (const entry of entries) {\n\t\tif (entry.isActive(state)) return entry.label;\n\t}\n\treturn locale.paragraph;\n}\n","/**\n * Command registration and implementations for heading block types.\n * Handles toggle between heading/title/subtitle and paragraph,\n * plus excluded-mark stripping when switching block types.\n */\n\nimport type { BlockNode, Mark } from '../../model/Document.js';\nimport { getBlockLength, getInlineChildren, isTextNode } from '../../model/Document.js';\nimport { isTextSelection } from '../../model/Selection.js';\nimport { type NodeTypeName, nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { TransactionBuilder } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig, HeadingLevel } from './HeadingPlugin.js';\n\n/** Registers all heading commands (setTitle, setSubtitle, setHeadingN, toggleHeading, setParagraph). */\nexport function registerHeadingCommands(context: PluginContext, config: HeadingConfig): void {\n\tcontext.registerCommand('setTitle', () => toggleSpecialBlock(context, 'title'));\n\n\tcontext.registerCommand('setSubtitle', () => toggleSpecialBlock(context, 'subtitle'));\n\n\tfor (const level of config.levels) {\n\t\tcontext.registerCommand(`setHeading${level}`, () => toggleHeading(context, level));\n\t}\n\n\tcontext.registerCommand('toggleHeading', () => toggleHeading(context, 1));\n\n\tcontext.registerCommand('setParagraph', () => setBlockType(context, nodeType('paragraph')));\n}\n\n// --- Command Implementations ---\n\n/**\n * Toggles between a special block type (title/subtitle) and paragraph.\n * If the block is already that type, resets to paragraph.\n */\nfunction toggleSpecialBlock(context: PluginContext, type: string): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(state.selection.anchor.blockId);\n\tif (!block) return false;\n\n\tif (block.type === type) {\n\t\treturn setBlockType(context, nodeType('paragraph'));\n\t}\n\n\treturn setBlockType(context, nodeType(type) as NodeTypeName);\n}\n\n/**\n * Toggles between heading (at given level) and paragraph.\n * If the block is already a heading at the same level, resets to paragraph.\n */\nfunction toggleHeading(context: PluginContext, level: HeadingLevel): boolean {\n\tconst state: EditorState = context.getState();\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block) return false;\n\n\tif (block.type === 'heading' && block.attrs?.level === level) {\n\t\treturn setBlockType(context, nodeType('paragraph'));\n\t}\n\n\treturn setBlockType(context, nodeType('heading'), { level });\n}\n\nfunction setBlockType(\n\tcontext: PluginContext,\n\ttype: NodeTypeName,\n\tattrs?: Record<string, string | number | boolean>,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block) return false;\n\n\tconst builder: TransactionBuilder = state.transaction('command');\n\n\tconst spec = context.getSchemaRegistry().getNodeSpec(type);\n\tif (spec?.excludeMarks && spec.excludeMarks.length > 0) {\n\t\tstripExcludedMarks(builder, block, spec.excludeMarks);\n\t\tclearExcludedStoredMarks(builder, state, spec.excludeMarks);\n\t}\n\n\tconst tr = builder.setBlockType(sel.anchor.blockId, type, attrs).setSelection(sel).build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n// --- Mark Stripping Helpers ---\n\n/**\n * Adds removeMark steps for each excluded mark type found\n * on the block's inline text content.\n */\nfunction stripExcludedMarks(\n\tbuilder: TransactionBuilder,\n\tblock: BlockNode,\n\texcludeMarks: readonly string[],\n): void {\n\tconst blockLength: number = getBlockLength(block);\n\tif (blockLength === 0) return;\n\n\tconst excludeSet: Set<string> = new Set(excludeMarks);\n\tconst inlineChildren = getInlineChildren(block);\n\tlet offset = 0;\n\n\tfor (const child of inlineChildren) {\n\t\tif (isTextNode(child)) {\n\t\t\tif (child.text.length > 0) {\n\t\t\t\tfor (const mark of child.marks) {\n\t\t\t\t\tif (excludeSet.has(mark.type)) {\n\t\t\t\t\t\tbuilder.removeMark(block.id, offset, offset + child.text.length, mark);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\toffset += child.text.length;\n\t\t} else {\n\t\t\toffset += 1;\n\t\t}\n\t}\n}\n\n/**\n * Clears excluded mark types from stored marks so that\n * subsequent typing does not reintroduce them.\n */\nfunction clearExcludedStoredMarks(\n\tbuilder: TransactionBuilder,\n\tstate: EditorState,\n\texcludeMarks: readonly string[],\n): void {\n\tif (!state.storedMarks) return;\n\n\tconst excludeSet: Set<string> = new Set(excludeMarks);\n\tconst filtered: readonly Mark[] = state.storedMarks.filter((m: Mark) => !excludeSet.has(m.type));\n\n\tif (filtered.length !== state.storedMarks.length) {\n\t\tbuilder.setStoredMarks(filtered.length > 0 ? filtered : null, state.storedMarks);\n\t}\n}\n","/**\n * Input rule registration for heading block types.\n * Converts `# `, `## `, etc. at the start of a paragraph into headings.\n */\n\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\n\n/** Registers markdown-style input rules (e.g. `# ` → H1) for configured heading levels. */\nexport function registerHeadingInputRules(context: PluginContext, config: HeadingConfig): void {\n\tfor (const level of config.levels) {\n\t\tconst hashes: string = '#'.repeat(level);\n\t\tconst pattern: RegExp = new RegExp(`^${hashes} $`);\n\n\t\tcontext.registerInputRule({\n\t\t\tpattern,\n\t\t\thandler(state, _match, start, _end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, start, start + level + 1)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('heading'), { level })\n\t\t\t\t\t.setSelection(createCollapsedSelection(sel.anchor.blockId, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n}\n","/**\n * Keyboard handlers for heading block types.\n * Handles Enter key behavior: empty heading → paragraph, cursor at end → split + paragraph.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { generateBlockId, getBlockLength, getBlockText } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\n\n// --- Context Guard ---\n\nconst HEADING_TYPES: ReadonlySet<string> = new Set(['heading', 'title', 'subtitle']);\n\ninterface HeadingContext {\n\treadonly state: EditorState;\n\treadonly block: BlockNode;\n\treadonly blockId: BlockId;\n\treadonly offset: number;\n}\n\n/**\n * Guards against NodeSelection, non-collapsed selections, and non-heading blocks.\n * Returns false (not handled) if the cursor is not inside a heading-type block.\n */\nfunction withHeadingContext(\n\tcontext: PluginContext,\n\thandler: (ctx: HeadingContext) => boolean,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tconst sel = state.selection;\n\tif (!isCollapsed(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block || !HEADING_TYPES.has(block.type)) return false;\n\n\treturn handler({\n\t\tstate,\n\t\tblock,\n\t\tblockId: sel.anchor.blockId,\n\t\toffset: sel.anchor.offset,\n\t});\n}\n\n/** Registers all heading keyboard handlers (Enter, Mod-Shift-N shortcuts). */\nexport function registerHeadingKeymaps(context: PluginContext, config: HeadingConfig): void {\n\tconst keymap: Record<string, () => boolean> = {\n\t\tEnter: () => handleEnter(context),\n\t};\n\n\tfor (const level of config.levels) {\n\t\tif (level <= 6) {\n\t\t\tkeymap[`Mod-Shift-${level}`] = () => context.executeCommand(`setHeading${level}`);\n\t\t}\n\t}\n\n\tcontext.registerKeymap(keymap);\n}\n\n// --- Enter Handler ---\n\n/**\n * Handles Enter inside a heading block.\n * Empty heading → convert to paragraph.\n * Cursor at end → split and convert new block to paragraph.\n * Cursor in middle → normal split (both stay heading).\n */\nfunction handleEnter(context: PluginContext): boolean {\n\treturn withHeadingContext(context, (ctx) => {\n\t\tconst text: string = getBlockText(ctx.block);\n\n\t\tif (text === '') {\n\t\t\tconst tr = ctx.state\n\t\t\t\t.transaction('input')\n\t\t\t\t.setBlockType(ctx.blockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(ctx.state.selection)\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst blockLength: number = getBlockLength(ctx.block);\n\n\t\tif (ctx.offset >= blockLength) {\n\t\t\tconst newBlockId = generateBlockId();\n\t\t\tconst tr = ctx.state\n\t\t\t\t.transaction('input')\n\t\t\t\t.splitBlock(ctx.blockId, ctx.offset, newBlockId)\n\t\t\t\t.setBlockType(newBlockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(createCollapsedSelection(newBlockId, 0))\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t});\n}\n","/**\n * Locale interface and default English locale for the HeadingPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface HeadingLocale {\n\treadonly paragraph: string;\n\treadonly title: string;\n\treadonly subtitle: string;\n\treadonly heading1: string;\n\treadonly heading2: string;\n\treadonly heading3: string;\n\treadonly heading4: string;\n\treadonly heading5: string;\n\treadonly heading6: string;\n\treadonly blockTypeLabel: string;\n\treadonly blockTypesAria: string;\n}\n\n// --- Default English Locale ---\n\nexport const HEADING_LOCALE_EN: HeadingLocale = {\n\tparagraph: 'Paragraph',\n\ttitle: 'Title',\n\tsubtitle: 'Subtitle',\n\theading1: 'Heading 1',\n\theading2: 'Heading 2',\n\theading3: 'Heading 3',\n\theading4: 'Heading 4',\n\theading5: 'Heading 5',\n\theading6: 'Heading 6',\n\tblockTypeLabel: 'Block Type',\n\tblockTypesAria: 'Block types',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: HeadingLocale }>> = import.meta.glob<{\n\tdefault: HeadingLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadHeadingLocale(lang: string): Promise<HeadingLocale> {\n\tif (lang === 'en') return HEADING_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return HEADING_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn HEADING_LOCALE_EN;\n\t}\n}\n","/**\n * HeadingPlugin: registers Title, Subtitle, and H1–H6 heading block types\n * with NodeSpec, toggle commands, keyboard shortcuts, input rules, and a\n * combobox-style toolbar dropdown that reflects the current block type.\n *\n * This file is a thin orchestrator — command logic, input rules, keyboard\n * handlers, and picker/toolbar rendering are delegated to dedicated modules.\n */\n\nimport { HEADING_SELECT_CSS } from '../../editor/styles/heading-select.js';\nimport type { BlockAlignment } from '../../model/BlockAlignment.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tregisterHeadingPickerEntries,\n\tregisterHeadingToolbarItem,\n} from './HeadingBlockTypePicker.js';\nimport { registerHeadingCommands } from './HeadingCommands.js';\nimport { registerHeadingInputRules } from './HeadingInputRules.js';\nimport { registerHeadingKeymaps } from './HeadingKeyboardHandlers.js';\nimport { HEADING_LOCALE_EN, type HeadingLocale, loadHeadingLocale } from './HeadingLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\theading: { level: HeadingLevel; align?: BlockAlignment };\n\t\ttitle: { align?: BlockAlignment };\n\t\tsubtitle: { align?: BlockAlignment };\n\t}\n}\n\n// --- Configuration ---\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface HeadingConfig {\n\t/** Which heading levels to enable. Defaults to [1, 2, 3, 4, 5, 6]. */\n\treadonly levels: readonly HeadingLevel[];\n\treadonly locale?: HeadingLocale;\n}\n\nconst DEFAULT_CONFIG: HeadingConfig = {\n\tlevels: [1, 2, 3, 4, 5, 6],\n};\n\n// --- Heading Tag Mapping ---\n\nconst HEADING_TAGS: Record<HeadingLevel, string> = {\n\t1: 'h1',\n\t2: 'h2',\n\t3: 'h3',\n\t4: 'h4',\n\t5: 'h5',\n\t6: 'h6',\n};\n\n// --- Plugin ---\n\nexport class HeadingPlugin implements Plugin {\n\treadonly id = 'heading';\n\treadonly name = 'Heading';\n\treadonly priority = 30;\n\n\tprivate readonly config: HeadingConfig;\n\tprivate locale!: HeadingLocale;\n\n\tconstructor(config?: Partial<HeadingConfig>) {\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\tHEADING_LOCALE_EN,\n\t\t\tloadHeadingLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(HEADING_SELECT_CSS);\n\n\t\tthis.registerNodeSpecs(context);\n\t\tregisterHeadingCommands(context, this.config);\n\t\tregisterHeadingKeymaps(context, this.config);\n\t\tregisterHeadingInputRules(context, this.config);\n\t\tregisterHeadingPickerEntries(context, this.config, this.locale);\n\t\tregisterHeadingToolbarItem(context, this.locale);\n\t}\n\n\tprivate registerNodeSpecs(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'title',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\ttoDOM(node) {\n\t\t\t\tconst el = createBlockElement('h1', node.id);\n\t\t\t\tel.classList.add('notectl-title');\n\t\t\t\treturn el;\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<h1 class=\"notectl-title\">${content || '<br>'}</h1>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'h1',\n\t\t\t\t\tpriority: 60,\n\t\t\t\t\tgetAttrs: (el) => (el.classList.contains('notectl-title') ? {} : false),\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['h1'], attrs: ['class'] },\n\t\t});\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'subtitle',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\ttoDOM(node) {\n\t\t\t\tconst el = createBlockElement('h2', node.id);\n\t\t\t\tel.classList.add('notectl-subtitle');\n\t\t\t\treturn el;\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<h2 class=\"notectl-subtitle\">${content || '<br>'}</h2>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'h2',\n\t\t\t\t\tpriority: 60,\n\t\t\t\t\tgetAttrs: (el) => (el.classList.contains('notectl-subtitle') ? {} : false),\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['h2'], attrs: ['class'] },\n\t\t});\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'heading',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\tattrs: {\n\t\t\t\tlevel: { default: 1 },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst level = node.attrs?.level ?? 1;\n\t\t\t\tconst tag = HEADING_TAGS[level] ?? 'h1';\n\t\t\t\treturn createBlockElement(tag, node.id);\n\t\t\t},\n\t\t\ttoHTML(node, content) {\n\t\t\t\tconst level = (node.attrs?.level ?? 1) as HeadingLevel;\n\t\t\t\tconst tag: string = HEADING_TAGS[level] ?? 'h1';\n\t\t\t\treturn `<${tag}>${content || '<br>'}</${tag}>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{ tag: 'h1', getAttrs: () => ({ level: 1 }) },\n\t\t\t\t{ tag: 'h2', getAttrs: () => ({ level: 2 }) },\n\t\t\t\t{ tag: 'h3', getAttrs: () => ({ level: 3 }) },\n\t\t\t\t{ tag: 'h4', getAttrs: () => ({ level: 4 }) },\n\t\t\t\t{ tag: 'h5', getAttrs: () => ({ level: 5 }) },\n\t\t\t\t{ tag: 'h6', getAttrs: () => ({ level: 6 }) },\n\t\t\t],\n\t\t\tsanitize: { tags: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] },\n\t\t});\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./HTMLUtils-BLwp5G4f.mjs";import{s as t}from"./StyleRuntime-Bwde5icB.mjs";import{i as r}from"./PluginHelpers-BZU5rE44.mjs";import{a as o,t as a}from"./ColorValidation-rOrJxBBt.mjs";import{t as s}from"./color-picker-iPmE48jm.mjs";import{a as i,i as l,t as f}from"./ColorPickerPopup-BZxMBDxy.mjs";var c={label:"Highlight",tooltip:"Highlight Color",resetLabel:"None",ariaLabelPrefix:"Highlight color"},g=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-Cg1wGAxo.mjs"),"./locales/de.ts":()=>import("./de-D3lxYgJa.mjs"),"./locales/es.ts":()=>import("./es-DjwvgN1j.mjs"),"./locales/fr.ts":()=>import("./fr-BFngqWSa.mjs"),"./locales/hi.ts":()=>import("./hi-DcA0CxZR.mjs"),"./locales/pt.ts":()=>import("./pt-ncNSxrVp.mjs"),"./locales/ru.ts":()=>import("./ru-BA5-gdMK.mjs"),"./locales/zh.ts":()=>import("./zh-BjY4TNQf.mjs")});async function h(e){if("en"===e)return c;const t=g[`./locales/${e}.ts`];if(!t)return c;try{return(await t()).default}catch{return c}}var n=["#fff176","#aed581","#4dd0e1","#64b5f6","#ce93d8","#f48fb1","#ffab91","#ff8a65","#e6ee9c","#80cbc4","#fff9c4","#dcedc8","#e0f7fa","#e3f2fd","#f3e5f5","#fce4ec","#fff3e0","#fbe9e7","#f9fbe7","#e0f2f1","#fff59d","#c5e1a5","#80deea","#90caf9","#e1bee7","#f8bbd0","#ffcc80","#ffab91","#e6ee9c","#a5d6a7","#ffee58","#9ccc65","#26c6da","#42a5f5","#ab47bc","#ec407a","#ffa726","#ff7043","#d4e157","#66bb6a","#ffffff","#fafafa","#f5f5f5","#eeeeee","#e0e0e0","#bdbdbd","#e8eaf6","#efebe9","#eceff1","#fafafa"],m=class{id="highlight";name="Highlight";priority=24;config;colors;locale;constructor(e){this.config={...e},this.colors=o(e?.colors,n,"HighlightPlugin")}async init(e){this.locale=await r(e,this.config.locale,c,h),e.registerStyleSheet(s),this.registerMarkSpec(e),this.registerCommands(e),this.registerToolbarItem(e)}registerMarkSpec(r){r.registerMarkSpec({type:"highlight",rank:4,attrs:{color:{default:""}},toDOM(e){const r=document.createElement("span");return t(r,"backgroundColor",e.attrs?.color??""),r},toHTMLString:(t,r,o)=>{const s=String(t.attrs?.color??"");if(!s||!a(s))return r;const i=`background-color: ${e(s)}`;return`<span${o?.styleAttr(i)??` style="${i}"`}>${r}</span>`},toHTMLStyle:t=>{const r=String(t.attrs?.color??"");return r&&a(r)?`background-color: ${e(r)}`:null},parseHTML:[{tag:"span",getAttrs:e=>{const t=e.style.backgroundColor;return!(!t||!a(t))&&{color:t}}}],sanitize:{tags:["span"]}})}registerCommands(e){e.registerCommand("removeHighlight",()=>i(e,e.getState(),"highlight"))}registerToolbarItem(e){const t=['<svg xmlns="http://www.w3.org/2000/svg"',' viewBox="0 0 24 24">','<path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/>','<rect x="3" y="17" width="18" height="6"',' rx="0.5" fill="#fff176"/>',"</svg>"].join("");e.registerToolbarItem({id:"highlight",group:"format",icon:t,label:this.locale.label,tooltip:this.locale.tooltip,command:"removeHighlight",popupType:"custom",renderPopup:(e,t,r)=>{f(e,t,{markType:"highlight",colors:this.colors,columns:10,resetLabel:this.locale.resetLabel,resetCommand:"removeHighlight",ariaLabelPrefix:this.locale.ariaLabelPrefix,onClose:r})},isActive:e=>l(e,"highlight")})}};export{c as n,h as r,m as t};
|
|
2
|
-
//# sourceMappingURL=HighlightPlugin-CwrtRVfS.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HighlightPlugin-CwrtRVfS.mjs","names":[],"sources":["../../src/plugins/highlight/HighlightLocale.ts","../../src/plugins/highlight/HighlightPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HighlightPlugin. */\n\n// --- Locale Interface ---\n\nexport interface HighlightLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly resetLabel: string;\n\treadonly ariaLabelPrefix: string;\n}\n\n// --- Default English Locale ---\n\nexport const HIGHLIGHT_LOCALE_EN: HighlightLocale = {\n\tlabel: 'Highlight',\n\ttooltip: 'Highlight Color',\n\tresetLabel: 'None',\n\tariaLabelPrefix: 'Highlight color',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: HighlightLocale }>> =\n\timport.meta.glob<{ default: HighlightLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadHighlightLocale(lang: string): Promise<HighlightLocale> {\n\tif (lang === 'en') return HIGHLIGHT_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return HIGHLIGHT_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn HIGHLIGHT_LOCALE_EN;\n\t}\n}\n","/**\n * HighlightPlugin: registers a highlight (background-color) mark with attrs,\n * toolbar button with a color picker popup, and removeHighlight command.\n */\n\nimport { COLOR_PICKER_CSS } from '../../editor/styles/color-picker.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isColorMarkActive, removeColorMark } from '../shared/ColorMarkOperations.js';\nimport { renderColorPickerPopup } from '../shared/ColorPickerPopup.js';\nimport { isValidCSSColor, resolveColors } from '../shared/ColorValidation.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tHIGHLIGHT_LOCALE_EN,\n\ttype HighlightLocale,\n\tloadHighlightLocale,\n} from './HighlightLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\thighlight: { color: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HighlightConfig {\n\t/**\n\t * Restricts the color picker to a specific set of hex colors.\n\t * Each value must be a valid hex color code (`#RGB` or `#RRGGBB`).\n\t * Duplicates are removed automatically (case-insensitive).\n\t * When omitted, the full default palette is shown.\n\t */\n\treadonly colors?: readonly string[];\n\treadonly locale?: HighlightLocale;\n}\n\n// --- Color Palette (Highlight-optimized: 10 columns x 5 rows) ---\n\nconst HIGHLIGHT_PALETTE: readonly string[] = [\n\t// Row 1 — Classic highlighter colors (bright, vivid)\n\t'#fff176',\n\t'#aed581',\n\t'#4dd0e1',\n\t'#64b5f6',\n\t'#ce93d8',\n\t'#f48fb1',\n\t'#ffab91',\n\t'#ff8a65',\n\t'#e6ee9c',\n\t'#80cbc4',\n\t// Row 2 — Light pastels\n\t'#fff9c4',\n\t'#dcedc8',\n\t'#e0f7fa',\n\t'#e3f2fd',\n\t'#f3e5f5',\n\t'#fce4ec',\n\t'#fff3e0',\n\t'#fbe9e7',\n\t'#f9fbe7',\n\t'#e0f2f1',\n\t// Row 3 — Medium pastels\n\t'#fff59d',\n\t'#c5e1a5',\n\t'#80deea',\n\t'#90caf9',\n\t'#e1bee7',\n\t'#f8bbd0',\n\t'#ffcc80',\n\t'#ffab91',\n\t'#e6ee9c',\n\t'#a5d6a7',\n\t// Row 4 — Bold pastels\n\t'#ffee58',\n\t'#9ccc65',\n\t'#26c6da',\n\t'#42a5f5',\n\t'#ab47bc',\n\t'#ec407a',\n\t'#ffa726',\n\t'#ff7043',\n\t'#d4e157',\n\t'#66bb6a',\n\t// Row 5 — Grays and neutral highlights\n\t'#ffffff',\n\t'#fafafa',\n\t'#f5f5f5',\n\t'#eeeeee',\n\t'#e0e0e0',\n\t'#bdbdbd',\n\t'#e8eaf6',\n\t'#efebe9',\n\t'#eceff1',\n\t'#fafafa',\n];\n\n// --- Plugin ---\n\nexport class HighlightPlugin implements Plugin {\n\treadonly id = 'highlight';\n\treadonly name = 'Highlight';\n\treadonly priority = 24;\n\n\tprivate readonly config: HighlightConfig;\n\tprivate readonly colors: readonly string[];\n\tprivate locale!: HighlightLocale;\n\n\tconstructor(config?: Partial<HighlightConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.colors = resolveColors(config?.colors, HIGHLIGHT_PALETTE, 'HighlightPlugin');\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\tHIGHLIGHT_LOCALE_EN,\n\t\t\tloadHighlightLocale,\n\t\t);\n\n\t\tcontext.registerStyleSheet(COLOR_PICKER_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'highlight',\n\t\t\trank: 4,\n\t\t\tattrs: {\n\t\t\t\tcolor: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tconst color = mark.attrs?.color ?? '';\n\t\t\t\tsetStyleProperty(span, 'backgroundColor', color);\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content, ctx?: HTMLExportContext) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return content;\n\t\t\t\tconst decl: string = `background-color: ${escapeHTML(color)}`;\n\t\t\t\tconst attr: string = ctx?.styleAttr(decl) ?? ` style=\"${decl}\"`;\n\t\t\t\treturn `<span${attr}>${content}</span>`;\n\t\t\t},\n\t\t\ttoHTMLStyle: (mark) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return null;\n\t\t\t\treturn `background-color: ${escapeHTML(color)}`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst color: string = el.style.backgroundColor;\n\t\t\t\t\t\tif (!color || !isValidCSSColor(color)) return false;\n\t\t\t\t\t\treturn { color };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeHighlight', () => {\n\t\t\treturn removeColorMark(context, context.getState(), 'highlight');\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst pathD =\n\t\t\t'M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2z' + 'm-1.38 9L12 5.67 14.38 12H9.62z';\n\t\tconst icon: string = [\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\"',\n\t\t\t' viewBox=\"0 0 24 24\">',\n\t\t\t`<path d=\"${pathD}\"/>`,\n\t\t\t'<rect x=\"3\" y=\"17\" width=\"18\" height=\"6\"',\n\t\t\t' rx=\"0.5\" fill=\"#fff176\"/>',\n\t\t\t'</svg>',\n\t\t].join('');\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'highlight',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeHighlight',\n\t\t\tpopupType: 'custom',\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderColorPickerPopup(container, ctx, {\n\t\t\t\t\tmarkType: 'highlight',\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tcolumns: 10,\n\t\t\t\t\tresetLabel: this.locale.resetLabel,\n\t\t\t\t\tresetCommand: 'removeHighlight',\n\t\t\t\t\tariaLabelPrefix: this.locale.ariaLabelPrefix,\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => isColorMarkActive(state, 'highlight'),\n\t\t});\n\t}\n}\n"],"mappings":"0TAaA,IAAa,EAAuC,CACnD,MAAO,YACP,QAAS,kBACT,WAAY,OACZ,gBAAiB,mBAKZ,iBACL,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAED,eAAsB,EAAoB,GACzC,GAAa,OAAT,EAAe,OAAO,EAC1B,MAAM,EAAS,EAAc,aAAa,QAC1C,IAAK,EAAQ,OAAO,EACpB,IAEC,aADkB,KACP,cAEX,OAAO,GCWT,IAAM,EAAuC,CAE5C,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAKY,EAAb,MACC,GAAc,YACd,KAAgB,YAChB,SAAoB,GAEpB,OACA,OACA,OAEA,WAAA,CAAY,GACX,KAAK,OAAS,IAAK,GACnB,KAAK,OAAS,EAAc,GAAQ,OAAQ,EAAmB,mBAGhE,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,EACA,KAAK,OAAO,OACZ,EACA,GAGD,EAAQ,mBAAmB,GAC3B,KAAK,iBAAiB,GACtB,KAAK,iBAAiB,GACtB,KAAK,oBAAoB,GAG1B,gBAAA,CAAyB,GACxB,EAAQ,iBAAiB,CACxB,KAAM,YACN,KAAM,EACN,MAAO,CACN,MAAO,CAAE,QAAS,KAEnB,KAAA,CAAM,GACL,MAAM,EAAO,SAAS,cAAc,QAGpC,OADA,EAAiB,EAAM,kBADT,EAAK,OAAO,OAAS,IAE5B,GAER,aAAA,CAAe,EAAM,EAAS,KAC7B,MAAM,EAAgB,OAAO,EAAK,OAAO,OAAS,IAClD,IAAK,IAAU,EAAgB,GAAQ,OAAO,EAC9C,MAAM,EAAe,qBAAqB,EAAW,KAErD,MAAO,QADc,GAAK,UAAU,IAAS,WAAW,QACjC,YAExB,YAAc,IACb,MAAM,EAAgB,OAAO,EAAK,OAAO,OAAS,IAClD,OAAK,GAAU,EAAgB,GACxB,qBAAqB,EAAW,KADO,MAG/C,UAAW,CACV,CACC,IAAK,OACL,SAAW,IACV,MAAM,EAAgB,EAAG,MAAM,gBAC/B,SAAK,IAAU,EAAgB,KACxB,CAAE,YAIZ,SAAU,CAAE,KAAM,CAAC,WAIrB,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,kBAAA,IAChB,EAAgB,EAAS,EAAQ,WAAY,cAItD,mBAAA,CAA4B,GAG3B,MAAM,EAAe,CACpB,0CACA,wBACA,gGACA,2CACA,6BACA,UACC,KAAK,IAEP,EAAQ,oBAAoB,CAC3B,GAAI,YACJ,MAAO,SACP,OACA,MAAO,KAAK,OAAO,MACnB,QAAS,KAAK,OAAO,QACrB,QAAS,kBACT,UAAW,SACX,YAAA,CAAc,EAAW,EAAK,KAC7B,EAAuB,EAAW,EAAK,CACtC,SAAU,YACV,OAAQ,KAAK,OACb,QAAS,GACT,WAAY,KAAK,OAAO,WACxB,aAAc,kBACd,gBAAiB,KAAK,OAAO,gBAC7B,aAGF,SAAW,GAAuB,EAAkB,EAAO"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as t}from"./Document-DnPKbcPE.mjs";import{o as r,t as e,u as o}from"./Selection-B14e7gd0.mjs";import{a as i}from"./TypeBrands-BQR8dEYU.mjs";import{n as s}from"./DomUtils-BkyCg-OO.mjs";import{i as l}from"./PluginHelpers-BZU5rE44.mjs";import{t as n}from"./ShortcutFormatting-c0IajwWG.mjs";var a={label:"Horizontal Rule",tooltip:t=>`Horizontal Rule (${t})`},c=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-fGsuiCw5.mjs"),"./locales/de.ts":()=>import("./de-D_9IOrAk.mjs"),"./locales/es.ts":()=>import("./es-CrZtAd3-.mjs"),"./locales/fr.ts":()=>import("./fr-D6XZTFJa.mjs"),"./locales/hi.ts":()=>import("./hi-Bg8jWcjX.mjs"),"./locales/pt.ts":()=>import("./pt-BVLuZULN.mjs"),"./locales/ru.ts":()=>import("./ru-ejPBB15H.mjs"),"./locales/zh.ts":()=>import("./zh-Z9seusJc.mjs")});async function m(t){if("en"===t)return a;const r=c[`./locales/${t}.ts`];if(!r)return a;try{return(await r()).default}catch{return a}}var u={};function p(t){const r=t.selection;return o(r)?t.doc.children.findIndex(t=>t.id===r.anchor.blockId):-1}var h=class{id="horizontal-rule";name="Horizontal Rule";priority=40;config;locale;constructor(t){this.config={...u,...t}}async init(t){this.locale=await l(t,this.config.locale,a,m),this.registerNodeSpec(t),this.registerCommands(t),this.registerKeymap(t),this.registerInputRule(t),this.registerToolbarItem(t)}registerNodeSpec(t){t.registerNodeSpec({type:"horizontal_rule",group:"block",isVoid:!0,toDOM:t=>s("hr",t.id),toHTML:()=>"<hr>",parseHTML:[{tag:"hr"}],sanitize:{tags:["hr"]}})}registerCommands(t){t.registerCommand("insertHorizontalRule",()=>this.insertHorizontalRule(t))}registerKeymap(t){t.registerKeymap({"Mod-Shift-H":()=>t.executeCommand("insertHorizontalRule")})}registerInputRule(s){s.registerInputRule({pattern:/^-{3,} $/,handler(s,l,n,a){const c=s.selection;if(!o(c))return null;if(!r(c))return null;const m=s.getBlock(c.anchor.blockId);if(!m||"paragraph"!==m.type)return null;const u=p(s);if(-1===u)return null;const h=t(i("paragraph"));return s.transaction("input").deleteTextAt(c.anchor.blockId,0,a).setBlockType(c.anchor.blockId,i("horizontal_rule")).insertNode([],u+1,h).setSelection(e(h.id,0)).build()}})}registerToolbarItem(t){t.registerToolbarItem({id:"horizontal-rule",group:"block",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11h16v2H4z"/></svg>',label:this.locale.label,tooltip:this.locale.tooltip(n("Mod-Shift-H")),command:"insertHorizontalRule",isActive:()=>!1})}insertHorizontalRule(r){const s=r.getState();if(!o(s.selection))return!1;const l=p(s);if(-1===l)return!1;const n=t(i("horizontal_rule")),a=t(i("paragraph")),c=s.transaction("command").insertNode([],l+1,n).insertNode([],l+2,a).setSelection(e(a.id,0)).build();return r.dispatch(c),!0}};export{a as n,m as r,h as t};
|
|
2
|
-
//# sourceMappingURL=HorizontalRulePlugin-CKIkbVwn.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HorizontalRulePlugin-CKIkbVwn.mjs","names":[],"sources":["../../src/plugins/horizontal-rule/HorizontalRuleLocale.ts","../../src/plugins/horizontal-rule/HorizontalRulePlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HorizontalRulePlugin. */\n\n// --- Locale Interface ---\n\nexport interface HorizontalRuleLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const HORIZONTAL_RULE_LOCALE_EN: HorizontalRuleLocale = {\n\tlabel: 'Horizontal Rule',\n\ttooltip: (shortcut: string) => `Horizontal Rule (${shortcut})`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: HorizontalRuleLocale }>> =\n\timport.meta.glob<{ default: HorizontalRuleLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadHorizontalRuleLocale(lang: string): Promise<HorizontalRuleLocale> {\n\tif (lang === 'en') return HORIZONTAL_RULE_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return HORIZONTAL_RULE_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn HORIZONTAL_RULE_LOCALE_EN;\n\t}\n}\n","/**\n * HorizontalRulePlugin: registers a horizontal rule (divider) void block type\n * with NodeSpec, insert command, input rule, keyboard shortcut, and toolbar button.\n */\n\nimport { createBlockNode } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport {\n\tHORIZONTAL_RULE_LOCALE_EN,\n\ttype HorizontalRuleLocale,\n\tloadHorizontalRuleLocale,\n} from './HorizontalRuleLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\thorizontal_rule: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HorizontalRuleConfig {\n\t/** Locale override for user-facing strings. */\n\treadonly locale?: HorizontalRuleLocale;\n}\n\nconst DEFAULT_CONFIG: HorizontalRuleConfig = {};\n\n// --- Helpers ---\n\n/** Finds the index of the cursor's block among top-level document children. */\nfunction findBlockIndexForCursor(state: EditorState): number {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return -1;\n\treturn state.doc.children.findIndex((b) => b.id === sel.anchor.blockId);\n}\n\n// --- Plugin ---\n\nexport class HorizontalRulePlugin implements Plugin {\n\treadonly id = 'horizontal-rule';\n\treadonly name = 'Horizontal Rule';\n\treadonly priority = 40;\n\n\tprivate readonly config: HorizontalRuleConfig;\n\tprivate locale!: HorizontalRuleLocale;\n\n\tconstructor(config?: Partial<HorizontalRuleConfig>) {\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\tHORIZONTAL_RULE_LOCALE_EN,\n\t\t\tloadHorizontalRuleLocale,\n\t\t);\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerInputRule(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'horizontal_rule',\n\t\t\tgroup: 'block',\n\t\t\tisVoid: true,\n\t\t\ttoDOM(node) {\n\t\t\t\treturn createBlockElement('hr', node.id);\n\t\t\t},\n\t\t\ttoHTML() {\n\t\t\t\treturn '<hr>';\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'hr' }],\n\t\t\tsanitize: { tags: ['hr'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('insertHorizontalRule', () => {\n\t\t\treturn this.insertHorizontalRule(context);\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift-H': () => context.executeCommand('insertHorizontalRule'),\n\t\t});\n\t}\n\n\tprivate registerInputRule(context: PluginContext): void {\n\t\tcontext.registerInputRule({\n\t\t\tpattern: /^-{3,} $/,\n\t\t\thandler(state, _match, _start, end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\tconst blockIndex: number = findBlockIndexForCursor(state);\n\t\t\t\tif (blockIndex === -1) return null;\n\n\t\t\t\tconst newParagraph = createBlockNode(nodeType('paragraph'));\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, 0, end)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('horizontal_rule'))\n\t\t\t\t\t.insertNode([], blockIndex + 1, newParagraph)\n\t\t\t\t\t.setSelection(createCollapsedSelection(newParagraph.id, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 11h16v2H4z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'horizontal-rule',\n\t\t\tgroup: 'block',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut('Mod-Shift-H')),\n\t\t\tcommand: 'insertHorizontalRule',\n\t\t\tisActive: () => false,\n\t\t});\n\t}\n\n\t/**\n\t * Inserts a horizontal rule after the current block,\n\t * followed by a new paragraph for continued editing.\n\t */\n\tprivate insertHorizontalRule(context: PluginContext): boolean {\n\t\tconst state: EditorState = context.getState();\n\t\tif (!isTextSelection(state.selection)) return false;\n\t\tconst blockIndex: number = findBlockIndexForCursor(state);\n\t\tif (blockIndex === -1) return false;\n\n\t\tconst hrBlock = createBlockNode(nodeType('horizontal_rule'));\n\t\tconst newParagraph = createBlockNode(nodeType('paragraph'));\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.insertNode([], blockIndex + 1, hrBlock)\n\t\t\t.insertNode([], blockIndex + 2, newParagraph)\n\t\t\t.setSelection(createCollapsedSelection(newParagraph.id, 0))\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n}\n"],"mappings":"wSAWA,IAAa,EAAkD,CAC9D,MAAO,kBACP,QAAU,GAAqB,oBAAoB,MAK9C,iBACL,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAED,eAAsB,EAAyB,GAC9C,GAAa,OAAT,EAAe,OAAO,EAC1B,MAAM,EAAS,EAAc,aAAa,QAC1C,IAAK,EAAQ,OAAO,EACpB,IAEC,aADkB,KACP,cAEX,OAAO,GCKT,IAAM,EAAuC,CAAA,EAK7C,SAAS,EAAwB,GAChC,MAAM,EAAM,EAAM,UAClB,OAAK,EAAgB,GACd,EAAM,IAAI,SAAS,UAAW,GAAM,EAAE,KAAO,EAAI,OAAO,UAD7B,EAMnC,IAAa,EAAb,MACC,GAAc,kBACd,KAAgB,kBAChB,SAAoB,GAEpB,OACA,OAEA,WAAA,CAAY,GACX,KAAK,OAAS,IAAK,KAAmB,GAGvC,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,EACA,KAAK,OAAO,OACZ,EACA,GAED,KAAK,iBAAiB,GACtB,KAAK,iBAAiB,GACtB,KAAK,eAAe,GACpB,KAAK,kBAAkB,GACvB,KAAK,oBAAoB,GAG1B,gBAAA,CAAyB,GACxB,EAAQ,iBAAiB,CACxB,KAAM,kBACN,MAAO,QACP,QAAQ,EACR,MAAM,GACE,EAAmB,KAAM,EAAK,IAEtC,OAAA,IACQ,OAER,UAAW,CAAC,CAAE,IAAK,OACnB,SAAU,CAAE,KAAM,CAAC,SAIrB,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,uBAAA,IAChB,KAAK,qBAAqB,IAInC,cAAA,CAAuB,GACtB,EAAQ,eAAe,CACtB,cAAA,IAAqB,EAAQ,eAAe,0BAI9C,iBAAA,CAA0B,GACzB,EAAQ,kBAAkB,CACzB,QAAS,WACT,OAAA,CAAQ,EAAO,EAAQ,EAAQ,GAC9B,MAAM,EAAM,EAAM,UAClB,IAAK,EAAgB,GAAM,OAAO,KAClC,IAAK,EAAY,GAAM,OAAO,KAE9B,MAAM,EAAQ,EAAM,SAAS,EAAI,OAAO,SACxC,IAAK,GAAwB,cAAf,EAAM,KAAsB,OAAO,KAEjD,MAAM,EAAqB,EAAwB,GACnD,IAAmB,IAAf,EAAmB,OAAO,KAE9B,MAAM,EAAe,EAAgB,EAAS,cAE9C,OAAO,EACL,YAAY,SACZ,aAAa,EAAI,OAAO,QAAS,EAAG,GACpC,aAAa,EAAI,OAAO,QAAS,EAAS,oBAC1C,WAAW,GAAI,EAAa,EAAG,GAC/B,aAAa,EAAyB,EAAa,GAAI,IACvD,WAKL,mBAAA,CAA4B,GAI3B,EAAQ,oBAAoB,CAC3B,GAAI,kBACJ,MAAO,QACP,KALA,8FAMA,MAAO,KAAK,OAAO,MACnB,QAAS,KAAK,OAAO,QAAQ,EAAe,gBAC5C,QAAS,uBACT,SAAA,KAAgB,IAQlB,oBAAA,CAA6B,GAC5B,MAAM,EAAqB,EAAQ,WACnC,IAAK,EAAgB,EAAM,WAAY,OAAO,EAC9C,MAAM,EAAqB,EAAwB,GACnD,IAAmB,IAAf,EAAmB,OAAO,EAE9B,MAAM,EAAU,EAAgB,EAAS,oBACnC,EAAe,EAAgB,EAAS,cAExC,EAAK,EACT,YAAY,WACZ,WAAW,GAAI,EAAa,EAAG,GAC/B,WAAW,GAAI,EAAa,EAAG,GAC/B,aAAa,EAAyB,EAAa,GAAI,IACvD,QAGF,OADA,EAAQ,SAAS,IACV"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{l as t,r as e,y as n}from"./Document-DnPKbcPE.mjs";import{c as i,l as r,r as o}from"./Selection-B14e7gd0.mjs";import{a}from"./TypeBrands-BQR8dEYU.mjs";import{n as s}from"./DomUtils-BkyCg-OO.mjs";import{r as l}from"./HTMLUtils-BLwp5G4f.mjs";import{t as c}from"./NodeSelectionCommands-U8xEdaE4.mjs";import{t as d}from"./Platform-wPvKFB9m.mjs";import{c as g,o as m,r as u,s as p}from"./StyleRuntime-Bwde5icB.mjs";import{n as h}from"./Plugin-C4cBw3bs.mjs";import{i as f}from"./PluginHelpers-BZU5rE44.mjs";import{t as b}from"./ShortcutFormatting-c0IajwWG.mjs";function v(s,l){const c=s.getState(),d=c.selection,g={src:l.src,alt:l.alt??"",align:l.align??"center",...void 0!==l.width?{width:l.width}:{},...void 0!==l.height?{height:l.height}:{}};if(i(d))return!1;const m=r(d)?d.nodeId:d.anchor.blockId,u=function(t,e){if("table_cell"===t.getBlock(e)?.type)return e;const n=t.getNodePath(e);if(n)for(const i of n)if("table_cell"===t.getBlock(i)?.type)return i}(c,m);return u?function(i,r,s,l){const c=i.getNodePath(s);if(!c)return!1;const d=e(a("image"),[],void 0,l),g=i.getBlock(s);if(!g)return!1;const m=i.transaction("command"),u=t(g);for(let t=u.length-1;t>=0;t--){const e=g.children.findIndex(e=>n(e)&&e.id===u[t]?.id);-1!==e&&m.removeNode(c,e)}return m.insertNode(c,0,d),m.setSelection(o(d.id,[...c,d.id])),r.dispatch(m.build()),!0}(c,s,u,g):function(t,n,i,r){const s=t.doc.children.findIndex(t=>t.id===i);if(-1===s)return!1;const l=e(a("image"),[],void 0,r),c=e(a("paragraph")),d=t.transaction("command").insertNode([],s+1,l).insertNode([],s+2,c).setSelection(o(l.id,[])).build();return n.dispatch(d),!0}(c,s,m,g)}function x(t,e,n){const i=t.getState(),o=i.selection;if(!r(o))return!1;const a=i.getBlock(o.nodeId);if(!a||"image"!==a.type)return!1;const s=a.attrs?.width,l=a.attrs?.height;if(void 0===s||void 0===l)return!1;const c=l>0?s/l:1,d=Math.max(50,Math.min(n,s+e)),g=Math.round(d/c);return(d!==s||g!==l)&&function(t,e){const n=t.getState(),i=n.selection;if(!r(i))return!1;const o=n.getBlock(i.nodeId);if(!o||"image"!==o.type)return!1;const a=n.getNodePath(i.nodeId);if(!a)return!1;const s={...o.attrs??{},...e},l=n.transaction("command").setNodeAttr(a,s).build();return t.dispatch(l),!0}(t,{width:d,height:g})}var w={insertImage:"Insert Image",insertImageTooltip:"Insert Image",uploadFromComputer:"Upload from computer",uploadAria:"Upload image from computer",separator:"or",urlPlaceholder:"https://...",urlAria:"Image URL",insertButton:"Insert",insertAria:"Insert image",imageAria:(t,e,n)=>{const i=[t||"Image"];return void 0!==e&&void 0!==n&&i.push(`${e} by ${n} pixels`),i.join(", ")},resetToNaturalSize:"Image reset to natural size.",uploadFailed:"Upload failed.",uploading:"Uploading...",resizeHandleLabel:t=>`Resize ${t}`,imageSelected:"Image selected.",altTextPrefix:"Alt text: ",imageSizeAnnounce:(t,e)=>`Size: ${t} by ${e} pixels.`,resizeHint:(t,e)=>`${t} / ${e} to resize.`,imageResized:(t,e)=>`Image resized to ${t} by ${e} pixels.`,keyboardResizeHint:(t,e)=>`${t} / ${e} to resize`},z=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-BaLVMaVO.mjs"),"./locales/de.ts":()=>import("./de-QDbUiCAO.mjs"),"./locales/es.ts":()=>import("./es-B2QB6DHA.mjs"),"./locales/fr.ts":()=>import("./fr-DQBLPLlz.mjs"),"./locales/hi.ts":()=>import("./hi-8AQg9KKV.mjs"),"./locales/pt.ts":()=>import("./pt-BGQj9xok.mjs"),"./locales/ru.ts":()=>import("./ru-OKZRZ5c-.mjs"),"./locales/zh.ts":()=>import("./zh-DcY4Ouin.mjs")});async function y(t){if("en"===t)return w;const e=z[`./locales/${t}.ts`];if(!e)return w;try{return(await e()).default}catch{return w}}var _={start:"notectl-image--start",center:"notectl-image--center",end:"notectl-image--end"},S={nw:"nwse-resize",ne:"nesw-resize",sw:"nesw-resize",se:"nwse-resize"},I={nw:-1,ne:1,sw:-1,se:1},k={nw:"top-left",ne:"top-right",sw:"bottom-left",se:"bottom-right"},L={nw:"top-right",ne:"top-left",sw:"bottom-right",se:"bottom-left"},A={nw:"nesw-resize",ne:"nwse-resize",sw:"nwse-resize",se:"nesw-resize"};function C(t,e,n=w){const i=(e?L:k)[t];return n.resizeHandleLabel(i)}var N=null;function j(){N&&(N.remove(),N=null)}function E(t,e,n,i=w){return(r,o,a)=>{const s=document.createElement("figure");s.className="notectl-image",s.setAttribute("data-block-id",r.id),s.setAttribute("data-void","true"),s.setAttribute("data-selectable","true");const l=document.createElement("div");l.className="notectl-image__container";const c=document.createElement("img");c.className="notectl-image__img",c.draggable=!1;const g=document.createElement("div");g.className="notectl-image__overlay",l.appendChild(c),l.appendChild(g),s.appendChild(l);let h=r.id,f=null;function v(t){const n=t.attrs?.src??"",r=t.attrs?.alt??"",o=t.attrs?.width,a=t.attrs?.height,l=t.attrs?.align??"center";c.src!==n&&(c.src=n),c.alt=r,p(c,"width",void 0!==o?`${o}px`:""),p(c,"height",void 0!==a?`${a}px`:"");for(const e of Object.values(_))s.classList.remove(e);const d=_[l];d&&s.classList.add(d);const m=e.get(t.id)??"idle",u="uploading"===m;g.classList.toggle("notectl-image__overlay--uploading",u),g.classList.toggle("notectl-image__overlay--error","error"===m),g.textContent=u?i.uploading:"error"===m?i.uploadFailed:"",u?s.setAttribute("aria-busy","true"):s.removeAttribute("aria-busy"),function(t){const e=t.attrs?.alt??"",n=t.attrs?.width,r=t.attrs?.height;s.setAttribute("aria-label",i.imageAria(e,n,r))}(t)}v(r);let x=!1;function w(e,n,i,r){let l=0,g=0,p=1,h=I[n];const f=e=>{const n=e.clientX-l,i=(o=g+n*h,Math.max(50,Math.min(t.maxWidth,o)));var o;const a=Math.round(i/p);m(c,{width:`${i}px`,height:`${a}px`}),r.textContent=`${Math.round(i)} × ${a}`},b=t=>{document.removeEventListener("pointermove",f),document.removeEventListener("pointerup",b),s.classList.remove("notectl-image--resizing"),r.classList.remove("notectl-image__size-indicator--visible"),j();const e=Math.round(c.getBoundingClientRect().width);!function(t,e,n){const i=o(),r=i.getBlock(t);if(!r)return;const s=r.attrs?.width,l=r.attrs?.height;if(s===e&&l===n)return;const c=i.getNodePath(t);if(!c)return;const d={...r.attrs??{},width:e,height:n};a(i.transaction("command").setNodeAttr(c,d).build())}(i,e,Math.round(e/p)),t.target?.releasePointerCapture?.(t.pointerId)};e.addEventListener("pointerdown",t=>{t.preventDefault(),t.stopPropagation();const e="rtl"===d(s);h=function(t,e){const n=I[t];return e?-n:n}(n,e),l=t.clientX,g=c.getBoundingClientRect().width;const i=c.getBoundingClientRect().height;p=i>0?g/i:1,s.classList.add("notectl-image--resizing"),r.textContent=`${Math.round(g)} × ${Math.round(i)}`,r.classList.add("notectl-image__size-indicator--visible"),function(t,e){j(),N=document.createElement("style");const n=e?u(e):void 0;n&&N.setAttribute("nonce",n),N.textContent=`*{cursor:${t}!important;user-select:none!important}`,document.head.appendChild(N)}(e?A[n]:S[n],s),t.target.setPointerCapture(t.pointerId),document.addEventListener("pointermove",f),document.addEventListener("pointerup",b)})}function z(){j(),f&&(f.remove(),f=null)}return c.addEventListener("load",()=>{if(x)return;const e=o(),n=e.getBlock(h);if(!n||"image"!==n.type)return;const i=void 0!==n.attrs?.width,r=void 0!==n.attrs?.height;if(i&&r)return void(x=!0);const s=c.naturalWidth,l=c.naturalHeight;if(0===s||0===l)return;const d=Math.min(s,t.maxWidth),g=s>0?l/s:1,m=Math.round(d*g),u=e.getNodePath(h);if(!u)return;const p={...n.attrs??{},width:d,height:m};a(e.transaction("command").setNodeAttr(u,p).build()),x=!0}),{dom:s,contentDOM:null,update:t=>"image"===t.type&&(h=t.id,s.setAttribute("data-block-id",t.id),v(t),!0),selectNode(){s.classList.add("notectl-image--selected"),function(e){if(!t.resizable||f)return;f=document.createElement("div"),f.className="notectl-image__resize-overlay",f.setAttribute("data-notectl-no-print","");const r=document.createElement("div");r.className="notectl-image__size-indicator",f.appendChild(r);const o="rtl"===d(s);for(const t of["nw","ne","sw","se"]){const n=document.createElement("div");n.className=`notectl-image__resize-handle notectl-image__resize-handle--${t}`,n.setAttribute("role","separator"),n.setAttribute("aria-label",C(t,o,i)),w(n,t,e,r),f.appendChild(n)}if(n){const t=function(t,e){const n=t.shrinkWidth??null,i=t.growWidth??null;return n&&i?e.keyboardResizeHint(b(n),b(i)):""}(n,i);if(t){const e=document.createElement("div");e.className="notectl-image__keyboard-hint",e.setAttribute("aria-hidden","true"),e.textContent=t,f.appendChild(e)}}l.appendChild(f)}(h)},deselectNode(){s.classList.remove("notectl-image--selected"),z()},destroy(){z()}}}}var $=new h("image:upload"),R={growWidth:"Mod-Shift-ArrowRight",shrinkWidth:"Mod-Shift-ArrowLeft",growWidthLarge:"Mod-Shift-Alt-ArrowRight",shrinkWidthLarge:"Mod-Shift-Alt-ArrowLeft",resetSize:"Mod-Shift-0"},M={maxWidth:800,maxFileSize:10485760,acceptedTypes:["image/png","image/jpeg","image/gif","image/webp","image/svg+xml"],resizable:!0,resizeStep:10,resizeStepLarge:50},T=class{id="image";name="Image";priority=45;config;resolvedKeymap;uploadStates=/* @__PURE__ */new Map;blobUrls=/* @__PURE__ */new Set;context=null;locale;constructor(t){this.config={...M,...t},this.resolvedKeymap={...R,...t?.keymap}}async init(t){this.locale=await f(t,this.config.locale,w,y),t.registerStyleSheet('\n/* Image */\n.notectl-image {\n\tmargin: 8px 0;\n\tuser-select: none;\n\tline-height: 0;\n}\n\n.notectl-image--center {\n\ttext-align: center;\n}\n\n.notectl-image--start {\n\ttext-align: start;\n}\n\n.notectl-image--end {\n\ttext-align: end;\n}\n\n.notectl-image__container {\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: 0;\n}\n\n.notectl-image__img {\n\tdisplay: block;\n\tmax-width: 100%;\n\tborder-radius: 4px;\n}\n\n.notectl-image--selected .notectl-image__container {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n\tborder-radius: 6px;\n}\n\n/* Alignment toolbar (appears on image selection) */\n.notectl-image__align-toolbar {\n\tdisplay: flex;\n\tgap: 2px;\n\tposition: absolute;\n\ttop: -36px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tpadding: 2px;\n\tbox-shadow: 0 2px 8px var(--notectl-shadow);\n\tz-index: 10;\n}\n\n.notectl-image__align-btn {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\theight: 28px;\n\tborder: none;\n\tbackground: transparent;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n}\n\n.notectl-image__align-btn:hover {\n\tbackground: var(--notectl-hover-bg);\n}\n\n.notectl-image__align-btn--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-image__align-btn svg {\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n/* Upload overlay */\n.notectl-image__overlay {\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: none;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: rgba(255, 255, 255, 0.8);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg-muted);\n}\n\n.notectl-image__overlay--uploading {\n\tdisplay: flex;\n}\n\n.notectl-image__overlay--error {\n\tdisplay: flex;\n\tbackground: var(--notectl-danger-muted);\n\tcolor: var(--notectl-danger);\n}\n\n/* Resize overlay + handles */\n.notectl-image__resize-overlay {\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n}\n\n.notectl-image__resize-handle {\n\tposition: absolute;\n\twidth: 10px;\n\theight: 10px;\n\tbackground: var(--notectl-surface-raised);\n\tborder: 2px solid var(--notectl-primary);\n\tborder-radius: 50%;\n\tpointer-events: all;\n\tz-index: 2;\n\ttransition: transform 0.1s, background 0.1s;\n}\n\n.notectl-image__resize-handle:hover {\n\tbackground: var(--notectl-primary);\n\ttransform: scale(1.3);\n}\n\n.notectl-image--resizing .notectl-image__resize-handle {\n\tbackground: var(--notectl-primary);\n}\n\n.notectl-image__resize-handle--nw {\n\ttop: -5px;\n\tinset-inline-start: -5px;\n\tcursor: nwse-resize;\n}\n\n.notectl-image__resize-handle--ne {\n\ttop: -5px;\n\tinset-inline-end: -5px;\n\tcursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--sw {\n\tbottom: -5px;\n\tinset-inline-start: -5px;\n\tcursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--se {\n\tbottom: -5px;\n\tinset-inline-end: -5px;\n\tcursor: nwse-resize;\n}\n\n/* RTL cursor overrides — flip diagonal cursors when in RTL context */\n[dir="rtl"] .notectl-image__resize-handle--nw {\n\tcursor: nesw-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--ne {\n\tcursor: nwse-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--sw {\n\tcursor: nwse-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--se {\n\tcursor: nesw-resize;\n}\n\n/* Size indicator tooltip */\n.notectl-image__size-indicator {\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\tborder-radius: 4px;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\topacity: 0;\n\ttransition: opacity 0.15s;\n\tz-index: 3;\n}\n\n.notectl-image__size-indicator--visible {\n\topacity: 1;\n}\n\n/* Keyboard resize hint (shown on selection, hidden during drag) */\n.notectl-image__keyboard-hint {\n\tdisplay: none;\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 3;\n}\n\n.notectl-image--selected .notectl-image__keyboard-hint {\n\tdisplay: block;\n}\n\n.notectl-image--resizing .notectl-image__keyboard-hint {\n\tdisplay: none;\n}\n\n/* Resizing feedback */\n.notectl-image--resizing .notectl-image__img {\n\topacity: 0.85;\n}\n'),this.context=t,this.registerNodeSpec(t),this.registerNodeView(t),function(t){t.registerCommand("insertImage",()=>v(t,{src:""})),t.registerCommand("removeImage",()=>function(t){const e=t.getState(),n=e.selection;if(!r(n))return!1;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return!1;const a=e.getNodePath(n.nodeId);if(!a||0===a.length)return!1;const s=c(e,o(n.nodeId,a));return!!s&&(t.dispatch(s),!0)}(t))}(t),this.registerResizeCommands(t),this.registerResizeKeymaps(t),this.registerFileHandler(t),this.registerToolbarItem(t)}destroy(){for(const t of this.blobUrls)URL.revokeObjectURL(t);this.blobUrls.clear(),this.uploadStates.clear(),this.context=null}onStateChange(t,e,n){if(!this.context)return;for(const o of this.uploadStates.keys())e.getBlock(o)||this.uploadStates.delete(o);const i=this.isImageSelected(t),r=this.isImageSelected(e);!i&&r&&this.announceImageSelection(e)}registerNodeSpec(t){const e=this.locale;t.registerNodeSpec({type:"image",group:"block",isVoid:!0,selectable:!0,attrs:{src:{default:""},alt:{default:""},align:{default:"center"}},toDOM(t){const n=s("figure",t.id);n.className="notectl-image",n.setAttribute("data-void","true"),n.setAttribute("data-selectable","true");const i=document.createElement("div");i.className="notectl-image__container";const r=t.attrs?.alt??"",o=t.attrs?.width,a=t.attrs?.height,l=document.createElement("img");l.className="notectl-image__img",l.src=t.attrs?.src??"",l.alt=r,l.draggable=!1,void 0!==o&&p(l,"width",`${o}px`),void 0!==a&&p(l,"height",`${a}px`);const c={start:"notectl-image--start",center:"notectl-image--center",end:"notectl-image--end"}[t.attrs?.align??"center"];return c&&n.classList.add(c),n.setAttribute("aria-label",e.imageAria(r,o,a)),i.appendChild(l),n.appendChild(i),n},toHTML(t){const e=l(t.attrs?.src??""),n=l(t.attrs?.alt??""),i=t.attrs?.width,r=t.attrs?.height;return`<figure><img src="${e}" alt="${n}"${(void 0!==i?` width="${i}"`:"")+(void 0!==r?` height="${r}"`:"")}></figure>`},parseHTML:[{tag:"figure",getAttrs(t){const e=t.querySelector("img");if(!e)return!1;const n={src:e.getAttribute("src")??"",alt:e.getAttribute("alt")??"",align:"center"},i=e.getAttribute("width"),r=e.getAttribute("height");i&&(n.width=Number.parseInt(i,10)),r&&(n.height=Number.parseInt(r,10));const o=t.style?.textAlign??"";return"start"===o||"end"===o||"center"===o?n.align=o:"left"===o?n.align="start":"right"===o?n.align="end":t.classList.contains("notectl-align-start")||t.classList.contains("notectl-align-left")||t.classList.contains("notectl-image--start")||t.classList.contains("notectl-image--left")?n.align="start":t.classList.contains("notectl-align-end")||t.classList.contains("notectl-align-right")||t.classList.contains("notectl-image--end")||t.classList.contains("notectl-image--right")?n.align="end":t.classList.contains("notectl-align-center")&&(n.align="center"),n}},{tag:"img",getAttrs(t){const e={src:t.getAttribute("src")??"",alt:t.getAttribute("alt")??"",align:"center"},n=t.getAttribute("width"),i=t.getAttribute("height");return n&&(e.width=Number.parseInt(n,10)),i&&(e.height=Number.parseInt(i,10)),e}}],sanitize:{tags:["figure","img"],attrs:["src","alt","width","height","class","style"]}})}registerNodeView(t){t.registerNodeView("image",E(this.config,this.uploadStates,this.resolvedKeymap,this.locale))}registerResizeCommands(t){const e=this.config.resizeStep??10,n=this.config.resizeStepLarge??50,i=this.config.maxWidth;t.registerCommand("resizeImageGrow",()=>{const n=x(t,e,i);return n&&this.announceCurrentSize(t),n}),t.registerCommand("resizeImageShrink",()=>{const n=x(t,-e,i);return n&&this.announceCurrentSize(t),n}),t.registerCommand("resizeImageGrowLarge",()=>{const e=x(t,n,i);return e&&this.announceCurrentSize(t),e}),t.registerCommand("resizeImageShrinkLarge",()=>{const e=x(t,-n,i);return e&&this.announceCurrentSize(t),e}),t.registerCommand("resetImageSize",()=>{const e=function(t){const e=t.getState(),n=e.selection;if(!r(n))return!1;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return!1;const o=e.getNodePath(n.nodeId);if(!o)return!1;const a={...i.attrs??{}},s=Object.fromEntries(Object.entries(a).filter(([t])=>"width"!==t&&"height"!==t)),l=e.transaction("command").setNodeAttr(o,s).build();return t.dispatch(l),!0}(t);return e&&t.announce(this.locale.resetToNaturalSize),e})}registerResizeKeymaps(t){const e={};for(const[n,i]of Object.entries({growWidth:"resizeImageGrow",shrinkWidth:"resizeImageShrink",growWidthLarge:"resizeImageGrowLarge",shrinkWidthLarge:"resizeImageShrinkLarge",resetSize:"resetImageSize"})){const r=this.resolvedKeymap[n]??null;r&&(e[r]=()=>t.executeCommand(i))}Object.keys(e).length>0&&t.registerKeymap(e)}registerFileHandler(t){t.registerFileHandler("image/*",async(e,n)=>!!this.isAcceptedType(e.type)&&(this.handleFileInsert(t,e),!0))}handleFileInsert(t,e){if(e.size>this.config.maxFileSize)return;const n=URL.createObjectURL(e);if(this.blobUrls.add(n),!v(t,{src:n}))return URL.revokeObjectURL(n),void this.blobUrls.delete(n);const i=t.getState().selection;if(!r(i))return;const o=i.nodeId;this.uploadStates.set(o,"uploading"),t.getService($)?this.uploadFile(t,e,o,n):this.uploadStates.set(o,"complete")}async uploadFile(t,e,n,i){const r=t.getService($);if(r)try{const o=await r.upload(e);this.uploadStates.set(n,"complete");const a=t.getState(),s=a.getBlock(n);if(!s)return;const l=a.getNodePath(n);if(!l)return;const c={...s.attrs??{},src:o.url,...void 0!==o.width?{width:o.width}:{},...void 0!==o.height?{height:o.height}:{}},d=a.transaction("command").setNodeAttr(l,c).build();t.dispatch(d),URL.revokeObjectURL(i),this.blobUrls.delete(i)}catch{this.uploadStates.set(n,"error"),t.announce(this.locale.uploadFailed)}}registerToolbarItem(t){t.registerToolbarItem({id:"image",group:"insert",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg>',label:this.locale.insertImage,tooltip:this.locale.insertImageTooltip,command:"insertImage",popupType:"custom",renderPopup:(t,e,n)=>{!function(t,e,n){p(t,"padding","8px"),p(t,"minWidth","240px"),function(t,e,n){const i=document.createElement("input");i.type="file",i.accept=n.acceptedTypes.join(","),g(i,"position:absolute;width:0;height:0;overflow:hidden;opacity:0;");const r=document.createElement("button");r.type="button",r.textContent=n.locale.uploadFromComputer,r.setAttribute("aria-label",n.locale.uploadAria),g(r,"display:block;width:100%;padding:8px 12px;cursor:pointer;text-align:center;box-sizing:border-box;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-raised);color:var(--notectl-fg);"),r.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),i.click()}),i.addEventListener("change",()=>{const t=i.files?.[0];t&&(n.onFileInsert(e,t),n.onClose(),e.getContainer().focus())}),t.appendChild(i),t.appendChild(r)}(t,e,n),function(t,e){const n=document.createElement("div");g(n,"display:flex;align-items:center;margin:8px 0;color:var(--notectl-fg-muted);font-size:12px;");const i=document.createElement("span");g(i,"flex:1;height:1px;background:var(--notectl-border);");const r=document.createElement("span");r.textContent=e.separator,g(r,"padding:0 8px;");const o=document.createElement("span");g(o,"flex:1;height:1px;background:var(--notectl-border);"),n.appendChild(i),n.appendChild(r),n.appendChild(o),t.appendChild(n)}(t,n.locale),function(t,e,n){const i=document.createElement("input");i.type="url",i.placeholder=n.locale.urlPlaceholder,i.setAttribute("aria-label",n.locale.urlAria),g(i,"width:100%;padding:6px 8px;box-sizing:border-box;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-overlay);color:var(--notectl-fg);");const r=document.createElement("button");r.type="button",r.textContent=n.locale.insertButton,r.setAttribute("aria-label",n.locale.insertAria),g(r,"width:100%;padding:8px 12px;margin-top:4px;cursor:pointer;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-raised);color:var(--notectl-fg);");const o=()=>{const t=i.value.trim();t&&(v(e,{src:t}),n.onClose(),e.getContainer().focus())};r.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),o()}),i.addEventListener("keydown",t=>{"Enter"===t.key&&(t.preventDefault(),o())}),t.appendChild(i),t.appendChild(r),requestAnimationFrame(()=>i.focus())}(t,e,n)}(t,e,{acceptedTypes:this.config.acceptedTypes,locale:this.locale,onFileInsert:(t,e)=>this.handleFileInsert(t,e),onClose:n})}})}isAcceptedType(t){return this.config.acceptedTypes.some(e=>e===t||e.endsWith("/*")&&t.startsWith(e.slice(0,-1)))}isImageSelected(t){const e=t.selection;return!!r(e)&&"image"===t.getBlock(e.nodeId)?.type}announceImageSelection(t){if(!this.context)return;const e=t.selection;if(!r(e))return;const n=t.getBlock(e.nodeId);if(!n||"image"!==n.type)return;const i=n.attrs?.alt??"",o=n.attrs?.width,a=n.attrs?.height,s=[this.locale.imageSelected];i&&s.push(`${this.locale.altTextPrefix}${i}.`),void 0!==o&&void 0!==a&&s.push(this.locale.imageSizeAnnounce(o,a));const l=this.resolvedKeymap.shrinkWidth??null,c=this.resolvedKeymap.growWidth??null;l&&c&&s.push(this.locale.resizeHint(b(l),b(c))),this.context.announce(s.join(" "))}announceCurrentSize(t){const e=t.getState(),n=e.selection;if(!r(n))return;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return;const o=i.attrs?.width,a=i.attrs?.height;void 0!==o&&void 0!==a&&t.announce(this.locale.imageResized(o,a))}};export{y as a,w as i,R as n,$ as r,T as t};
|
|
2
|
-
//# sourceMappingURL=ImagePlugin-BqRAKlG1.mjs.map
|