@notectl/core 2.1.2 → 2.2.1
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-BLzRjrUl.mjs +2 -0
- package/dist/chunks/AlignmentPlugin-BLzRjrUl.mjs.map +1 -0
- package/dist/chunks/AttrRegistry-CRnXTPha.mjs +2 -0
- package/dist/chunks/AttrRegistry-CRnXTPha.mjs.map +1 -0
- package/dist/chunks/AttributedMarkCommands-CxhdUsuE.mjs +2 -0
- package/dist/chunks/AttributedMarkCommands-CxhdUsuE.mjs.map +1 -0
- package/dist/chunks/BidiIsolationPlugin-DNPXe5ga.mjs +2 -0
- package/dist/chunks/BidiIsolationPlugin-DNPXe5ga.mjs.map +1 -0
- package/dist/chunks/BlockInsertion-C7jFEeYB.mjs +2 -0
- package/dist/chunks/BlockInsertion-C7jFEeYB.mjs.map +1 -0
- package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs +2 -0
- package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs.map +1 -0
- package/dist/chunks/BlockquotePlugin-YgXcV4mT.mjs +2 -0
- package/dist/chunks/BlockquotePlugin-YgXcV4mT.mjs.map +1 -0
- package/dist/chunks/CaretNavigationPlugin-P6OYaTSq.mjs +2 -0
- package/dist/chunks/CaretNavigationPlugin-P6OYaTSq.mjs.map +1 -0
- package/dist/chunks/CodeBlockPlugin-ChPv3Edf.mjs +2 -0
- package/dist/chunks/CodeBlockPlugin-ChPv3Edf.mjs.map +1 -0
- package/dist/chunks/ColorGrid-D5-teEjD.mjs +2 -0
- package/dist/chunks/ColorGrid-D5-teEjD.mjs.map +1 -0
- package/dist/chunks/ColorPickerPopup-_Gp09pdx.mjs +2 -0
- package/dist/chunks/ColorPickerPopup-_Gp09pdx.mjs.map +1 -0
- package/dist/chunks/ColorValidation-okAvytHQ.mjs +2 -0
- package/dist/chunks/ColorValidation-okAvytHQ.mjs.map +1 -0
- package/dist/chunks/CommandHelpers-NV80Ff1G.mjs +2 -0
- package/dist/chunks/CommandHelpers-NV80Ff1G.mjs.map +1 -0
- package/dist/chunks/Commands-ixGhPiRG.mjs +2 -0
- package/dist/chunks/Commands-ixGhPiRG.mjs.map +1 -0
- package/dist/chunks/Decoration-DZK7hrL1.mjs +2 -0
- package/dist/chunks/Decoration-DZK7hrL1.mjs.map +1 -0
- package/dist/chunks/DirectionDetection-7HmMUZrx.mjs +2 -0
- package/dist/chunks/DirectionDetection-7HmMUZrx.mjs.map +1 -0
- package/dist/chunks/DirectionIcons-DhRvPVoz.mjs +2 -0
- package/dist/chunks/DirectionIcons-DhRvPVoz.mjs.map +1 -0
- package/dist/chunks/Document-znhIcvM9.mjs +2 -0
- package/dist/chunks/Document-znhIcvM9.mjs.map +1 -0
- package/dist/chunks/DocumentParser-DCjOW3us.mjs +2 -0
- package/dist/chunks/DocumentParser-DCjOW3us.mjs.map +1 -0
- package/dist/chunks/FontPlugin-COYtG1Uo.mjs +2 -0
- package/dist/chunks/FontPlugin-COYtG1Uo.mjs.map +1 -0
- package/dist/chunks/FontSizePlugin-CLcfdTm3.mjs +2 -0
- package/dist/chunks/FontSizePlugin-CLcfdTm3.mjs.map +1 -0
- package/dist/chunks/FormulaPlugin-DphHU4Rn.mjs +2 -0
- package/dist/chunks/FormulaPlugin-DphHU4Rn.mjs.map +1 -0
- package/dist/chunks/GapCursorNavigation-Bkuu_Ek8.mjs +2 -0
- package/dist/chunks/GapCursorNavigation-Bkuu_Ek8.mjs.map +1 -0
- package/dist/chunks/GapCursorPlugin-CRDmQEi1.mjs +2 -0
- package/dist/chunks/GapCursorPlugin-CRDmQEi1.mjs.map +1 -0
- package/dist/chunks/HardBreakPlugin-Cr6dMQ-H.mjs +2 -0
- package/dist/chunks/HardBreakPlugin-Cr6dMQ-H.mjs.map +1 -0
- package/dist/chunks/HeadingPlugin-3NL4ARPp.mjs +2 -0
- package/dist/chunks/HeadingPlugin-3NL4ARPp.mjs.map +1 -0
- package/dist/chunks/HighlightPlugin-dHxnAuoW.mjs +2 -0
- package/dist/chunks/HighlightPlugin-dHxnAuoW.mjs.map +1 -0
- package/dist/chunks/HorizontalRulePlugin-BYPaI4TR.mjs +2 -0
- package/dist/chunks/HorizontalRulePlugin-BYPaI4TR.mjs.map +1 -0
- package/dist/chunks/ImagePlugin-kgokm-a1.mjs +2 -0
- package/dist/chunks/ImagePlugin-kgokm-a1.mjs.map +1 -0
- package/dist/chunks/InlineCodePlugin-Bl1jyDwk.mjs +2 -0
- package/dist/chunks/InlineCodePlugin-Bl1jyDwk.mjs.map +1 -0
- package/dist/chunks/InlineStyleMarkSpec-Cc-b1tlm.mjs +2 -0
- package/dist/chunks/InlineStyleMarkSpec-Cc-b1tlm.mjs.map +1 -0
- package/dist/chunks/KeyboardNav-DZXdTg-_.mjs +2 -0
- package/dist/chunks/KeyboardNav-DZXdTg-_.mjs.map +1 -0
- package/dist/chunks/LinkPlugin-Dmcfo3On.mjs +2 -0
- package/dist/chunks/LinkPlugin-Dmcfo3On.mjs.map +1 -0
- package/dist/chunks/ListPlugin-Ch-5CsFc.mjs +2 -0
- package/dist/chunks/ListPlugin-Ch-5CsFc.mjs.map +1 -0
- package/dist/chunks/NavigationQueries-3zTaNBlp.mjs +2 -0
- package/dist/chunks/NavigationQueries-3zTaNBlp.mjs.map +1 -0
- package/dist/chunks/NodeResolver-BplmzA7c.mjs +2 -0
- package/dist/chunks/NodeResolver-BplmzA7c.mjs.map +1 -0
- package/dist/chunks/NodeSelectionCommands-dUmbRoZ2.mjs +2 -0
- package/dist/chunks/NodeSelectionCommands-dUmbRoZ2.mjs.map +1 -0
- package/dist/chunks/NodeSpecPatching-DToX09gc.mjs +2 -0
- package/dist/chunks/NodeSpecPatching-DToX09gc.mjs.map +1 -0
- package/dist/chunks/Platform-wPvKFB9m.mjs +2 -0
- package/dist/chunks/Platform-wPvKFB9m.mjs.map +1 -0
- package/dist/chunks/PluginHelpers-C3aCCGfX.mjs +2 -0
- package/dist/chunks/PluginHelpers-C3aCCGfX.mjs.map +1 -0
- package/dist/chunks/PopupKeyboardPatterns-ZdAQB78m.mjs +2 -0
- package/dist/chunks/PopupKeyboardPatterns-ZdAQB78m.mjs.map +1 -0
- package/dist/chunks/PopupManager-DsT1uRWi.mjs +2 -0
- package/dist/chunks/PopupManager-DsT1uRWi.mjs.map +1 -0
- package/dist/chunks/PopupPositioning-BEnz90Oh.mjs +2 -0
- package/dist/chunks/PopupPositioning-BEnz90Oh.mjs.map +1 -0
- package/dist/chunks/PrintPlugin-Bq-Z14K1.mjs +2 -0
- package/dist/chunks/PrintPlugin-Bq-Z14K1.mjs.map +1 -0
- package/dist/chunks/PrintTypes-DA0Cc--M.mjs +2 -0
- package/dist/chunks/PrintTypes-DA0Cc--M.mjs.map +1 -0
- package/dist/chunks/RangeIterator-Cl4_k8cx.mjs +2 -0
- package/dist/chunks/RangeIterator-Cl4_k8cx.mjs.map +1 -0
- package/dist/chunks/SelectionSync-DCJpNFat.mjs +2 -0
- package/dist/chunks/SelectionSync-DCJpNFat.mjs.map +1 -0
- package/dist/chunks/ShortcutFormatting-DZK70CN9.mjs +2 -0
- package/dist/chunks/ShortcutFormatting-DZK70CN9.mjs.map +1 -0
- package/dist/chunks/SimpleMark-CezTJnXh.mjs +2 -0
- package/dist/chunks/SimpleMark-CezTJnXh.mjs.map +1 -0
- package/dist/chunks/SmartPastePlugin-DlApY6Vw.mjs +2 -0
- package/dist/chunks/SmartPastePlugin-DlApY6Vw.mjs.map +1 -0
- package/dist/chunks/StrikethroughPlugin-BuFDABvz.mjs +2 -0
- package/dist/chunks/StrikethroughPlugin-BuFDABvz.mjs.map +1 -0
- package/dist/chunks/StyleRuntime-Bwde5icB.mjs +2 -0
- package/dist/chunks/StyleRuntime-Bwde5icB.mjs.map +1 -0
- package/dist/chunks/SuperSubPlugin-CiLJ7i4s.mjs +2 -0
- package/dist/chunks/SuperSubPlugin-CiLJ7i4s.mjs.map +1 -0
- package/dist/chunks/SyntaxTokenTypes-C9dGwufi.mjs +2 -0
- package/dist/chunks/SyntaxTokenTypes-C9dGwufi.mjs.map +1 -0
- package/dist/chunks/TablePlugin-5ru-y-YX.mjs +2 -0
- package/dist/chunks/TablePlugin-5ru-y-YX.mjs.map +1 -0
- package/dist/chunks/TextColorPlugin-Vz-Nz8aH.mjs +2 -0
- package/dist/chunks/TextColorPlugin-Vz-Nz8aH.mjs.map +1 -0
- package/dist/chunks/TextDirectionAutoPlugin-Behl6KMe.mjs +2 -0
- package/dist/chunks/TextDirectionAutoPlugin-Behl6KMe.mjs.map +1 -0
- package/dist/chunks/TextDirectionPlugin-C3h1n-aA.mjs +2 -0
- package/dist/chunks/TextDirectionPlugin-C3h1n-aA.mjs.map +1 -0
- package/dist/chunks/TextDirectionService-DRfeQnF6.mjs +2 -0
- package/dist/chunks/TextDirectionService-DRfeQnF6.mjs.map +1 -0
- package/dist/chunks/TextFormattingPlugin-D_nRMeBn.mjs +2 -0
- package/dist/chunks/TextFormattingPlugin-D_nRMeBn.mjs.map +1 -0
- package/dist/chunks/ToolbarPlugin-CSMSgjPM.mjs +2 -0
- package/dist/chunks/ToolbarPlugin-CSMSgjPM.mjs.map +1 -0
- package/dist/chunks/TypedKeys-E3jOGByL.mjs +2 -0
- package/dist/chunks/TypedKeys-E3jOGByL.mjs.map +1 -0
- package/dist/chunks/VideoPlugin-BUCGIYXr.mjs +2 -0
- package/dist/chunks/VideoPlugin-BUCGIYXr.mjs.map +1 -0
- package/dist/chunks/WordBoundary-CYDAtEks.mjs +2 -0
- package/dist/chunks/WordBoundary-CYDAtEks.mjs.map +1 -0
- package/dist/chunks/XmlDetector-DxBGXqua.mjs +2 -0
- package/dist/chunks/XmlDetector-DxBGXqua.mjs.map +1 -0
- package/dist/chunks/XmlPatterns-BiHS8w3k.mjs +2 -0
- package/dist/chunks/XmlPatterns-BiHS8w3k.mjs.map +1 -0
- package/dist/chunks/XmlSupport-B_F65M8G.mjs +2 -0
- package/dist/chunks/XmlSupport-B_F65M8G.mjs.map +1 -0
- package/dist/chunks/ar-B38MlRRN.mjs +2 -0
- package/dist/chunks/ar-B38MlRRN.mjs.map +1 -0
- package/dist/chunks/ar-BIeE0C5A.mjs +2 -0
- package/dist/chunks/ar-BIeE0C5A.mjs.map +1 -0
- package/dist/chunks/ar-BK0rFxF_.mjs +2 -0
- package/dist/chunks/ar-BK0rFxF_.mjs.map +1 -0
- package/dist/chunks/ar-BK4O36ep.mjs +2 -0
- package/dist/chunks/ar-BK4O36ep.mjs.map +1 -0
- package/dist/chunks/ar-BNUWuZe3.mjs +2 -0
- package/dist/chunks/ar-BNUWuZe3.mjs.map +1 -0
- package/dist/chunks/ar-BSXH8acw.mjs +2 -0
- package/dist/chunks/ar-BSXH8acw.mjs.map +1 -0
- package/dist/chunks/ar-BY8yNlGe.mjs +2 -0
- package/dist/chunks/ar-BY8yNlGe.mjs.map +1 -0
- package/dist/chunks/ar-BgHkduPE.mjs +2 -0
- package/dist/chunks/ar-BgHkduPE.mjs.map +1 -0
- package/dist/chunks/ar-BnfWtLhK.mjs +2 -0
- package/dist/chunks/ar-BnfWtLhK.mjs.map +1 -0
- package/dist/chunks/ar-BwCPhCf6.mjs +2 -0
- package/dist/chunks/ar-BwCPhCf6.mjs.map +1 -0
- package/dist/chunks/ar-Bymjd9Z_.mjs +2 -0
- package/dist/chunks/ar-Bymjd9Z_.mjs.map +1 -0
- package/dist/chunks/ar-CKPpdJ7F.mjs +2 -0
- package/dist/chunks/ar-CKPpdJ7F.mjs.map +1 -0
- package/dist/chunks/ar-C_ir5Uf4.mjs +2 -0
- package/dist/chunks/ar-C_ir5Uf4.mjs.map +1 -0
- package/dist/chunks/ar-CkE6GDVA.mjs +2 -0
- package/dist/chunks/ar-CkE6GDVA.mjs.map +1 -0
- package/dist/chunks/ar-ClgA1KQM.mjs +2 -0
- package/dist/chunks/ar-ClgA1KQM.mjs.map +1 -0
- package/dist/chunks/ar-Cm1DOK74.mjs +2 -0
- package/dist/chunks/ar-Cm1DOK74.mjs.map +1 -0
- package/dist/chunks/ar-CseGhQtS.mjs +2 -0
- package/dist/chunks/ar-CseGhQtS.mjs.map +1 -0
- package/dist/chunks/ar-D0bqkviV.mjs +2 -0
- package/dist/chunks/ar-D0bqkviV.mjs.map +1 -0
- package/dist/chunks/ar-D5d185g0.mjs +2 -0
- package/dist/chunks/ar-D5d185g0.mjs.map +1 -0
- package/dist/chunks/ar-DSwUyX47.mjs +2 -0
- package/dist/chunks/ar-DSwUyX47.mjs.map +1 -0
- package/dist/chunks/ar-DfSNWZX7.mjs +2 -0
- package/dist/chunks/ar-DfSNWZX7.mjs.map +1 -0
- package/dist/chunks/ar-Dghtfs46.mjs +2 -0
- package/dist/chunks/ar-Dghtfs46.mjs.map +1 -0
- package/dist/chunks/ar-DvNKBrJd.mjs +2 -0
- package/dist/chunks/ar-DvNKBrJd.mjs.map +1 -0
- package/dist/chunks/ar-KNULRI8r.mjs +2 -0
- package/dist/chunks/ar-KNULRI8r.mjs.map +1 -0
- package/dist/chunks/ar-NtGRavHz.mjs +2 -0
- package/dist/chunks/ar-NtGRavHz.mjs.map +1 -0
- package/dist/chunks/ar-Y9KjJLX8.mjs +2 -0
- package/dist/chunks/ar-Y9KjJLX8.mjs.map +1 -0
- package/dist/chunks/ar-odM5gkvw.mjs +2 -0
- package/dist/chunks/ar-odM5gkvw.mjs.map +1 -0
- package/dist/chunks/color-picker-C89H4SVX.mjs +2 -0
- package/dist/chunks/color-picker-C89H4SVX.mjs.map +1 -0
- package/dist/chunks/de-B1TXiyll.mjs +2 -0
- package/dist/chunks/de-B1TXiyll.mjs.map +1 -0
- package/dist/chunks/de-BDRaxLyi.mjs +2 -0
- package/dist/chunks/de-BDRaxLyi.mjs.map +1 -0
- package/dist/chunks/de-BGOpZ8Ls.mjs +2 -0
- package/dist/chunks/de-BGOpZ8Ls.mjs.map +1 -0
- package/dist/chunks/de-BfZ5qXWz.mjs +2 -0
- package/dist/chunks/de-BfZ5qXWz.mjs.map +1 -0
- package/dist/chunks/de-BibufNIa.mjs +2 -0
- package/dist/chunks/de-BibufNIa.mjs.map +1 -0
- package/dist/chunks/de-BkZqCmzL.mjs +2 -0
- package/dist/chunks/de-BkZqCmzL.mjs.map +1 -0
- package/dist/chunks/de-BzRd2oyR.mjs +2 -0
- package/dist/chunks/de-BzRd2oyR.mjs.map +1 -0
- package/dist/chunks/de-C4gnHDmk.mjs +2 -0
- package/dist/chunks/de-C4gnHDmk.mjs.map +1 -0
- package/dist/chunks/de-C4iw9SEp.mjs +2 -0
- package/dist/chunks/de-C4iw9SEp.mjs.map +1 -0
- package/dist/chunks/de-CLWzcDoW.mjs +2 -0
- package/dist/chunks/de-CLWzcDoW.mjs.map +1 -0
- package/dist/chunks/de-Cbv0otYM.mjs +2 -0
- package/dist/chunks/de-Cbv0otYM.mjs.map +1 -0
- package/dist/chunks/de-Cinp7zmo.mjs +2 -0
- package/dist/chunks/de-Cinp7zmo.mjs.map +1 -0
- package/dist/chunks/de-CvnyjI_X.mjs +2 -0
- package/dist/chunks/de-CvnyjI_X.mjs.map +1 -0
- package/dist/chunks/de-DCx3Shj3.mjs +2 -0
- package/dist/chunks/de-DCx3Shj3.mjs.map +1 -0
- package/dist/chunks/de-Dav2GzjV.mjs +2 -0
- package/dist/chunks/de-Dav2GzjV.mjs.map +1 -0
- package/dist/chunks/de-Dc7GRbWc.mjs +2 -0
- package/dist/chunks/de-Dc7GRbWc.mjs.map +1 -0
- package/dist/chunks/de-DdntlpT3.mjs +2 -0
- package/dist/chunks/de-DdntlpT3.mjs.map +1 -0
- package/dist/chunks/de-DefykdF-.mjs +2 -0
- package/dist/chunks/de-DefykdF-.mjs.map +1 -0
- package/dist/chunks/de-DfQQIP8Y.mjs +2 -0
- package/dist/chunks/de-DfQQIP8Y.mjs.map +1 -0
- package/dist/chunks/de-DkcKDkbA.mjs +2 -0
- package/dist/chunks/de-DkcKDkbA.mjs.map +1 -0
- package/dist/chunks/de-DqGfLfeV.mjs +2 -0
- package/dist/chunks/de-DqGfLfeV.mjs.map +1 -0
- package/dist/chunks/de-DudqIJho.mjs +2 -0
- package/dist/chunks/de-DudqIJho.mjs.map +1 -0
- package/dist/chunks/de-LCXA2xWj.mjs +2 -0
- package/dist/chunks/de-LCXA2xWj.mjs.map +1 -0
- package/dist/chunks/de-YygmrxGp.mjs +2 -0
- package/dist/chunks/de-YygmrxGp.mjs.map +1 -0
- package/dist/chunks/de-asI3UlFG.mjs +2 -0
- package/dist/chunks/de-asI3UlFG.mjs.map +1 -0
- package/dist/chunks/de-kvMvD3AJ.mjs +2 -0
- package/dist/chunks/de-kvMvD3AJ.mjs.map +1 -0
- package/dist/chunks/de-pnfTnS03.mjs +2 -0
- package/dist/chunks/de-pnfTnS03.mjs.map +1 -0
- package/dist/chunks/es-4tbAR0If.mjs +2 -0
- package/dist/chunks/es-4tbAR0If.mjs.map +1 -0
- package/dist/chunks/es-B9z2Xwj0.mjs +2 -0
- package/dist/chunks/es-B9z2Xwj0.mjs.map +1 -0
- package/dist/chunks/es-BJxjRQSg.mjs +2 -0
- package/dist/chunks/es-BJxjRQSg.mjs.map +1 -0
- package/dist/chunks/es-BSyxBRjn.mjs +2 -0
- package/dist/chunks/es-BSyxBRjn.mjs.map +1 -0
- package/dist/chunks/es-Bcpq2xfU.mjs +2 -0
- package/dist/chunks/es-Bcpq2xfU.mjs.map +1 -0
- package/dist/chunks/es-BhUjc8mO.mjs +2 -0
- package/dist/chunks/es-BhUjc8mO.mjs.map +1 -0
- package/dist/chunks/es-Bm7hoJSI.mjs +2 -0
- package/dist/chunks/es-Bm7hoJSI.mjs.map +1 -0
- package/dist/chunks/es-C0E-lFIC.mjs +2 -0
- package/dist/chunks/es-C0E-lFIC.mjs.map +1 -0
- package/dist/chunks/es-C2wBBQ7N.mjs +2 -0
- package/dist/chunks/es-C2wBBQ7N.mjs.map +1 -0
- package/dist/chunks/es-C9vhYpfP.mjs +2 -0
- package/dist/chunks/es-C9vhYpfP.mjs.map +1 -0
- package/dist/chunks/es-Cgslt0Hp.mjs +2 -0
- package/dist/chunks/es-Cgslt0Hp.mjs.map +1 -0
- package/dist/chunks/es-CksXDFxg.mjs +2 -0
- package/dist/chunks/es-CksXDFxg.mjs.map +1 -0
- package/dist/chunks/es-CnQUZlfY.mjs +2 -0
- package/dist/chunks/es-CnQUZlfY.mjs.map +1 -0
- package/dist/chunks/es-CrRNOn2Q.mjs +2 -0
- package/dist/chunks/es-CrRNOn2Q.mjs.map +1 -0
- package/dist/chunks/es-D0427MIH.mjs +2 -0
- package/dist/chunks/es-D0427MIH.mjs.map +1 -0
- package/dist/chunks/es-D19xfXus.mjs +2 -0
- package/dist/chunks/es-D19xfXus.mjs.map +1 -0
- package/dist/chunks/es-Dk6lCcOt.mjs +2 -0
- package/dist/chunks/es-Dk6lCcOt.mjs.map +1 -0
- package/dist/chunks/es-Dls_xPCW.mjs +2 -0
- package/dist/chunks/es-Dls_xPCW.mjs.map +1 -0
- package/dist/chunks/es-DrcsyDvI.mjs +2 -0
- package/dist/chunks/es-DrcsyDvI.mjs.map +1 -0
- package/dist/chunks/es-DwKejbO9.mjs +2 -0
- package/dist/chunks/es-DwKejbO9.mjs.map +1 -0
- package/dist/chunks/es-NcrWuNe1.mjs +2 -0
- package/dist/chunks/es-NcrWuNe1.mjs.map +1 -0
- package/dist/chunks/es-RaZerssd.mjs +2 -0
- package/dist/chunks/es-RaZerssd.mjs.map +1 -0
- package/dist/chunks/es-TIjHCFNF.mjs +2 -0
- package/dist/chunks/es-TIjHCFNF.mjs.map +1 -0
- package/dist/chunks/es-eZcDkBb-.mjs +2 -0
- package/dist/chunks/es-eZcDkBb-.mjs.map +1 -0
- package/dist/chunks/es-j_-KW9-4.mjs +2 -0
- package/dist/chunks/es-j_-KW9-4.mjs.map +1 -0
- package/dist/chunks/es-kGLwn8EB.mjs +2 -0
- package/dist/chunks/es-kGLwn8EB.mjs.map +1 -0
- package/dist/chunks/es-qQRDC0Ge.mjs +2 -0
- package/dist/chunks/es-qQRDC0Ge.mjs.map +1 -0
- package/dist/chunks/fonts-ZXAIMT3b.mjs +2 -0
- package/dist/chunks/fonts-ZXAIMT3b.mjs.map +1 -0
- package/dist/chunks/fr-B27zAq0X.mjs +2 -0
- package/dist/chunks/fr-B27zAq0X.mjs.map +1 -0
- package/dist/chunks/fr-BEd3ZHO4.mjs +2 -0
- package/dist/chunks/fr-BEd3ZHO4.mjs.map +1 -0
- package/dist/chunks/fr-BHXLpdaH.mjs +2 -0
- package/dist/chunks/fr-BHXLpdaH.mjs.map +1 -0
- package/dist/chunks/fr-BKu4eU3V.mjs +2 -0
- package/dist/chunks/fr-BKu4eU3V.mjs.map +1 -0
- package/dist/chunks/fr-BUrUZ5UQ.mjs +2 -0
- package/dist/chunks/fr-BUrUZ5UQ.mjs.map +1 -0
- package/dist/chunks/fr-BlqlUQ3b.mjs +2 -0
- package/dist/chunks/fr-BlqlUQ3b.mjs.map +1 -0
- package/dist/chunks/fr-BruEqDw1.mjs +2 -0
- package/dist/chunks/fr-BruEqDw1.mjs.map +1 -0
- package/dist/chunks/fr-BwuuFBkA.mjs +2 -0
- package/dist/chunks/fr-BwuuFBkA.mjs.map +1 -0
- package/dist/chunks/fr-C2lLh5Ti.mjs +2 -0
- package/dist/chunks/fr-C2lLh5Ti.mjs.map +1 -0
- package/dist/chunks/fr-C7N2_AlK.mjs +2 -0
- package/dist/chunks/fr-C7N2_AlK.mjs.map +1 -0
- package/dist/chunks/fr-COfd6sLW.mjs +2 -0
- package/dist/chunks/fr-COfd6sLW.mjs.map +1 -0
- package/dist/chunks/fr-COx4cSxc.mjs +2 -0
- package/dist/chunks/fr-COx4cSxc.mjs.map +1 -0
- package/dist/chunks/fr-CX37XjPO.mjs +2 -0
- package/dist/chunks/fr-CX37XjPO.mjs.map +1 -0
- package/dist/chunks/fr-CYn6fMiH.mjs +2 -0
- package/dist/chunks/fr-CYn6fMiH.mjs.map +1 -0
- package/dist/chunks/fr-CbsiyDEa.mjs +2 -0
- package/dist/chunks/fr-CbsiyDEa.mjs.map +1 -0
- package/dist/chunks/fr-CcZiELJY.mjs +2 -0
- package/dist/chunks/fr-CcZiELJY.mjs.map +1 -0
- package/dist/chunks/fr-CeHzUPVT.mjs +2 -0
- package/dist/chunks/fr-CeHzUPVT.mjs.map +1 -0
- package/dist/chunks/fr-Cv73J4QZ.mjs +2 -0
- package/dist/chunks/fr-Cv73J4QZ.mjs.map +1 -0
- package/dist/chunks/fr-DDLuorz7.mjs +2 -0
- package/dist/chunks/fr-DDLuorz7.mjs.map +1 -0
- package/dist/chunks/fr-DMA4CAyo.mjs +2 -0
- package/dist/chunks/fr-DMA4CAyo.mjs.map +1 -0
- package/dist/chunks/fr-DNJuGtO1.mjs +2 -0
- package/dist/chunks/fr-DNJuGtO1.mjs.map +1 -0
- package/dist/chunks/fr-DQOE8O6_.mjs +2 -0
- package/dist/chunks/fr-DQOE8O6_.mjs.map +1 -0
- package/dist/chunks/fr-DXjOwGew.mjs +2 -0
- package/dist/chunks/fr-DXjOwGew.mjs.map +1 -0
- package/dist/chunks/fr-DilrEvE_.mjs +2 -0
- package/dist/chunks/fr-DilrEvE_.mjs.map +1 -0
- package/dist/chunks/fr-P7iY3ntE.mjs +2 -0
- package/dist/chunks/fr-P7iY3ntE.mjs.map +1 -0
- package/dist/chunks/fr-ViUNGo_J.mjs +2 -0
- package/dist/chunks/fr-ViUNGo_J.mjs.map +1 -0
- package/dist/chunks/fr-gdIyLcGC.mjs +2 -0
- package/dist/chunks/fr-gdIyLcGC.mjs.map +1 -0
- package/dist/chunks/full-h88Sb2MR.mjs +2 -0
- package/dist/chunks/full-h88Sb2MR.mjs.map +1 -0
- package/dist/chunks/hi-BC82Jxjl.mjs +2 -0
- package/dist/chunks/hi-BC82Jxjl.mjs.map +1 -0
- package/dist/chunks/hi-BCTarnem.mjs +2 -0
- package/dist/chunks/hi-BCTarnem.mjs.map +1 -0
- package/dist/chunks/hi-BMStjhJF.mjs +2 -0
- package/dist/chunks/hi-BMStjhJF.mjs.map +1 -0
- package/dist/chunks/hi-BQ2Fyx7t.mjs +2 -0
- package/dist/chunks/hi-BQ2Fyx7t.mjs.map +1 -0
- package/dist/chunks/hi-Bg4-z2Os.mjs +2 -0
- package/dist/chunks/hi-Bg4-z2Os.mjs.map +1 -0
- package/dist/chunks/hi-BgqI_gOH.mjs +2 -0
- package/dist/chunks/hi-BgqI_gOH.mjs.map +1 -0
- package/dist/chunks/hi-CEPSeUBX.mjs +2 -0
- package/dist/chunks/hi-CEPSeUBX.mjs.map +1 -0
- package/dist/chunks/hi-CRaZj5Uo.mjs +2 -0
- package/dist/chunks/hi-CRaZj5Uo.mjs.map +1 -0
- package/dist/chunks/hi-CT0uK1Me.mjs +2 -0
- package/dist/chunks/hi-CT0uK1Me.mjs.map +1 -0
- package/dist/chunks/hi-CnIpMd8L.mjs +2 -0
- package/dist/chunks/hi-CnIpMd8L.mjs.map +1 -0
- package/dist/chunks/hi-CnSv0JhL.mjs +2 -0
- package/dist/chunks/hi-CnSv0JhL.mjs.map +1 -0
- package/dist/chunks/hi-DLLBZu67.mjs +2 -0
- package/dist/chunks/hi-DLLBZu67.mjs.map +1 -0
- package/dist/chunks/hi-DMg_aiSR.mjs +2 -0
- package/dist/chunks/hi-DMg_aiSR.mjs.map +1 -0
- package/dist/chunks/hi-DWwLzOX5.mjs +2 -0
- package/dist/chunks/hi-DWwLzOX5.mjs.map +1 -0
- package/dist/chunks/hi-D_4Xi4Nv.mjs +2 -0
- package/dist/chunks/hi-D_4Xi4Nv.mjs.map +1 -0
- package/dist/chunks/hi-D_Jtykmj.mjs +2 -0
- package/dist/chunks/hi-D_Jtykmj.mjs.map +1 -0
- package/dist/chunks/hi-Da5pRz8E.mjs +2 -0
- package/dist/chunks/hi-Da5pRz8E.mjs.map +1 -0
- package/dist/chunks/hi-DqL20WmM.mjs +2 -0
- package/dist/chunks/hi-DqL20WmM.mjs.map +1 -0
- package/dist/chunks/hi-DwQopxRg.mjs +2 -0
- package/dist/chunks/hi-DwQopxRg.mjs.map +1 -0
- package/dist/chunks/hi-IuMohSSw.mjs +2 -0
- package/dist/chunks/hi-IuMohSSw.mjs.map +1 -0
- package/dist/chunks/hi-PUX7dDPm.mjs +2 -0
- package/dist/chunks/hi-PUX7dDPm.mjs.map +1 -0
- package/dist/chunks/hi-RmfZAmwT.mjs +2 -0
- package/dist/chunks/hi-RmfZAmwT.mjs.map +1 -0
- package/dist/chunks/hi-UIBrTEVu.mjs +2 -0
- package/dist/chunks/hi-UIBrTEVu.mjs.map +1 -0
- package/dist/chunks/hi-_SjWnfeh.mjs +2 -0
- package/dist/chunks/hi-_SjWnfeh.mjs.map +1 -0
- package/dist/chunks/hi-dV2GZgH_.mjs +2 -0
- package/dist/chunks/hi-dV2GZgH_.mjs.map +1 -0
- package/dist/chunks/hi-ehh5oKz3.mjs +2 -0
- package/dist/chunks/hi-ehh5oKz3.mjs.map +1 -0
- package/dist/chunks/hi-yXnRBFJK.mjs +2 -0
- package/dist/chunks/hi-yXnRBFJK.mjs.map +1 -0
- package/dist/chunks/minimal-a40NeBQ_.mjs +2 -0
- package/dist/chunks/minimal-a40NeBQ_.mjs.map +1 -0
- package/dist/chunks/pt-2a8Oto6x.mjs +2 -0
- package/dist/chunks/pt-2a8Oto6x.mjs.map +1 -0
- package/dist/chunks/pt-ALzIyTiI.mjs +2 -0
- package/dist/chunks/pt-ALzIyTiI.mjs.map +1 -0
- package/dist/chunks/pt-B2hMlTc6.mjs +2 -0
- package/dist/chunks/pt-B2hMlTc6.mjs.map +1 -0
- package/dist/chunks/pt-BCIkSb0w.mjs +2 -0
- package/dist/chunks/pt-BCIkSb0w.mjs.map +1 -0
- package/dist/chunks/pt-BFotmq5x.mjs +2 -0
- package/dist/chunks/pt-BFotmq5x.mjs.map +1 -0
- package/dist/chunks/pt-BM7OScX6.mjs +2 -0
- package/dist/chunks/pt-BM7OScX6.mjs.map +1 -0
- package/dist/chunks/pt-BM7zXWxW.mjs +2 -0
- package/dist/chunks/pt-BM7zXWxW.mjs.map +1 -0
- package/dist/chunks/pt-BchCuzFq.mjs +2 -0
- package/dist/chunks/pt-BchCuzFq.mjs.map +1 -0
- package/dist/chunks/pt-BmcHFWoR.mjs +2 -0
- package/dist/chunks/pt-BmcHFWoR.mjs.map +1 -0
- package/dist/chunks/pt-C53W99RV.mjs +2 -0
- package/dist/chunks/pt-C53W99RV.mjs.map +1 -0
- package/dist/chunks/pt-CORQy8qv.mjs +2 -0
- package/dist/chunks/pt-CORQy8qv.mjs.map +1 -0
- package/dist/chunks/pt-CUPKr943.mjs +2 -0
- package/dist/chunks/pt-CUPKr943.mjs.map +1 -0
- package/dist/chunks/pt-CYkKDsLa.mjs +2 -0
- package/dist/chunks/pt-CYkKDsLa.mjs.map +1 -0
- package/dist/chunks/pt-Cd_SXHKt.mjs +2 -0
- package/dist/chunks/pt-Cd_SXHKt.mjs.map +1 -0
- package/dist/chunks/pt-CjN3Oq-6.mjs +2 -0
- package/dist/chunks/pt-CjN3Oq-6.mjs.map +1 -0
- package/dist/chunks/pt-CrKrgktr.mjs +2 -0
- package/dist/chunks/pt-CrKrgktr.mjs.map +1 -0
- package/dist/chunks/pt-Crmbkj0e.mjs +2 -0
- package/dist/chunks/pt-Crmbkj0e.mjs.map +1 -0
- package/dist/chunks/pt-D19IWOM_.mjs +2 -0
- package/dist/chunks/pt-D19IWOM_.mjs.map +1 -0
- package/dist/chunks/pt-D6zY7l2E.mjs +2 -0
- package/dist/chunks/pt-D6zY7l2E.mjs.map +1 -0
- package/dist/chunks/pt-DA5hufLZ.mjs +2 -0
- package/dist/chunks/pt-DA5hufLZ.mjs.map +1 -0
- package/dist/chunks/pt-DEfBqu-c.mjs +2 -0
- package/dist/chunks/pt-DEfBqu-c.mjs.map +1 -0
- package/dist/chunks/pt-DG3rw6nK.mjs +2 -0
- package/dist/chunks/pt-DG3rw6nK.mjs.map +1 -0
- package/dist/chunks/pt-DRoAHNZi.mjs +2 -0
- package/dist/chunks/pt-DRoAHNZi.mjs.map +1 -0
- package/dist/chunks/pt-Eml9QiUL.mjs +2 -0
- package/dist/chunks/pt-Eml9QiUL.mjs.map +1 -0
- package/dist/chunks/pt-Haa3wVmA.mjs +2 -0
- package/dist/chunks/pt-Haa3wVmA.mjs.map +1 -0
- package/dist/chunks/pt-aj7zOxTg.mjs +2 -0
- package/dist/chunks/pt-aj7zOxTg.mjs.map +1 -0
- package/dist/chunks/pt-l6dTmkQk.mjs +2 -0
- package/dist/chunks/pt-l6dTmkQk.mjs.map +1 -0
- package/dist/chunks/ru--JPEpdcJ.mjs +2 -0
- package/dist/chunks/ru--JPEpdcJ.mjs.map +1 -0
- package/dist/chunks/ru-B76ORyqe.mjs +2 -0
- package/dist/chunks/ru-B76ORyqe.mjs.map +1 -0
- package/dist/chunks/ru-BDQ62WuE.mjs +2 -0
- package/dist/chunks/ru-BDQ62WuE.mjs.map +1 -0
- package/dist/chunks/ru-BQ6W3lwr.mjs +2 -0
- package/dist/chunks/ru-BQ6W3lwr.mjs.map +1 -0
- package/dist/chunks/ru-BQpaitci.mjs +2 -0
- package/dist/chunks/ru-BQpaitci.mjs.map +1 -0
- package/dist/chunks/ru-Bm9VwJLu.mjs +2 -0
- package/dist/chunks/ru-Bm9VwJLu.mjs.map +1 -0
- package/dist/chunks/ru-BnNdik6i.mjs +2 -0
- package/dist/chunks/ru-BnNdik6i.mjs.map +1 -0
- package/dist/chunks/ru-Bo4am8cd.mjs +2 -0
- package/dist/chunks/ru-Bo4am8cd.mjs.map +1 -0
- package/dist/chunks/ru-C1k56xWQ.mjs +2 -0
- package/dist/chunks/ru-C1k56xWQ.mjs.map +1 -0
- package/dist/chunks/ru-C4rnSQlI.mjs +2 -0
- package/dist/chunks/ru-C4rnSQlI.mjs.map +1 -0
- package/dist/chunks/ru-CKM3t1sv.mjs +2 -0
- package/dist/chunks/ru-CKM3t1sv.mjs.map +1 -0
- package/dist/chunks/ru-CO6eCsxU.mjs +2 -0
- package/dist/chunks/ru-CO6eCsxU.mjs.map +1 -0
- package/dist/chunks/ru-CTaYpQ9_.mjs +2 -0
- package/dist/chunks/ru-CTaYpQ9_.mjs.map +1 -0
- package/dist/chunks/ru-CdY8d80t.mjs +2 -0
- package/dist/chunks/ru-CdY8d80t.mjs.map +1 -0
- package/dist/chunks/ru-CsDtaWRd.mjs +2 -0
- package/dist/chunks/ru-CsDtaWRd.mjs.map +1 -0
- package/dist/chunks/ru-Cy_4nn8h.mjs +2 -0
- package/dist/chunks/ru-Cy_4nn8h.mjs.map +1 -0
- package/dist/chunks/ru-DACtjNuJ.mjs +2 -0
- package/dist/chunks/ru-DACtjNuJ.mjs.map +1 -0
- package/dist/chunks/ru-DN6yN_w9.mjs +2 -0
- package/dist/chunks/ru-DN6yN_w9.mjs.map +1 -0
- package/dist/chunks/ru-DThFtd76.mjs +2 -0
- package/dist/chunks/ru-DThFtd76.mjs.map +1 -0
- package/dist/chunks/ru-Dd_P7hP7.mjs +2 -0
- package/dist/chunks/ru-Dd_P7hP7.mjs.map +1 -0
- package/dist/chunks/ru-Dhuxwzwy.mjs +2 -0
- package/dist/chunks/ru-Dhuxwzwy.mjs.map +1 -0
- package/dist/chunks/ru-Dn6UDGIG.mjs +2 -0
- package/dist/chunks/ru-Dn6UDGIG.mjs.map +1 -0
- package/dist/chunks/ru-DojHc5wu.mjs +2 -0
- package/dist/chunks/ru-DojHc5wu.mjs.map +1 -0
- package/dist/chunks/ru-DyWzWBjV.mjs +2 -0
- package/dist/chunks/ru-DyWzWBjV.mjs.map +1 -0
- package/dist/chunks/ru-NBxCkjlP.mjs +2 -0
- package/dist/chunks/ru-NBxCkjlP.mjs.map +1 -0
- package/dist/chunks/ru-_MQaVHam.mjs +2 -0
- package/dist/chunks/ru-_MQaVHam.mjs.map +1 -0
- package/dist/chunks/ru-wv17PPrd.mjs +2 -0
- package/dist/chunks/ru-wv17PPrd.mjs.map +1 -0
- package/dist/chunks/src-ooaZ_Egu.mjs +2 -0
- package/dist/chunks/src-ooaZ_Egu.mjs.map +1 -0
- package/dist/chunks/zh-2-Y3Limy.mjs +2 -0
- package/dist/chunks/zh-2-Y3Limy.mjs.map +1 -0
- package/dist/chunks/zh-B02VPMqX.mjs +2 -0
- package/dist/chunks/zh-B02VPMqX.mjs.map +1 -0
- package/dist/chunks/zh-BYjLBWWN.mjs +2 -0
- package/dist/chunks/zh-BYjLBWWN.mjs.map +1 -0
- package/dist/chunks/zh-Bt2ZdHcS.mjs +2 -0
- package/dist/chunks/zh-Bt2ZdHcS.mjs.map +1 -0
- package/dist/chunks/zh-BuN_C4o-.mjs +2 -0
- package/dist/chunks/zh-BuN_C4o-.mjs.map +1 -0
- package/dist/chunks/zh-CA3BDj0Y.mjs +2 -0
- package/dist/chunks/zh-CA3BDj0Y.mjs.map +1 -0
- package/dist/chunks/zh-CHuGP7RS.mjs +2 -0
- package/dist/chunks/zh-CHuGP7RS.mjs.map +1 -0
- package/dist/chunks/zh-CIPsF5P8.mjs +2 -0
- package/dist/chunks/zh-CIPsF5P8.mjs.map +1 -0
- package/dist/chunks/zh-C_YS18re.mjs +2 -0
- package/dist/chunks/zh-C_YS18re.mjs.map +1 -0
- package/dist/chunks/zh-CfMPFWUg.mjs +2 -0
- package/dist/chunks/zh-CfMPFWUg.mjs.map +1 -0
- package/dist/chunks/zh-CfjCcBIB.mjs +2 -0
- package/dist/chunks/zh-CfjCcBIB.mjs.map +1 -0
- package/dist/chunks/zh-CqQph809.mjs +2 -0
- package/dist/chunks/zh-CqQph809.mjs.map +1 -0
- package/dist/chunks/zh-Cxe42GC5.mjs +2 -0
- package/dist/chunks/zh-Cxe42GC5.mjs.map +1 -0
- package/dist/chunks/zh-CyMU2cTf.mjs +2 -0
- package/dist/chunks/zh-CyMU2cTf.mjs.map +1 -0
- package/dist/chunks/zh-Cynz1sBa.mjs +2 -0
- package/dist/chunks/zh-Cynz1sBa.mjs.map +1 -0
- package/dist/chunks/zh-DRKs6Q0a.mjs +2 -0
- package/dist/chunks/zh-DRKs6Q0a.mjs.map +1 -0
- package/dist/chunks/zh-DTuIJjx6.mjs +2 -0
- package/dist/chunks/zh-DTuIJjx6.mjs.map +1 -0
- package/dist/chunks/zh-DTz9l6mp.mjs +2 -0
- package/dist/chunks/zh-DTz9l6mp.mjs.map +1 -0
- package/dist/chunks/zh-DZwjiJmn.mjs +2 -0
- package/dist/chunks/zh-DZwjiJmn.mjs.map +1 -0
- package/dist/chunks/zh-D_VJDQl4.mjs +2 -0
- package/dist/chunks/zh-D_VJDQl4.mjs.map +1 -0
- package/dist/chunks/zh-Dt20Om7Z.mjs +2 -0
- package/dist/chunks/zh-Dt20Om7Z.mjs.map +1 -0
- package/dist/chunks/zh-SgsZ9f-W.mjs +2 -0
- package/dist/chunks/zh-SgsZ9f-W.mjs.map +1 -0
- package/dist/chunks/zh-XR7Ls7m-.mjs +2 -0
- package/dist/chunks/zh-XR7Ls7m-.mjs.map +1 -0
- package/dist/chunks/zh-aXPI9lKF.mjs +2 -0
- package/dist/chunks/zh-aXPI9lKF.mjs.map +1 -0
- package/dist/chunks/zh-cLXIKkZQ.mjs +2 -0
- package/dist/chunks/zh-cLXIKkZQ.mjs.map +1 -0
- package/dist/chunks/zh-cZUtN871.mjs +2 -0
- package/dist/chunks/zh-cZUtN871.mjs.map +1 -0
- package/dist/chunks/zh-hcdnCGUp.mjs +2 -0
- package/dist/chunks/zh-hcdnCGUp.mjs.map +1 -0
- package/dist/commands/AttributedMarkCommands.d.ts.map +1 -1
- package/dist/commands/BlockInsertion.d.ts +27 -0
- package/dist/commands/BlockInsertion.d.ts.map +1 -1
- package/dist/commands/CommandHelpers.d.ts +12 -0
- package/dist/commands/CommandHelpers.d.ts.map +1 -1
- package/dist/commands/Commands.d.ts.map +1 -1
- package/dist/commands/ContainerCommands.d.ts +24 -0
- package/dist/commands/ContainerCommands.d.ts.map +1 -0
- package/dist/commands/CursorMarks.d.ts +13 -0
- package/dist/commands/CursorMarks.d.ts.map +1 -0
- package/dist/commands/GapCursorCommands.d.ts.map +1 -1
- package/dist/commands/MarkCommands.d.ts.map +1 -1
- package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
- package/dist/commands/PasteCommand.d.ts.map +1 -1
- package/dist/commands/SelectionDeletion.d.ts +25 -0
- package/dist/commands/SelectionDeletion.d.ts.map +1 -0
- package/dist/decorations/Decoration.d.ts +6 -0
- package/dist/decorations/Decoration.d.ts.map +1 -1
- package/dist/decorations/PositionMapping.d.ts +13 -3
- package/dist/decorations/PositionMapping.d.ts.map +1 -1
- package/dist/editor/ContentSerializer.d.ts +1 -1
- package/dist/editor/ContentSerializer.d.ts.map +1 -1
- package/dist/editor/EditorConfig.d.ts +14 -2
- package/dist/editor/EditorConfig.d.ts.map +1 -1
- package/dist/editor/EditorDOM.d.ts.map +1 -1
- package/dist/editor/EditorInitializer.d.ts.map +1 -1
- package/dist/editor/NotectlEditor.d.ts +12 -7
- package/dist/editor/NotectlEditor.d.ts.map +1 -1
- package/dist/editor/PluginBootstrapper.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/styles/table.d.ts +1 -1
- package/dist/editor/styles/table.d.ts.map +1 -1
- package/dist/editor/styles/toolbar.d.ts +1 -1
- package/dist/editor/styles/toolbar.d.ts.map +1 -1
- package/dist/fonts.d.ts +11 -0
- package/dist/fonts.d.ts.map +1 -1
- package/dist/fonts.mjs +1 -1
- package/dist/full.d.ts +2 -0
- package/dist/full.d.ts.map +1 -1
- package/dist/full.mjs +1 -1
- package/dist/html.d.ts +1 -1
- package/dist/html.d.ts.map +1 -1
- package/dist/html.mjs +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/input/ClipboardHandler.d.ts.map +1 -1
- package/dist/input/HTMLParser.d.ts +3 -0
- package/dist/input/HTMLParser.d.ts.map +1 -1
- package/dist/input/InputHandler.d.ts +9 -0
- package/dist/input/InputHandler.d.ts.map +1 -1
- package/dist/input/InputManager.d.ts +2 -0
- package/dist/input/InputManager.d.ts.map +1 -1
- package/dist/input/KeyboardHandler.d.ts.map +1 -1
- package/dist/input/PasteHTMLHandler.d.ts +1 -1
- package/dist/input/PasteHTMLHandler.d.ts.map +1 -1
- package/dist/input/PasteRichBlockHandler.d.ts +1 -1
- package/dist/input/PasteRichBlockHandler.d.ts.map +1 -1
- package/dist/input/SelectionDocument.d.ts.map +1 -1
- package/dist/model/ContentSlice.d.ts +6 -7
- package/dist/model/ContentSlice.d.ts.map +1 -1
- package/dist/model/Document.d.ts +34 -0
- package/dist/model/Document.d.ts.map +1 -1
- package/dist/model/GraphemeUtils.d.ts +8 -2
- package/dist/model/GraphemeUtils.d.ts.map +1 -1
- package/dist/model/MarkSpec.d.ts +6 -0
- package/dist/model/MarkSpec.d.ts.map +1 -1
- package/dist/model/NodeResolver.d.ts +18 -0
- package/dist/model/NodeResolver.d.ts.map +1 -1
- package/dist/model/Schema.d.ts +6 -0
- package/dist/model/Schema.d.ts.map +1 -1
- package/dist/model/SchemaRegistry.d.ts.map +1 -1
- package/dist/model/TextInputInterceptor.d.ts +21 -0
- package/dist/model/TextInputInterceptor.d.ts.map +1 -0
- 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/MiddlewareChain.d.ts +11 -0
- package/dist/plugins/MiddlewareChain.d.ts.map +1 -1
- package/dist/plugins/Plugin.d.ts +7 -0
- package/dist/plugins/Plugin.d.ts.map +1 -1
- package/dist/plugins/PluginContextFactory.d.ts +6 -0
- package/dist/plugins/PluginContextFactory.d.ts.map +1 -1
- package/dist/plugins/PluginManager.d.ts +5 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -1
- package/dist/plugins/RegistrationTracker.d.ts.map +1 -1
- package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
- package/dist/plugins/alignment.mjs +1 -1
- package/dist/plugins/bidi-isolation/BidiIsolationPlugin.d.ts.map +1 -1
- package/dist/plugins/bidi-isolation.mjs +1 -1
- package/dist/plugins/blockquote/BlockquoteKeyboardHandlers.d.ts +1 -1
- package/dist/plugins/blockquote/BlockquoteKeyboardHandlers.d.ts.map +1 -1
- package/dist/plugins/blockquote/BlockquotePlugin.d.ts +13 -3
- package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
- package/dist/plugins/blockquote/BlockquoteStyles.d.ts +1 -1
- package/dist/plugins/blockquote/BlockquoteStyles.d.ts.map +1 -1
- package/dist/plugins/blockquote.mjs +1 -1
- package/dist/plugins/caret-navigation.mjs +1 -1
- package/dist/plugins/code-block/AutoPairController.d.ts +50 -0
- package/dist/plugins/code-block/AutoPairController.d.ts.map +1 -0
- package/dist/plugins/code-block/BracketPairing.d.ts +49 -0
- package/dist/plugins/code-block/BracketPairing.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockDecorations.d.ts +16 -0
- package/dist/plugins/code-block/CodeBlockDecorations.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockHighlighting.d.ts +10 -0
- package/dist/plugins/code-block/CodeBlockHighlighting.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts +11 -2
- package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockLocale.d.ts +4 -0
- package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts +4 -14
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockSchema.d.ts +11 -0
- package/dist/plugins/code-block/CodeBlockSchema.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockTypes.d.ts +66 -0
- package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
- package/dist/plugins/code-block/IndentHelpers.d.ts +71 -0
- package/dist/plugins/code-block/IndentHelpers.d.ts.map +1 -0
- package/dist/plugins/code-block/PairStack.d.ts +37 -0
- package/dist/plugins/code-block/PairStack.d.ts.map +1 -0
- package/dist/plugins/code-block/TokenCache.d.ts +21 -0
- package/dist/plugins/code-block/TokenCache.d.ts.map +1 -0
- package/dist/plugins/code-block/highlighter/RegexTokenizer.d.ts.map +1 -1
- package/dist/plugins/code-block/highlighter/TokenIteration.d.ts +18 -0
- package/dist/plugins/code-block/highlighter/TokenIteration.d.ts.map +1 -0
- package/dist/plugins/code-block/highlighter/languages/index.d.ts +1 -0
- package/dist/plugins/code-block/highlighter/languages/index.d.ts.map +1 -1
- package/dist/plugins/code-block/highlighter/languages/java.d.ts.map +1 -1
- package/dist/plugins/code-block/highlighter/languages/typescript.d.ts +3 -0
- package/dist/plugins/code-block/highlighter/languages/typescript.d.ts.map +1 -0
- package/dist/plugins/code-block/index.d.ts +1 -0
- package/dist/plugins/code-block/index.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/ar.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/de.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/es.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/fr.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/hi.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/pt.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/ru.d.ts.map +1 -1
- package/dist/plugins/code-block/locales/zh.d.ts.map +1 -1
- package/dist/plugins/code-block.mjs +1 -1
- package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
- package/dist/plugins/font-size/FontSizeOperations.d.ts +7 -3
- package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -1
- package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
- package/dist/plugins/font-size.mjs +1 -1
- package/dist/plugins/font.mjs +1 -1
- package/dist/plugins/formula/DisplayMathNodeSpec.d.ts +5 -0
- package/dist/plugins/formula/DisplayMathNodeSpec.d.ts.map +1 -0
- package/dist/plugins/formula/DisplayMathNodeView.d.ts +12 -0
- package/dist/plugins/formula/DisplayMathNodeView.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaCommands.d.ts +35 -0
- package/dist/plugins/formula/FormulaCommands.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaEditTrigger.d.ts +12 -0
- package/dist/plugins/formula/FormulaEditTrigger.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaEditorMount.d.ts +19 -0
- package/dist/plugins/formula/FormulaEditorMount.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaInputRules.d.ts +4 -0
- package/dist/plugins/formula/FormulaInputRules.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaLocale.d.ts +45 -0
- package/dist/plugins/formula/FormulaLocale.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaOverlay.d.ts +38 -0
- package/dist/plugins/formula/FormulaOverlay.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaPasteInterceptor.d.ts +10 -0
- package/dist/plugins/formula/FormulaPasteInterceptor.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaPlugin.d.ts +22 -0
- package/dist/plugins/formula/FormulaPlugin.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaRendering.d.ts +18 -0
- package/dist/plugins/formula/FormulaRendering.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaStyles.d.ts +12 -0
- package/dist/plugins/formula/FormulaStyles.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaToolbar.d.ts +5 -0
- package/dist/plugins/formula/FormulaToolbar.d.ts.map +1 -0
- package/dist/plugins/formula/FormulaTypes.d.ts +64 -0
- package/dist/plugins/formula/FormulaTypes.d.ts.map +1 -0
- package/dist/plugins/formula/InlineMathNodeSpec.d.ts +5 -0
- package/dist/plugins/formula/InlineMathNodeSpec.d.ts.map +1 -0
- package/dist/plugins/formula/MathFont.d.ts +4 -0
- package/dist/plugins/formula/MathFont.d.ts.map +1 -0
- package/dist/plugins/formula/MathFontFace.d.ts +4 -0
- package/dist/plugins/formula/MathFontFace.d.ts.map +1 -0
- package/dist/plugins/formula/index.d.ts +14 -0
- package/dist/plugins/formula/index.d.ts.map +1 -0
- package/dist/plugins/formula/latex/LatexParser.d.ts +8 -0
- package/dist/plugins/formula/latex/LatexParser.d.ts.map +1 -0
- package/dist/plugins/formula/latex/LatexParserTypes.d.ts +61 -0
- package/dist/plugins/formula/latex/LatexParserTypes.d.ts.map +1 -0
- package/dist/plugins/formula/latex/LatexSymbols.d.ts +87 -0
- package/dist/plugins/formula/latex/LatexSymbols.d.ts.map +1 -0
- package/dist/plugins/formula/latex/LatexToMathML.d.ts +33 -0
- package/dist/plugins/formula/latex/LatexToMathML.d.ts.map +1 -0
- package/dist/plugins/formula/latex/LatexTokenizer.d.ts +45 -0
- package/dist/plugins/formula/latex/LatexTokenizer.d.ts.map +1 -0
- package/dist/plugins/formula/latex/MathAlphabet.d.ts +42 -0
- package/dist/plugins/formula/latex/MathAlphabet.d.ts.map +1 -0
- package/dist/plugins/formula/latex/handlers/Accents.d.ts +6 -0
- package/dist/plugins/formula/latex/handlers/Accents.d.ts.map +1 -0
- package/dist/plugins/formula/latex/handlers/Delimiters.d.ts +12 -0
- package/dist/plugins/formula/latex/handlers/Delimiters.d.ts.map +1 -0
- package/dist/plugins/formula/latex/handlers/Environments.d.ts +9 -0
- package/dist/plugins/formula/latex/handlers/Environments.d.ts.map +1 -0
- package/dist/plugins/formula/latex/handlers/Fonts.d.ts +6 -0
- package/dist/plugins/formula/latex/handlers/Fonts.d.ts.map +1 -0
- package/dist/plugins/formula/latex/handlers/Spacing.d.ts +13 -0
- package/dist/plugins/formula/latex/handlers/Spacing.d.ts.map +1 -0
- package/dist/plugins/formula/latex/handlers/Structures.d.ts +19 -0
- package/dist/plugins/formula/latex/handlers/Structures.d.ts.map +1 -0
- package/dist/plugins/formula/latex/index.d.ts +11 -0
- package/dist/plugins/formula/latex/index.d.ts.map +1 -0
- package/dist/plugins/formula/locales/ar.d.ts +4 -0
- package/dist/plugins/formula/locales/ar.d.ts.map +1 -0
- package/dist/plugins/formula/locales/de.d.ts +4 -0
- package/dist/plugins/formula/locales/de.d.ts.map +1 -0
- package/dist/plugins/formula/locales/es.d.ts +4 -0
- package/dist/plugins/formula/locales/es.d.ts.map +1 -0
- package/dist/plugins/formula/locales/fr.d.ts +4 -0
- package/dist/plugins/formula/locales/fr.d.ts.map +1 -0
- package/dist/plugins/formula/locales/hi.d.ts +4 -0
- package/dist/plugins/formula/locales/hi.d.ts.map +1 -0
- package/dist/plugins/formula/locales/pt.d.ts +4 -0
- package/dist/plugins/formula/locales/pt.d.ts.map +1 -0
- package/dist/plugins/formula/locales/ru.d.ts +4 -0
- package/dist/plugins/formula/locales/ru.d.ts.map +1 -0
- package/dist/plugins/formula/locales/zh.d.ts +4 -0
- package/dist/plugins/formula/locales/zh.d.ts.map +1 -0
- package/dist/plugins/formula/math-field/MathField.d.ts +45 -0
- package/dist/plugins/formula/math-field/MathField.d.ts.map +1 -0
- package/dist/plugins/formula/math-field/MathFieldTypes.d.ts +73 -0
- package/dist/plugins/formula/math-field/MathFieldTypes.d.ts.map +1 -0
- package/dist/plugins/formula/math-field/MathPalette.d.ts +16 -0
- package/dist/plugins/formula/math-field/MathPalette.d.ts.map +1 -0
- package/dist/plugins/formula/math-field/MathPaletteData.d.ts +15 -0
- package/dist/plugins/formula/math-field/MathPaletteData.d.ts.map +1 -0
- package/dist/plugins/formula/math-field/index.d.ts +9 -0
- package/dist/plugins/formula/math-field/index.d.ts.map +1 -0
- package/dist/plugins/formula/mathml/MathMLBuilder.d.ts +58 -0
- package/dist/plugins/formula/mathml/MathMLBuilder.d.ts.map +1 -0
- package/dist/plugins/formula/mathml/MathMLDocument.d.ts +54 -0
- package/dist/plugins/formula/mathml/MathMLDocument.d.ts.map +1 -0
- package/dist/plugins/formula/mathml/MathMLSanitize.d.ts +15 -0
- package/dist/plugins/formula/mathml/MathMLSanitize.d.ts.map +1 -0
- package/dist/plugins/formula/mathml/index.d.ts +8 -0
- package/dist/plugins/formula/mathml/index.d.ts.map +1 -0
- package/dist/plugins/formula.mjs +1 -0
- 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/HighlightPalette.d.ts +7 -0
- package/dist/plugins/highlight/HighlightPalette.d.ts.map +1 -0
- package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
- package/dist/plugins/highlight.mjs +1 -1
- package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
- package/dist/plugins/horizontal-rule.mjs +1 -1
- package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
- package/dist/plugins/image/ImageNodeView.d.ts.map +1 -1
- package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
- package/dist/plugins/image/ImagePopup.d.ts.map +1 -1
- package/dist/plugins/image/ImagePopupStyles.d.ts +3 -0
- package/dist/plugins/image/ImagePopupStyles.d.ts.map +1 -0
- package/dist/plugins/image.mjs +1 -1
- package/dist/plugins/inline-code/InlineCodePlugin.d.ts +1 -4
- package/dist/plugins/inline-code/InlineCodePlugin.d.ts.map +1 -1
- package/dist/plugins/inline-code.mjs +1 -1
- package/dist/plugins/language/bundles/JavaSupport.d.ts.map +1 -1
- package/dist/plugins/language/bundles/TypeScriptSupport.d.ts +3 -0
- package/dist/plugins/language/bundles/TypeScriptSupport.d.ts.map +1 -0
- package/dist/plugins/language/bundles/index.d.ts +1 -0
- package/dist/plugins/language/bundles/index.d.ts.map +1 -1
- package/dist/plugins/language/index.d.ts +1 -1
- package/dist/plugins/language/index.d.ts.map +1 -1
- package/dist/plugins/language.mjs +1 -1
- package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
- package/dist/plugins/link.mjs +1 -1
- package/dist/plugins/list.mjs +1 -1
- package/dist/plugins/print.mjs +1 -1
- package/dist/plugins/shared/InlineStyleMarkSpec.d.ts +22 -0
- package/dist/plugins/shared/InlineStyleMarkSpec.d.ts.map +1 -0
- package/dist/plugins/shared/NodeSpecPatching.d.ts +16 -0
- package/dist/plugins/shared/NodeSpecPatching.d.ts.map +1 -0
- package/dist/plugins/shared/PluginHelpers.d.ts +8 -0
- package/dist/plugins/shared/PluginHelpers.d.ts.map +1 -1
- package/dist/plugins/shared/PopupManager.d.ts.map +1 -1
- package/dist/plugins/shared/PopupPositioning.d.ts +20 -0
- package/dist/plugins/shared/PopupPositioning.d.ts.map +1 -1
- package/dist/plugins/shared/SimpleMark.d.ts +22 -0
- package/dist/plugins/shared/SimpleMark.d.ts.map +1 -0
- package/dist/plugins/shared.mjs +1 -1
- package/dist/plugins/smart-paste/detectors/DetectionScorer.d.ts +17 -0
- package/dist/plugins/smart-paste/detectors/DetectionScorer.d.ts.map +1 -0
- package/dist/plugins/smart-paste/detectors/LexerDetector.d.ts +36 -0
- package/dist/plugins/smart-paste/detectors/LexerDetector.d.ts.map +1 -0
- package/dist/plugins/smart-paste/detectors/TokenStats.d.ts +44 -0
- package/dist/plugins/smart-paste/detectors/TokenStats.d.ts.map +1 -0
- package/dist/plugins/smart-paste/index.d.ts +3 -1
- package/dist/plugins/smart-paste/index.d.ts.map +1 -1
- package/dist/plugins/smart-paste.mjs +1 -1
- package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +0 -4
- package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
- package/dist/plugins/strikethrough.mjs +1 -1
- package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
- package/dist/plugins/super-sub.mjs +1 -1
- package/dist/plugins/table/TableCommands.d.ts.map +1 -1
- package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
- package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
- package/dist/plugins/table.mjs +1 -1
- package/dist/plugins/text-color/TextColorPalette.d.ts +6 -0
- package/dist/plugins/text-color/TextColorPalette.d.ts.map +1 -0
- package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
- package/dist/plugins/text-color.mjs +1 -1
- package/dist/plugins/text-direction/TextDirectionPlugin.d.ts.map +1 -1
- package/dist/plugins/text-direction-auto.mjs +1 -1
- package/dist/plugins/text-direction.mjs +1 -1
- package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
- package/dist/plugins/text-formatting.mjs +1 -1
- package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +14 -1
- package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -1
- package/dist/plugins/toolbar/ToolbarPlugin.d.ts +13 -1
- package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
- package/dist/plugins/toolbar/ToolbarRenderers.d.ts.map +1 -1
- package/dist/plugins/toolbar/index.d.ts +1 -1
- package/dist/plugins/toolbar/index.d.ts.map +1 -1
- package/dist/plugins/toolbar.mjs +1 -1
- package/dist/plugins/video/VideoCommands.d.ts +62 -0
- package/dist/plugins/video/VideoCommands.d.ts.map +1 -0
- package/dist/plugins/video/VideoEditOverlay.d.ts +30 -0
- package/dist/plugins/video/VideoEditOverlay.d.ts.map +1 -0
- package/dist/plugins/video/VideoEmbedPrompt.d.ts +18 -0
- package/dist/plugins/video/VideoEmbedPrompt.d.ts.map +1 -0
- package/dist/plugins/video/VideoFacade.d.ts +46 -0
- package/dist/plugins/video/VideoFacade.d.ts.map +1 -0
- package/dist/plugins/video/VideoLocale.d.ts +53 -0
- package/dist/plugins/video/VideoLocale.d.ts.map +1 -0
- package/dist/plugins/video/VideoNodeSpec.d.ts +24 -0
- package/dist/plugins/video/VideoNodeSpec.d.ts.map +1 -0
- package/dist/plugins/video/VideoNodeView.d.ts +16 -0
- package/dist/plugins/video/VideoNodeView.d.ts.map +1 -0
- package/dist/plugins/video/VideoPasteInterceptor.d.ts +9 -0
- package/dist/plugins/video/VideoPasteInterceptor.d.ts.map +1 -0
- package/dist/plugins/video/VideoPlugin.d.ts +31 -0
- package/dist/plugins/video/VideoPlugin.d.ts.map +1 -0
- package/dist/plugins/video/VideoPopup.d.ts +28 -0
- package/dist/plugins/video/VideoPopup.d.ts.map +1 -0
- package/dist/plugins/video/VideoPopupStyles.d.ts +3 -0
- package/dist/plugins/video/VideoPopupStyles.d.ts.map +1 -0
- package/dist/plugins/video/VideoProviders.d.ts +98 -0
- package/dist/plugins/video/VideoProviders.d.ts.map +1 -0
- package/dist/plugins/video/VideoResize.d.ts +35 -0
- package/dist/plugins/video/VideoResize.d.ts.map +1 -0
- package/dist/plugins/video/VideoSanitizeHook.d.ts +23 -0
- package/dist/plugins/video/VideoSanitizeHook.d.ts.map +1 -0
- package/dist/plugins/video/VideoSelectionToolbar.d.ts +20 -0
- package/dist/plugins/video/VideoSelectionToolbar.d.ts.map +1 -0
- package/dist/plugins/video/VideoStyles.d.ts +3 -0
- package/dist/plugins/video/VideoStyles.d.ts.map +1 -0
- package/dist/plugins/video/VideoTypes.d.ts +102 -0
- package/dist/plugins/video/VideoTypes.d.ts.map +1 -0
- package/dist/plugins/video/VideoViewHelpers.d.ts +13 -0
- package/dist/plugins/video/VideoViewHelpers.d.ts.map +1 -0
- package/dist/plugins/video/index.d.ts +6 -0
- package/dist/plugins/video/index.d.ts.map +1 -0
- package/dist/plugins/video/locales/ar.d.ts +4 -0
- package/dist/plugins/video/locales/ar.d.ts.map +1 -0
- package/dist/plugins/video/locales/de.d.ts +4 -0
- package/dist/plugins/video/locales/de.d.ts.map +1 -0
- package/dist/plugins/video/locales/es.d.ts +4 -0
- package/dist/plugins/video/locales/es.d.ts.map +1 -0
- package/dist/plugins/video/locales/fr.d.ts +4 -0
- package/dist/plugins/video/locales/fr.d.ts.map +1 -0
- package/dist/plugins/video/locales/hi.d.ts +4 -0
- package/dist/plugins/video/locales/hi.d.ts.map +1 -0
- package/dist/plugins/video/locales/pt.d.ts +4 -0
- package/dist/plugins/video/locales/pt.d.ts.map +1 -0
- package/dist/plugins/video/locales/ru.d.ts +4 -0
- package/dist/plugins/video/locales/ru.d.ts.map +1 -0
- package/dist/plugins/video/locales/zh.d.ts +4 -0
- package/dist/plugins/video/locales/zh.d.ts.map +1 -0
- package/dist/plugins/video.mjs +1 -0
- package/dist/presets/FullPreset.d.ts +1 -1
- package/dist/presets/FullPreset.d.ts.map +1 -1
- package/dist/presets/PresetTypes.d.ts +4 -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/CSSClassCollector.d.ts.map +1 -1
- package/dist/serialization/ContentHTMLTypes.d.ts +19 -1
- package/dist/serialization/ContentHTMLTypes.d.ts.map +1 -1
- package/dist/serialization/DocumentParser.d.ts.map +1 -1
- package/dist/serialization/DocumentSerializer.d.ts +3 -3
- package/dist/serialization/DocumentSerializer.d.ts.map +1 -1
- package/dist/serialization/HTMLWhitespace.d.ts +22 -0
- package/dist/serialization/HTMLWhitespace.d.ts.map +1 -0
- package/dist/serialization/MarkSerializer.d.ts.map +1 -1
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/state/BlockTreeOps.d.ts +8 -1
- package/dist/state/BlockTreeOps.d.ts.map +1 -1
- package/dist/state/EditorState.d.ts.map +1 -1
- package/dist/state/History.d.ts +20 -0
- package/dist/state/History.d.ts.map +1 -1
- package/dist/state/InlineContentOps.d.ts +30 -0
- package/dist/state/InlineContentOps.d.ts.map +1 -1
- package/dist/state/Mapping.d.ts +261 -0
- package/dist/state/Mapping.d.ts.map +1 -0
- package/dist/state/NavigationQueries.d.ts +11 -0
- package/dist/state/NavigationQueries.d.ts.map +1 -1
- package/dist/state/SelectionMapping.d.ts +25 -0
- package/dist/state/SelectionMapping.d.ts.map +1 -0
- package/dist/state/StepApplication.d.ts +20 -3
- package/dist/state/StepApplication.d.ts.map +1 -1
- package/dist/state/StepHandlers.d.ts +68 -0
- package/dist/state/StepHandlers.d.ts.map +1 -0
- package/dist/state/StepInversion.d.ts +22 -5
- package/dist/state/StepInversion.d.ts.map +1 -1
- package/dist/state/StepMapping.d.ts +18 -0
- package/dist/state/StepMapping.d.ts.map +1 -0
- package/dist/state/StepMaps.d.ts +25 -0
- package/dist/state/StepMaps.d.ts.map +1 -0
- package/dist/state/Steps.d.ts +38 -0
- package/dist/state/Steps.d.ts.map +1 -1
- package/dist/state/Transaction.d.ts +25 -1
- package/dist/state/Transaction.d.ts.map +1 -1
- package/dist/state/TransactionBuilder.d.ts +51 -7
- package/dist/state/TransactionBuilder.d.ts.map +1 -1
- package/dist/test/TestUtils.d.ts +3 -1
- package/dist/test/TestUtils.d.ts.map +1 -1
- package/dist/view/CaretNavigation.d.ts.map +1 -1
- package/dist/view/EditorView.d.ts.map +1 -1
- package/dist/view/SelectionSync.d.ts.map +1 -1
- package/dist/view/ViewMovementCommands.d.ts.map +1 -1
- package/package.json +16 -1
- package/dist/chunks/AlignmentPlugin-bqK6ze-E.mjs +0 -2
- package/dist/chunks/AlignmentPlugin-bqK6ze-E.mjs.map +0 -1
- package/dist/chunks/AttrRegistry-nDKtHK87.mjs +0 -2
- package/dist/chunks/AttrRegistry-nDKtHK87.mjs.map +0 -1
- package/dist/chunks/AttributedMarkCommands-35jTbVRg.mjs +0 -2
- package/dist/chunks/AttributedMarkCommands-35jTbVRg.mjs.map +0 -1
- package/dist/chunks/BidiIsolationPlugin-SIKxfWXp.mjs +0 -2
- package/dist/chunks/BidiIsolationPlugin-SIKxfWXp.mjs.map +0 -1
- package/dist/chunks/BlockInsertion-DsnHLcvM.mjs +0 -2
- package/dist/chunks/BlockInsertion-DsnHLcvM.mjs.map +0 -1
- package/dist/chunks/BlockTypePickerRegistry-C_jLddOz.mjs +0 -2
- package/dist/chunks/BlockTypePickerRegistry-C_jLddOz.mjs.map +0 -1
- package/dist/chunks/BlockquotePlugin-BEaZSoVT.mjs +0 -2
- package/dist/chunks/BlockquotePlugin-BEaZSoVT.mjs.map +0 -1
- package/dist/chunks/CaretNavigationPlugin-DHl61oc6.mjs +0 -2
- package/dist/chunks/CaretNavigationPlugin-DHl61oc6.mjs.map +0 -1
- package/dist/chunks/CodeBlockPlugin-DglqiSNK.mjs +0 -2
- package/dist/chunks/CodeBlockPlugin-DglqiSNK.mjs.map +0 -1
- package/dist/chunks/ColorGrid-Czm0p2E9.mjs +0 -2
- package/dist/chunks/ColorGrid-Czm0p2E9.mjs.map +0 -1
- package/dist/chunks/ColorPickerPopup-CL-W380M.mjs +0 -2
- package/dist/chunks/ColorPickerPopup-CL-W380M.mjs.map +0 -1
- package/dist/chunks/ColorValidation-CiGxVsqd.mjs +0 -2
- package/dist/chunks/ColorValidation-CiGxVsqd.mjs.map +0 -1
- package/dist/chunks/CommandHelpers-DTlQcGv5.mjs +0 -2
- package/dist/chunks/CommandHelpers-DTlQcGv5.mjs.map +0 -1
- package/dist/chunks/Commands-BuYF23lf.mjs +0 -2
- package/dist/chunks/Commands-BuYF23lf.mjs.map +0 -1
- package/dist/chunks/Decoration-oeHDjWWq.mjs +0 -2
- package/dist/chunks/Decoration-oeHDjWWq.mjs.map +0 -1
- package/dist/chunks/DirectionDetection-Hun6-7ER.mjs +0 -2
- package/dist/chunks/DirectionDetection-Hun6-7ER.mjs.map +0 -1
- package/dist/chunks/DirectionIcons-CfaDcQ9a.mjs +0 -2
- package/dist/chunks/DirectionIcons-CfaDcQ9a.mjs.map +0 -1
- package/dist/chunks/Document-_qdGR4vh.mjs +0 -2
- package/dist/chunks/Document-_qdGR4vh.mjs.map +0 -1
- package/dist/chunks/DocumentParser-CyATBOz-.mjs +0 -2
- package/dist/chunks/DocumentParser-CyATBOz-.mjs.map +0 -1
- package/dist/chunks/FontPlugin-B-Sxa0UW.mjs +0 -2
- package/dist/chunks/FontPlugin-B-Sxa0UW.mjs.map +0 -1
- package/dist/chunks/FontSizePlugin-C1zlyXL2.mjs +0 -2
- package/dist/chunks/FontSizePlugin-C1zlyXL2.mjs.map +0 -1
- package/dist/chunks/GapCursorNavigation-BaXDnjFf.mjs +0 -2
- package/dist/chunks/GapCursorNavigation-BaXDnjFf.mjs.map +0 -1
- package/dist/chunks/GapCursorPlugin-nldun8cE.mjs +0 -2
- package/dist/chunks/GapCursorPlugin-nldun8cE.mjs.map +0 -1
- package/dist/chunks/HardBreakPlugin-DZRdsE15.mjs +0 -2
- package/dist/chunks/HardBreakPlugin-DZRdsE15.mjs.map +0 -1
- package/dist/chunks/HeadingPlugin-EPAmsEGt.mjs +0 -2
- package/dist/chunks/HeadingPlugin-EPAmsEGt.mjs.map +0 -1
- package/dist/chunks/HighlightPlugin-RN3l6pVJ.mjs +0 -2
- package/dist/chunks/HighlightPlugin-RN3l6pVJ.mjs.map +0 -1
- package/dist/chunks/HorizontalRulePlugin-BJPXzTtJ.mjs +0 -2
- package/dist/chunks/HorizontalRulePlugin-BJPXzTtJ.mjs.map +0 -1
- package/dist/chunks/ImagePlugin-CCEevNfJ.mjs +0 -2
- package/dist/chunks/ImagePlugin-CCEevNfJ.mjs.map +0 -1
- package/dist/chunks/InlineCodePlugin-B7IOgUSI.mjs +0 -2
- package/dist/chunks/InlineCodePlugin-B7IOgUSI.mjs.map +0 -1
- package/dist/chunks/KeyboardNav-CsdlWnNl.mjs +0 -2
- package/dist/chunks/KeyboardNav-CsdlWnNl.mjs.map +0 -1
- package/dist/chunks/LinkPlugin-Bhwg24lH.mjs +0 -2
- package/dist/chunks/LinkPlugin-Bhwg24lH.mjs.map +0 -1
- package/dist/chunks/ListPlugin-BkG6UO4x.mjs +0 -2
- package/dist/chunks/ListPlugin-BkG6UO4x.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-DVPpO5nC.mjs +0 -2
- package/dist/chunks/NodeResolver-DVPpO5nC.mjs.map +0 -1
- package/dist/chunks/NodeSelectionCommands-Ddxu5Qck.mjs +0 -2
- package/dist/chunks/NodeSelectionCommands-Ddxu5Qck.mjs.map +0 -1
- package/dist/chunks/Platform-D9TRT4Mn.mjs +0 -2
- package/dist/chunks/Platform-D9TRT4Mn.mjs.map +0 -1
- package/dist/chunks/PluginHelpers-D-MvWR98.mjs +0 -2
- package/dist/chunks/PluginHelpers-D-MvWR98.mjs.map +0 -1
- package/dist/chunks/PopupKeyboardPatterns-DQdL7RHx.mjs +0 -2
- package/dist/chunks/PopupKeyboardPatterns-DQdL7RHx.mjs.map +0 -1
- package/dist/chunks/PopupManager-CxPzNm-P.mjs +0 -2
- package/dist/chunks/PopupManager-CxPzNm-P.mjs.map +0 -1
- package/dist/chunks/PopupPositioning-DRNwWB0U.mjs +0 -2
- package/dist/chunks/PopupPositioning-DRNwWB0U.mjs.map +0 -1
- package/dist/chunks/PrintPlugin-DOk5IZRO.mjs +0 -2
- package/dist/chunks/PrintPlugin-DOk5IZRO.mjs.map +0 -1
- package/dist/chunks/PrintTypes-Drk6kLcl.mjs +0 -2
- package/dist/chunks/PrintTypes-Drk6kLcl.mjs.map +0 -1
- package/dist/chunks/RangeIterator-DytL1lUT.mjs +0 -2
- package/dist/chunks/RangeIterator-DytL1lUT.mjs.map +0 -1
- package/dist/chunks/ShortcutFormatting-DE6B8iGs.mjs +0 -2
- package/dist/chunks/ShortcutFormatting-DE6B8iGs.mjs.map +0 -1
- package/dist/chunks/SmartPastePlugin-DqKx94sH.mjs +0 -2
- package/dist/chunks/SmartPastePlugin-DqKx94sH.mjs.map +0 -1
- package/dist/chunks/StrikethroughPlugin-vYNzfxdy.mjs +0 -2
- package/dist/chunks/StrikethroughPlugin-vYNzfxdy.mjs.map +0 -1
- package/dist/chunks/StyleRuntime-D3d1XFFe.mjs +0 -2
- package/dist/chunks/StyleRuntime-D3d1XFFe.mjs.map +0 -1
- package/dist/chunks/SuperSubPlugin-BNsoXWHS.mjs +0 -2
- package/dist/chunks/SuperSubPlugin-BNsoXWHS.mjs.map +0 -1
- package/dist/chunks/SyntaxTokenTypes-CVUAMov0.mjs +0 -2
- package/dist/chunks/SyntaxTokenTypes-CVUAMov0.mjs.map +0 -1
- package/dist/chunks/TablePlugin-R-hmydrM.mjs +0 -2
- package/dist/chunks/TablePlugin-R-hmydrM.mjs.map +0 -1
- package/dist/chunks/TextColorPlugin-DQ-CB9cr.mjs +0 -2
- package/dist/chunks/TextColorPlugin-DQ-CB9cr.mjs.map +0 -1
- package/dist/chunks/TextDirectionAutoPlugin-kZ1tcu0d.mjs +0 -2
- package/dist/chunks/TextDirectionAutoPlugin-kZ1tcu0d.mjs.map +0 -1
- package/dist/chunks/TextDirectionPlugin-Bk3CkbYh.mjs +0 -2
- package/dist/chunks/TextDirectionPlugin-Bk3CkbYh.mjs.map +0 -1
- package/dist/chunks/TextDirectionService-DY4M8EwU.mjs +0 -2
- package/dist/chunks/TextDirectionService-DY4M8EwU.mjs.map +0 -1
- package/dist/chunks/TextFormattingPlugin-D13eP6nF.mjs +0 -2
- package/dist/chunks/TextFormattingPlugin-D13eP6nF.mjs.map +0 -1
- package/dist/chunks/ToolbarPlugin-DeH8n5d2.mjs +0 -2
- package/dist/chunks/ToolbarPlugin-DeH8n5d2.mjs.map +0 -1
- package/dist/chunks/TypedKeys-CU7aToqY.mjs +0 -2
- package/dist/chunks/TypedKeys-CU7aToqY.mjs.map +0 -1
- package/dist/chunks/WordBoundary-BE2u997Q.mjs +0 -2
- package/dist/chunks/WordBoundary-BE2u997Q.mjs.map +0 -1
- package/dist/chunks/XmlDetector-BtYxzBDa.mjs +0 -2
- package/dist/chunks/XmlDetector-BtYxzBDa.mjs.map +0 -1
- package/dist/chunks/XmlPatterns-DuP8GWVt.mjs +0 -2
- package/dist/chunks/XmlPatterns-DuP8GWVt.mjs.map +0 -1
- package/dist/chunks/XmlSupport-D54BdAJZ.mjs +0 -2
- package/dist/chunks/XmlSupport-D54BdAJZ.mjs.map +0 -1
- package/dist/chunks/ar-2Fkz_6nI.mjs +0 -2
- package/dist/chunks/ar-2Fkz_6nI.mjs.map +0 -1
- package/dist/chunks/ar-4ZPC8daa.mjs +0 -2
- package/dist/chunks/ar-4ZPC8daa.mjs.map +0 -1
- package/dist/chunks/ar-6I20_Djq.mjs +0 -2
- package/dist/chunks/ar-6I20_Djq.mjs.map +0 -1
- package/dist/chunks/ar-B7-Dm70S.mjs +0 -2
- package/dist/chunks/ar-B7-Dm70S.mjs.map +0 -1
- package/dist/chunks/ar-BRe0t96G.mjs +0 -2
- package/dist/chunks/ar-BRe0t96G.mjs.map +0 -1
- package/dist/chunks/ar-BnNyrtdi.mjs +0 -2
- package/dist/chunks/ar-BnNyrtdi.mjs.map +0 -1
- package/dist/chunks/ar-BsMfhWs5.mjs +0 -2
- package/dist/chunks/ar-BsMfhWs5.mjs.map +0 -1
- package/dist/chunks/ar-Bvja-bjE.mjs +0 -2
- package/dist/chunks/ar-Bvja-bjE.mjs.map +0 -1
- package/dist/chunks/ar-BxVbBvSa.mjs +0 -2
- package/dist/chunks/ar-BxVbBvSa.mjs.map +0 -1
- package/dist/chunks/ar-C5dW-co3.mjs +0 -2
- package/dist/chunks/ar-C5dW-co3.mjs.map +0 -1
- package/dist/chunks/ar-CARMr30L.mjs +0 -2
- package/dist/chunks/ar-CARMr30L.mjs.map +0 -1
- package/dist/chunks/ar-CB-pehGw.mjs +0 -2
- package/dist/chunks/ar-CB-pehGw.mjs.map +0 -1
- package/dist/chunks/ar-CEYgAxTM.mjs +0 -2
- package/dist/chunks/ar-CEYgAxTM.mjs.map +0 -1
- package/dist/chunks/ar-CO60qpZJ.mjs +0 -2
- package/dist/chunks/ar-CO60qpZJ.mjs.map +0 -1
- package/dist/chunks/ar-CtI_snUM.mjs +0 -2
- package/dist/chunks/ar-CtI_snUM.mjs.map +0 -1
- package/dist/chunks/ar-Cv1RQvhK.mjs +0 -2
- package/dist/chunks/ar-Cv1RQvhK.mjs.map +0 -1
- package/dist/chunks/ar-D5jV20Tu.mjs +0 -2
- package/dist/chunks/ar-D5jV20Tu.mjs.map +0 -1
- package/dist/chunks/ar-DJN9fQ7Z.mjs +0 -2
- package/dist/chunks/ar-DJN9fQ7Z.mjs.map +0 -1
- package/dist/chunks/ar-DPTsUnwA.mjs +0 -2
- package/dist/chunks/ar-DPTsUnwA.mjs.map +0 -1
- package/dist/chunks/ar-DZJIBD1Q.mjs +0 -2
- package/dist/chunks/ar-DZJIBD1Q.mjs.map +0 -1
- package/dist/chunks/ar-DkkbwV93.mjs +0 -2
- package/dist/chunks/ar-DkkbwV93.mjs.map +0 -1
- package/dist/chunks/ar-DmeMor8Y.mjs +0 -2
- package/dist/chunks/ar-DmeMor8Y.mjs.map +0 -1
- package/dist/chunks/ar-LnE7jPai.mjs +0 -2
- package/dist/chunks/ar-LnE7jPai.mjs.map +0 -1
- package/dist/chunks/ar-P3wW0fmA.mjs +0 -2
- package/dist/chunks/ar-P3wW0fmA.mjs.map +0 -1
- package/dist/chunks/ar-uum0DCfv.mjs +0 -2
- package/dist/chunks/ar-uum0DCfv.mjs.map +0 -1
- package/dist/chunks/color-picker-DlXhHBZ6.mjs +0 -2
- package/dist/chunks/color-picker-DlXhHBZ6.mjs.map +0 -1
- package/dist/chunks/de-8SHQu0rr.mjs +0 -2
- package/dist/chunks/de-8SHQu0rr.mjs.map +0 -1
- package/dist/chunks/de-B8a71A0X.mjs +0 -2
- package/dist/chunks/de-B8a71A0X.mjs.map +0 -1
- package/dist/chunks/de-B9weXoA1.mjs +0 -2
- package/dist/chunks/de-B9weXoA1.mjs.map +0 -1
- package/dist/chunks/de-BKm53tVU.mjs +0 -2
- package/dist/chunks/de-BKm53tVU.mjs.map +0 -1
- package/dist/chunks/de-BLWrnMfX.mjs +0 -2
- package/dist/chunks/de-BLWrnMfX.mjs.map +0 -1
- package/dist/chunks/de-BOujs1pF.mjs +0 -2
- package/dist/chunks/de-BOujs1pF.mjs.map +0 -1
- package/dist/chunks/de-B_1XleAG.mjs +0 -2
- package/dist/chunks/de-B_1XleAG.mjs.map +0 -1
- package/dist/chunks/de-BpmjrOMc.mjs +0 -2
- package/dist/chunks/de-BpmjrOMc.mjs.map +0 -1
- package/dist/chunks/de-C8OHD1fm.mjs +0 -2
- package/dist/chunks/de-C8OHD1fm.mjs.map +0 -1
- package/dist/chunks/de-CAVCXBBR.mjs +0 -2
- package/dist/chunks/de-CAVCXBBR.mjs.map +0 -1
- package/dist/chunks/de-CkMnuozT.mjs +0 -2
- package/dist/chunks/de-CkMnuozT.mjs.map +0 -1
- package/dist/chunks/de-CtDnvnnm.mjs +0 -2
- package/dist/chunks/de-CtDnvnnm.mjs.map +0 -1
- package/dist/chunks/de-Cz26vtXW.mjs +0 -2
- package/dist/chunks/de-Cz26vtXW.mjs.map +0 -1
- package/dist/chunks/de-D0BPSP3j.mjs +0 -2
- package/dist/chunks/de-D0BPSP3j.mjs.map +0 -1
- package/dist/chunks/de-D74v0paw.mjs +0 -2
- package/dist/chunks/de-D74v0paw.mjs.map +0 -1
- package/dist/chunks/de-DKj55F9g.mjs +0 -2
- package/dist/chunks/de-DKj55F9g.mjs.map +0 -1
- package/dist/chunks/de-DYuRb98l.mjs +0 -2
- package/dist/chunks/de-DYuRb98l.mjs.map +0 -1
- package/dist/chunks/de-DaK0-sdo.mjs +0 -2
- package/dist/chunks/de-DaK0-sdo.mjs.map +0 -1
- package/dist/chunks/de-Dia08Wsq.mjs +0 -2
- package/dist/chunks/de-Dia08Wsq.mjs.map +0 -1
- package/dist/chunks/de-Dp_uj2Z3.mjs +0 -2
- package/dist/chunks/de-Dp_uj2Z3.mjs.map +0 -1
- package/dist/chunks/de-DwX1CDNO.mjs +0 -2
- package/dist/chunks/de-DwX1CDNO.mjs.map +0 -1
- package/dist/chunks/de-DyF2mRfw.mjs +0 -2
- package/dist/chunks/de-DyF2mRfw.mjs.map +0 -1
- package/dist/chunks/de-X3BLBlF8.mjs +0 -2
- package/dist/chunks/de-X3BLBlF8.mjs.map +0 -1
- package/dist/chunks/de-dPC3Qk7N.mjs +0 -2
- package/dist/chunks/de-dPC3Qk7N.mjs.map +0 -1
- package/dist/chunks/de-pLGt5S7j.mjs +0 -2
- package/dist/chunks/de-pLGt5S7j.mjs.map +0 -1
- package/dist/chunks/es--xozZF4T.mjs +0 -2
- package/dist/chunks/es--xozZF4T.mjs.map +0 -1
- package/dist/chunks/es-2BjtTusm.mjs +0 -2
- package/dist/chunks/es-2BjtTusm.mjs.map +0 -1
- package/dist/chunks/es-B2rEK7_f.mjs +0 -2
- package/dist/chunks/es-B2rEK7_f.mjs.map +0 -1
- package/dist/chunks/es-B9esmUm1.mjs +0 -2
- package/dist/chunks/es-B9esmUm1.mjs.map +0 -1
- package/dist/chunks/es-BJxkHalP.mjs +0 -2
- package/dist/chunks/es-BJxkHalP.mjs.map +0 -1
- package/dist/chunks/es-BMKsnh3y.mjs +0 -2
- package/dist/chunks/es-BMKsnh3y.mjs.map +0 -1
- package/dist/chunks/es-BXFflrrU.mjs +0 -2
- package/dist/chunks/es-BXFflrrU.mjs.map +0 -1
- package/dist/chunks/es-BbX_lEEN.mjs +0 -2
- package/dist/chunks/es-BbX_lEEN.mjs.map +0 -1
- package/dist/chunks/es-BlHe_tc0.mjs +0 -2
- package/dist/chunks/es-BlHe_tc0.mjs.map +0 -1
- package/dist/chunks/es-Bu6nnEeT.mjs +0 -2
- package/dist/chunks/es-Bu6nnEeT.mjs.map +0 -1
- package/dist/chunks/es-Bx0CbUoY.mjs +0 -2
- package/dist/chunks/es-Bx0CbUoY.mjs.map +0 -1
- package/dist/chunks/es-CE9Tbsb7.mjs +0 -2
- package/dist/chunks/es-CE9Tbsb7.mjs.map +0 -1
- package/dist/chunks/es-COSomns3.mjs +0 -2
- package/dist/chunks/es-COSomns3.mjs.map +0 -1
- package/dist/chunks/es-C_7qthHu.mjs +0 -2
- package/dist/chunks/es-C_7qthHu.mjs.map +0 -1
- package/dist/chunks/es-CirfP3x1.mjs +0 -2
- package/dist/chunks/es-CirfP3x1.mjs.map +0 -1
- package/dist/chunks/es-CpF8eiPr.mjs +0 -2
- package/dist/chunks/es-CpF8eiPr.mjs.map +0 -1
- package/dist/chunks/es-D787y0ui.mjs +0 -2
- package/dist/chunks/es-D787y0ui.mjs.map +0 -1
- package/dist/chunks/es-D8iB5vwQ.mjs +0 -2
- package/dist/chunks/es-D8iB5vwQ.mjs.map +0 -1
- package/dist/chunks/es-DBb78XWu.mjs +0 -2
- package/dist/chunks/es-DBb78XWu.mjs.map +0 -1
- package/dist/chunks/es-DC6mYTD3.mjs +0 -2
- package/dist/chunks/es-DC6mYTD3.mjs.map +0 -1
- package/dist/chunks/es-Dh--mRZs.mjs +0 -2
- package/dist/chunks/es-Dh--mRZs.mjs.map +0 -1
- package/dist/chunks/es-DvPsYqFj.mjs +0 -2
- package/dist/chunks/es-DvPsYqFj.mjs.map +0 -1
- package/dist/chunks/es-DxXimuUa.mjs +0 -2
- package/dist/chunks/es-DxXimuUa.mjs.map +0 -1
- package/dist/chunks/es-mWJptxq3.mjs +0 -2
- package/dist/chunks/es-mWJptxq3.mjs.map +0 -1
- package/dist/chunks/es-qYV--o6U.mjs +0 -2
- package/dist/chunks/es-qYV--o6U.mjs.map +0 -1
- package/dist/chunks/fonts-CxtWyeNB.mjs +0 -2
- package/dist/chunks/fonts-CxtWyeNB.mjs.map +0 -1
- package/dist/chunks/fr--F426oao.mjs +0 -2
- package/dist/chunks/fr--F426oao.mjs.map +0 -1
- package/dist/chunks/fr-B0BPbbNB.mjs +0 -2
- package/dist/chunks/fr-B0BPbbNB.mjs.map +0 -1
- package/dist/chunks/fr-B4UQy0j-.mjs +0 -2
- package/dist/chunks/fr-B4UQy0j-.mjs.map +0 -1
- package/dist/chunks/fr-B4XLxkci.mjs +0 -2
- package/dist/chunks/fr-B4XLxkci.mjs.map +0 -1
- package/dist/chunks/fr-BC1Rfp9S.mjs +0 -2
- package/dist/chunks/fr-BC1Rfp9S.mjs.map +0 -1
- package/dist/chunks/fr-BRGGu0E2.mjs +0 -2
- package/dist/chunks/fr-BRGGu0E2.mjs.map +0 -1
- package/dist/chunks/fr-BoSz1pa9.mjs +0 -2
- package/dist/chunks/fr-BoSz1pa9.mjs.map +0 -1
- package/dist/chunks/fr-Bom3RFIN.mjs +0 -2
- package/dist/chunks/fr-Bom3RFIN.mjs.map +0 -1
- package/dist/chunks/fr-BtnwMUII.mjs +0 -2
- package/dist/chunks/fr-BtnwMUII.mjs.map +0 -1
- package/dist/chunks/fr-C6pglM3H.mjs +0 -2
- package/dist/chunks/fr-C6pglM3H.mjs.map +0 -1
- package/dist/chunks/fr-CDBpS6xE.mjs +0 -2
- package/dist/chunks/fr-CDBpS6xE.mjs.map +0 -1
- package/dist/chunks/fr-CN0ihkUg.mjs +0 -2
- package/dist/chunks/fr-CN0ihkUg.mjs.map +0 -1
- package/dist/chunks/fr-CNNBBeLM.mjs +0 -2
- package/dist/chunks/fr-CNNBBeLM.mjs.map +0 -1
- package/dist/chunks/fr-CVOY2y07.mjs +0 -2
- package/dist/chunks/fr-CVOY2y07.mjs.map +0 -1
- package/dist/chunks/fr-CZAbL_o0.mjs +0 -2
- package/dist/chunks/fr-CZAbL_o0.mjs.map +0 -1
- package/dist/chunks/fr-DJkPmQG_.mjs +0 -2
- package/dist/chunks/fr-DJkPmQG_.mjs.map +0 -1
- package/dist/chunks/fr-DkWdFDsR.mjs +0 -2
- package/dist/chunks/fr-DkWdFDsR.mjs.map +0 -1
- package/dist/chunks/fr-DnQHoPVo.mjs +0 -2
- package/dist/chunks/fr-DnQHoPVo.mjs.map +0 -1
- package/dist/chunks/fr-DsdueaiG.mjs +0 -2
- package/dist/chunks/fr-DsdueaiG.mjs.map +0 -1
- package/dist/chunks/fr-DxNdsa11.mjs +0 -2
- package/dist/chunks/fr-DxNdsa11.mjs.map +0 -1
- package/dist/chunks/fr-IO4_LYvE.mjs +0 -2
- package/dist/chunks/fr-IO4_LYvE.mjs.map +0 -1
- package/dist/chunks/fr-ZKDCEpww.mjs +0 -2
- package/dist/chunks/fr-ZKDCEpww.mjs.map +0 -1
- package/dist/chunks/fr-coufP_et.mjs +0 -2
- package/dist/chunks/fr-coufP_et.mjs.map +0 -1
- package/dist/chunks/fr-lYSOgOK7.mjs +0 -2
- package/dist/chunks/fr-lYSOgOK7.mjs.map +0 -1
- package/dist/chunks/fr-wobtRjcF.mjs +0 -2
- package/dist/chunks/fr-wobtRjcF.mjs.map +0 -1
- package/dist/chunks/full-5hGvv-bG.mjs +0 -2
- package/dist/chunks/full-5hGvv-bG.mjs.map +0 -1
- package/dist/chunks/hi-B0o90MFd.mjs +0 -2
- package/dist/chunks/hi-B0o90MFd.mjs.map +0 -1
- package/dist/chunks/hi-BFko34WG.mjs +0 -2
- package/dist/chunks/hi-BFko34WG.mjs.map +0 -1
- package/dist/chunks/hi-BVxSgaNT.mjs +0 -2
- package/dist/chunks/hi-BVxSgaNT.mjs.map +0 -1
- package/dist/chunks/hi-BirBQ5Ef.mjs +0 -2
- package/dist/chunks/hi-BirBQ5Ef.mjs.map +0 -1
- package/dist/chunks/hi-BnsbcSIX.mjs +0 -2
- package/dist/chunks/hi-BnsbcSIX.mjs.map +0 -1
- package/dist/chunks/hi-BoFuxLtG.mjs +0 -2
- package/dist/chunks/hi-BoFuxLtG.mjs.map +0 -1
- package/dist/chunks/hi-BptyTwAv.mjs +0 -2
- package/dist/chunks/hi-BptyTwAv.mjs.map +0 -1
- package/dist/chunks/hi-BulaYhi_.mjs +0 -2
- package/dist/chunks/hi-BulaYhi_.mjs.map +0 -1
- package/dist/chunks/hi-BzflHG6Y.mjs +0 -2
- package/dist/chunks/hi-BzflHG6Y.mjs.map +0 -1
- package/dist/chunks/hi-C7Hb-gQ_.mjs +0 -2
- package/dist/chunks/hi-C7Hb-gQ_.mjs.map +0 -1
- package/dist/chunks/hi-C_lY7kA9.mjs +0 -2
- package/dist/chunks/hi-C_lY7kA9.mjs.map +0 -1
- package/dist/chunks/hi-CkylXoIm.mjs +0 -2
- package/dist/chunks/hi-CkylXoIm.mjs.map +0 -1
- package/dist/chunks/hi-DGJTbrQi.mjs +0 -2
- package/dist/chunks/hi-DGJTbrQi.mjs.map +0 -1
- package/dist/chunks/hi-DGJgX0fG.mjs +0 -2
- package/dist/chunks/hi-DGJgX0fG.mjs.map +0 -1
- package/dist/chunks/hi-DKDYpjdr.mjs +0 -2
- package/dist/chunks/hi-DKDYpjdr.mjs.map +0 -1
- package/dist/chunks/hi-DfAX8S-T.mjs +0 -2
- package/dist/chunks/hi-DfAX8S-T.mjs.map +0 -1
- package/dist/chunks/hi-Dhq91ipt.mjs +0 -2
- package/dist/chunks/hi-Dhq91ipt.mjs.map +0 -1
- package/dist/chunks/hi-Dup389dM.mjs +0 -2
- package/dist/chunks/hi-Dup389dM.mjs.map +0 -1
- package/dist/chunks/hi-DzRFsYYN.mjs +0 -2
- package/dist/chunks/hi-DzRFsYYN.mjs.map +0 -1
- package/dist/chunks/hi-ObZRwITd.mjs +0 -2
- package/dist/chunks/hi-ObZRwITd.mjs.map +0 -1
- package/dist/chunks/hi-VvUzjfH_.mjs +0 -2
- package/dist/chunks/hi-VvUzjfH_.mjs.map +0 -1
- package/dist/chunks/hi-jWQDQkOX.mjs +0 -2
- package/dist/chunks/hi-jWQDQkOX.mjs.map +0 -1
- package/dist/chunks/hi-l3hIrp8J.mjs +0 -2
- package/dist/chunks/hi-l3hIrp8J.mjs.map +0 -1
- package/dist/chunks/hi-o8Gsu5Ly.mjs +0 -2
- package/dist/chunks/hi-o8Gsu5Ly.mjs.map +0 -1
- package/dist/chunks/hi-sxC2nk3h.mjs +0 -2
- package/dist/chunks/hi-sxC2nk3h.mjs.map +0 -1
- package/dist/chunks/minimal-pBhi4EJI.mjs +0 -2
- package/dist/chunks/minimal-pBhi4EJI.mjs.map +0 -1
- package/dist/chunks/pt--57Ug7ig.mjs +0 -2
- package/dist/chunks/pt--57Ug7ig.mjs.map +0 -1
- package/dist/chunks/pt-4j8Km9Db.mjs +0 -2
- package/dist/chunks/pt-4j8Km9Db.mjs.map +0 -1
- package/dist/chunks/pt-BTGFKCns.mjs +0 -2
- package/dist/chunks/pt-BTGFKCns.mjs.map +0 -1
- package/dist/chunks/pt-BU8Qfuoz.mjs +0 -2
- package/dist/chunks/pt-BU8Qfuoz.mjs.map +0 -1
- package/dist/chunks/pt-BYAOJxIB.mjs +0 -2
- package/dist/chunks/pt-BYAOJxIB.mjs.map +0 -1
- package/dist/chunks/pt-BjNWQm9A.mjs +0 -2
- package/dist/chunks/pt-BjNWQm9A.mjs.map +0 -1
- package/dist/chunks/pt-Bvnb_NpT.mjs +0 -2
- package/dist/chunks/pt-Bvnb_NpT.mjs.map +0 -1
- package/dist/chunks/pt-C2pkn7vo.mjs +0 -2
- package/dist/chunks/pt-C2pkn7vo.mjs.map +0 -1
- package/dist/chunks/pt-C8MhLnWx.mjs +0 -2
- package/dist/chunks/pt-C8MhLnWx.mjs.map +0 -1
- package/dist/chunks/pt-CJfYLSTe.mjs +0 -2
- package/dist/chunks/pt-CJfYLSTe.mjs.map +0 -1
- package/dist/chunks/pt-CdwVIYOK.mjs +0 -2
- package/dist/chunks/pt-CdwVIYOK.mjs.map +0 -1
- package/dist/chunks/pt-CwrVo90O.mjs +0 -2
- package/dist/chunks/pt-CwrVo90O.mjs.map +0 -1
- package/dist/chunks/pt-DD26CKCA.mjs +0 -2
- package/dist/chunks/pt-DD26CKCA.mjs.map +0 -1
- package/dist/chunks/pt-DLbf6uoo.mjs +0 -2
- package/dist/chunks/pt-DLbf6uoo.mjs.map +0 -1
- package/dist/chunks/pt-DNyNHwKh.mjs +0 -2
- package/dist/chunks/pt-DNyNHwKh.mjs.map +0 -1
- package/dist/chunks/pt-DVfMAcXb.mjs +0 -2
- package/dist/chunks/pt-DVfMAcXb.mjs.map +0 -1
- package/dist/chunks/pt-DWSFad3n.mjs +0 -2
- package/dist/chunks/pt-DWSFad3n.mjs.map +0 -1
- package/dist/chunks/pt-DZXY4i4G.mjs +0 -2
- package/dist/chunks/pt-DZXY4i4G.mjs.map +0 -1
- package/dist/chunks/pt-DfUpRhK1.mjs +0 -2
- package/dist/chunks/pt-DfUpRhK1.mjs.map +0 -1
- package/dist/chunks/pt-DlvNEDeW.mjs +0 -2
- package/dist/chunks/pt-DlvNEDeW.mjs.map +0 -1
- package/dist/chunks/pt-DzFyGwB4.mjs +0 -2
- package/dist/chunks/pt-DzFyGwB4.mjs.map +0 -1
- package/dist/chunks/pt-HhQcARW6.mjs +0 -2
- package/dist/chunks/pt-HhQcARW6.mjs.map +0 -1
- package/dist/chunks/pt-SjvTF40s.mjs +0 -2
- package/dist/chunks/pt-SjvTF40s.mjs.map +0 -1
- package/dist/chunks/pt-ihNE0VQJ.mjs +0 -2
- package/dist/chunks/pt-ihNE0VQJ.mjs.map +0 -1
- package/dist/chunks/pt-zfCjhIgy.mjs +0 -2
- package/dist/chunks/pt-zfCjhIgy.mjs.map +0 -1
- package/dist/chunks/ru-0AHodbWv.mjs +0 -2
- package/dist/chunks/ru-0AHodbWv.mjs.map +0 -1
- package/dist/chunks/ru-2MDGmLw0.mjs +0 -2
- package/dist/chunks/ru-2MDGmLw0.mjs.map +0 -1
- package/dist/chunks/ru-3VfYKfTm.mjs +0 -2
- package/dist/chunks/ru-3VfYKfTm.mjs.map +0 -1
- package/dist/chunks/ru-B-gRJ6nQ.mjs +0 -2
- package/dist/chunks/ru-B-gRJ6nQ.mjs.map +0 -1
- package/dist/chunks/ru-B6ITUB-Y.mjs +0 -2
- package/dist/chunks/ru-B6ITUB-Y.mjs.map +0 -1
- package/dist/chunks/ru-BKDWkabk.mjs +0 -2
- package/dist/chunks/ru-BKDWkabk.mjs.map +0 -1
- package/dist/chunks/ru-BMxJsSe3.mjs +0 -2
- package/dist/chunks/ru-BMxJsSe3.mjs.map +0 -1
- package/dist/chunks/ru-Bep1iHQL.mjs +0 -2
- package/dist/chunks/ru-Bep1iHQL.mjs.map +0 -1
- package/dist/chunks/ru-Blj0nqoL.mjs +0 -2
- package/dist/chunks/ru-Blj0nqoL.mjs.map +0 -1
- package/dist/chunks/ru-BqnHkmii.mjs +0 -2
- package/dist/chunks/ru-BqnHkmii.mjs.map +0 -1
- package/dist/chunks/ru-C-4AaPUK.mjs +0 -2
- package/dist/chunks/ru-C-4AaPUK.mjs.map +0 -1
- package/dist/chunks/ru-C9Nv7JJI.mjs +0 -2
- package/dist/chunks/ru-C9Nv7JJI.mjs.map +0 -1
- package/dist/chunks/ru-CJFtr1Ks.mjs +0 -2
- package/dist/chunks/ru-CJFtr1Ks.mjs.map +0 -1
- package/dist/chunks/ru-CN63yWk_.mjs +0 -2
- package/dist/chunks/ru-CN63yWk_.mjs.map +0 -1
- package/dist/chunks/ru-CcFX97-2.mjs +0 -2
- package/dist/chunks/ru-CcFX97-2.mjs.map +0 -1
- package/dist/chunks/ru-D8PhWFSp.mjs +0 -2
- package/dist/chunks/ru-D8PhWFSp.mjs.map +0 -1
- package/dist/chunks/ru-DYAncidS.mjs +0 -2
- package/dist/chunks/ru-DYAncidS.mjs.map +0 -1
- package/dist/chunks/ru-D_zXo-FA.mjs +0 -2
- package/dist/chunks/ru-D_zXo-FA.mjs.map +0 -1
- package/dist/chunks/ru-DhSPV6m0.mjs +0 -2
- package/dist/chunks/ru-DhSPV6m0.mjs.map +0 -1
- package/dist/chunks/ru-LNbpjKCw.mjs +0 -2
- package/dist/chunks/ru-LNbpjKCw.mjs.map +0 -1
- package/dist/chunks/ru-LXi1ONW4.mjs +0 -2
- package/dist/chunks/ru-LXi1ONW4.mjs.map +0 -1
- package/dist/chunks/ru-db7wsWkx.mjs +0 -2
- package/dist/chunks/ru-db7wsWkx.mjs.map +0 -1
- package/dist/chunks/ru-nZ4BjiD0.mjs +0 -2
- package/dist/chunks/ru-nZ4BjiD0.mjs.map +0 -1
- package/dist/chunks/ru-v9zumXd2.mjs +0 -2
- package/dist/chunks/ru-v9zumXd2.mjs.map +0 -1
- package/dist/chunks/ru-wK2ytv3A.mjs +0 -2
- package/dist/chunks/ru-wK2ytv3A.mjs.map +0 -1
- package/dist/chunks/src-CNK6vpUU.mjs +0 -2
- package/dist/chunks/src-CNK6vpUU.mjs.map +0 -1
- package/dist/chunks/zh-9AcCSFm0.mjs +0 -2
- package/dist/chunks/zh-9AcCSFm0.mjs.map +0 -1
- package/dist/chunks/zh-B3bJCfdB.mjs +0 -2
- package/dist/chunks/zh-B3bJCfdB.mjs.map +0 -1
- package/dist/chunks/zh-B46Dt1h7.mjs +0 -2
- package/dist/chunks/zh-B46Dt1h7.mjs.map +0 -1
- package/dist/chunks/zh-BRy2B6Og.mjs +0 -2
- package/dist/chunks/zh-BRy2B6Og.mjs.map +0 -1
- package/dist/chunks/zh-BfYi8wB2.mjs +0 -2
- package/dist/chunks/zh-BfYi8wB2.mjs.map +0 -1
- package/dist/chunks/zh-C0I3L6NA.mjs +0 -2
- package/dist/chunks/zh-C0I3L6NA.mjs.map +0 -1
- package/dist/chunks/zh-C33e4gfg.mjs +0 -2
- package/dist/chunks/zh-C33e4gfg.mjs.map +0 -1
- package/dist/chunks/zh-C9sNwnC1.mjs +0 -2
- package/dist/chunks/zh-C9sNwnC1.mjs.map +0 -1
- package/dist/chunks/zh-CACr0qSo.mjs +0 -2
- package/dist/chunks/zh-CACr0qSo.mjs.map +0 -1
- package/dist/chunks/zh-CU0hd8zq.mjs +0 -2
- package/dist/chunks/zh-CU0hd8zq.mjs.map +0 -1
- package/dist/chunks/zh-CX2zUoWR.mjs +0 -2
- package/dist/chunks/zh-CX2zUoWR.mjs.map +0 -1
- package/dist/chunks/zh-CblZ-34H.mjs +0 -2
- package/dist/chunks/zh-CblZ-34H.mjs.map +0 -1
- package/dist/chunks/zh-CicpU0g8.mjs +0 -2
- package/dist/chunks/zh-CicpU0g8.mjs.map +0 -1
- package/dist/chunks/zh-Cr3KdEZV.mjs +0 -2
- package/dist/chunks/zh-Cr3KdEZV.mjs.map +0 -1
- package/dist/chunks/zh-D24dsCiw.mjs +0 -2
- package/dist/chunks/zh-D24dsCiw.mjs.map +0 -1
- package/dist/chunks/zh-DQtLxQ3s.mjs +0 -2
- package/dist/chunks/zh-DQtLxQ3s.mjs.map +0 -1
- package/dist/chunks/zh-DR1OF5vm.mjs +0 -2
- package/dist/chunks/zh-DR1OF5vm.mjs.map +0 -1
- package/dist/chunks/zh-DS82x1KL.mjs +0 -2
- package/dist/chunks/zh-DS82x1KL.mjs.map +0 -1
- package/dist/chunks/zh-DdJA-AEY.mjs +0 -2
- package/dist/chunks/zh-DdJA-AEY.mjs.map +0 -1
- package/dist/chunks/zh-DpVlDZ9n.mjs +0 -2
- package/dist/chunks/zh-DpVlDZ9n.mjs.map +0 -1
- package/dist/chunks/zh-OWVKcbVR.mjs +0 -2
- package/dist/chunks/zh-OWVKcbVR.mjs.map +0 -1
- package/dist/chunks/zh-d19V68ib.mjs +0 -2
- package/dist/chunks/zh-d19V68ib.mjs.map +0 -1
- package/dist/chunks/zh-fSMt1FnB.mjs +0 -2
- package/dist/chunks/zh-fSMt1FnB.mjs.map +0 -1
- package/dist/chunks/zh-mLlk9Wki.mjs +0 -2
- package/dist/chunks/zh-mLlk9Wki.mjs.map +0 -1
- package/dist/chunks/zh-nnMt8E6m.mjs +0 -2
- package/dist/chunks/zh-nnMt8E6m.mjs.map +0 -1
- package/dist/input/InternalClipboard.d.ts +0 -13
- package/dist/input/InternalClipboard.d.ts.map +0 -1
- package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts +0 -7
- package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as t}from"./Platform-wPvKFB9m.mjs";import{o as e,s as o}from"./StyleRuntime-Bwde5icB.mjs";import{n}from"./TypedKeys-E3jOGByL.mjs";import{a as r,s as i}from"./PluginHelpers-C3aCCGfX.mjs";import{n as l,r as s,t as a}from"./KeyboardNav-DZXdTg-_.mjs";import{n as c,r as d,t as p}from"./PopupPositioning-BEnz90Oh.mjs";import{n as u,t as h}from"./PopupManager-DsT1uRWi.mjs";var b=class{_toolbarItems=/* @__PURE__ */new Map;_toolbarItemPluginMap=/* @__PURE__ */new Map;registerToolbarItem(t,e){if(this._toolbarItems.has(t.id))throw new Error(`ToolbarItem with id "${t.id}" is already registered.`);if(this._toolbarItems.set(t.id,t),e){const o=this._toolbarItemPluginMap.get(e)??[];o.push(t.id),this._toolbarItemPluginMap.set(e,o)}}getToolbarItemsByPlugin(t){const e=this._toolbarItemPluginMap.get(t)??[],o=[];for(const n of e){const t=this._toolbarItems.get(n);t&&o.push(t)}return o}getToolbarItem(t){return this._toolbarItems.get(t)}getToolbarItems(){return[...this._toolbarItems.values()]}removeToolbarItem(t){this._toolbarItems.delete(t);for(const[e,o]of this._toolbarItemPluginMap){const n=o.indexOf(t);if(-1!==n){o.splice(n,1),0===o.length&&this._toolbarItemPluginMap.delete(e);break}}}clear(){this._toolbarItems.clear(),this._toolbarItemPluginMap.clear()}};function m(t){for(let e=0;e<t.length;e++)if(!t[e]?.disabled)return e;return-1}var f={formattingOptionsAria:"Formatting options",moreToolsAria:"More tools",gridPickerLabel:(t,e)=>`${t} x ${e}`},v=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-Bymjd9Z_.mjs"),"./locales/de.ts":()=>import("./de-BibufNIa.mjs"),"./locales/es.ts":()=>import("./es-D19xfXus.mjs"),"./locales/fr.ts":()=>import("./fr-P7iY3ntE.mjs"),"./locales/hi.ts":()=>import("./hi-BMStjhJF.mjs"),"./locales/pt.ts":()=>import("./pt-Crmbkj0e.mjs"),"./locales/ru.ts":()=>import("./ru-CTaYpQ9_.mjs"),"./locales/zh.ts":()=>import("./zh-C_YS18re.mjs")});async function g(t){return i(v,t,f)}var w={BurgerMenu:"burger-menu",Flow:"flow",None:"none"},x="notectl-toolbar-btn--overflow-hidden",y="notectl-toolbar-separator--overflow-hidden",A="notectl-toolbar-group--overflow-hidden",E="notectl-toolbar-group",_="notectl-toolbar-separator",k=class{toolbar;context;onOverflowChange;onItemActivated;getActiveElement;ariaLabel;popupManager;entries=[];overflowButton=null;overflowDropdown=null;overflowHandle=null;overflowEntries=[];resizeObserver=null;closeHandler=null;closeHandlerTimer=null;closeHandlerAttached=!1;constructor(t){this.toolbar=t.toolbar,this.ariaLabel=t.ariaLabel,this.context=t.context,this.onOverflowChange=t.onOverflowChange,this.onItemActivated=t.onItemActivated,this.getActiveElement=t.getActiveElement,this.popupManager=t.popupManager??null,this.resizeObserver=new ResizeObserver(()=>this.recalculate()),this.resizeObserver.observe(this.toolbar)}update(t){this.entries=t.map(t=>({element:t.element,item:t.item})),this.recalculate()}recalculate(){if(0===this.entries.length)return;this.closeDropdown(),this.resetVisibility(),this.ensureOverflowButton(),this.setOverflowButtonVisible(!1);const t=this.measureAvailableWidth(),e=Array.from(this.toolbar.children),o=this.measureChildWidths(e),n=t-34-2;let r=0,i=!1;const l=[];for(const s of e){if(s===this.overflowButton)continue;if(s.classList.contains(_)){const t=(o.get(s)??0)+2;i||r+t>n?(i=!0,s.classList.add(y)):r+=t;continue}if(s.classList.contains(E)){const t=(o.get(s)??0)+2,e=this.entriesInside(s);i||r+t>n?(i=!0,this.hideGroup(s,e,l)):r+=t;continue}const t=this.entries.find(t=>t.element===s);if(!t)continue;const e=(o.get(s)??0)+2;i||r+e>n?(i=!0,t.element.classList.add(x),l.push(t)):r+=e}this.overflowEntries=l,this.hideTrailingSeparators(),this.setOverflowButtonVisible(l.length>0),this.notifyChange()}hideGroup(t,e,o){t.classList.add(A);for(const n of e)n.element.classList.add(x),o.push(n)}entriesInside(t){const e=[];for(const o of this.entries)t.contains(o.element)&&e.push(o);return e}updateItemStates(t){if(!this.overflowDropdown)return;const e=Array.from(this.overflowDropdown.querySelectorAll(".notectl-dropdown__item"));for(const o of e){const e=o.getAttribute("data-toolbar-item"),n=this.overflowEntries.find(t=>t.item.id===e);if(!n)continue;const r=n.item.isActive?.(t)??!1,i=n.item.isEnabled?.(t)??!0;if(o.classList.toggle("notectl-dropdown__item--active",r),o.disabled=!i,"combobox"===n.item.popupType){const e=o.querySelector(".notectl-dropdown__item-label");e&&(e.textContent=n.item.getLabel(t))}if(n.item.getIcon){const e=n.item.getIcon(t),r=o.querySelector(".notectl-dropdown__item-icon");r&&r.innerHTML!==e&&(r.innerHTML=e)}}}destroy(){this.resizeObserver?.disconnect(),this.resizeObserver=null,this.closeDropdown(),this.overflowButton?.remove(),this.overflowButton=null,this.entries=[],this.overflowEntries=[]}measureChildWidths(t){const e=/* @__PURE__ */new Map;for(const o of t)o!==this.overflowButton&&e.set(o,o.offsetWidth);return e}measureAvailableWidth(){const t=getComputedStyle(this.toolbar),e=Number.parseFloat(t.paddingLeft)||0,o=Number.parseFloat(t.paddingRight)||0;return this.toolbar.clientWidth-e-o}resetVisibility(){for(const o of this.entries)o.element.classList.remove(x);const t=Array.from(this.toolbar.querySelectorAll(`.${_}`));for(const o of t)o.classList.remove(y);const e=Array.from(this.toolbar.querySelectorAll(`.${E}`));for(const o of e)o.classList.remove(A)}setOverflowButtonVisible(t){this.overflowButton&&(this.overflowButton.classList.toggle("notectl-toolbar-overflow-btn--hidden",!t),t||this.overflowButton.removeAttribute("tabindex"))}ensureOverflowButton(){if(this.overflowButton)return;const t=document.createElement("button");t.type="button",t.className="notectl-toolbar-overflow-btn",t.setAttribute("aria-label",this.ariaLabel),t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false"),t.setAttribute("part","toolbar-button toolbar-overflow-button"),t.innerHTML='<svg viewBox="0 0 16 16" width="16" height="16"><circle cx="3" cy="8" r="1.5" fill="currentColor"/><circle cx="8" cy="8" r="1.5" fill="currentColor"/><circle cx="13" cy="8" r="1.5" fill="currentColor"/></svg>',t.addEventListener("mousedown",t=>{t.preventDefault(),this.toggleDropdown()}),this.toolbar.appendChild(t),this.overflowButton=t}toggleDropdown(){this.overflowDropdown?this.closeDropdown():this.openDropdown()}openDropdown(){if(!this.overflowButton||0===this.overflowEntries.length)return;const t=document.createElement("div");t.className="notectl-toolbar-popup notectl-dropdown",t.setAttribute("role","menu"),this.renderDropdownItems(t,this.context.getState()),this.popupManager?(this.overflowHandle=this.popupManager.open({anchor:this.overflowButton,className:"notectl-toolbar-popup notectl-dropdown",ariaRole:"menu",position:"below-end",referenceNode:this.overflowButton,restoreFocusTo:this.overflowButton,onClose:()=>{this.overflowHandle=null,this.overflowDropdown=null,this.overflowButton&&this.overflowButton.setAttribute("aria-expanded","false")},content:t=>{this.renderDropdownItems(t,this.context.getState()),this.overflowDropdown=t,t.addEventListener("keydown",t=>this.handleDropdownKeydown(t))}}),this.overflowButton.setAttribute("aria-expanded","true")):(this.positionDropdown(t),p(t,this.overflowButton),this.overflowDropdown=t,this.overflowButton.setAttribute("aria-expanded","true"),requestAnimationFrame(()=>{t.querySelector('[role="menuitem"]')?.focus()}),t.addEventListener("keydown",t=>this.handleDropdownKeydown(t)),this.registerCloseHandler())}renderDropdownItems(t,e){let o=null;for(const n of this.overflowEntries){if(null!==o&&n.item.group!==o){const e=document.createElement("div");e.className="notectl-dropdown__separator",e.setAttribute("role","separator"),t.appendChild(e)}o=n.item.group;const r=document.createElement("button");r.type="button",r.className="notectl-dropdown__item",r.setAttribute("role","menuitem"),r.setAttribute("tabindex","-1"),r.setAttribute("data-toolbar-item",n.item.id);const i=document.createElement("span");i.className="notectl-dropdown__item-icon","combobox"!==n.item.popupType&&(i.innerHTML=n.item.icon),r.appendChild(i);const l=document.createElement("span");l.className="notectl-dropdown__item-label",l.textContent="combobox"===n.item.popupType?n.item.getLabel(e):n.item.tooltip??n.item.label,r.appendChild(l),r.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),this.activateOverflowItem(n)}),t.appendChild(r)}}positionDropdown(e){if(!this.overflowButton)return;const o=this.overflowButton.getBoundingClientRect(),n=t(this.toolbar);d(e,o,{position:n?"below-start":"below-end",isRtl:n})}registerCloseHandler(){this.closeHandler=t=>{const e=t.composedPath();this.overflowDropdown&&!e.includes(this.overflowDropdown)&&this.overflowButton&&!e.includes(this.overflowButton)&&this.closeDropdown()},this.closeHandlerTimer=setTimeout(()=>{this.closeHandlerTimer=null,this.closeHandler&&this.overflowDropdown&&(document.addEventListener("mousedown",this.closeHandler),this.closeHandlerAttached=!0)},0)}closeDropdown(){if(this.overflowHandle){const t=this.overflowHandle;return this.overflowHandle=null,this.overflowDropdown=null,t.close(),void(this.overflowButton&&this.overflowButton.setAttribute("aria-expanded","false"))}this.overflowDropdown&&(this.overflowDropdown.remove(),this.overflowDropdown=null),this.overflowButton&&this.overflowButton.setAttribute("aria-expanded","false"),this.closeHandler&&(null!==this.closeHandlerTimer&&(clearTimeout(this.closeHandlerTimer),this.closeHandlerTimer=null),this.closeHandlerAttached&&(document.removeEventListener("mousedown",this.closeHandler),this.closeHandlerAttached=!1),this.closeHandler=null)}activateOverflowItem(t){this.closeDropdown(),t.item.popupType&&this.overflowButton?this.onItemActivated(this.overflowButton,t.item):this.context.executeCommand(t.item.command)}handleDropdownKeydown(t){if(!this.overflowDropdown)return;if("Escape"===t.key||"Tab"===t.key)return t.preventDefault(),t.stopPropagation(),this.closeDropdown(),void this.overflowButton?.focus();const e=Array.from(this.overflowDropdown.querySelectorAll('[role="menuitem"]')),o=e.indexOf(this.getActiveElement());switch(t.key){case"ArrowDown":t.preventDefault(),e[l(e,o,1)]?.focus();break;case"ArrowUp":t.preventDefault(),e[l(e,o,-1)]?.focus();break;case"Enter":case" ":{t.preventDefault();const n=e[o];if(!n)break;const r=n.getAttribute("data-toolbar-item"),i=this.overflowEntries.find(t=>t.item.id===r);i&&this.activateOverflowItem(i);break}}}hideTrailingSeparators(){const t=Array.from(this.toolbar.children);for(let e=t.length-1;e>=0;e--){const o=t[e];if(!o||o===this.overflowButton)continue;if(o.classList.contains(_)){o.classList.contains(y)||o.classList.add(y);continue}const n=o.classList.contains(E)&&o.classList.contains(A),r=o.classList.contains("notectl-toolbar-btn")&&o.classList.contains(x);if(!n&&!r)break}}notifyChange(){const t=this.entries.filter(t=>!t.element.classList.contains(x)).map(t=>t.element);this.onOverflowChange(t,this.overflowEntries.length>0?this.overflowButton:null)}};function C(t,e,o){const n=t.querySelectorAll(".notectl-grid-picker__cell");for(const r of n){const t=Number(r.getAttribute("data-row")),n=Number(r.getAttribute("data-col"));r.classList.toggle("notectl-grid-picker__cell--highlighted",t<=e&&n<=o)}}function B(){const t=document.createElement("span");return t.className="notectl-toolbar-separator",t.setAttribute("role","separator"),t.setAttribute("part","toolbar-divider"),t}var L=class{activePopup=null;activePopupButton=null;activeHandle=null;getActiveElement;locale;popupManager=null;constructor(t,e=f){this.getActiveElement=t,this.locale=e}setPopupManager(t){this.popupManager=t}isOpen(){return null!==this.activePopup}toggle(t,e,o){this.activePopup?this.close():this.openViaManager(t,e,o)}close(){if(this.activeHandle){const t=this.activeHandle;return this.activeHandle=null,this.clearButtonState(),void t.close()}this.clearButtonState(),this.activePopup&&(this.activePopup.remove(),this.activePopup=null)}closeAndRestoreFocus(){const t=this.activePopupButton;this.close(),t?.focus()}destroy(){this.close()}openViaManager(t,e,o){this.popupManager&&(this.activePopupButton=t,t.classList.add("notectl-toolbar-btn--popup-open"),t.setAttribute("aria-expanded","true"),this.activeHandle=this.popupManager.open({anchor:t,className:"notectl-toolbar-popup",referenceNode:t,restoreFocusTo:t,position:"below-start",onClose:()=>{this.activeHandle=null,this.clearButtonState(),this.activePopup=null},content:(t,n)=>{this.activePopup=t,this.renderPopupContent(t,e,o,n),t.addEventListener("keydown",t=>this.handlePopupKeydown(t))}}))}renderPopupContent(t,o,n,r){const i=()=>{r({restoreFocusTo:null}),n.getContainer().focus()};switch(o.popupType){case"gridPicker":!function(t,o,n,r=f){t.className+=" notectl-grid-picker";const i=document.createElement("div");i.className="notectl-grid-picker__grid",i.setAttribute("role","grid"),e(i,{display:"grid",gridTemplateColumns:`repeat(${o.maxCols}, 1fr)`,gap:"2px",padding:"8px"});const l=document.createElement("div");l.className="notectl-grid-picker__label",l.textContent=r.gridPickerLabel(1,1),e(l,{textAlign:"center",padding:"4px",fontSize:"12px"}),l.setAttribute("aria-live","polite");for(let s=1;s<=o.maxRows;s++)for(let t=1;t<=o.maxCols;t++){const a=document.createElement("div");a.className="notectl-grid-picker__cell",a.setAttribute("role","gridcell"),a.setAttribute("tabindex","-1"),a.setAttribute("aria-label",r.gridPickerLabel(s,t)),e(a,{width:"20px",height:"20px",border:"1px solid #ccc",cursor:"pointer"}),a.setAttribute("data-row",String(s)),a.setAttribute("data-col",String(t)),a.addEventListener("mouseenter",()=>{C(i,s,t),l.textContent=r.gridPickerLabel(s,t)}),a.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),a.addEventListener("click",()=>{o.onSelect(s,t),n()}),i.appendChild(a)}t.appendChild(i),t.appendChild(l)}(t,o.popupConfig,i,this.locale);break;case"dropdown":!function(t,e,o,r){t.classList.add("notectl-dropdown"),t.setAttribute("role","menu");for(const i of e.items){const e=document.createElement("button");if(e.type="button",e.className="notectl-dropdown__item",e.setAttribute("role","menuitem"),e.setAttribute("tabindex","-1"),i.icon){const t=document.createElement("span");t.className="notectl-dropdown__item-icon",t.innerHTML=i.icon,e.appendChild(t)}const o=document.createElement("span");o.className="notectl-dropdown__item-label",o.textContent=i.label,e.appendChild(o),e.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),e.addEventListener("click",()=>{var t;t=i.command,n.executeCommand(t),r()}),t.appendChild(e)}}(t,o.popupConfig,0,i);break;case"custom":case"combobox":o.renderPopup(t,n,r)}}clearButtonState(){this.activePopupButton&&(this.activePopupButton.classList.remove("notectl-toolbar-btn--popup-open"),this.activePopupButton.setAttribute("aria-expanded","false"),this.activePopupButton=null)}handlePopupKeydown(t){if(!this.activePopup)return;if("Escape"===t.key)return t.preventDefault(),t.stopPropagation(),void this.closeAndRestoreFocus();if("Tab"===t.key)return t.preventDefault(),void this.closeAndRestoreFocus();const e=this.activePopup.querySelectorAll('[role="menuitem"]');e.length>0?this.handleDropdownKeydown(t,e):null===this.activePopup.querySelector(".notectl-grid-picker__cell")?this.handleCustomPopupKeydown(t):this.handleGridKeydown(t)}handleDropdownKeydown(t,e){const o=Array.from(e),n=o.indexOf(this.getActiveElement());switch(t.key){case"ArrowDown":t.preventDefault(),o[l(o,n,1)]?.focus();break;case"ArrowUp":t.preventDefault(),o[l(o,n,-1)]?.focus();break;case"Enter":case" ":{t.preventDefault();const e=o[n];e&&e.click();break}}}handleGridKeydown(e){const o=this.getActiveElement(),n=Number(o?.getAttribute("data-row")??1),r=Number(o?.getAttribute("data-col")??1),i=this.activePopup?.querySelector(".notectl-grid-picker__grid")??null;if(!i)return;const l=i.querySelector(".notectl-grid-picker__cell:last-child"),a=Number(l?.getAttribute("data-col")??1),c=Number(l?.getAttribute("data-row")??1);if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(e.key)){e.preventDefault();const[o,l]=s(n,r,c,a,e.key,!!this.activePopup&&t(this.activePopup));i.querySelector(`.notectl-grid-picker__cell[data-row="${o}"][data-col="${l}"]`)?.focus(),C(i,o,l);const d=this.activePopup?.querySelector(".notectl-grid-picker__label")??null;d&&(d.textContent=this.locale.gridPickerLabel(o,l))}"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),o?.click())}handleCustomPopupKeydown(t){if(!this.activePopup)return;const e=Array.from(this.activePopup.querySelectorAll("button"));if(0===e.length)return;const o=this.getActiveElement(),n=e.indexOf(o);switch(t.key){case"ArrowDown":t.preventDefault(),e[l(e,n,1)]?.focus();break;case"ArrowUp":t.preventDefault(),e[l(e,n,-1)]?.focus();break;case"Enter":case" ":t.preventDefault(),o&&o.dispatchEvent(new MouseEvent("mousedown",{bubbles:!0,cancelable:!0}))}}},I=class t{element;timer=null;target=null;isPopupActive;static TOOLTIP_ID="notectl-toolbar-tooltip";constructor(e){this.isPopupActive=e,this.element=document.createElement("div"),this.element.className="notectl-toolbar-tooltip",this.element.id=t.TOOLTIP_ID,this.element.setAttribute("role","tooltip"),o(this.element,"display","none")}show(n){if(this.hide(),this.isPopupActive()||n.disabled)return;const r=n.getAttribute("data-tooltip");r&&(this.target=n,this.timer=setTimeout(()=>{if(this.isPopupActive())return;this.element.textContent=r,o(this.element,"display","");const i=n.getRootNode();i instanceof ShadowRoot&&!this.element.parentNode?i.appendChild(this.element):i instanceof ShadowRoot||this.element.parentNode||document.body.appendChild(this.element),n.setAttribute("aria-describedby",t.TOOLTIP_ID);const l=n.getBoundingClientRect();o(this.element,"position","fixed");const s=c(this.element);e(this.element,{top:l.bottom+6-s.y+"px",left:l.left+l.width/2-s.x+"px",transform:"translateX(-50%)"})},500))}hide(){this.timer&&(clearTimeout(this.timer),this.timer=null),this.target&&(this.target.removeAttribute("aria-describedby"),this.target=null),o(this.element,"display","none")}destroy(){this.hide(),this.element.remove()}};function P(t){if(Array.isArray(t))return{plugins:t,label:void 0};const e=t;return{plugins:e.plugins,label:e.label}}var T=new n("toolbar"),D=class{id="toolbar";name="Toolbar";priority=10;context=null;toolbarElement=null;buttons=[];hiddenItems=/* @__PURE__ */new Set;layoutConfig;overflowBehavior;focusedIndex=0;tooltip=null;popupController=null;popupManager=null;overflowController=null;visibleElements=[];locale;constructor(t){this.layoutConfig=t??null,this.overflowBehavior=t?.overflow??w.BurgerMenu}async init(t){this.locale=await r(t,void 0,f,g),t.registerStyleSheet('\n/* Toolbar */\n.notectl-plugin-container--top {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\tborder-bottom: 1px solid var(--notectl-border);\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tmin-height: 40px;\n\tflex-shrink: 0;\n}\n\n.notectl-toolbar {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n\tflex: 1;\n\tmin-width: 0;\n\tgap: 2px;\n\tpadding: 4px 8px;\n}\n\n.notectl-toolbar[hidden] {\n\tdisplay: none;\n}\n\n/* Group wrapper — real flex container so consumers can style it via ::part(toolbar-group)\n with padding/background/border directly. Group gap mirrors the toolbar gap so the\n visual rhythm between buttons stays uniform whether or not a group boundary lies between them. */\n.notectl-toolbar-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 2px;\n}\n\n.notectl-toolbar-group--overflow-hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-toolbar-button-bg, transparent);\n\tcursor: pointer;\n\tcolor: var(--notectl-toolbar-button-fg, var(--notectl-fg));\n\tfont-size: 14px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:hover {\n\t\tbackground: var(--notectl-toolbar-button-hover-bg, var(--notectl-hover-bg));\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-btn--active {\n\tbackground: var(--notectl-toolbar-button-active-bg, var(--notectl-active-bg));\n\tborder-color: var(--notectl-primary-muted);\n\tcolor: var(--notectl-toolbar-button-active-fg, var(--notectl-primary-fg));\n}\n\n.notectl-toolbar-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n.notectl-toolbar-btn:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:disabled:hover {\n\t\tbackground: transparent;\n\t\tborder-color: transparent;\n\t}\n}\n\n.notectl-toolbar-btn__icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpointer-events: none;\n}\n\n.notectl-toolbar-btn__icon svg {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tfill: currentColor;\n}\n\n/* Tooltip (rendered as fixed-position element in shadow root) */\n.notectl-toolbar-tooltip {\n\tpadding: 4px 8px;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 10001;\n\tline-height: 1.4;\n\tletter-spacing: 0.01em;\n\tfont-family: -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, sans-serif;\n}\n\n.notectl-toolbar-separator {\n\tdisplay: inline-block;\n\twidth: 1px;\n\theight: 20px;\n\tbackground: var(--notectl-border);\n\tmargin: 0 4px;\n\tvertical-align: middle;\n}\n\n/* Toolbar Popups */\n.notectl-toolbar-popup {\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 12px var(--notectl-shadow);\n\toverflow: hidden;\n}\n\n/* Grid Picker */\n.notectl-grid-picker__cell:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-grid-picker__cell--highlighted {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n}\n\n/* Dropdown */\n.notectl-dropdown {\n\tmin-width: 160px;\n\tpadding: 4px 0;\n}\n\n.notectl-dropdown__item {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tpadding: 8px 12px;\n\ttext-align: start;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\tfont-family: inherit;\n\twhite-space: nowrap;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-dropdown__item:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\toutline: none;\n}\n\n.notectl-dropdown__item-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-fg-muted);\n\tflex-shrink: 0;\n}\n\n.notectl-dropdown__item-label {\n\tflex: 1;\n}\n\n/* Overflow behavior: flow mode — toolbar wraps to additional rows */\n.notectl-toolbar[data-overflow="flow"] {\n\tflex-wrap: wrap;\n\toverflow: visible;\n}\n\n/* Overflow behavior: none — toolbar clips without any responsive behavior */\n.notectl-toolbar[data-overflow="none"] {\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n}\n\n/* Overflow: hidden items (burger-menu mode) */\n.notectl-toolbar-btn--overflow-hidden,\n.notectl-toolbar-separator--overflow-hidden {\n\tdisplay: none;\n}\n\n/* Overflow "more" button */\n.notectl-toolbar-overflow-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n\tfont-size: 16px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\tmargin-inline-start: auto;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-overflow-btn:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-overflow-btn--hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-overflow-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n/* Dropdown item states shared by all dropdown menus (including overflow) */\n.notectl-dropdown__item:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:disabled:hover {\n\t\tbackground: none;\n\t}\n}\n\n.notectl-dropdown__item--active {\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-dropdown__item-icon svg {\n\tdisplay: block;\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n.notectl-dropdown__separator {\n\theight: 1px;\n\tbackground: var(--notectl-border);\n\tmargin: 4px 0;\n}\n\n/* Combobox-style toolbar buttons (shared base for font, fontSize, heading, etc.) */\n.notectl-toolbar-btn[role="combobox"] {\n\twidth: auto;\n\tpadding: 0 8px;\n\tgap: 4px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn[role="combobox"]:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-fg-muted);\n\t}\n}\n\n.notectl-toolbar-btn[role="combobox"].notectl-toolbar-btn--active {\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tborder-color: var(--notectl-primary-muted);\n}\n\n.notectl-toolbar-combobox__label {\n\tflex: 1;\n\tfont-size: 13px;\n\tfont-weight: 500;\n\tcolor: var(--notectl-fg);\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: start;\n\tline-height: 30px;\n}\n\n.notectl-toolbar-combobox__arrow {\n\tflex-shrink: 0;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tline-height: 30px;\n}\n\n/* Link Popup */\n.notectl-link-popup {\n\tpadding: 8px;\n\tmin-width: 200px;\n}\n\n.notectl-link-popup__input {\n\twidth: 100%;\n\tpadding: 4px;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-surface-overlay);\n}\n\n.notectl-link-popup__input:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-link-popup__button {\n\twidth: 100%;\n\tpadding: 6px 12px;\n\tcursor: pointer;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-overlay);\n\tcolor: var(--notectl-fg);\n\tfont-size: 13px;\n}\n\n.notectl-link-popup__button--apply {\n\tmargin-top: 4px;\n}\n\n@media (hover: hover) {\n\t.notectl-link-popup__button:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-link-popup__button:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n'),this.context=t,this.popupManager=new h(t.getContainer()),t.registerService(u,this.popupManager),this.popupController=new L(()=>this.getActiveElement(),this.locale),this.popupController.setPopupManager(this.popupManager),this.tooltip=new I(()=>this.popupController?.isOpen()??!1),t.registerService(T,{refresh:()=>this.updateButtonStates(t.getState()),closePopup:()=>this.popupController?.close()}),this.createToolbarElement()}getOverflowBehavior(){return this.overflowBehavior}setOverflowBehavior(t){t!==this.overflowBehavior&&(this.overflowBehavior=t,this.applyOverflowBehavior(),this.renderItems())}onReady(){this.renderItems()}destroy(){this.overflowController?.destroy(),this.overflowController=null,this.popupController?.destroy(),this.popupController=null,this.popupManager?.destroy(),this.popupManager=null,this.tooltip?.destroy(),this.tooltip=null,this.toolbarElement&&(this.toolbarElement.remove(),this.toolbarElement=null),this.buttons=[],this.visibleElements=[],this.context=null}onStateChange(t,e,o){this.updateButtonStates(e)}onReadOnlyChange(t){this.toolbarElement&&(this.toolbarElement.hidden=t)}onConfigure(t){for(const[e,o]of Object.entries(t))!1===o?this.hiddenItems.add(e):this.hiddenItems.delete(e);this.renderItems()}createToolbarElement(){if(!this.context)return;this.toolbarElement&&this.toolbarElement.remove(),this.buttons=[];const t=this.context.getPluginContainer("top");this.toolbarElement=document.createElement("div"),this.toolbarElement.setAttribute("role","toolbar"),this.toolbarElement.setAttribute("aria-label",this.locale.formattingOptionsAria),this.toolbarElement.setAttribute("data-notectl-no-print",""),this.toolbarElement.setAttribute("part","toolbar"),this.toolbarElement.className="notectl-toolbar",this.toolbarElement.addEventListener("keydown",t=>this.handleToolbarKeydown(t)),this.applyOverflowBehavior(),t.appendChild(this.toolbarElement)}applyOverflowBehavior(){this.toolbarElement&&this.context&&(this.overflowController?.destroy(),this.overflowController=null,this.toolbarElement.setAttribute("data-overflow",this.overflowBehavior),this.overflowBehavior===w.BurgerMenu?this.overflowController=new k({toolbar:this.toolbarElement,ariaLabel:this.locale.moreToolsAria,context:this.context,popupManager:this.popupManager??void 0,onOverflowChange:(t,e)=>{this.visibleElements=e?[...t,e]:[...t],this.initRovingTabindex()},onItemActivated:(t,e)=>{this.activateButton(t,e)},getActiveElement:()=>this.getActiveElement()}):this.visibleElements=[])}renderItems(){if(this.context&&this.toolbarElement){for(const t of this.buttons)t.element.remove();this.buttons=[];for(const t of this.toolbarElement.querySelectorAll(".notectl-toolbar-separator"))t.remove();for(const t of this.toolbarElement.querySelectorAll(".notectl-toolbar-group"))t.remove();this.layoutConfig?this.renderItemsByLayout():this.renderItemsByGroup(),this.buttons.length>0&&!this.toolbarElement.parentElement&&this.context.getPluginContainer("top").appendChild(this.toolbarElement),this.overflowController?.update(this.buttons),this.initRovingTabindex(),this.updateButtonStates(this.context.getState())}}createGroupWrapper(t){const e=document.createElement("div");return e.className="notectl-toolbar-group",e.setAttribute("part","toolbar-group"),void 0!==t&&(e.setAttribute("role","group"),e.setAttribute("aria-label",t)),e}getTabElements(){return this.visibleElements.length>0?this.visibleElements:this.buttons.map(t=>t.element)}initRovingTabindex(){const t=this.getTabElements(),e=m(t);this.focusedIndex=e>=0?e:0,a(t,this.focusedIndex)}setRovingFocus(t){const e=this.getTabElements();t<0||t>=e.length||(this.focusedIndex=t,a(e,t),e[t]?.focus())}getActiveElement(){const t=this.toolbarElement?.getRootNode();return t instanceof ShadowRoot?t.activeElement:document.activeElement}syncFocusedIndex(){const t=this.getActiveElement(),e=this.getTabElements().findIndex(e=>e===t);e>=0&&(this.focusedIndex=e)}handleToolbarKeydown(e){const o=this.getTabElements();var n;if(0!==o.length)switch(this.syncFocusedIndex(),e.key){case"ArrowRight":case"ArrowLeft":{e.preventDefault();const r=(n=!!this.toolbarElement&&t(this.toolbarElement),"ArrowRight"===e.key?n?-1:1:n?1:-1),i=function(t,e,o){const n=t.length;if(0===n)return-1;let r=e;for(let i=0;i<n;i++)if(r=(r+o+n)%n,!t[r]?.disabled)return r;return e}(o,this.focusedIndex,r);this.setRovingFocus(i);break}case"Home":{e.preventDefault();const t=m(o);t>=0&&this.setRovingFocus(t);break}case"End":{e.preventDefault();const t=function(t){for(let e=t.length-1;e>=0;e--)if(!t[e]?.disabled)return e;return-1}(o);t>=0&&this.setRovingFocus(t);break}case"Enter":case" ":{e.preventDefault();const t=o[this.focusedIndex],n=this.buttons.find(e=>e.element===t);n&&this.activateButton(n.element,n.item);break}}}activateButton(t,e){this.tooltip?.hide(),e.popupType&&this.context?this.popupController?.toggle(t,e,this.context):this.context?.executeCommand(e.command)}renderItemsByLayout(){if(!this.context||!this.toolbarElement||!this.layoutConfig)return;const t=this.context.getToolbarRegistry();let e=!0;for(const o of this.layoutConfig.groups){const{plugins:n,label:r}=P(o),i=[];for(const e of n){const o=t.getToolbarItemsByPlugin(e).filter(t=>!this.hiddenItems.has(t.id));i.push(...o)}if(0===i.length)continue;e||this.toolbarElement.appendChild(B()),e=!1;const l=this.createGroupWrapper(r);for(const t of i){const e=this.createButton(t);l.appendChild(e.element),this.buttons.push(e)}this.toolbarElement.appendChild(l)}0===this.buttons.length&&this.toolbarElement.remove()}renderItemsByGroup(){if(!this.context||!this.toolbarElement)return;const t=this.context.getToolbarRegistry().getToolbarItems().filter(t=>!this.hiddenItems.has(t.id));if(0===t.length)return void this.toolbarElement.remove();const e=/* @__PURE__ */new Map;for(const n of t){const t=e.get(n.group)??[];t.push(n),e.set(n.group,t)}let o=!0;for(const[,n]of e){o||this.toolbarElement.appendChild(B()),o=!1;const t=this.createGroupWrapper(void 0);for(const e of n){const o=this.createButton(e);t.appendChild(o.element),this.buttons.push(o)}this.toolbarElement.appendChild(t)}}createButton(t){const e=document.createElement("button");e.type="button",e.className=`notectl-toolbar-btn notectl-toolbar-btn--${t.id}`,e.setAttribute("aria-pressed","false"),e.setAttribute("aria-label",t.label),e.setAttribute("data-toolbar-item",t.id),e.setAttribute("data-tooltip",t.tooltip??t.label),e.setAttribute("part","toolbar-button");let o=null;if("combobox"===t.popupType){e.setAttribute("role","combobox"),e.setAttribute("aria-haspopup","listbox"),e.setAttribute("aria-expanded","false");const n=document.createElement("span");n.className="notectl-toolbar-combobox__label";const r=this.context?.getState();r&&(n.textContent=t.getLabel(r)),e.appendChild(n),o=n;const i=document.createElement("span");i.className="notectl-toolbar-combobox__arrow",i.setAttribute("aria-hidden","true"),i.textContent="▾",e.appendChild(i)}else{t.popupType&&(e.setAttribute("aria-haspopup","true"),e.setAttribute("aria-expanded","false"));const o=document.createElement("span");o.className="notectl-toolbar-btn__icon",o.innerHTML=t.icon,e.appendChild(o)}return e.addEventListener("mousedown",o=>{o.preventDefault(),this.activateButton(e,t)}),e.addEventListener("mouseenter",()=>this.tooltip?.show(e)),e.addEventListener("mouseleave",()=>this.tooltip?.hide()),e.addEventListener("focus",()=>this.tooltip?.show(e)),e.addEventListener("blur",()=>this.tooltip?.hide()),{element:e,item:t,comboLabelEl:o}}updateButtonStates(t){for(const e of this.buttons){const o=e.item.isActive?.(t)??!1,n=e.item.isEnabled?.(t)??!0;if(e.element.setAttribute("aria-pressed",String(o)),e.element.classList.toggle("notectl-toolbar-btn--active",o),e.element.setAttribute("part",o?"toolbar-button toolbar-button-active":"toolbar-button"),e.element.disabled=!n,n?e.element.removeAttribute("aria-disabled"):e.element.setAttribute("aria-disabled","true"),e.comboLabelEl&&"combobox"===e.item.popupType&&(e.comboLabelEl.textContent=e.item.getLabel(t)),e.item.getIcon){const o=e.item.getIcon(t),n=e.element.querySelector(".notectl-toolbar-btn__icon");n&&n.innerHTML!==o&&(n.innerHTML=o)}}this.overflowController?.updateItemStates(t)}};export{g as a,f as i,T as n,b as o,w as r,D as t};
|
|
2
|
+
//# sourceMappingURL=ToolbarPlugin-CSMSgjPM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolbarPlugin-CSMSgjPM.mjs","names":[],"sources":["../../src/plugins/toolbar/ToolbarRegistry.ts","../../src/editor/styles/toolbar.ts","../../src/plugins/toolbar/ToolbarKeyboardNav.ts","../../src/plugins/toolbar/ToolbarLocale.ts","../../src/plugins/toolbar/ToolbarOverflowBehavior.ts","../../src/plugins/toolbar/ToolbarOverflowController.ts","../../src/plugins/toolbar/ToolbarRenderers.ts","../../src/plugins/toolbar/ToolbarPopupController.ts","../../src/plugins/toolbar/ToolbarTooltip.ts","../../src/plugins/toolbar/ToolbarPlugin.ts"],"sourcesContent":["/**\n * ToolbarRegistry: manages plugin-registered toolbar items\n * with per-plugin tracking for clean teardown.\n */\n\nimport type { ToolbarItem } from './ToolbarItem.js';\n\nexport class ToolbarRegistry {\n\tprivate readonly _toolbarItems = new Map<string, ToolbarItem>();\n\tprivate readonly _toolbarItemPluginMap = new Map<string, string[]>();\n\n\tregisterToolbarItem(item: ToolbarItem, pluginId?: string): void {\n\t\tif (this._toolbarItems.has(item.id)) {\n\t\t\tthrow new Error(`ToolbarItem with id \"${item.id}\" is already registered.`);\n\t\t}\n\t\tthis._toolbarItems.set(item.id, item);\n\t\tif (pluginId) {\n\t\t\tconst ids = this._toolbarItemPluginMap.get(pluginId) ?? [];\n\t\t\tids.push(item.id);\n\t\t\tthis._toolbarItemPluginMap.set(pluginId, ids);\n\t\t}\n\t}\n\n\tgetToolbarItemsByPlugin(pluginId: string): ToolbarItem[] {\n\t\tconst ids = this._toolbarItemPluginMap.get(pluginId) ?? [];\n\t\tconst items: ToolbarItem[] = [];\n\t\tfor (const id of ids) {\n\t\t\tconst item = this._toolbarItems.get(id);\n\t\t\tif (item) items.push(item);\n\t\t}\n\t\treturn items;\n\t}\n\n\tgetToolbarItem(id: string): ToolbarItem | undefined {\n\t\treturn this._toolbarItems.get(id);\n\t}\n\n\tgetToolbarItems(): ToolbarItem[] {\n\t\treturn [...this._toolbarItems.values()];\n\t}\n\n\tremoveToolbarItem(id: string): void {\n\t\tthis._toolbarItems.delete(id);\n\t\tfor (const [pluginId, ids] of this._toolbarItemPluginMap) {\n\t\t\tconst idx = ids.indexOf(id);\n\t\t\tif (idx !== -1) {\n\t\t\t\tids.splice(idx, 1);\n\t\t\t\tif (ids.length === 0) this._toolbarItemPluginMap.delete(pluginId);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis._toolbarItems.clear();\n\t\tthis._toolbarItemPluginMap.clear();\n\t}\n}\n","/** Toolbar styles — buttons, separators, tooltips, popups, dropdowns. */\nexport const TOOLBAR_CSS = `\n/* Toolbar */\n.notectl-plugin-container--top {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\tborder-bottom: 1px solid var(--notectl-border);\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tmin-height: 40px;\n\tflex-shrink: 0;\n}\n\n.notectl-toolbar {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n\tflex: 1;\n\tmin-width: 0;\n\tgap: 2px;\n\tpadding: 4px 8px;\n}\n\n.notectl-toolbar[hidden] {\n\tdisplay: none;\n}\n\n/* Group wrapper — real flex container so consumers can style it via ::part(toolbar-group)\n with padding/background/border directly. Group gap mirrors the toolbar gap so the\n visual rhythm between buttons stays uniform whether or not a group boundary lies between them. */\n.notectl-toolbar-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 2px;\n}\n\n.notectl-toolbar-group--overflow-hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-toolbar-button-bg, transparent);\n\tcursor: pointer;\n\tcolor: var(--notectl-toolbar-button-fg, var(--notectl-fg));\n\tfont-size: 14px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:hover {\n\t\tbackground: var(--notectl-toolbar-button-hover-bg, var(--notectl-hover-bg));\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-btn--active {\n\tbackground: var(--notectl-toolbar-button-active-bg, var(--notectl-active-bg));\n\tborder-color: var(--notectl-primary-muted);\n\tcolor: var(--notectl-toolbar-button-active-fg, var(--notectl-primary-fg));\n}\n\n.notectl-toolbar-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n.notectl-toolbar-btn:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:disabled:hover {\n\t\tbackground: transparent;\n\t\tborder-color: transparent;\n\t}\n}\n\n.notectl-toolbar-btn__icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpointer-events: none;\n}\n\n.notectl-toolbar-btn__icon svg {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tfill: currentColor;\n}\n\n/* Tooltip (rendered as fixed-position element in shadow root) */\n.notectl-toolbar-tooltip {\n\tpadding: 4px 8px;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 10001;\n\tline-height: 1.4;\n\tletter-spacing: 0.01em;\n\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.notectl-toolbar-separator {\n\tdisplay: inline-block;\n\twidth: 1px;\n\theight: 20px;\n\tbackground: var(--notectl-border);\n\tmargin: 0 4px;\n\tvertical-align: middle;\n}\n\n/* Toolbar Popups */\n.notectl-toolbar-popup {\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 12px var(--notectl-shadow);\n\toverflow: hidden;\n}\n\n/* Grid Picker */\n.notectl-grid-picker__cell:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-grid-picker__cell--highlighted {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n}\n\n/* Dropdown */\n.notectl-dropdown {\n\tmin-width: 160px;\n\tpadding: 4px 0;\n}\n\n.notectl-dropdown__item {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tpadding: 8px 12px;\n\ttext-align: start;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\tfont-family: inherit;\n\twhite-space: nowrap;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-dropdown__item:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\toutline: none;\n}\n\n.notectl-dropdown__item-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-fg-muted);\n\tflex-shrink: 0;\n}\n\n.notectl-dropdown__item-label {\n\tflex: 1;\n}\n\n/* Overflow behavior: flow mode — toolbar wraps to additional rows */\n.notectl-toolbar[data-overflow=\"flow\"] {\n\tflex-wrap: wrap;\n\toverflow: visible;\n}\n\n/* Overflow behavior: none — toolbar clips without any responsive behavior */\n.notectl-toolbar[data-overflow=\"none\"] {\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n}\n\n/* Overflow: hidden items (burger-menu mode) */\n.notectl-toolbar-btn--overflow-hidden,\n.notectl-toolbar-separator--overflow-hidden {\n\tdisplay: none;\n}\n\n/* Overflow \"more\" button */\n.notectl-toolbar-overflow-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n\tfont-size: 16px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\tmargin-inline-start: auto;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-overflow-btn:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-overflow-btn--hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-overflow-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n/* Dropdown item states shared by all dropdown menus (including overflow) */\n.notectl-dropdown__item:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:disabled:hover {\n\t\tbackground: none;\n\t}\n}\n\n.notectl-dropdown__item--active {\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-dropdown__item-icon svg {\n\tdisplay: block;\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n.notectl-dropdown__separator {\n\theight: 1px;\n\tbackground: var(--notectl-border);\n\tmargin: 4px 0;\n}\n\n/* Combobox-style toolbar buttons (shared base for font, fontSize, heading, etc.) */\n.notectl-toolbar-btn[role=\"combobox\"] {\n\twidth: auto;\n\tpadding: 0 8px;\n\tgap: 4px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn[role=\"combobox\"]:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-fg-muted);\n\t}\n}\n\n.notectl-toolbar-btn[role=\"combobox\"].notectl-toolbar-btn--active {\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tborder-color: var(--notectl-primary-muted);\n}\n\n.notectl-toolbar-combobox__label {\n\tflex: 1;\n\tfont-size: 13px;\n\tfont-weight: 500;\n\tcolor: var(--notectl-fg);\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: start;\n\tline-height: 30px;\n}\n\n.notectl-toolbar-combobox__arrow {\n\tflex-shrink: 0;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tline-height: 30px;\n}\n\n/* Link Popup */\n.notectl-link-popup {\n\tpadding: 8px;\n\tmin-width: 200px;\n}\n\n.notectl-link-popup__input {\n\twidth: 100%;\n\tpadding: 4px;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-surface-overlay);\n}\n\n.notectl-link-popup__input:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-link-popup__button {\n\twidth: 100%;\n\tpadding: 6px 12px;\n\tcursor: pointer;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-overlay);\n\tcolor: var(--notectl-fg);\n\tfont-size: 13px;\n}\n\n.notectl-link-popup__button--apply {\n\tmargin-top: 4px;\n}\n\n@media (hover: hover) {\n\t.notectl-link-popup__button:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-link-popup__button:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n`;\n","/**\n * Keyboard navigation helpers for the toolbar (WAI-ARIA Toolbar pattern).\n * Also re-exports generic navigation helpers from `plugins/shared`.\n */\n\n/** Returns indices of all enabled buttons. */\nexport function getEnabledIndices(buttons: readonly HTMLButtonElement[]): number[] {\n\tconst result: number[] = [];\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tif (!buttons[i]?.disabled) {\n\t\t\tresult.push(i);\n\t\t}\n\t}\n\treturn result;\n}\n\n/** Finds the next enabled button index in the given direction (wraps around). */\nexport function findNextEnabled(\n\tbuttons: readonly HTMLButtonElement[],\n\tcurrent: number,\n\tdirection: 1 | -1,\n): number {\n\tconst len = buttons.length;\n\tif (len === 0) return -1;\n\n\tlet index = current;\n\tfor (let i = 0; i < len; i++) {\n\t\tindex = (index + direction + len) % len;\n\t\tif (!buttons[index]?.disabled) {\n\t\t\treturn index;\n\t\t}\n\t}\n\treturn current;\n}\n\n/** Finds the first enabled button index. */\nexport function findFirstEnabled(buttons: readonly HTMLButtonElement[]): number {\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tif (!buttons[i]?.disabled) return i;\n\t}\n\treturn -1;\n}\n\n/** Finds the last enabled button index. */\nexport function findLastEnabled(buttons: readonly HTMLButtonElement[]): number {\n\tfor (let i = buttons.length - 1; i >= 0; i--) {\n\t\tif (!buttons[i]?.disabled) return i;\n\t}\n\treturn -1;\n}\n\nexport {\n\tapplyRovingTabindex,\n\tfindNextDropdownItem,\n\tnavigateGrid,\n} from '../shared/KeyboardNav.js';\n\n/**\n * Resolves a horizontal navigation direction based on text direction.\n * In RTL, ArrowRight moves backward (-1) and ArrowLeft moves forward (1).\n */\nexport function resolveHorizontalDirection(\n\tkey: 'ArrowRight' | 'ArrowLeft',\n\tisRtl: boolean,\n): 1 | -1 {\n\tif (key === 'ArrowRight') return isRtl ? -1 : 1;\n\treturn isRtl ? 1 : -1;\n}\n","/** Locale interface and default English locale for the ToolbarPlugin. */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface ToolbarLocale {\n\treadonly formattingOptionsAria: string;\n\treadonly moreToolsAria: string;\n\treadonly gridPickerLabel: (rows: number, cols: number) => string;\n}\n\n// --- Default English Locale ---\n\nexport const TOOLBAR_LOCALE_EN: ToolbarLocale = {\n\tformattingOptionsAria: 'Formatting options',\n\tmoreToolsAria: 'More tools',\n\tgridPickerLabel: (rows: number, cols: number) => `${rows} x ${cols}`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<ToolbarLocale> = import.meta.glob<{\n\tdefault: ToolbarLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadToolbarLocale(lang: string): Promise<ToolbarLocale> {\n\treturn loadLocaleModule(localeModules, lang, TOOLBAR_LOCALE_EN);\n}\n","/**\n * Controls how the toolbar responds when items exceed the available width.\n *\n * @example\n * ```typescript\n * const editor = await createEditor({\n * toolbar: {\n * groups: [[BoldPlugin, ItalicPlugin], [HeadingPlugin]],\n * overflow: ToolbarOverflowBehavior.Flow,\n * },\n * });\n * ```\n */\nexport const ToolbarOverflowBehavior = {\n\t/** Items that don't fit are hidden behind a \"...\" dropdown button. Default. */\n\tBurgerMenu: 'burger-menu',\n\t/** Toolbar wraps to additional rows when items overflow. Pure CSS, no JS measurement. */\n\tFlow: 'flow',\n\t/** No responsive behavior; the toolbar clips at the container boundary. */\n\tNone: 'none',\n} as const;\n\nexport type ToolbarOverflowBehavior =\n\t(typeof ToolbarOverflowBehavior)[keyof typeof ToolbarOverflowBehavior];\n","/**\n * ToolbarOverflowController: manages responsive toolbar overflow.\n * Uses ResizeObserver to detect when items exceed available width,\n * hides overflow items, and shows a \"more\" dropdown button.\n * Delegates popup lifecycle to PopupManager when available.\n */\n\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { findNextDropdownItem } from '../shared/KeyboardNav.js';\nimport type { PopupHandle, PopupManager } from '../shared/PopupManager.js';\nimport { appendToRoot, positionPopup } from '../shared/PopupPositioning.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\n\n// --- Types ---\n\ninterface OverflowEntry {\n\treadonly element: HTMLButtonElement;\n\treadonly item: ToolbarItem;\n}\n\ntype OnOverflowChange = (\n\tvisibleButtons: readonly HTMLButtonElement[],\n\toverflowButton: HTMLButtonElement | null,\n) => void;\n\ntype OnItemActivated = (overflowButton: HTMLButtonElement, item: ToolbarItem) => void;\n\nexport interface OverflowControllerConfig {\n\treadonly toolbar: HTMLElement;\n\treadonly ariaLabel: string;\n\treadonly context: PluginContext;\n\treadonly onOverflowChange: OnOverflowChange;\n\treadonly onItemActivated: OnItemActivated;\n\treadonly getActiveElement: () => Element | null;\n\treadonly popupManager?: PopupManager;\n}\n\n// --- Constants ---\n\nconst OVERFLOW_BTN_WIDTH = 34;\nconst GAP = 2;\nconst HIDDEN_BTN_CLASS = 'notectl-toolbar-btn--overflow-hidden';\nconst HIDDEN_SEP_CLASS = 'notectl-toolbar-separator--overflow-hidden';\nconst HIDDEN_GROUP_CLASS = 'notectl-toolbar-group--overflow-hidden';\nconst HIDDEN_OVERFLOW_CLASS = 'notectl-toolbar-overflow-btn--hidden';\nconst GROUP_CLASS = 'notectl-toolbar-group';\nconst SEPARATOR_CLASS = 'notectl-toolbar-separator';\nconst BUTTON_CLASS = 'notectl-toolbar-btn';\nconst ELLIPSIS_SVG =\n\t'<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\"><circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/></svg>';\n\n// --- Controller ---\n\nexport class ToolbarOverflowController {\n\tprivate readonly toolbar: HTMLElement;\n\tprivate readonly context: PluginContext;\n\tprivate readonly onOverflowChange: OnOverflowChange;\n\tprivate readonly onItemActivated: OnItemActivated;\n\tprivate readonly getActiveElement: () => Element | null;\n\tprivate readonly ariaLabel: string;\n\tprivate readonly popupManager: PopupManager | null;\n\n\tprivate entries: OverflowEntry[] = [];\n\tprivate overflowButton: HTMLButtonElement | null = null;\n\tprivate overflowDropdown: HTMLElement | null = null;\n\tprivate overflowHandle: PopupHandle | null = null;\n\tprivate overflowEntries: OverflowEntry[] = [];\n\tprivate resizeObserver: ResizeObserver | null = null;\n\tprivate closeHandler: ((e: MouseEvent) => void) | null = null;\n\tprivate closeHandlerTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate closeHandlerAttached = false;\n\n\tconstructor(config: OverflowControllerConfig) {\n\t\tthis.toolbar = config.toolbar;\n\t\tthis.ariaLabel = config.ariaLabel;\n\t\tthis.context = config.context;\n\t\tthis.onOverflowChange = config.onOverflowChange;\n\t\tthis.onItemActivated = config.onItemActivated;\n\t\tthis.getActiveElement = config.getActiveElement;\n\t\tthis.popupManager = config.popupManager ?? null;\n\n\t\tthis.resizeObserver = new ResizeObserver(() => this.recalculate());\n\t\tthis.resizeObserver.observe(this.toolbar);\n\t}\n\n\t/** Called after renderItems() — stores button references and recalculates. */\n\tupdate(buttons: readonly { element: HTMLButtonElement; item: ToolbarItem }[]): void {\n\t\tthis.entries = buttons.map((b) => ({ element: b.element, item: b.item }));\n\t\tthis.recalculate();\n\t}\n\n\t/**\n\t * Measures the toolbar and redistributes content between visible and overflow.\n\t *\n\t * Overflow unit is the **group wrapper** (`.notectl-toolbar-group`), not individual\n\t * buttons — when any button in a group would not fit, the whole group moves to the\n\t * overflow dropdown so logical clusters stay together. Standalone buttons appended\n\t * directly to the toolbar (legacy / test setups) are treated as single-button groups.\n\t */\n\trecalculate(): void {\n\t\tif (this.entries.length === 0) return;\n\n\t\tthis.closeDropdown();\n\t\tthis.resetVisibility();\n\t\tthis.ensureOverflowButton();\n\t\tthis.setOverflowButtonVisible(false);\n\n\t\t// Phase 1 — Measure (reads only): batch all layout reads before any writes\n\t\tconst availableWidth: number = this.measureAvailableWidth();\n\t\tconst children: HTMLElement[] = Array.from(this.toolbar.children) as HTMLElement[];\n\t\tconst childWidths: Map<HTMLElement, number> = this.measureChildWidths(children);\n\n\t\t// Phase 2 — Apply (writes only): use cached widths, no layout reads\n\t\tconst maxWidth: number = availableWidth - OVERFLOW_BTN_WIDTH - GAP;\n\t\tlet usedWidth = 0;\n\t\tlet overflowing = false;\n\t\tconst overflowList: OverflowEntry[] = [];\n\n\t\tfor (const child of children) {\n\t\t\tif (child === this.overflowButton) continue;\n\n\t\t\tif (child.classList.contains(SEPARATOR_CLASS)) {\n\t\t\t\tconst sepWidth: number = (childWidths.get(child) ?? 0) + GAP;\n\t\t\t\tif (overflowing || usedWidth + sepWidth > maxWidth) {\n\t\t\t\t\toverflowing = true;\n\t\t\t\t\tchild.classList.add(HIDDEN_SEP_CLASS);\n\t\t\t\t} else {\n\t\t\t\t\tusedWidth += sepWidth;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (child.classList.contains(GROUP_CLASS)) {\n\t\t\t\tconst groupWidth: number = (childWidths.get(child) ?? 0) + GAP;\n\t\t\t\tconst groupEntries: OverflowEntry[] = this.entriesInside(child);\n\t\t\t\tif (overflowing || usedWidth + groupWidth > maxWidth) {\n\t\t\t\t\toverflowing = true;\n\t\t\t\t\tthis.hideGroup(child, groupEntries, overflowList);\n\t\t\t\t} else {\n\t\t\t\t\tusedWidth += groupWidth;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Standalone button (used by tests that append buttons directly to the toolbar)\n\t\t\tconst entry: OverflowEntry | undefined = this.entries.find((oe) => oe.element === child);\n\t\t\tif (!entry) continue;\n\n\t\t\tconst btnWidth: number = (childWidths.get(child) ?? 0) + GAP;\n\t\t\tif (overflowing || usedWidth + btnWidth > maxWidth) {\n\t\t\t\toverflowing = true;\n\t\t\t\tentry.element.classList.add(HIDDEN_BTN_CLASS);\n\t\t\t\toverflowList.push(entry);\n\t\t\t} else {\n\t\t\t\tusedWidth += btnWidth;\n\t\t\t}\n\t\t}\n\n\t\tthis.overflowEntries = overflowList;\n\t\tthis.hideTrailingSeparators();\n\t\tthis.setOverflowButtonVisible(overflowList.length > 0);\n\t\tthis.notifyChange();\n\t}\n\n\t/**\n\t * Hides a group wrapper and marks every entry inside it as overflowed.\n\t * Marking individual buttons too keeps `notifyChange()` filter logic uniform.\n\t */\n\tprivate hideGroup(\n\t\tgroup: HTMLElement,\n\t\tentries: readonly OverflowEntry[],\n\t\toverflowList: OverflowEntry[],\n\t): void {\n\t\tgroup.classList.add(HIDDEN_GROUP_CLASS);\n\t\tfor (const entry of entries) {\n\t\t\tentry.element.classList.add(HIDDEN_BTN_CLASS);\n\t\t\toverflowList.push(entry);\n\t\t}\n\t}\n\n\tprivate entriesInside(group: HTMLElement): OverflowEntry[] {\n\t\tconst result: OverflowEntry[] = [];\n\t\tfor (const entry of this.entries) {\n\t\t\tif (group.contains(entry.element)) {\n\t\t\t\tresult.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/** Updates active/disabled states for items in the open overflow dropdown. */\n\tupdateItemStates(state: EditorState): void {\n\t\tif (!this.overflowDropdown) return;\n\n\t\tconst menuItems: HTMLButtonElement[] = Array.from(\n\t\t\tthis.overflowDropdown.querySelectorAll('.notectl-dropdown__item'),\n\t\t) as HTMLButtonElement[];\n\n\t\tfor (const menuItem of menuItems) {\n\t\t\tconst itemId: string | null = menuItem.getAttribute('data-toolbar-item');\n\t\t\tconst entry: OverflowEntry | undefined = this.overflowEntries.find(\n\t\t\t\t(oe) => oe.item.id === itemId,\n\t\t\t);\n\t\t\tif (!entry) continue;\n\n\t\t\tconst active: boolean = entry.item.isActive?.(state) ?? false;\n\t\t\tconst enabled: boolean = entry.item.isEnabled?.(state) ?? true;\n\t\t\tmenuItem.classList.toggle('notectl-dropdown__item--active', active);\n\t\t\tmenuItem.disabled = !enabled;\n\n\t\t\tif (entry.item.popupType === 'combobox') {\n\t\t\t\tconst labelEl: HTMLSpanElement | null = menuItem.querySelector(\n\t\t\t\t\t'.notectl-dropdown__item-label',\n\t\t\t\t);\n\t\t\t\tif (labelEl) {\n\t\t\t\t\tlabelEl.textContent = entry.item.getLabel(state);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entry.item.getIcon) {\n\t\t\t\tconst newIcon: string = entry.item.getIcon(state);\n\t\t\t\tconst iconEl: HTMLSpanElement | null = menuItem.querySelector(\n\t\t\t\t\t'.notectl-dropdown__item-icon',\n\t\t\t\t);\n\t\t\t\tif (iconEl && iconEl.innerHTML !== newIcon) {\n\t\t\t\t\ticonEl.innerHTML = newIcon;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Cleans up ResizeObserver, DOM elements, and event listeners. */\n\tdestroy(): void {\n\t\tthis.resizeObserver?.disconnect();\n\t\tthis.resizeObserver = null;\n\t\tthis.closeDropdown();\n\t\tthis.overflowButton?.remove();\n\t\tthis.overflowButton = null;\n\t\tthis.entries = [];\n\t\tthis.overflowEntries = [];\n\t}\n\n\t// --- Measurement ---\n\n\tprivate measureChildWidths(children: readonly HTMLElement[]): Map<HTMLElement, number> {\n\t\tconst widths: Map<HTMLElement, number> = new Map();\n\t\tfor (const child of children) {\n\t\t\tif (child === this.overflowButton) continue;\n\t\t\twidths.set(child, child.offsetWidth);\n\t\t}\n\t\treturn widths;\n\t}\n\n\tprivate measureAvailableWidth(): number {\n\t\tconst toolbarStyle: CSSStyleDeclaration = getComputedStyle(this.toolbar);\n\t\tconst paddingLeft: number = Number.parseFloat(toolbarStyle.paddingLeft) || 0;\n\t\tconst paddingRight: number = Number.parseFloat(toolbarStyle.paddingRight) || 0;\n\t\treturn this.toolbar.clientWidth - paddingLeft - paddingRight;\n\t}\n\n\tprivate resetVisibility(): void {\n\t\tfor (const entry of this.entries) {\n\t\t\tentry.element.classList.remove(HIDDEN_BTN_CLASS);\n\t\t}\n\t\tconst separators: HTMLElement[] = Array.from(\n\t\t\tthis.toolbar.querySelectorAll(`.${SEPARATOR_CLASS}`),\n\t\t) as HTMLElement[];\n\t\tfor (const sep of separators) {\n\t\t\tsep.classList.remove(HIDDEN_SEP_CLASS);\n\t\t}\n\t\tconst groups: HTMLElement[] = Array.from(\n\t\t\tthis.toolbar.querySelectorAll(`.${GROUP_CLASS}`),\n\t\t) as HTMLElement[];\n\t\tfor (const grp of groups) {\n\t\t\tgrp.classList.remove(HIDDEN_GROUP_CLASS);\n\t\t}\n\t}\n\n\t// --- Overflow Button ---\n\n\tprivate setOverflowButtonVisible(visible: boolean): void {\n\t\tif (!this.overflowButton) return;\n\t\tthis.overflowButton.classList.toggle(HIDDEN_OVERFLOW_CLASS, !visible);\n\t\tif (!visible) {\n\t\t\tthis.overflowButton.removeAttribute('tabindex');\n\t\t}\n\t}\n\n\tprivate ensureOverflowButton(): void {\n\t\tif (this.overflowButton) return;\n\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = 'notectl-toolbar-overflow-btn';\n\t\tbtn.setAttribute('aria-label', this.ariaLabel);\n\t\tbtn.setAttribute('aria-haspopup', 'true');\n\t\tbtn.setAttribute('aria-expanded', 'false');\n\t\tbtn.setAttribute('part', 'toolbar-button toolbar-overflow-button');\n\t\tbtn.innerHTML = ELLIPSIS_SVG;\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tthis.toggleDropdown();\n\t\t});\n\n\t\tthis.toolbar.appendChild(btn);\n\t\tthis.overflowButton = btn;\n\t}\n\n\t// --- Dropdown ---\n\n\tprivate toggleDropdown(): void {\n\t\tif (this.overflowDropdown) {\n\t\t\tthis.closeDropdown();\n\t\t} else {\n\t\t\tthis.openDropdown();\n\t\t}\n\t}\n\n\tprivate openDropdown(): void {\n\t\tif (!this.overflowButton || this.overflowEntries.length === 0) return;\n\n\t\tconst dropdown: HTMLDivElement = document.createElement('div');\n\t\tdropdown.className = 'notectl-toolbar-popup notectl-dropdown';\n\t\tdropdown.setAttribute('role', 'menu');\n\n\t\tthis.renderDropdownItems(dropdown, this.context.getState());\n\n\t\tif (this.popupManager) {\n\t\t\tthis.overflowHandle = this.popupManager.open({\n\t\t\t\tanchor: this.overflowButton,\n\t\t\t\tclassName: 'notectl-toolbar-popup notectl-dropdown',\n\t\t\t\tariaRole: 'menu',\n\t\t\t\tposition: 'below-end',\n\t\t\t\treferenceNode: this.overflowButton,\n\t\t\t\trestoreFocusTo: this.overflowButton,\n\t\t\t\tonClose: () => {\n\t\t\t\t\tthis.overflowHandle = null;\n\t\t\t\t\tthis.overflowDropdown = null;\n\t\t\t\t\tif (this.overflowButton) {\n\t\t\t\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcontent: (popup: HTMLElement) => {\n\t\t\t\t\tthis.renderDropdownItems(popup, this.context.getState());\n\t\t\t\t\tthis.overflowDropdown = popup;\n\t\t\t\t\tpopup.addEventListener('keydown', (e: KeyboardEvent) => this.handleDropdownKeydown(e));\n\t\t\t\t},\n\t\t\t});\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'true');\n\t\t} else {\n\t\t\tthis.positionDropdown(dropdown);\n\t\t\tappendToRoot(dropdown, this.overflowButton);\n\t\t\tthis.overflowDropdown = dropdown;\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'true');\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst first: HTMLElement | null = dropdown.querySelector('[role=\"menuitem\"]');\n\t\t\t\tfirst?.focus();\n\t\t\t});\n\n\t\t\tdropdown.addEventListener('keydown', (e: KeyboardEvent) => this.handleDropdownKeydown(e));\n\t\t\tthis.registerCloseHandler();\n\t\t}\n\t}\n\n\tprivate renderDropdownItems(dropdown: HTMLElement, state: EditorState): void {\n\t\tlet lastGroup: string | null = null;\n\n\t\tfor (const entry of this.overflowEntries) {\n\t\t\tif (lastGroup !== null && entry.item.group !== lastGroup) {\n\t\t\t\tconst sep: HTMLDivElement = document.createElement('div');\n\t\t\t\tsep.className = 'notectl-dropdown__separator';\n\t\t\t\tsep.setAttribute('role', 'separator');\n\t\t\t\tdropdown.appendChild(sep);\n\t\t\t}\n\t\t\tlastGroup = entry.item.group;\n\n\t\t\tconst menuBtn: HTMLButtonElement = document.createElement('button');\n\t\t\tmenuBtn.type = 'button';\n\t\t\tmenuBtn.className = 'notectl-dropdown__item';\n\t\t\tmenuBtn.setAttribute('role', 'menuitem');\n\t\t\tmenuBtn.setAttribute('tabindex', '-1');\n\t\t\tmenuBtn.setAttribute('data-toolbar-item', entry.item.id);\n\n\t\t\tconst iconSpan: HTMLSpanElement = document.createElement('span');\n\t\t\ticonSpan.className = 'notectl-dropdown__item-icon';\n\t\t\tif (entry.item.popupType !== 'combobox') {\n\t\t\t\ticonSpan.innerHTML = entry.item.icon;\n\t\t\t}\n\t\t\tmenuBtn.appendChild(iconSpan);\n\n\t\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tlabelSpan.className = 'notectl-dropdown__item-label';\n\t\t\tlabelSpan.textContent =\n\t\t\t\tentry.item.popupType === 'combobox'\n\t\t\t\t\t? entry.item.getLabel(state)\n\t\t\t\t\t: (entry.item.tooltip ?? entry.item.label);\n\t\t\tmenuBtn.appendChild(labelSpan);\n\n\t\t\tmenuBtn.addEventListener('mousedown', (ev: MouseEvent) => {\n\t\t\t\tev.preventDefault();\n\t\t\t\tev.stopPropagation();\n\t\t\t\tthis.activateOverflowItem(entry);\n\t\t\t});\n\n\t\t\tdropdown.appendChild(menuBtn);\n\t\t}\n\t}\n\n\tprivate positionDropdown(dropdown: HTMLElement): void {\n\t\tif (!this.overflowButton) return;\n\n\t\tconst rect: DOMRect = this.overflowButton.getBoundingClientRect();\n\t\tconst rtl: boolean = isRtlContext(this.toolbar);\n\n\t\tpositionPopup(dropdown, rect, { position: rtl ? 'below-start' : 'below-end', isRtl: rtl });\n\t}\n\n\tprivate registerCloseHandler(): void {\n\t\tthis.closeHandler = (ev: MouseEvent) => {\n\t\t\tconst path: EventTarget[] = ev.composedPath();\n\t\t\tif (\n\t\t\t\tthis.overflowDropdown &&\n\t\t\t\t!path.includes(this.overflowDropdown) &&\n\t\t\t\tthis.overflowButton &&\n\t\t\t\t!path.includes(this.overflowButton)\n\t\t\t) {\n\t\t\t\tthis.closeDropdown();\n\t\t\t}\n\t\t};\n\t\tthis.closeHandlerTimer = setTimeout(() => {\n\t\t\tthis.closeHandlerTimer = null;\n\t\t\tif (!this.closeHandler || !this.overflowDropdown) return;\n\t\t\tdocument.addEventListener('mousedown', this.closeHandler);\n\t\t\tthis.closeHandlerAttached = true;\n\t\t}, 0);\n\t}\n\n\tprivate closeDropdown(): void {\n\t\tif (this.overflowHandle) {\n\t\t\tconst handle: PopupHandle = this.overflowHandle;\n\t\t\tthis.overflowHandle = null;\n\t\t\tthis.overflowDropdown = null;\n\t\t\thandle.close();\n\t\t\tif (this.overflowButton) {\n\t\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.overflowDropdown) {\n\t\t\tthis.overflowDropdown.remove();\n\t\t\tthis.overflowDropdown = null;\n\t\t}\n\t\tif (this.overflowButton) {\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t}\n\t\tif (this.closeHandler) {\n\t\t\tif (this.closeHandlerTimer !== null) {\n\t\t\t\tclearTimeout(this.closeHandlerTimer);\n\t\t\t\tthis.closeHandlerTimer = null;\n\t\t\t}\n\t\t\tif (this.closeHandlerAttached) {\n\t\t\t\tdocument.removeEventListener('mousedown', this.closeHandler);\n\t\t\t\tthis.closeHandlerAttached = false;\n\t\t\t}\n\t\t\tthis.closeHandler = null;\n\t\t}\n\t}\n\n\tprivate activateOverflowItem(entry: OverflowEntry): void {\n\t\tthis.closeDropdown();\n\t\tif (entry.item.popupType && this.overflowButton) {\n\t\t\tthis.onItemActivated(this.overflowButton, entry.item);\n\t\t} else {\n\t\t\tthis.context.executeCommand(entry.item.command);\n\t\t}\n\t}\n\n\t// --- Keyboard Navigation ---\n\n\tprivate handleDropdownKeydown(e: KeyboardEvent): void {\n\t\tif (!this.overflowDropdown) return;\n\n\t\tif (e.key === 'Escape' || e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.closeDropdown();\n\t\t\tthis.overflowButton?.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst items: HTMLElement[] = Array.from(\n\t\t\tthis.overflowDropdown.querySelectorAll('[role=\"menuitem\"]'),\n\t\t) as HTMLElement[];\n\t\tconst current: number = items.indexOf(this.getActiveElement() as HTMLElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(items, current, 1);\n\t\t\t\titems[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(items, current, -1);\n\t\t\t\titems[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focusedItem: HTMLElement | undefined = items[current];\n\t\t\t\tif (!focusedItem) break;\n\t\t\t\tconst itemId: string | null = focusedItem.getAttribute('data-toolbar-item');\n\t\t\t\tconst entry: OverflowEntry | undefined = this.overflowEntries.find(\n\t\t\t\t\t(oe) => oe.item.id === itemId,\n\t\t\t\t);\n\t\t\t\tif (entry) this.activateOverflowItem(entry);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Helpers ---\n\n\tprivate hideTrailingSeparators(): void {\n\t\tconst children: HTMLElement[] = Array.from(this.toolbar.children) as HTMLElement[];\n\t\tfor (let i = children.length - 1; i >= 0; i--) {\n\t\t\tconst child: HTMLElement | undefined = children[i];\n\t\t\tif (!child || child === this.overflowButton) continue;\n\t\t\tif (child.classList.contains(SEPARATOR_CLASS)) {\n\t\t\t\tif (!child.classList.contains(HIDDEN_SEP_CLASS)) {\n\t\t\t\t\tchild.classList.add(HIDDEN_SEP_CLASS);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isHiddenGroup: boolean =\n\t\t\t\tchild.classList.contains(GROUP_CLASS) && child.classList.contains(HIDDEN_GROUP_CLASS);\n\t\t\tconst isHiddenButton: boolean =\n\t\t\t\tchild.classList.contains(BUTTON_CLASS) && child.classList.contains(HIDDEN_BTN_CLASS);\n\t\t\tif (isHiddenGroup || isHiddenButton) continue;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate notifyChange(): void {\n\t\tconst visible: HTMLButtonElement[] = this.entries\n\t\t\t.filter((oe) => !oe.element.classList.contains(HIDDEN_BTN_CLASS))\n\t\t\t.map((oe) => oe.element);\n\t\tthis.onOverflowChange(visible, this.overflowEntries.length > 0 ? this.overflowButton : null);\n\t}\n}\n","/**\n * ToolbarRenderers: pure rendering functions for toolbar popup content.\n * Grid pickers, dropdown menus, and separator elements.\n */\n\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\nimport type { DropdownConfig, GridPickerConfig } from './ToolbarItem.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale } from './ToolbarLocale.js';\n\nconst HIGHLIGHTED_CLASS = 'notectl-grid-picker__cell--highlighted';\n\n/**\n * Renders a grid picker into the given container.\n * Calls `onClose` after a cell is selected so the popup can be dismissed.\n */\nexport function renderGridPicker(\n\tcontainer: HTMLElement,\n\tconfig: GridPickerConfig,\n\tonClose: () => void,\n\tlocale: ToolbarLocale = TOOLBAR_LOCALE_EN,\n): void {\n\tcontainer.className += ' notectl-grid-picker';\n\n\tconst grid: HTMLDivElement = document.createElement('div');\n\tgrid.className = 'notectl-grid-picker__grid';\n\tgrid.setAttribute('role', 'grid');\n\tsetStyleProperties(grid, {\n\t\tdisplay: 'grid',\n\t\tgridTemplateColumns: `repeat(${config.maxCols}, 1fr)`,\n\t\tgap: '2px',\n\t\tpadding: '8px',\n\t});\n\n\tconst label: HTMLDivElement = document.createElement('div');\n\tlabel.className = 'notectl-grid-picker__label';\n\tlabel.textContent = locale.gridPickerLabel(1, 1);\n\tsetStyleProperties(label, {\n\t\ttextAlign: 'center',\n\t\tpadding: '4px',\n\t\tfontSize: '12px',\n\t});\n\tlabel.setAttribute('aria-live', 'polite');\n\n\tfor (let r = 1; r <= config.maxRows; r++) {\n\t\tfor (let c = 1; c <= config.maxCols; c++) {\n\t\t\tconst cell: HTMLDivElement = document.createElement('div');\n\t\t\tcell.className = 'notectl-grid-picker__cell';\n\t\t\tcell.setAttribute('role', 'gridcell');\n\t\t\tcell.setAttribute('tabindex', '-1');\n\t\t\tcell.setAttribute('aria-label', locale.gridPickerLabel(r, c));\n\t\t\tsetStyleProperties(cell, {\n\t\t\t\twidth: '20px',\n\t\t\t\theight: '20px',\n\t\t\t\tborder: '1px solid #ccc',\n\t\t\t\tcursor: 'pointer',\n\t\t\t});\n\t\t\tcell.setAttribute('data-row', String(r));\n\t\t\tcell.setAttribute('data-col', String(c));\n\n\t\t\tcell.addEventListener('mouseenter', () => {\n\t\t\t\thighlightCells(grid, r, c);\n\t\t\t\tlabel.textContent = locale.gridPickerLabel(r, c);\n\t\t\t});\n\n\t\t\tcell.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t\tcell.addEventListener('click', () => {\n\t\t\t\tconfig.onSelect(r, c);\n\t\t\t\tonClose();\n\t\t\t});\n\n\t\t\tgrid.appendChild(cell);\n\t\t}\n\t}\n\n\tcontainer.appendChild(grid);\n\tcontainer.appendChild(label);\n}\n\n/**\n * Highlights grid cells up to the given row/col and updates the label.\n * Used by both mouse hover and keyboard navigation.\n */\nexport function highlightCells(grid: HTMLElement, targetRow: number, targetCol: number): void {\n\tconst cells: NodeListOf<Element> = grid.querySelectorAll('.notectl-grid-picker__cell');\n\tfor (const cell of cells) {\n\t\tconst r: number = Number(cell.getAttribute('data-row'));\n\t\tconst c: number = Number(cell.getAttribute('data-col'));\n\t\tcell.classList.toggle(HIGHLIGHTED_CLASS, r <= targetRow && c <= targetCol);\n\t}\n}\n\n/**\n * Renders a dropdown menu into the given container.\n * Calls `onClose` after an item is activated so the popup can be dismissed.\n */\nexport function renderDropdown(\n\tcontainer: HTMLElement,\n\tconfig: DropdownConfig,\n\texecuteCommand: (command: string) => void,\n\tonClose: () => void,\n): void {\n\tcontainer.classList.add('notectl-dropdown');\n\tcontainer.setAttribute('role', 'menu');\n\n\tfor (const item of config.items) {\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = 'notectl-dropdown__item';\n\t\tbtn.setAttribute('role', 'menuitem');\n\t\tbtn.setAttribute('tabindex', '-1');\n\n\t\tif (item.icon) {\n\t\t\tconst iconSpan: HTMLSpanElement = document.createElement('span');\n\t\t\ticonSpan.className = 'notectl-dropdown__item-icon';\n\t\t\ticonSpan.innerHTML = item.icon;\n\t\t\tbtn.appendChild(iconSpan);\n\t\t}\n\n\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\tlabelSpan.className = 'notectl-dropdown__item-label';\n\t\tlabelSpan.textContent = item.label;\n\t\tbtn.appendChild(labelSpan);\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tbtn.addEventListener('click', () => {\n\t\t\texecuteCommand(item.command);\n\t\t\tonClose();\n\t\t});\n\n\t\tcontainer.appendChild(btn);\n\t}\n}\n\n/** Creates a toolbar group separator element. */\nexport function createSeparator(): HTMLSpanElement {\n\tconst sep: HTMLSpanElement = document.createElement('span');\n\tsep.className = 'notectl-toolbar-separator';\n\tsep.setAttribute('role', 'separator');\n\tsep.setAttribute('part', 'toolbar-divider');\n\treturn sep;\n}\n","/**\n * ToolbarPopupController: manages popup lifecycle, positioning, keyboard\n * navigation, and auto-close for toolbar popups (grid pickers, dropdowns,\n * and custom popups). Delegates lifecycle to PopupManager.\n */\n\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { findNextDropdownItem, navigateGrid } from '../shared/KeyboardNav.js';\nimport type { PopupCloseOptions, PopupHandle, PopupManager } from '../shared/PopupManager.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale } from './ToolbarLocale.js';\nimport { highlightCells, renderDropdown, renderGridPicker } from './ToolbarRenderers.js';\n\nexport class ToolbarPopupController {\n\tprivate activePopup: HTMLElement | null = null;\n\tprivate activePopupButton: HTMLButtonElement | null = null;\n\tprivate activeHandle: PopupHandle | null = null;\n\tprivate readonly getActiveElement: () => Element | null;\n\tprivate readonly locale: ToolbarLocale;\n\tprivate popupManager: PopupManager | null = null;\n\n\tconstructor(getActiveElement: () => Element | null, locale: ToolbarLocale = TOOLBAR_LOCALE_EN) {\n\t\tthis.getActiveElement = getActiveElement;\n\t\tthis.locale = locale;\n\t}\n\n\t/** Injects the PopupManager instance (called after service registration). */\n\tsetPopupManager(manager: PopupManager): void {\n\t\tthis.popupManager = manager;\n\t}\n\n\t/** Whether a popup is currently open. */\n\tisOpen(): boolean {\n\t\treturn this.activePopup !== null;\n\t}\n\n\t/** Toggles a popup for the given toolbar button. */\n\ttoggle(button: HTMLButtonElement, item: ToolbarItem, context: PluginContext): void {\n\t\tif (this.activePopup) {\n\t\t\tthis.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.openViaManager(button, item, context);\n\t}\n\n\t/** Closes the active popup and cleans up event listeners. */\n\tclose(): void {\n\t\tif (this.activeHandle) {\n\t\t\t// Prevent onClose callback from re-entering\n\t\t\tconst handle: PopupHandle = this.activeHandle;\n\t\t\tthis.activeHandle = null;\n\t\t\tthis.clearButtonState();\n\t\t\thandle.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearButtonState();\n\t\tif (this.activePopup) {\n\t\t\tthis.activePopup.remove();\n\t\t\tthis.activePopup = null;\n\t\t}\n\t}\n\n\t/** Closes popup and restores focus to the trigger button. */\n\tcloseAndRestoreFocus(): void {\n\t\tconst triggerBtn: HTMLButtonElement | null = this.activePopupButton;\n\t\tthis.close();\n\t\ttriggerBtn?.focus();\n\t}\n\n\tdestroy(): void {\n\t\tthis.close();\n\t}\n\n\t// --- PopupManager path ---\n\n\tprivate openViaManager(\n\t\tbutton: HTMLButtonElement,\n\t\titem: ToolbarItem,\n\t\tcontext: PluginContext,\n\t): void {\n\t\tif (!this.popupManager) return;\n\n\t\tthis.activePopupButton = button;\n\t\tbutton.classList.add('notectl-toolbar-btn--popup-open');\n\t\tbutton.setAttribute('aria-expanded', 'true');\n\n\t\tthis.activeHandle = this.popupManager.open({\n\t\t\tanchor: button,\n\t\t\tclassName: 'notectl-toolbar-popup',\n\t\t\treferenceNode: button,\n\t\t\trestoreFocusTo: button,\n\t\t\tposition: 'below-start',\n\t\t\tonClose: () => {\n\t\t\t\t// Called when PopupManager closes the popup (click-outside, etc.)\n\t\t\t\tthis.activeHandle = null;\n\t\t\t\tthis.clearButtonState();\n\t\t\t\tthis.activePopup = null;\n\t\t\t},\n\t\t\tcontent: (popup: HTMLElement, close: (options?: PopupCloseOptions) => void) => {\n\t\t\t\tthis.activePopup = popup;\n\t\t\t\tthis.renderPopupContent(popup, item, context, close);\n\t\t\t\tpopup.addEventListener('keydown', (e: KeyboardEvent) => this.handlePopupKeydown(e));\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- Shared rendering ---\n\n\tprivate renderPopupContent(\n\t\tpopup: HTMLElement,\n\t\titem: ToolbarItem,\n\t\tcontext: PluginContext,\n\t\tclose: (options?: PopupCloseOptions) => void,\n\t): void {\n\t\tconst closeAndFocusEditor = (): void => {\n\t\t\tclose({ restoreFocusTo: null });\n\t\t\tcontext.getContainer().focus();\n\t\t};\n\n\t\tswitch (item.popupType) {\n\t\t\tcase 'gridPicker':\n\t\t\t\trenderGridPicker(popup, item.popupConfig, closeAndFocusEditor, this.locale);\n\t\t\t\tbreak;\n\t\t\tcase 'dropdown':\n\t\t\t\trenderDropdown(\n\t\t\t\t\tpopup,\n\t\t\t\t\titem.popupConfig,\n\t\t\t\t\t(cmd: string) => context.executeCommand(cmd),\n\t\t\t\t\tcloseAndFocusEditor,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'custom':\n\t\t\t\titem.renderPopup(popup, context, close);\n\t\t\t\tbreak;\n\t\t\tcase 'combobox':\n\t\t\t\titem.renderPopup(popup, context, close);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// --- Button state ---\n\n\tprivate clearButtonState(): void {\n\t\tif (this.activePopupButton) {\n\t\t\tthis.activePopupButton.classList.remove('notectl-toolbar-btn--popup-open');\n\t\t\tthis.activePopupButton.setAttribute('aria-expanded', 'false');\n\t\t\tthis.activePopupButton = null;\n\t\t}\n\t}\n\n\t// --- Keyboard Navigation ---\n\n\tprivate handlePopupKeydown(e: KeyboardEvent): void {\n\t\tif (!this.activePopup) return;\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.closeAndRestoreFocus();\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\tthis.closeAndRestoreFocus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst menuItems: NodeListOf<Element> = this.activePopup.querySelectorAll('[role=\"menuitem\"]');\n\t\tif (menuItems.length > 0) {\n\t\t\tthis.handleDropdownKeydown(e, menuItems);\n\t\t\treturn;\n\t\t}\n\n\t\tconst hasGrid: boolean = this.activePopup.querySelector('.notectl-grid-picker__cell') !== null;\n\t\tif (hasGrid) {\n\t\t\tthis.handleGridKeydown(e);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.handleCustomPopupKeydown(e);\n\t}\n\n\tprivate handleDropdownKeydown(e: KeyboardEvent, items: NodeListOf<Element>): void {\n\t\tconst itemArr: HTMLElement[] = Array.from(items) as HTMLElement[];\n\t\tconst current: number = itemArr.indexOf(this.getActiveElement() as HTMLElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(itemArr, current, 1);\n\t\t\t\titemArr[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(itemArr, current, -1);\n\t\t\t\titemArr[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focused: HTMLElement | undefined = itemArr[current];\n\t\t\t\tif (focused) focused.click();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleGridKeydown(e: KeyboardEvent): void {\n\t\tconst focused: HTMLElement = this.getActiveElement() as HTMLElement;\n\t\tconst row: number = Number(focused?.getAttribute('data-row') ?? 1);\n\t\tconst col: number = Number(focused?.getAttribute('data-col') ?? 1);\n\n\t\tconst grid: Element | null =\n\t\t\tthis.activePopup?.querySelector('.notectl-grid-picker__grid') ?? null;\n\t\tif (!grid) return;\n\n\t\tconst lastCell: Element | null = grid.querySelector('.notectl-grid-picker__cell:last-child');\n\t\tconst maxCols: number = Number(lastCell?.getAttribute('data-col') ?? 1);\n\t\tconst maxRows: number = Number(lastCell?.getAttribute('data-row') ?? 1);\n\n\t\tif (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\tconst [newRow, newCol]: [number, number] = navigateGrid(\n\t\t\t\trow,\n\t\t\t\tcol,\n\t\t\t\tmaxRows,\n\t\t\t\tmaxCols,\n\t\t\t\te.key as 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n\t\t\t\tthis.activePopup ? isRtlContext(this.activePopup) : false,\n\t\t\t);\n\t\t\tconst target: HTMLElement | null = grid.querySelector(\n\t\t\t\t`.notectl-grid-picker__cell[data-row=\"${newRow}\"][data-col=\"${newCol}\"]`,\n\t\t\t);\n\t\t\ttarget?.focus();\n\n\t\t\thighlightCells(grid as HTMLElement, newRow, newCol);\n\t\t\tconst label: Element | null =\n\t\t\t\tthis.activePopup?.querySelector('.notectl-grid-picker__label') ?? null;\n\t\t\tif (label) label.textContent = this.locale.gridPickerLabel(newRow, newCol);\n\t\t}\n\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\tfocused?.click();\n\t\t}\n\t}\n\n\tprivate handleCustomPopupKeydown(e: KeyboardEvent): void {\n\t\tif (!this.activePopup) return;\n\t\tconst buttons: HTMLButtonElement[] = Array.from(this.activePopup.querySelectorAll('button'));\n\t\tif (buttons.length === 0) return;\n\t\tconst active: HTMLElement = this.getActiveElement() as HTMLElement;\n\t\tconst currentIdx: number = buttons.indexOf(active as HTMLButtonElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(buttons, currentIdx, 1);\n\t\t\t\tbuttons[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(buttons, currentIdx, -1);\n\t\t\t\tbuttons[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (active) {\n\t\t\t\t\tactive.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * ToolbarTooltip: manages the tooltip lifecycle for toolbar buttons.\n * Shows a tooltip after a short delay when hovering or focusing a button,\n * hides it when the cursor leaves or focus moves away.\n */\n\nimport { setStyleProperties, setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { ContainingBlockOffset } from '../shared/PopupPositioning.js';\nimport { measureContainingBlockOffset } from '../shared/PopupPositioning.js';\n\nconst TOOLTIP_DELAY_MS = 500;\n\nexport class ToolbarTooltip {\n\tprivate readonly element: HTMLElement;\n\tprivate timer: ReturnType<typeof setTimeout> | null = null;\n\tprivate target: HTMLButtonElement | null = null;\n\tprivate readonly isPopupActive: () => boolean;\n\n\tstatic readonly TOOLTIP_ID = 'notectl-toolbar-tooltip';\n\n\tconstructor(isPopupActive: () => boolean) {\n\t\tthis.isPopupActive = isPopupActive;\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'notectl-toolbar-tooltip';\n\t\tthis.element.id = ToolbarTooltip.TOOLTIP_ID;\n\t\tthis.element.setAttribute('role', 'tooltip');\n\t\tsetStyleProperty(this.element, 'display', 'none');\n\t}\n\n\tshow(button: HTMLButtonElement): void {\n\t\tthis.hide();\n\n\t\tif (this.isPopupActive() || button.disabled) return;\n\n\t\tconst text: string | null = button.getAttribute('data-tooltip');\n\t\tif (!text) return;\n\n\t\tthis.target = button;\n\n\t\tthis.timer = setTimeout(() => {\n\t\t\tif (this.isPopupActive()) return;\n\n\t\t\tthis.element.textContent = text;\n\t\t\tsetStyleProperty(this.element, 'display', '');\n\n\t\t\tconst root: Node = button.getRootNode();\n\t\t\tif (root instanceof ShadowRoot && !this.element.parentNode) {\n\t\t\t\troot.appendChild(this.element);\n\t\t\t} else if (!(root instanceof ShadowRoot) && !this.element.parentNode) {\n\t\t\t\tdocument.body.appendChild(this.element);\n\t\t\t}\n\n\t\t\tbutton.setAttribute('aria-describedby', ToolbarTooltip.TOOLTIP_ID);\n\n\t\t\tconst rect: DOMRect = button.getBoundingClientRect();\n\t\t\tsetStyleProperty(this.element, 'position', 'fixed');\n\t\t\tconst cbOffset: ContainingBlockOffset = measureContainingBlockOffset(this.element);\n\t\t\tsetStyleProperties(this.element, {\n\t\t\t\ttop: `${rect.bottom + 6 - cbOffset.y}px`,\n\t\t\t\tleft: `${rect.left + rect.width / 2 - cbOffset.x}px`,\n\t\t\t\ttransform: 'translateX(-50%)',\n\t\t\t});\n\t\t}, TOOLTIP_DELAY_MS);\n\t}\n\n\thide(): void {\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = null;\n\t\t}\n\t\tif (this.target) {\n\t\t\tthis.target.removeAttribute('aria-describedby');\n\t\t\tthis.target = null;\n\t\t}\n\t\tsetStyleProperty(this.element, 'display', 'none');\n\t}\n\n\tdestroy(): void {\n\t\tthis.hide();\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * Toolbar plugin: renders toolbar items registered by other plugins.\n * Acts as a pure rendering engine — has no knowledge of specific features.\n * Supports buttons, dropdowns, grid pickers, and custom popups.\n * Implements WAI-ARIA Toolbar pattern with roving tabindex.\n */\n\nimport { TOOLBAR_CSS } from '../../editor/styles/toolbar.js';\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { ServiceKey } from '../Plugin.js';\nimport type { Plugin, PluginConfig, PluginContext } from '../Plugin.js';\nimport { applyRovingTabindex } from '../shared/KeyboardNav.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { PopupManager, PopupServiceKey } from '../shared/PopupManager.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\nimport {\n\tfindFirstEnabled,\n\tfindLastEnabled,\n\tfindNextEnabled,\n\tresolveHorizontalDirection,\n} from './ToolbarKeyboardNav.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale, loadToolbarLocale } from './ToolbarLocale.js';\nimport {\n\tToolbarOverflowBehavior,\n\ttype ToolbarOverflowBehavior as ToolbarOverflowBehaviorType,\n} from './ToolbarOverflowBehavior.js';\nimport { ToolbarOverflowController } from './ToolbarOverflowController.js';\nimport { ToolbarPopupController } from './ToolbarPopupController.js';\nimport { createSeparator } from './ToolbarRenderers.js';\nimport { ToolbarTooltip } from './ToolbarTooltip.js';\n\n// --- Layout Config ---\n\n/**\n * Configuration for a single toolbar group. Accepts either:\n * - A `ReadonlyArray<string>` of plugin ids (backwards-compatible tuple form), or\n * - An object with `plugins` and an optional accessible `label`. When `label` is set,\n * the group wrapper receives `role=\"group\"` and `aria-label`, so assistive technology\n * can announce the cluster by name.\n */\nexport type ToolbarGroupConfig =\n\t| ReadonlyArray<string>\n\t| {\n\t\t\treadonly plugins: ReadonlyArray<string>;\n\t\t\treadonly label?: string;\n\t };\n\nexport interface ToolbarLayoutConfig {\n\treadonly groups: ReadonlyArray<ToolbarGroupConfig>;\n\t/**\n\t * Controls responsive overflow behavior when toolbar items exceed available width.\n\t * Defaults to `ToolbarOverflowBehavior.BurgerMenu`.\n\t */\n\treadonly overflow?: ToolbarOverflowBehaviorType;\n}\n\ninterface NormalizedGroup {\n\treadonly plugins: ReadonlyArray<string>;\n\treadonly label: string | undefined;\n}\n\nfunction normalizeGroupConfig(group: ToolbarGroupConfig): NormalizedGroup {\n\tif (Array.isArray(group)) {\n\t\treturn { plugins: group, label: undefined };\n\t}\n\tconst obj: { readonly plugins: ReadonlyArray<string>; readonly label?: string } = group as {\n\t\treadonly plugins: ReadonlyArray<string>;\n\t\treadonly label?: string;\n\t};\n\treturn { plugins: obj.plugins, label: obj.label };\n}\n\n// --- Typed Service API ---\n\nexport interface ToolbarServiceAPI {\n\t/** Re-reads isActive/isEnabled from state and updates all buttons. */\n\trefresh(): void;\n\t/** Closes the currently open popup, if any. */\n\tclosePopup(): void;\n}\n\nexport const ToolbarServiceKey = new ServiceKey<ToolbarServiceAPI>('toolbar');\n\n// --- Plugin ---\n\ninterface ToolbarButton {\n\telement: HTMLButtonElement;\n\titem: ToolbarItem;\n\tcomboLabelEl: HTMLSpanElement | null;\n}\n\nexport class ToolbarPlugin implements Plugin {\n\treadonly id = 'toolbar';\n\treadonly name = 'Toolbar';\n\treadonly priority = 10;\n\n\tprivate context: PluginContext | null = null;\n\tprivate toolbarElement: HTMLElement | null = null;\n\tprivate buttons: ToolbarButton[] = [];\n\tprivate readonly hiddenItems = new Set<string>();\n\tprivate readonly layoutConfig: ToolbarLayoutConfig | null;\n\tprivate overflowBehavior: ToolbarOverflowBehaviorType;\n\tprivate focusedIndex = 0;\n\tprivate tooltip: ToolbarTooltip | null = null;\n\tprivate popupController: ToolbarPopupController | null = null;\n\tprivate popupManager: PopupManager | null = null;\n\tprivate overflowController: ToolbarOverflowController | null = null;\n\tprivate visibleElements: HTMLButtonElement[] = [];\n\tprivate locale!: ToolbarLocale;\n\n\tconstructor(layoutConfig?: ToolbarLayoutConfig) {\n\t\tthis.layoutConfig = layoutConfig ?? null;\n\t\tthis.overflowBehavior = layoutConfig?.overflow ?? ToolbarOverflowBehavior.BurgerMenu;\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(context, undefined, TOOLBAR_LOCALE_EN, loadToolbarLocale);\n\t\tcontext.registerStyleSheet(TOOLBAR_CSS);\n\t\tthis.context = context;\n\n\t\tthis.popupManager = new PopupManager(context.getContainer());\n\t\tcontext.registerService(PopupServiceKey, this.popupManager);\n\n\t\tthis.popupController = new ToolbarPopupController(() => this.getActiveElement(), this.locale);\n\t\tthis.popupController.setPopupManager(this.popupManager);\n\t\tthis.tooltip = new ToolbarTooltip(() => this.popupController?.isOpen() ?? false);\n\n\t\tcontext.registerService(ToolbarServiceKey, {\n\t\t\trefresh: () => this.updateButtonStates(context.getState()),\n\t\t\tclosePopup: () => this.popupController?.close(),\n\t\t});\n\n\t\tthis.createToolbarElement();\n\t}\n\n\t/** Returns the current overflow behavior. */\n\tgetOverflowBehavior(): ToolbarOverflowBehaviorType {\n\t\treturn this.overflowBehavior;\n\t}\n\n\t/** Switches the overflow behavior at runtime. */\n\tsetOverflowBehavior(behavior: ToolbarOverflowBehaviorType): void {\n\t\tif (behavior === this.overflowBehavior) return;\n\n\t\tthis.overflowBehavior = behavior;\n\t\tthis.applyOverflowBehavior();\n\t\tthis.renderItems();\n\t}\n\n\tonReady(): void {\n\t\tthis.renderItems();\n\t}\n\n\tdestroy(): void {\n\t\tthis.overflowController?.destroy();\n\t\tthis.overflowController = null;\n\t\tthis.popupController?.destroy();\n\t\tthis.popupController = null;\n\t\tthis.popupManager?.destroy();\n\t\tthis.popupManager = null;\n\t\tthis.tooltip?.destroy();\n\t\tthis.tooltip = null;\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.remove();\n\t\t\tthis.toolbarElement = null;\n\t\t}\n\t\tthis.buttons = [];\n\t\tthis.visibleElements = [];\n\t\tthis.context = null;\n\t}\n\n\tonStateChange(_oldState: EditorState, newState: EditorState, _tr: Transaction): void {\n\t\tthis.updateButtonStates(newState);\n\t}\n\n\tonReadOnlyChange(readonly: boolean): void {\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.hidden = readonly;\n\t\t}\n\t}\n\n\tonConfigure(config: PluginConfig): void {\n\t\tfor (const [key, value] of Object.entries(config)) {\n\t\t\tif (value === false) {\n\t\t\t\tthis.hiddenItems.add(key);\n\t\t\t} else {\n\t\t\t\tthis.hiddenItems.delete(key);\n\t\t\t}\n\t\t}\n\t\tthis.renderItems();\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate createToolbarElement(): void {\n\t\tif (!this.context) return;\n\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.remove();\n\t\t}\n\t\tthis.buttons = [];\n\n\t\tconst container: HTMLElement = this.context.getPluginContainer('top');\n\t\tthis.toolbarElement = document.createElement('div');\n\t\tthis.toolbarElement.setAttribute('role', 'toolbar');\n\t\tthis.toolbarElement.setAttribute('aria-label', this.locale.formattingOptionsAria);\n\t\tthis.toolbarElement.setAttribute('data-notectl-no-print', '');\n\t\tthis.toolbarElement.setAttribute('part', 'toolbar');\n\t\tthis.toolbarElement.className = 'notectl-toolbar';\n\n\t\tthis.toolbarElement.addEventListener('keydown', (e) => this.handleToolbarKeydown(e));\n\n\t\tthis.applyOverflowBehavior();\n\t\tcontainer.appendChild(this.toolbarElement);\n\t}\n\n\t/** Applies the current overflow behavior: creates/destroys the overflow controller and sets the data attribute. */\n\tprivate applyOverflowBehavior(): void {\n\t\tif (!this.toolbarElement || !this.context) return;\n\n\t\t// Tear down existing overflow controller\n\t\tthis.overflowController?.destroy();\n\t\tthis.overflowController = null;\n\n\t\tthis.toolbarElement.setAttribute('data-overflow', this.overflowBehavior);\n\n\t\tif (this.overflowBehavior === ToolbarOverflowBehavior.BurgerMenu) {\n\t\t\tthis.overflowController = new ToolbarOverflowController({\n\t\t\t\ttoolbar: this.toolbarElement,\n\t\t\t\tariaLabel: this.locale.moreToolsAria,\n\t\t\t\tcontext: this.context,\n\t\t\t\tpopupManager: this.popupManager ?? undefined,\n\t\t\t\tonOverflowChange: (visibleButtons, overflowBtn) => {\n\t\t\t\t\tthis.visibleElements = overflowBtn\n\t\t\t\t\t\t? [...visibleButtons, overflowBtn]\n\t\t\t\t\t\t: [...visibleButtons];\n\t\t\t\t\tthis.initRovingTabindex();\n\t\t\t\t},\n\t\t\t\tonItemActivated: (btn: HTMLButtonElement, item: ToolbarItem) => {\n\t\t\t\t\tthis.activateButton(btn, item);\n\t\t\t\t},\n\t\t\t\tgetActiveElement: () => this.getActiveElement(),\n\t\t\t});\n\t\t} else {\n\t\t\t// Flow and None modes: all buttons are visible for roving tabindex\n\t\t\tthis.visibleElements = [];\n\t\t}\n\t}\n\n\tprivate renderItems(): void {\n\t\tif (!this.context || !this.toolbarElement) return;\n\n\t\tfor (const btn of this.buttons) {\n\t\t\tbtn.element.remove();\n\t\t}\n\t\tthis.buttons = [];\n\n\t\tfor (const sep of this.toolbarElement.querySelectorAll('.notectl-toolbar-separator')) {\n\t\t\tsep.remove();\n\t\t}\n\t\tfor (const grp of this.toolbarElement.querySelectorAll('.notectl-toolbar-group')) {\n\t\t\tgrp.remove();\n\t\t}\n\n\t\tif (this.layoutConfig) {\n\t\t\tthis.renderItemsByLayout();\n\t\t} else {\n\t\t\tthis.renderItemsByGroup();\n\t\t}\n\n\t\tif (this.buttons.length > 0 && !this.toolbarElement.parentElement) {\n\t\t\tconst container: HTMLElement = this.context.getPluginContainer('top');\n\t\t\tcontainer.appendChild(this.toolbarElement);\n\t\t}\n\n\t\tthis.overflowController?.update(this.buttons);\n\t\tthis.initRovingTabindex();\n\t\tthis.updateButtonStates(this.context.getState());\n\t}\n\n\tprivate createGroupWrapper(label: string | undefined): HTMLDivElement {\n\t\tconst wrapper: HTMLDivElement = document.createElement('div');\n\t\twrapper.className = 'notectl-toolbar-group';\n\t\twrapper.setAttribute('part', 'toolbar-group');\n\t\tif (label !== undefined) {\n\t\t\twrapper.setAttribute('role', 'group');\n\t\t\twrapper.setAttribute('aria-label', label);\n\t\t}\n\t\treturn wrapper;\n\t}\n\n\t// --- Roving Tabindex ---\n\n\tprivate getTabElements(): HTMLButtonElement[] {\n\t\treturn this.visibleElements.length > 0\n\t\t\t? this.visibleElements\n\t\t\t: this.buttons.map((b) => b.element);\n\t}\n\n\tprivate initRovingTabindex(): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tconst first: number = findFirstEnabled(elements);\n\t\tthis.focusedIndex = first >= 0 ? first : 0;\n\t\tapplyRovingTabindex(elements, this.focusedIndex);\n\t}\n\n\tprivate setRovingFocus(index: number): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tif (index < 0 || index >= elements.length) return;\n\t\tthis.focusedIndex = index;\n\t\tapplyRovingTabindex(elements, index);\n\t\telements[index]?.focus();\n\t}\n\n\t/** Returns the active element, respecting shadow DOM boundaries. */\n\tprivate getActiveElement(): Element | null {\n\t\tconst root: Node | undefined = this.toolbarElement?.getRootNode();\n\t\tif (root instanceof ShadowRoot) {\n\t\t\treturn root.activeElement;\n\t\t}\n\t\treturn document.activeElement;\n\t}\n\n\tprivate syncFocusedIndex(): void {\n\t\tconst active: Element | null = this.getActiveElement();\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tconst idx: number = elements.findIndex((el) => el === active);\n\t\tif (idx >= 0) {\n\t\t\tthis.focusedIndex = idx;\n\t\t}\n\t}\n\n\t// --- Toolbar Keyboard ---\n\n\tprivate handleToolbarKeydown(e: KeyboardEvent): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tif (elements.length === 0) return;\n\n\t\tthis.syncFocusedIndex();\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowLeft': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst rtl: boolean = this.toolbarElement ? isRtlContext(this.toolbarElement) : false;\n\t\t\t\tconst dir: 1 | -1 = resolveHorizontalDirection(e.key, rtl);\n\t\t\t\tconst next: number = findNextEnabled(elements, this.focusedIndex, dir);\n\t\t\t\tthis.setRovingFocus(next);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Home': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst first: number = findFirstEnabled(elements);\n\t\t\t\tif (first >= 0) this.setRovingFocus(first);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'End': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst last: number = findLastEnabled(elements);\n\t\t\t\tif (last >= 0) this.setRovingFocus(last);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focused: HTMLButtonElement | undefined = elements[this.focusedIndex];\n\t\t\t\tconst btn: ToolbarButton | undefined = this.buttons.find((b) => b.element === focused);\n\t\t\t\tif (btn) this.activateButton(btn.element, btn.item);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Activates a toolbar button (shared between mouse click and keyboard). */\n\tprivate activateButton(btn: HTMLButtonElement, item: ToolbarItem): void {\n\t\tthis.tooltip?.hide();\n\t\tif (item.popupType && this.context) {\n\t\t\tthis.popupController?.toggle(btn, item, this.context);\n\t\t} else {\n\t\t\tthis.context?.executeCommand(item.command);\n\t\t}\n\t}\n\n\t// --- Layout Rendering ---\n\n\tprivate renderItemsByLayout(): void {\n\t\tif (!this.context || !this.toolbarElement || !this.layoutConfig) return;\n\n\t\tconst toolbarReg = this.context.getToolbarRegistry();\n\t\tlet firstGroup = true;\n\n\t\tfor (const rawGroup of this.layoutConfig.groups) {\n\t\t\tconst { plugins, label }: NormalizedGroup = normalizeGroupConfig(rawGroup);\n\t\t\tconst groupItems: ToolbarItem[] = [];\n\t\t\tfor (const pId of plugins) {\n\t\t\t\tconst items: ToolbarItem[] = toolbarReg\n\t\t\t\t\t.getToolbarItemsByPlugin(pId)\n\t\t\t\t\t.filter((item) => !this.hiddenItems.has(item.id));\n\t\t\t\tgroupItems.push(...items);\n\t\t\t}\n\n\t\t\tif (groupItems.length === 0) continue;\n\n\t\t\tif (!firstGroup) {\n\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t}\n\t\t\tfirstGroup = false;\n\n\t\t\tconst wrapper: HTMLDivElement = this.createGroupWrapper(label);\n\t\t\tfor (const item of groupItems) {\n\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\twrapper.appendChild(btn.element);\n\t\t\t\tthis.buttons.push(btn);\n\t\t\t}\n\t\t\tthis.toolbarElement.appendChild(wrapper);\n\t\t}\n\n\t\tif (this.buttons.length === 0) {\n\t\t\tthis.toolbarElement.remove();\n\t\t}\n\t}\n\n\tprivate renderItemsByGroup(): void {\n\t\tif (!this.context || !this.toolbarElement) return;\n\n\t\tconst toolbarRegistry = this.context.getToolbarRegistry();\n\t\tconst items: ToolbarItem[] = toolbarRegistry\n\t\t\t.getToolbarItems()\n\t\t\t.filter((item) => !this.hiddenItems.has(item.id));\n\t\tif (items.length === 0) {\n\t\t\tthis.toolbarElement.remove();\n\t\t\treturn;\n\t\t}\n\n\t\tconst groups = new Map<string, ToolbarItem[]>();\n\t\tfor (const item of items) {\n\t\t\tconst list: ToolbarItem[] = groups.get(item.group) ?? [];\n\t\t\tlist.push(item);\n\t\t\tgroups.set(item.group, list);\n\t\t}\n\n\t\tlet firstGroup = true;\n\t\tfor (const [, groupItems] of groups) {\n\t\t\tif (!firstGroup) {\n\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t}\n\t\t\tfirstGroup = false;\n\n\t\t\tconst wrapper: HTMLDivElement = this.createGroupWrapper(undefined);\n\t\t\tfor (const item of groupItems) {\n\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\twrapper.appendChild(btn.element);\n\t\t\t\tthis.buttons.push(btn);\n\t\t\t}\n\t\t\tthis.toolbarElement.appendChild(wrapper);\n\t\t}\n\t}\n\n\t// --- Button Creation ---\n\n\tprivate createButton(item: ToolbarItem): ToolbarButton {\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = `notectl-toolbar-btn notectl-toolbar-btn--${item.id}`;\n\t\tbtn.setAttribute('aria-pressed', 'false');\n\t\tbtn.setAttribute('aria-label', item.label);\n\t\tbtn.setAttribute('data-toolbar-item', item.id);\n\t\tbtn.setAttribute('data-tooltip', item.tooltip ?? item.label);\n\t\tbtn.setAttribute('part', 'toolbar-button');\n\n\t\tlet comboLabelEl: HTMLSpanElement | null = null;\n\n\t\tif (item.popupType === 'combobox') {\n\t\t\tbtn.setAttribute('role', 'combobox');\n\t\t\tbtn.setAttribute('aria-haspopup', 'listbox');\n\t\t\tbtn.setAttribute('aria-expanded', 'false');\n\n\t\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tlabelSpan.className = 'notectl-toolbar-combobox__label';\n\t\t\tconst state: EditorState | undefined = this.context?.getState();\n\t\t\tif (state) {\n\t\t\t\tlabelSpan.textContent = item.getLabel(state);\n\t\t\t}\n\t\t\tbtn.appendChild(labelSpan);\n\t\t\tcomboLabelEl = labelSpan;\n\n\t\t\tconst arrowSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tarrowSpan.className = 'notectl-toolbar-combobox__arrow';\n\t\t\tarrowSpan.setAttribute('aria-hidden', 'true');\n\t\t\tarrowSpan.textContent = '\\u25BE';\n\t\t\tbtn.appendChild(arrowSpan);\n\t\t} else {\n\t\t\tif (item.popupType) {\n\t\t\t\tbtn.setAttribute('aria-haspopup', 'true');\n\t\t\t\tbtn.setAttribute('aria-expanded', 'false');\n\t\t\t}\n\n\t\t\tconst span: HTMLSpanElement = document.createElement('span');\n\t\t\tspan.className = 'notectl-toolbar-btn__icon';\n\t\t\tspan.innerHTML = item.icon;\n\t\t\tbtn.appendChild(span);\n\t\t}\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tthis.activateButton(btn, item);\n\t\t});\n\n\t\tbtn.addEventListener('mouseenter', () => this.tooltip?.show(btn));\n\t\tbtn.addEventListener('mouseleave', () => this.tooltip?.hide());\n\t\tbtn.addEventListener('focus', () => this.tooltip?.show(btn));\n\t\tbtn.addEventListener('blur', () => this.tooltip?.hide());\n\n\t\treturn { element: btn, item, comboLabelEl };\n\t}\n\n\t// --- Button State Updates ---\n\n\tprivate updateButtonStates(state: EditorState): void {\n\t\tfor (const btn of this.buttons) {\n\t\t\tconst active: boolean = btn.item.isActive?.(state) ?? false;\n\t\t\tconst enabled: boolean = btn.item.isEnabled?.(state) ?? true;\n\t\t\tbtn.element.setAttribute('aria-pressed', String(active));\n\t\t\tbtn.element.classList.toggle('notectl-toolbar-btn--active', active);\n\t\t\t// Modifier part mirrors active state for ::part() targeting from outside the shadow root.\n\t\t\t// Kept in sync with aria-pressed — never drift these apart.\n\t\t\tbtn.element.setAttribute(\n\t\t\t\t'part',\n\t\t\t\tactive ? 'toolbar-button toolbar-button-active' : 'toolbar-button',\n\t\t\t);\n\t\t\tbtn.element.disabled = !enabled;\n\t\t\tif (!enabled) {\n\t\t\t\tbtn.element.setAttribute('aria-disabled', 'true');\n\t\t\t} else {\n\t\t\t\tbtn.element.removeAttribute('aria-disabled');\n\t\t\t}\n\t\t\tif (btn.comboLabelEl && btn.item.popupType === 'combobox') {\n\t\t\t\tbtn.comboLabelEl.textContent = btn.item.getLabel(state);\n\t\t\t}\n\t\t\tif (btn.item.getIcon) {\n\t\t\t\tconst newIcon: string = btn.item.getIcon(state);\n\t\t\t\tconst iconEl: HTMLSpanElement | null = btn.element.querySelector(\n\t\t\t\t\t'.notectl-toolbar-btn__icon',\n\t\t\t\t);\n\t\t\t\tif (iconEl && iconEl.innerHTML !== newIcon) {\n\t\t\t\t\ticonEl.innerHTML = newIcon;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.overflowController?.updateItemStates(state);\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypedKeys-E3jOGByL.mjs","names":[],"sources":["../../src/model/TypedKeys.ts"],"sourcesContent":["/**\n * Type-safe nominal keys for dependency injection.\n *\n * `ServiceKey<T>` and `EventKey<T>` are phantom-typed string-id wrappers\n * that allow services and events to be registered/looked up with full\n * type safety. They have no runtime behavior beyond holding the id.\n *\n * Lives in `model/` so any layer (including `i18n/`) can construct typed\n * keys without depending on `plugins/`.\n */\n\n/** Type-safe event key for compile-time payload checking. */\nexport class EventKey<T> {\n\tdeclare readonly _type: T;\n\tconstructor(public readonly id: string) {}\n}\n\n/** Type-safe service key for compile-time type checking. */\nexport class ServiceKey<T> {\n\tdeclare readonly _type: T;\n\tconstructor(public readonly id: string) {}\n}\n"],"mappings":"AAYA,IAAa,EAAb,MAEC,WAAA,CAAY,GAAgB,KAAA,GAAA,IAIhB,EAAb,MAEC,WAAA,CAAY,GAAgB,KAAA,GAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{S as t,h as e,r as n,u as o}from"./Document-znhIcvM9.mjs";import{c as i,l as r,o as a,r as s,t as l,u as d}from"./Selection-aeiSsvhe.mjs";import{a as c}from"./TypeBrands-BZDKMjR-.mjs";import{n as u}from"./DomUtils-RKbAVBQz.mjs";import{n as p,r as h}from"./HTMLUtils-brwcaufP.mjs";import{t as m}from"./NodeSelectionCommands-dUmbRoZ2.mjs";import{t as v}from"./Platform-wPvKFB9m.mjs";import{r as f,s as b}from"./StyleRuntime-Bwde5icB.mjs";import{a as g,s as y}from"./PluginHelpers-C3aCCGfX.mjs";import{t as x}from"./ShortcutFormatting-DZK70CN9.mjs";import{i as _}from"./PopupPositioning-BEnz90Oh.mjs";import w from"dompurify";var A=/^[A-Za-z0-9_-]{11}$/,k=/^\d+$/,C=/^[A-Za-z0-9]+$/,P=/^[A-Za-z0-9]+$/;function z(t,e){const n=t.indexOf(e);if(-1!==n)return t[n+1]}function E(t,e,n){const o=e.searchParams.get("h")??n;return o&&C.test(o)?{videoId:t,hash:o}:{videoId:t}}var L=[{id:"youtube",label:"YouTube",hostnames:["youtube.com","www.youtube.com","m.youtube.com","music.youtube.com","youtu.be","youtube-nocookie.com","www.youtube-nocookie.com"],embedHostnames:["www.youtube-nocookie.com","youtube-nocookie.com","www.youtube.com","youtube.com"],parse(t){const e=t.hostname.toLowerCase(),n=t.pathname.split("/").filter(Boolean);if("youtu.be"===e){const t=n[0];return t&&A.test(t)?{videoId:t}:null}const o=t.searchParams.get("v");if(o&&A.test(o))return{videoId:o};for(const i of["embed","shorts","live","v"]){const t=z(n,i);if(t&&A.test(t))return{videoId:t}}return null},buildEmbedUrl(t,e){const n=e.privacy?"www.youtube-nocookie.com":"www.youtube.com",o=B({rel:"0",...e.autoplay?{autoplay:"1"}:{}});return`https://${n}/embed/${t.videoId}${o}`},buildWatchUrl:t=>`https://www.youtube.com/watch?v=${t.videoId}`,thumbnailUrl:t=>`https://i.ytimg.com/vi/${t.videoId}/hqdefault.jpg`},{id:"vimeo",label:"Vimeo",hostnames:["vimeo.com","www.vimeo.com","player.vimeo.com"],embedHostnames:["player.vimeo.com"],parse(t){const e=t.pathname.split("/").filter(Boolean),n=z(e,"video");if(n&&k.test(n))return E(n,t,void 0);const o=e.find(t=>k.test(t));return o?E(o,t,e[e.indexOf(o)+1]):null},buildEmbedUrl(t,e){const n=B({...t.hash?{h:t.hash}:{},...e.privacy?{dnt:"1"}:{},...e.autoplay?{autoplay:"1"}:{}});return`https://player.vimeo.com/video/${t.videoId}${n}`},buildWatchUrl(t){const e=`https://vimeo.com/${t.videoId}`;return t.hash?`${e}/${t.hash}`:e}},{id:"dailymotion",label:"Dailymotion",hostnames:["dailymotion.com","www.dailymotion.com","geo.dailymotion.com","dai.ly"],embedHostnames:["www.dailymotion.com","geo.dailymotion.com"],parse(t){const e=t.hostname.toLowerCase(),n=t.pathname.split("/").filter(Boolean);if("dai.ly"===e){const t=n[0];return t&&P.test(t)?{videoId:t}:null}const o=z(n,"video");return o&&P.test(o)?{videoId:o}:null},buildEmbedUrl(t,e){const n=B(e.autoplay?{autoplay:"1"}:{});return`https://www.dailymotion.com/embed/video/${t.videoId}${n}`},buildWatchUrl:t=>`https://www.dailymotion.com/video/${t.videoId}`,thumbnailUrl:t=>`https://www.dailymotion.com/thumbnail/video/${t.videoId}`}];function S(t,e=L){const n=H(t);if(!n)return null;if("https:"!==n.protocol&&"http:"!==n.protocol)return null;const o=n.hostname.toLowerCase();for(const i of e){if(!i.hostnames.includes(o))continue;const t=i.parse(n);if(t)return{provider:i.id,videoId:t.videoId,...t.hash?{hash:t.hash}:{}}}return null}function I(t,e=L){return e.find(e=>e.id===t)}function R(t,e){const n=I(t.provider,e);return n?n.buildWatchUrl(t):null}function N(t,e){return I(t.provider,e)?.thumbnailUrl?.(t)}function $(t,e=L){return I(t,e)?.label??t}function H(t){try{return new URL(t.trim())}catch{return null}}function B(t){const e=Object.entries(t);return 0===e.length?"":`?${e.map(([t,e])=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`).join("&")}`}var V={growWidth:"Mod-Shift-ArrowRight",shrinkWidth:"Mod-Shift-ArrowLeft",growWidthLarge:"Mod-Shift-Alt-ArrowRight",shrinkWidthLarge:"Mod-Shift-Alt-ArrowLeft",resetSize:"Mod-Shift-0"},M={providers:L,facade:!0,useProviderThumbnail:!1,privacy:!0,allowedAspectRatios:["16/9","4/3","1/1","9/16"],defaultAspectRatio:"16/9",defaultWidthPercent:100,minWidthPercent:25,widthStep:10,widthStepLarge:25,resizable:!0},W="video",D=/^\d+(?:\.\d+)?\s*\/\s*\d+(?:\.\d+)?$/;function j(t,e){if(!t||!D.test(t.trim()))return e.defaultAspectRatio;const[n,o]=t.split("/");return`${n?.trim()} / ${o?.trim()}`}function T(t,e){return Number.isFinite(t)?Math.max(e.minWidthPercent,Math.min(100,Math.round(t))):e.defaultWidthPercent}var O=/^[A-Za-z0-9_-]+$/;function U(t){return t.length>0&&t.length<=64&&O.test(t)}function F(t,e){return{provider:t?.provider??"",videoId:t?.videoId??"",...t?.hash?{hash:t.hash}:{},aspectRatio:j(t?.aspectRatio,e),widthPercent:T(t?.widthPercent??e.defaultWidthPercent,e),align:t?.align??"center",title:t?.title??"",...t?.caption?{caption:t.caption}:{},privacy:t?.privacy??e.privacy}}function K(t,e){const n=S(t.url,e.providers);return n?{provider:n.provider,videoId:n.videoId,...n.hash?{hash:n.hash}:{},aspectRatio:j(t.aspectRatio,e),widthPercent:e.defaultWidthPercent,align:"center",title:t.title,...t.caption?{caption:t.caption}:{},privacy:e.privacy}:null}function q(t){return{provider:t.provider,videoId:t.videoId,aspectRatio:t.aspectRatio,widthPercent:t.widthPercent,align:t.align,title:t.title,privacy:t.privacy,...t.hash?{hash:t.hash}:{},...t.caption?{caption:t.caption}:{}}}function X(t){const e=t.selection;if(!r(e))return null;const n=t.getBlock(e.nodeId);if(!n||"video"!==n.type)return null;const o=t.getNodePath(e.nodeId);return o?{block:n,path:o}:null}function Z(t,e){const n=t.getState(),o=X(n);return!!o&&(t.dispatch(n.transaction("command").setNodeAttr(o.path,e).build()),!0)}function G(t){const e=t.getState(),n=X(e);if(!n)return!1;const o=m(e,s(n.block.id,n.path));return!!o&&(t.dispatch(o),!0)}var Y=0;function J(t){return`${t}-${Y+=1}`}function Q(t,e){const n=J("notectl-video-field"),o=document.createElement("div");o.className="notectl-video-popup__field";const i=document.createElement("label");i.className="notectl-video-popup__label",i.setAttribute("for",n),i.textContent=e.label,o.appendChild(i);const r=document.createElement("input");r.id=n,r.type=e.type,r.value=e.value,r.placeholder=e.placeholder,r.className="notectl-video-popup__input",r.setAttribute("aria-label",e.ariaLabel),e.required&&r.setAttribute("aria-required","true");const a=[];if(e.hint){const t=`${n}-hint`,i=document.createElement("p");i.id=t,i.className="notectl-video-popup__hint",i.textContent=e.hint,o.appendChild(i),a.push(t)}return e.describedBy&&a.push(e.describedBy),a.length>0&&r.setAttribute("aria-describedby",a.join(" ")),o.insertBefore(r,o.children[1]??null),t.appendChild(o),r}var tt=class{panel=null;outsideHandler=null;constructor(t,e,n){this.context=t,this.config=e,this.locale=n}get isOpen(){return null!==this.panel}openInsert(){this.context.isReadOnly()||this.open({rect:et(),mode:"insert",label:this.locale.insertDialogLabel,onSubmit:e=>{const a=K(e,this.config);a&&function(e,a){const l=e.getState(),d=l.selection;if(i(d))return!1;const u=q(a),p=r(d)?d.nodeId:d.anchor.blockId,h=function(t,e){if("table_cell"===t.getBlock(e)?.type)return e;const n=t.getNodePath(e);if(n)for(const o of n)if("table_cell"===t.getBlock(o)?.type)return o}(l,p);h?function(e,i,r,a){const l=e.getNodePath(r),d=e.getBlock(r);if(!l||!d)return!1;const u=n(c(W),[],void 0,a),p=e.transaction("command"),h=o(d);for(let n=h.length-1;n>=0;n--){const e=d.children.findIndex(e=>t(e)&&e.id===h[n]?.id);-1!==e&&p.removeNode(l,e)}p.insertNode(l,0,u),p.setSelection(s(u.id,[...l,u.id])),i.dispatch(p.build())}(l,e,h,u):function(t,e,o,i){const r=t.doc.children.findIndex(t=>t.id===o);if(-1===r)return!1;const a=n(c(W),[],void 0,i),l=n(c("paragraph")),d=t.transaction("command").insertNode([],r+1,a).insertNode([],r+2,l).setSelection(s(a.id,[])).build();e.dispatch(d)}(l,e,p,u)}(this.context,a)}})}openInsertReplacingRange(o,i){this.context.isReadOnly()||this.open({rect:et(),mode:"insert",label:this.locale.insertDialogLabel,initial:{url:i},onSubmit:i=>{const r=K(i,this.config);r&&function(o,i,r){const a=o.getState(),l=a.getBlock(i.blockId);if(!l)return!1;const d=function(e,n){const o=e.getNodePath(n);if(!o||0===o.length)return null;if(1===o.length){const t=e.doc.children.findIndex(t=>t.id===n);return-1===t?null:{parentPath:[],index:t}}const i=o[o.length-2],r=i?e.getBlock(i):void 0;if(!r)return null;const a=r.children.findIndex(e=>t(e)&&e.id===n);return-1===a?null:{parentPath:o.slice(0,-1),index:a}}(a,i.blockId);if(!d)return!1;const u=0===Math.max(0,e(l).length-(i.end-i.start))&&"paragraph"===l.type,p=n(c(W),[],void 0,q(r)),h=0===d.parentPath.length?[]:[...d.parentPath,p.id],m=a.transaction("command");u?(m.removeNode(d.parentPath,d.index),m.insertNode(d.parentPath,d.index,p),0===d.parentPath.length&&d.index>=a.doc.children.length-1&&m.insertNode([],d.index+1,n(c("paragraph")))):(m.deleteTextAt(i.blockId,i.start,i.end),m.insertNode(d.parentPath,d.index+1,p)),m.setSelection(s(p.id,h)),o.dispatch(m.build())}(this.context,o,r)}})}openEditForSelected(){if(this.context.isReadOnly())return;const t=this.context.getState(),e=t.selection;if(!r(e))return;const n=t.getBlock(e.nodeId);if(!n||"video"!==n.type)return;const o=F(n.attrs,this.config),i={url:R({provider:o.provider,videoId:o.videoId,...o.hash?{hash:o.hash}:{}},this.config.providers)??"",title:o.title,caption:o.caption??"",aspectRatio:o.aspectRatio};this.open({rect:this.videoRect(e.nodeId),mode:"edit",label:this.locale.editDialogLabel,initial:i,onSubmit:t=>{!function(t,e,n){const o=X(t.getState());if(!o)return!1;const i=S(e.url,n.providers);if(!i)return!1;const r=function(t,e){const n={};for(const[o,i]of Object.entries(t??{}))e.includes(o)||(n[o]=i);return n}(o.block.attrs,["hash","caption"]);r.provider=i.provider,r.videoId=i.videoId,r.title=e.title,r.aspectRatio=j(e.aspectRatio,n),i.hash&&(r.hash=i.hash),e.caption.trim()&&(r.caption=e.caption.trim()),Z(t,r)}(this.context,t,this.config)}})}close(t){this.panel&&(this.outsideHandler&&(document.removeEventListener("mousedown",this.outsideHandler,!0),this.outsideHandler=null),this.panel.remove(),this.panel=null,t&&this.context.getContainer().focus())}open(t){this.close(!1);const e=document.createElement("div");e.className="notectl-video-overlay",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","false"),e.setAttribute("aria-label",t.label),this.panel=e,function(t,e){const{config:n,locale:o,initial:i,mode:r}=e;t.classList.add("notectl-video-popup");const a=J("notectl-video-error"),s=document.createElement("p");s.id=a,s.className="notectl-video-popup__error",s.setAttribute("role","alert");const l=Q(t,{label:o.urlLabel,ariaLabel:o.urlAria,placeholder:o.urlPlaceholder,value:i?.url??"",type:"url",required:!0,describedBy:a}),d=Q(t,{label:o.titleLabel,ariaLabel:o.titleAria,placeholder:o.titlePlaceholder,value:i?.title??"",type:"text",required:!0,hint:o.titleHint}),c=Q(t,{label:o.captionLabel,ariaLabel:o.captionAria,placeholder:o.captionPlaceholder,value:i?.caption??"",type:"text"}),u=function(t,e,n,o){const i=J("notectl-video-field"),r=document.createElement("div");r.className="notectl-video-popup__field";const a=document.createElement("label");a.className="notectl-video-popup__label",a.setAttribute("for",i),a.textContent=n.aspectRatioLabel,r.appendChild(a);const s=document.createElement("select");s.id=i,s.className="notectl-video-popup__select",s.setAttribute("aria-label",n.aspectRatioAria);const l=e.allowedAspectRatios.includes(o)?e.allowedAspectRatios:[o,...e.allowedAspectRatios];for(const d of l){const t=document.createElement("option");t.value=d,t.textContent=d,d===o&&(t.selected=!0),s.appendChild(t)}return r.appendChild(s),t.appendChild(r),s}(t,n,o,i?.aspectRatio??n.defaultAspectRatio);t.appendChild(s);const p=document.createElement("div");p.className="notectl-video-popup__actions";const h=document.createElement("button");h.type="button",h.className="notectl-video-popup__cancel",h.textContent=o.cancelButton;const m=document.createElement("button");m.type="button",m.className="notectl-video-popup__submit",m.textContent="edit"===r?o.updateButton:o.insertButton,m.setAttribute("aria-label","edit"===r?o.updateAria:o.insertAria),p.append(h,m),t.appendChild(p);const v=(t,e)=>{s.textContent=t,e.focus()},f=()=>{const t=l.value.trim();if(!S(t,n.providers))return void v(o.invalidUrl,l);const i=d.value.trim();i?(s.textContent="",e.onSubmit({url:t,title:i,caption:c.value.trim(),aspectRatio:u.value}),e.onClose()):v(o.titleRequired,d)};h.addEventListener("mousedown",t=>t.preventDefault()),h.addEventListener("click",t=>{t.preventDefault(),e.onClose()}),m.addEventListener("mousedown",t=>t.preventDefault()),m.addEventListener("click",t=>{t.preventDefault(),f()});for(const b of[l,d,c])b.addEventListener("keydown",t=>{"Enter"===t.key&&(t.preventDefault(),f())});requestAnimationFrame(()=>l.focus())}(e,{mode:t.mode,initial:t.initial,config:this.config,locale:this.locale,onSubmit:t.onSubmit,onClose:()=>this.close(!0)}),e.addEventListener("keydown",t=>{"Escape"===t.key&&(t.preventDefault(),t.stopPropagation(),this.close(!0))}),this.context.getPluginContainer("top").appendChild(e),_(e),function(t,e){const n=e?e.bottom:window.innerHeight/3,o=e?e.left:window.innerWidth/3,i=t.offsetWidth||320,r=window.innerWidth-i-8,a=Math.max(8,Math.min(o,r)),s=window.innerHeight-t.offsetHeight-8,l=Math.min(n+8,Math.max(8,s));t.style.left=`${Math.round(a)}px`,t.style.top=`${Math.round(l)}px`}(e,t.rect),this.installOutsideHandler()}videoRect(t){const e=this.context.getContainer().querySelector(`[data-block-id="${t}"]`);return e?e.getBoundingClientRect():null}installOutsideHandler(){const t=t=>{this.panel&&!t.composedPath().includes(this.panel)&&this.close(!1)};this.outsideHandler=t,requestAnimationFrame(()=>{this.outsideHandler&&document.addEventListener("mousedown",t,!0)})}};function et(){const t=window.getSelection();if(!t||0===t.rangeCount)return null;const e=t.getRangeAt(0).getBoundingClientRect();return 0===e.width&&0===e.height&&0===e.top&&0===e.left?null:e}var nt={insertVideo:"Insert Video",insertVideoTooltip:"Insert Video",urlLabel:"Video URL",urlPlaceholder:"https://www.youtube.com/watch?v=...",urlAria:"Video URL",titleLabel:"Title",titlePlaceholder:"Describe the video",titleAria:"Video title",titleHint:"Describes the video for screen readers. Required.",captionLabel:"Caption",captionPlaceholder:"Optional visible caption",captionAria:"Video caption",aspectRatioLabel:"Aspect ratio",aspectRatioAria:"Video aspect ratio",insertButton:"Insert",insertAria:"Insert video",updateButton:"Update",updateAria:"Update video",cancelButton:"Cancel",insertDialogLabel:"Insert video",editDialogLabel:"Edit video",invalidUrl:"Enter a YouTube, Vimeo, or Dailymotion video URL.",titleRequired:"Enter a title so screen readers can describe the video.",play:t=>t?`Play video: ${t}`:"Play video",loading:"Loading video...",providerBadge:t=>`${t} video`,closePlayer:"Close video player",videoAria:(t,e)=>e?`${t} video: ${e}`:`${t} video`,videoSelected:"Video selected.",videoSelectedWithTitle:t=>`Video selected: ${t}.`,resizeHint:(t,e)=>`${t} / ${e} to resize.`,keyboardResizeHint:(t,e)=>`${t} / ${e} to resize`,videoResized:t=>`Video resized to ${t} percent width.`,resetToDefaultSize:"Video reset to full width.",enteredPlayer:t=>t?`Playing ${t}. Press Escape to return to the document.`:"Playing video. Press Escape to return to the document.",exitedPlayer:"Returned to the document.",videoOptions:"Video options",editVideo:"Edit video",alignStart:"Align left",alignCenter:"Align center",alignEnd:"Align right",deleteVideo:"Delete video",embedPrompt:"Embed this video?",embedConfirm:"Embed",embedDismiss:"Keep as link",embedOfferAnnounce:t=>`${t} link pasted. Press Embed to turn it into a video, or continue editing to keep it as a link.`,embeddedAnnounce:"Video embedded."},ot=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-NtGRavHz.mjs"),"./locales/de.ts":()=>import("./de-C4iw9SEp.mjs"),"./locales/es.ts":()=>import("./es-eZcDkBb-.mjs"),"./locales/fr.ts":()=>import("./fr-CYn6fMiH.mjs"),"./locales/hi.ts":()=>import("./hi-DMg_aiSR.mjs"),"./locales/pt.ts":()=>import("./pt-BM7zXWxW.mjs"),"./locales/ru.ts":()=>import("./ru-DACtjNuJ.mjs"),"./locales/zh.ts":()=>import("./zh-CHuGP7RS.mjs")});async function it(t){return y(ot,t,nt)}var rt={start:"notectl-video--start",center:"notectl-video--center",end:"notectl-video--end"};function at(t,e){for(const o of Object.values(rt))t.classList.remove(o);const n=rt[e]??rt.center;t.classList.add(n)}function st(t,e,n){b(t,"aspect-ratio",e),b(t,"width",`${n}%`)}var lt=/^[A-Za-z0-9]+$/;function dt(t){return{provider:t.provider,videoId:t.videoId,...t.hash?{hash:t.hash}:{}}}function ct(t,e){const n=Number.parseFloat(t.getAttribute("width")??""),o=Number.parseFloat(t.getAttribute("height")??"");return Number.isFinite(n)&&Number.isFinite(o)&&n>0&&o>0?j(`${n}/${o}`,e):e.defaultAspectRatio}function ut(t,e,n){const o=function(t,e,n){const o=I(t.provider,e);return o?o.buildEmbedUrl(t,n):null}({provider:t.provider,videoId:t.videoId,...t.hash?{hash:t.hash}:{}},e.providers,{privacy:t.privacy,autoplay:!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches})??"",i=document.createElement("iframe");return i.className="notectl-video__iframe",i.setAttribute("src",o),i.setAttribute("title",t.title||n.providerBadge($(t.provider,e.providers))),i.setAttribute("allow","autoplay; fullscreen; picture-in-picture; encrypted-media"),i.setAttribute("allowfullscreen","true"),i.setAttribute("referrerpolicy","no-referrer"),i.setAttribute("loading","lazy"),i.setAttribute("frameborder","0"),i}var pt=class{frame;getAttrs;config;locale;announce;facadeButton=null;player=null;iframe=null;escapeHandler=null;renderedKey="";constructor(t){this.frame=t.frame,this.getAttrs=t.getAttrs,this.config=t.config,this.locale=t.locale,this.announce=t.announce,this.renderFacade()}get isActive(){return null!==this.player}facadeKey(t){return[t.provider,t.videoId,t.hash??"",t.privacy,t.title,this.config.useProviderThumbnail].join("|")}renderFacade(){this.facadeButton?.remove();const t=this.getAttrs();this.renderedKey=this.facadeKey(t);const e=document.createElement("button");e.type="button",e.className="notectl-video__facade",e.setAttribute("aria-label",this.locale.play(t.title));const n=document.createElement("span");if(n.className="notectl-video__poster",n.setAttribute("aria-hidden","true"),this.config.useProviderThumbnail){const e=N({provider:t.provider,videoId:t.videoId},this.config.providers);e&&b(n,"background-image",`url("${e}")`)}const o=document.createElement("span");o.className="notectl-video__play-icon",o.setAttribute("aria-hidden","true"),o.innerHTML='<svg viewBox="0 0 68 48" width="48" height="34" aria-hidden="true" focusable="false"><path d="M66.5 7.7c-.8-2.9-2.5-5.4-5.4-6.2C55.8.1 34 0 34 0S12.2.1 6.9 1.5C4 2.3 2.3 4.8 1.5 7.7.1 13 0 24 0 24s.1 11 1.5 16.3c.8 2.9 2.5 5.4 5.4 6.2C12.2 47.9 34 48 34 48s21.8-.1 27.1-1.5c2.9-.8 4.6-3.3 5.4-6.2C67.9 35 68 24 68 24s-.1-11-1.5-16.3z" fill="currentColor"/><path d="M45 24 27 14v20z" fill="#fff"/></svg>';const i=document.createElement("span");i.className="notectl-video__badge",i.setAttribute("aria-hidden","true"),i.textContent=this.locale.providerBadge($(t.provider,this.config.providers)),e.append(n,o,i),e.addEventListener("mousedown",t=>t.stopPropagation()),e.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.activate()}),this.facadeButton=e,this.frame.insertBefore(e,this.frame.firstChild)}update(){const t=this.getAttrs(),e=this.facadeKey(t);if(e!==this.renderedKey){if(this.renderedKey=e,this.isActive&&this.iframe){const e=ut(t,this.config,this.locale);return this.iframe.replaceWith(e),void(this.iframe=e)}this.renderFacade()}}activate(){if(this.isActive||!this.facadeButton)return;const t=this.getAttrs(),e=document.createElement("div");e.className="notectl-video__player";const n=document.createElement("button");n.type="button",n.className="notectl-video__exit",n.setAttribute("aria-label",this.locale.closePlayer),n.innerHTML='<svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" focusable="false"><path d="M19 6.4 17.6 5 12 10.6 6.4 5 5 6.4 10.6 12 5 17.6 6.4 19 12 13.4 17.6 19 19 17.6 13.4 12z" fill="currentColor"/></svg>',n.addEventListener("mousedown",t=>t.stopPropagation()),n.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.deactivate(!0)});const o=ut(t,this.config,this.locale);e.append(n,o),this.facadeButton.remove(),this.facadeButton=null,this.frame.insertBefore(e,this.frame.firstChild),this.player=e,this.iframe=o,this.escapeHandler=t=>{"Escape"===t.key&&(t.stopPropagation(),this.deactivate(!0))},this.frame.addEventListener("keydown",this.escapeHandler),o.focus(),this.announce(this.locale.enteredPlayer(t.title))}deactivate(t){this.player&&(this.escapeHandler&&(this.frame.removeEventListener("keydown",this.escapeHandler),this.escapeHandler=null),this.player.remove(),this.player=null,this.iframe=null,this.renderFacade(),t&&this.facadeButton?.focus(),this.announce(this.locale.exitedPlayer))}destroy(){this.escapeHandler&&(this.frame.removeEventListener("keydown",this.escapeHandler),this.escapeHandler=null),this.player?.remove(),this.player=null,this.iframe=null,this.facadeButton?.remove(),this.facadeButton=null}},ht=["w","e"],mt={w:-1,e:1},vt=null;function ft(){vt?.remove(),vt=null}function bt(t,e,n,o,i,r){let a=0,s=0,l=0,d=0,c=mt[e];const u=t=>{const e=(t.clientX-a)*c;var n,r;n=s+(l>0?e/l*100:0),r=i.minPercent,d=Math.max(r,Math.min(100,n)),i.applyLiveWidth(d),o.textContent=i.formatPercent(Math.round(d))},p=t=>{document.removeEventListener("pointermove",u),document.removeEventListener("pointerup",p),n.classList.remove("notectl-video__resize-overlay--active"),o.classList.remove("notectl-video__size-indicator--visible"),ft(),i.commit(Math.round(d)),t.target?.releasePointerCapture?.(t.pointerId)};r(()=>{document.removeEventListener("pointermove",u),document.removeEventListener("pointerup",p)}),t.addEventListener("pointerdown",t=>{t.preventDefault(),t.stopPropagation(),a=t.clientX,s=i.getWidthPercent(),d=s,l=i.getReferenceWidth(),c=i.isRtl()?-mt[e]:mt[e],n.classList.add("notectl-video__resize-overlay--active"),o.textContent=i.formatPercent(Math.round(s)),o.classList.add("notectl-video__size-indicator--visible"),function(t){ft(),vt=document.createElement("style");const e=f(t);e&&vt.setAttribute("nonce",e),vt.textContent="*{cursor:ew-resize!important;user-select:none!important}",document.head.appendChild(vt)}(n),t.target.setPointerCapture(t.pointerId),document.addEventListener("pointermove",u),document.addEventListener("pointerup",p)})}function gt(t,e,n){const o=document.createElement("button");return o.type="button",o.className="notectl-video__tool",o.setAttribute("aria-label",t),o.title=t,o.innerHTML=e,o.addEventListener("mousedown",t=>t.preventDefault()),o.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),n()}),o}function yt(t){const{config:e,locale:n,resolvedKeymap:o,announce:i,actions:r}=t;return(t,a,s)=>{const l=document.createElement("figure");l.className="notectl-video",l.setAttribute("data-block-id",t.id),l.setAttribute("data-void","true"),l.setAttribute("data-selectable","true");const d=document.createElement("div");d.className="notectl-video__frame",l.appendChild(d);let c=t.id,u=F(t.attrs,e),p=null,h=null,m=null;const f=new pt({frame:d,getAttrs:()=>u,config:e,locale:n,announce:i});function g(t){var o;u=F(t.attrs,e),st(d,u.aspectRatio,u.widthPercent),at(l,u.align),l.setAttribute("aria-label",n.videoAria($(u.provider,e.providers),u.title)),(o=u.caption)?(p||(p=document.createElement("figcaption"),p.className="notectl-video__caption",l.appendChild(p)),p.textContent!==o&&(p.textContent=o)):p&&(p.remove(),p=null),f.update(),m?.update(u.align)}function y(){h&&(h.destroy(),h.element.remove(),h=null)}return g(t),{dom:l,contentDOM:null,update:t=>"video"===t.type&&(c=t.id,l.setAttribute("data-block-id",t.id),g(t),!0),selectNode(){l.classList.add("notectl-video--selected"),e.resizable&&!h&&(h=function(t,e){const n=document.createElement("div");n.className="notectl-video__resize-overlay",n.setAttribute("data-notectl-no-print","");const o=document.createElement("div");o.className="notectl-video__size-indicator",n.appendChild(o);let i=null;for(const r of ht){const e=document.createElement("div");e.className=`notectl-video__resize-handle notectl-video__resize-handle--${r}`,e.setAttribute("aria-hidden","true"),bt(e,r,n,o,t,t=>{i=t}),n.appendChild(e)}if(e){const t=document.createElement("div");t.className="notectl-video__keyboard-hint",t.setAttribute("aria-hidden","true"),t.textContent=e,n.appendChild(t)}return{element:n,destroy(){i?.(),ft()}}}({minPercent:e.minWidthPercent,getWidthPercent:()=>u.widthPercent,getReferenceWidth:()=>l.clientWidth||d.clientWidth,isRtl:()=>"rtl"===v(l),applyLiveWidth:t=>b(d,"width",`${t}%`),commit:t=>function(t){const e=a(),n=e.getBlock(c);if(!n)return;const o=e.getNodePath(c);if(!o)return;const i={...n.attrs??{},widthPercent:t};s(e.transaction("command").setNodeAttr(o,i).build())}(t),formatPercent:t=>`${t}%`},function(t,e){const n=t.shrinkWidth??null,o=t.growWidth??null;return n&&o?e.keyboardResizeHint(x(n),x(o)):""}(o,n)),d.appendChild(h.element)),m||(m=function(t){const{locale:e,actions:n}=t,o=document.createElement("div");o.className="notectl-video__toolbar",o.setAttribute("role","toolbar"),o.setAttribute("aria-label",e.videoOptions),o.setAttribute("data-notectl-no-print",""),o.addEventListener("mousedown",t=>t.stopPropagation());const i=gt(e.editVideo,'<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a1 1 0 0 0 0-1.41l-2.34-2.34a1 1 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z" fill="currentColor"/></svg>',()=>n.edit()),r={start:gt(e.alignStart,'<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M3 4h18v2H3V4zm0 7h12v2H3v-2zm0 7h18v2H3v-2zm0-3.5h12v-2H3v2z" fill="currentColor"/></svg>',()=>n.align("start")),center:gt(e.alignCenter,'<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M3 4h18v2H3V4zm3 7h12v2H6v-2zm-3 7h18v2H3v-2zm3-3.5h12v-2H6v2z" fill="currentColor"/></svg>',()=>n.align("center")),end:gt(e.alignEnd,'<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M3 4h18v2H3V4zm6 7h12v2H9v-2zm-6 7h18v2H3v-2zm6-3.5h12v-2H9v2z" fill="currentColor"/></svg>',()=>n.align("end"))},a=gt(e.deleteVideo,'<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6 19a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z" fill="currentColor"/></svg>',()=>n.remove()),s=()=>{const t=document.createElement("span");return t.className="notectl-video__tool-separator",t.setAttribute("aria-hidden","true"),t};o.append(i,s(),r.start,r.center,r.end,s(),a);const l=t=>{for(const e of["start","center","end"]){const n=e===t;r[e].classList.toggle("notectl-video__tool--active",n),r[e].setAttribute("aria-pressed",n?"true":"false")}};return l(t.initialAlign),{element:o,update:l,destroy(){o.remove()}}}({locale:n,actions:r,initialAlign:u.align}),l.appendChild(m.element))},deselectNode(){l.classList.remove("notectl-video--selected"),y(),m?.destroy(),m=null},destroy(){y(),m?.destroy(),m=null,f.destroy()}}}}function xt(t){return(e,n,o)=>{const i=function(t,e,n){const o=t.trim();if(o&&!/\s/.test(o)){const t=S(o,n);if(t)return{url:o,match:t}}const i=function(t){if(!t)return null;const e=function(t){const e=document.createElement("template");return e.innerHTML=t,e.content}(t),n=e.querySelector("iframe");if(!n)return null;const o=e.cloneNode(!0);for(const i of Array.from(o.querySelectorAll("iframe")))i.remove();return""!==(o.textContent??"").trim()?null:n.getAttribute("src")}(e);if(i){const t=S(i,n);if(t)return{url:R(t,n)??i,match:t}}return null}(e,n,t.providers);if(!i)return null;const r=o.selection;if(!d(r)||!a(r))return null;const s=r.anchor.blockId,c=r.anchor.offset,u=c+i.url.length,p=o.transaction("paste").insertText(s,c,i.url,[]).setSelection(l(s,u)).build();return t.onOffer({blockId:s,start:c,end:u},i.match),p}}var _t=0,wt=/* @__PURE__ */new Set,At=null;var kt=class{id="video";name="Video";priority=47;config;resolvedKeymap;context=null;locale=nt;overlay=null;embedPrompt=null;constructor(t){this.config={...M,...t},this.resolvedKeymap={...V,...t?.keymap}}async init(t){this.context=t,this.locale=await g(t,this.config.locale,nt,it),t.registerStyleSheet('\n.notectl-video {\n\tmargin: 12px 0;\n\tposition: relative;\n\tuser-select: none;\n}\n\n.notectl-video--center { text-align: center; }\n.notectl-video--start { text-align: start; }\n.notectl-video--end { text-align: end; }\n\n.notectl-video__frame {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 100%;\n\tmax-width: 100%;\n\tvertical-align: top;\n\toverflow: hidden;\n\tborder-radius: 8px;\n\tbackground: #000;\n\ttext-align: start;\n}\n\n/* Facade (click-to-load) */\n.notectl-video__facade {\n\tposition: absolute;\n\tinset: 0;\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 0;\n\tborder: 0;\n\tcursor: pointer;\n\tbackground: #14181c;\n\tcolor: #fff;\n}\n\n.notectl-video__facade:focus-visible {\n\toutline: 3px solid var(--notectl-primary);\n\toutline-offset: -3px;\n}\n\n.notectl-video__poster {\n\tposition: absolute;\n\tinset: 0;\n\tbackground-size: cover;\n\tbackground-position: center;\n\tbackground-repeat: no-repeat;\n}\n\n.notectl-video__poster::after {\n\tcontent: "";\n\tposition: absolute;\n\tinset: 0;\n\tbackground: rgba(0, 0, 0, 0.25);\n}\n\n.notectl-video__play-icon {\n\tposition: relative;\n\tz-index: 1;\n\tdisplay: inline-flex;\n\tfilter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.5));\n\ttransition: transform 0.12s ease;\n}\n\n.notectl-video__facade:hover .notectl-video__play-icon {\n\ttransform: scale(1.08);\n}\n\n.notectl-video__badge {\n\tposition: absolute;\n\tz-index: 1;\n\tbottom: 8px;\n\tinset-inline-start: 8px;\n\tpadding: 2px 6px;\n\tborder-radius: 4px;\n\tbackground: rgba(0, 0, 0, 0.65);\n\tcolor: #fff;\n\tfont-size: 12px;\n\tfont-weight: 600;\n}\n\n/* Player (activated iframe + exit control) */\n.notectl-video__player {\n\tposition: absolute;\n\tinset: 0;\n}\n\n.notectl-video__iframe {\n\tposition: absolute;\n\tinset: 0;\n\twidth: 100%;\n\theight: 100%;\n\tborder: 0;\n\tdisplay: block;\n}\n\n.notectl-video__exit {\n\tposition: absolute;\n\tz-index: 2;\n\ttop: 6px;\n\tinset-inline-end: 6px;\n\twidth: 28px;\n\theight: 28px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tborder: 0;\n\tborder-radius: 50%;\n\tcursor: pointer;\n\tbackground: rgba(0, 0, 0, 0.65);\n\tcolor: #fff;\n}\n\n.notectl-video__exit:focus-visible {\n\toutline: 2px solid #fff;\n\toutline-offset: 2px;\n}\n\n/* Static fallback link (no-JS / export rehydration) */\n.notectl-video__fallback-link {\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 8px;\n\tcolor: #fff;\n\ttext-decoration: underline;\n\ttext-align: center;\n}\n\n/* Caption */\n.notectl-video__caption {\n\tmargin-top: 6px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg-muted);\n\ttext-align: center;\n}\n\n/* Selection */\n.notectl-video--selected .notectl-video__frame {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n}\n\n/* Resize overlay + side handles */\n.notectl-video__resize-overlay {\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n}\n\n.notectl-video__resize-handle {\n\tposition: absolute;\n\ttop: 50%;\n\ttransform: translateY(-50%);\n\twidth: 8px;\n\theight: 44px;\n\tmax-height: 60%;\n\tborder: 2px solid var(--notectl-primary);\n\tborder-radius: 6px;\n\tbackground: var(--notectl-surface-raised);\n\tpointer-events: all;\n\tcursor: ew-resize;\n\tz-index: 2;\n}\n\n.notectl-video__resize-handle--w { inset-inline-start: -5px; }\n.notectl-video__resize-handle--e { inset-inline-end: -5px; }\n\n.notectl-video__size-indicator {\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\topacity: 0;\n\ttransition: opacity 0.15s;\n\tz-index: 3;\n}\n\n.notectl-video__size-indicator--visible { opacity: 1; }\n\n.notectl-video__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-video--selected .notectl-video__keyboard-hint { display: block; }\n.notectl-video__resize-overlay--active ~ .notectl-video__keyboard-hint,\n.notectl-video__resize-overlay--active .notectl-video__keyboard-hint { display: none; }\n\n/* On-selection toolbar */\n.notectl-video__toolbar {\n\tposition: absolute;\n\ttop: -44px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 2px;\n\tpadding: 2px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbackground: var(--notectl-surface-overlay);\n\tbox-shadow: 0 2px 8px var(--notectl-shadow);\n\tz-index: 10;\n}\n\n.notectl-video__tool {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\theight: 28px;\n\tborder: none;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n}\n\n.notectl-video__tool:hover { background: var(--notectl-hover-bg); }\n\n.notectl-video__tool--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary);\n}\n\n.notectl-video__tool:focus-visible {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 1px;\n}\n\n.notectl-video__tool svg { width: 16px; height: 16px; }\n\n.notectl-video__tool-separator {\n\twidth: 1px;\n\theight: 18px;\n\tmargin: 0 2px;\n\tbackground: var(--notectl-border);\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.notectl-video__play-icon,\n\t.notectl-video__size-indicator {\n\t\ttransition: none;\n\t}\n}\n\n@media (forced-colors: active) {\n\t.notectl-video__frame { outline: 1px solid CanvasText; }\n\t.notectl-video__facade { border: 1px solid ButtonText; }\n\t.notectl-video__play-icon { forced-color-adjust: none; }\n\t.notectl-video__resize-handle { background: ButtonFace; border-color: ButtonText; }\n\t.notectl-video--selected .notectl-video__frame { outline: 2px solid Highlight; }\n}\n'),t.registerStyleSheet("\n.notectl-video-overlay {\n\tposition: fixed;\n\tz-index: 1000;\n\tbox-sizing: border-box;\n\tmin-width: 300px;\n\tmax-width: 92vw;\n\tpadding: 12px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 8px;\n\tbackground: var(--notectl-surface-overlay);\n\tcolor: var(--notectl-fg);\n\tbox-shadow: 0 6px 24px var(--notectl-shadow);\n}\n\n.notectl-video-popup {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n}\n\n.notectl-video-popup__field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.notectl-video-popup__label {\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-fg-muted);\n}\n\n.notectl-video-popup__input,\n.notectl-video-popup__select {\n\twidth: 100%;\n\tpadding: 6px 8px;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-raised);\n\tcolor: var(--notectl-fg);\n\tfont: inherit;\n}\n\n.notectl-video-popup__input:focus-visible,\n.notectl-video-popup__select:focus-visible {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 1px;\n}\n\n.notectl-video-popup__hint {\n\tmargin: 0;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n}\n\n.notectl-video-popup__error:not(:empty) {\n\tmargin: 0;\n\tpadding: 6px 8px;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-danger-muted);\n\tcolor: var(--notectl-danger);\n\tfont-size: 12px;\n}\n\n.notectl-video-popup__actions {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tgap: 8px;\n\tmargin-top: 2px;\n}\n\n.notectl-video-popup__cancel,\n.notectl-video-popup__submit {\n\tpadding: 7px 14px;\n\tcursor: pointer;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-raised);\n\tcolor: var(--notectl-fg);\n\tfont: inherit;\n}\n\n.notectl-video-popup__submit {\n\tborder-color: var(--notectl-primary);\n\tbackground: var(--notectl-primary);\n\tcolor: var(--notectl-primary-fg);\n\tfont-weight: 600;\n}\n\n.notectl-video-popup__cancel:focus-visible,\n.notectl-video-popup__submit:focus-visible {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n}\n\n/* Ask-first paste affordance */\n.notectl-video-embed-prompt {\n\tposition: fixed;\n\tz-index: 1000;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 6px 8px 6px 12px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 8px;\n\tbackground: var(--notectl-surface-overlay);\n\tcolor: var(--notectl-fg);\n\tbox-shadow: 0 4px 16px var(--notectl-shadow);\n\tfont-size: 13px;\n}\n\n.notectl-video-embed-prompt__text {\n\tmargin-inline-end: 4px;\n}\n\n.notectl-video-embed-prompt__embed,\n.notectl-video-embed-prompt__dismiss {\n\tpadding: 4px 10px;\n\tcursor: pointer;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-raised);\n\tcolor: var(--notectl-fg);\n\tfont: inherit;\n}\n\n.notectl-video-embed-prompt__embed {\n\tborder-color: var(--notectl-primary);\n\tbackground: var(--notectl-primary);\n\tcolor: var(--notectl-primary-fg);\n\tfont-weight: 600;\n}\n\n.notectl-video-embed-prompt__embed:focus-visible,\n.notectl-video-embed-prompt__dismiss:focus-visible {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n}\n\n@media (forced-colors: active) {\n\t.notectl-video-overlay,\n\t.notectl-video-embed-prompt {\n\t\tborder: 1px solid CanvasText;\n\t}\n\t.notectl-video-popup__submit,\n\t.notectl-video-embed-prompt__embed {\n\t\tborder: 1px solid ButtonText;\n\t}\n}\n"),function(t){for(const e of t)wt.add(e);_t+=1,At||(At=t=>{if("iframe"!==t.nodeName.toLowerCase())return;const e=t;e.hasAttribute("srcdoc")?e.parentNode?.removeChild(e):function(t,e){const n=H(t);return!!n&&"https:"===n.protocol&&e.has(n.hostname.toLowerCase())}(e.getAttribute("src")??"",wt)||e.parentNode?.removeChild(e)},w.addHook("uponSanitizeElement",At))}(function(t=L){const e=/* @__PURE__ */new Set;for(const n of t)for(const t of n.embedHostnames)e.add(t.toLowerCase());return e}(this.config.providers)),t.registerNodeSpec(function(t,e){const n=t.providers;return{type:"video",group:"block",isVoid:!0,selectable:!0,attrs:{provider:{default:""},videoId:{default:""},hash:{default:""},aspectRatio:{default:t.defaultAspectRatio},widthPercent:{default:t.defaultWidthPercent},align:{default:"center"},title:{default:""},caption:{default:""},privacy:{default:t.privacy}},toDOM(o){const i=F(o.attrs,t),r=u("figure",o.id);r.className="notectl-video",r.setAttribute("data-void","true"),r.setAttribute("data-selectable","true"),r.setAttribute("data-video-provider",i.provider),r.setAttribute("data-video-id",i.videoId),i.hash&&r.setAttribute("data-video-hash",i.hash),at(r,i.align),r.setAttribute("aria-label",e.videoAria($(i.provider,n),i.title));const a=document.createElement("div");a.className="notectl-video__frame",st(a,i.aspectRatio,i.widthPercent);const s=R(dt(i),n);if(s){const t=document.createElement("a");t.className="notectl-video__fallback-link",t.href=s,t.rel="noopener noreferrer",t.textContent=i.title||s,a.appendChild(t)}if(r.appendChild(a),i.caption){const t=document.createElement("figcaption");t.className="notectl-video__caption",t.textContent=i.caption,r.appendChild(t)}return r},toHTML(e){const o=F(e.attrs,t),i=dt(o),r=R(i,n),a=[`data-video-provider="${p(o.provider)}"`,`data-video-id="${p(o.videoId)}"`,`data-video-ratio="${p(o.aspectRatio)}"`,`data-video-width="${o.widthPercent}"`,`data-video-privacy="${o.privacy?"true":"false"}"`];o.hash&&a.push(`data-video-hash="${p(o.hash)}"`),o.title&&a.push(`data-video-title="${p(o.title)}"`);const s=t.useProviderThumbnail?N(i,n):void 0,l=s?`<img src="${p(s)}" alt="">`:h(o.title||r||""),d=r?`<a href="${p(r)}" rel="noopener noreferrer">${l}</a>`:l,c=o.caption?`<figcaption>${h(o.caption)}</figcaption>`:"";return`<figure ${a.join(" ")}>${d}${c}</figure>`},parseHTML:[{tag:"figure",priority:60,getAttrs:e=>function(t,e){const n=t.getAttribute("data-video-provider"),o=t.getAttribute("data-video-id");if(!n||!o)return!1;if(!U(o))return!1;if(!I(n,e.providers))return!1;const i=t.getAttribute("data-video-title")??t.querySelector("a")?.textContent?.trim()??t.getAttribute("aria-label")??"",r=t.querySelector("figcaption")?.textContent?.trim()??"",a=t.getAttribute("data-video-width"),s={provider:n,videoId:o,aspectRatio:j(t.getAttribute("data-video-ratio")??void 0,e),widthPercent:T(a?Number.parseFloat(a):e.defaultWidthPercent,e),align:"center",title:i,privacy:"false"!==t.getAttribute("data-video-privacy")},l=t.getAttribute("data-video-hash");return l&<.test(l)&&(s.hash=l),r&&(s.caption=r),s}(e,t)},{tag:"iframe",priority:60,getAttrs:e=>function(t,e){const n=S(t.getAttribute("src")??"",e.providers);if(!n||!U(n.videoId))return!1;const o={provider:n.provider,videoId:n.videoId,aspectRatio:ct(t,e),widthPercent:e.defaultWidthPercent,align:"center",title:t.getAttribute("title")??"",privacy:e.privacy};return n.hash&&(o.hash=n.hash),o}(e,t)}],sanitize:{tags:["figure","figcaption","a","img","iframe"],attrs:["href","rel","src","alt","title","allow","allowfullscreen","referrerpolicy","loading","width","height","frameborder","class","style"]}}}(this.config,this.locale)),this.overlay=new tt(t,this.config,this.locale),this.registerNodeView(t),function(t){t.registerCommand("removeVideo",()=>G(t))}(t),this.registerInsertCommand(t),this.registerResizeCommands(t),this.registerResizeKeymaps(t),this.registerPasteInterceptor(t),this.registerToolbarItem(t)}destroy(){(_t=Math.max(0,_t-1))>0||!At||(w.removeHook("uponSanitizeElement"),At=null,wt.clear()),this.embedPrompt?.close(),this.embedPrompt=null,this.overlay?.close(!1),this.overlay=null,this.context=null}onStateChange(t,e,n){this.context&&!this.isVideoSelected(t)&&this.isVideoSelected(e)&&this.announceVideoSelection(e)}registerNodeView(t){t.registerNodeView(W,yt({config:this.config,locale:this.locale,resolvedKeymap:this.resolvedKeymap,announce:e=>t.announce(e),actions:{edit:()=>this.overlay?.openEditForSelected(),align:e=>function(t,e){const n=X(t.getState());return!!n&&Z(t,{...n.block.attrs??{},align:e})}(t,e),remove:()=>G(t)}}))}registerInsertCommand(t){t.registerCommand("insertVideo",()=>(this.isVideoSelected(t.getState())?this.overlay?.openEditForSelected():this.overlay?.openInsert(),!0))}registerResizeCommands(t){const e=this.config.widthStep,n=this.config.widthStepLarge,o=e=>{const n=function(t,e,n){const o=X(t.getState());if(!o)return!1;const i=o.block.attrs?.widthPercent??n.defaultWidthPercent,r=T(i+e,n);return r!==i&&Z(t,{...o.block.attrs??{},widthPercent:r})}(t,e,this.config);return n&&this.announceCurrentSize(t),n};t.registerCommand("resizeVideoGrow",()=>o(e)),t.registerCommand("resizeVideoShrink",()=>o(-e)),t.registerCommand("resizeVideoGrowLarge",()=>o(n)),t.registerCommand("resizeVideoShrinkLarge",()=>o(-n)),t.registerCommand("resetVideoSize",()=>{const e=function(t,e){const n=X(t.getState());return!!n&&Z(t,{...n.block.attrs??{},widthPercent:e.defaultWidthPercent})}(t,this.config);return e&&t.announce(this.locale.resetToDefaultSize),e})}registerResizeKeymaps(t){const e={growWidth:"resizeVideoGrow",shrinkWidth:"resizeVideoShrink",growWidthLarge:"resizeVideoGrowLarge",shrinkWidthLarge:"resizeVideoShrinkLarge",resetSize:"resetVideoSize"},n={};for(const[o,i]of Object.entries(e)){const e=this.resolvedKeymap[o]??null;e&&(n[e]=()=>t.executeCommand(i))}Object.keys(n).length>0&&t.registerKeymap(n)}registerPasteInterceptor(t){t.registerPasteInterceptor(xt({providers:this.config.providers,onOffer:(t,e)=>this.offerEmbed(t,e)}),{name:"video",priority:40})}offerEmbed(t,n){if(!this.context)return;const o=this.context,i=$(n.provider,this.config.providers);this.embedPrompt?.close(),requestAnimationFrame(()=>{o.announce(this.locale.embedOfferAnnounce(i));const n=function(t,n){const o=t.getBlock(n.blockId);if(!o)return"";const i=e(o);return i.slice(n.start,Math.min(n.end,i.length))}(o.getState(),t);this.embedPrompt=function(t){const{locale:e}=t,n=document.createElement("div");n.className="notectl-video-embed-prompt",n.setAttribute("role","dialog"),n.setAttribute("aria-label",e.embedPrompt);const o=document.createElement("span");o.className="notectl-video-embed-prompt__text",o.textContent=e.embedPrompt;const i=document.createElement("button");i.type="button",i.className="notectl-video-embed-prompt__embed",i.textContent=e.embedConfirm;const r=document.createElement("button");r.type="button",r.className="notectl-video-embed-prompt__dismiss",r.textContent=e.embedDismiss,n.append(o,i,r);let a=null,s=!1;const l=()=>{s||(s=!0,a&&(document.removeEventListener("mousedown",a,!0),a=null),n.remove())},d=t=>{l(),t()};return i.addEventListener("mousedown",t=>t.preventDefault()),i.addEventListener("click",e=>{e.preventDefault(),d(t.onEmbed)}),r.addEventListener("mousedown",t=>t.preventDefault()),r.addEventListener("click",e=>{e.preventDefault(),d(t.onDismiss)}),n.addEventListener("keydown",e=>{"Escape"===e.key&&(e.preventDefault(),e.stopPropagation(),d(t.onDismiss))}),t.container.appendChild(n),_(n),function(t,e){const n=e?e.bottom:window.innerHeight/3,o=e?e.left:window.innerWidth/3,i=t.offsetWidth||240,r=window.innerWidth-i-8,a=Math.max(8,Math.min(o,r)),s=window.innerHeight-t.offsetHeight-8,l=Math.min(n+8,Math.max(8,s));t.style.left=`${Math.round(a)}px`,t.style.top=`${Math.round(l)}px`}(n,t.rect),a=e=>{e.composedPath().includes(n)||d(t.onDismiss)},requestAnimationFrame(()=>{a&&document.addEventListener("mousedown",a,!0),i.focus()}),{close:l}}({container:o.getPluginContainer("top"),rect:Ct(),locale:this.locale,onEmbed:()=>{this.embedPrompt=null,this.overlay?.openInsertReplacingRange(t,n)},onDismiss:()=>{this.embedPrompt=null,o.getContainer().focus()}})})}registerToolbarItem(t){t.registerToolbarItem({id:"video",group:"insert",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zm6 4.5v7l6-3.5-6-3.5z" fill="currentColor"/></svg>',label:this.locale.insertVideo,tooltip:this.locale.insertVideoTooltip,command:"insertVideo"})}isVideoSelected(t){const e=t.selection;return!!r(e)&&t.getBlock(e.nodeId)?.type===W}announceVideoSelection(t){if(!this.context)return;const e=t.selection;if(!r(e))return;const n=t.getBlock(e.nodeId);if(!n||"video"!==n.type)return;const o=n.attrs?.title??"",i=[o?this.locale.videoSelectedWithTitle(o):this.locale.videoSelected],a=this.resolvedKeymap.shrinkWidth??null,s=this.resolvedKeymap.growWidth??null;a&&s&&i.push(this.locale.resizeHint(x(a),x(s))),this.context.announce(i.join(" "))}announceCurrentSize(t){const e=function(t,e){const n=X(t);return n?n.block.attrs?.widthPercent??e.defaultWidthPercent:null}(t.getState(),this.config);null!==e&&t.announce(this.locale.videoResized(e))}};function Ct(){const t=window.getSelection();if(!t||0===t.rangeCount)return null;const e=t.getRangeAt(0).getBoundingClientRect();return 0===e.width&&0===e.height&&0===e.top&&0===e.left?null:e}export{V as a,M as i,nt as n,L as o,it as r,S as s,kt as t};
|
|
2
|
+
//# sourceMappingURL=VideoPlugin-BUCGIYXr.mjs.map
|